diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
index a6aacf1..49be7d9 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
@@ -33,8 +33,6 @@
 import net.floodlightcontroller.topology.ITopologyService;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.ofcontroller.bgproute.RibUpdate.Operation;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.config.IConfigInfoService;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery.LDUpdate;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/INetMapStorage.java b/src/main/java/net/onrc/onos/ofcontroller/core/INetMapStorage.java
deleted file mode 100644
index 2cf0e18..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/core/INetMapStorage.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * 
- */
-package net.onrc.onos.ofcontroller.core;
-
-/**
- * @author pankaj
- *
- */
-public interface INetMapStorage {
-	enum DM_OPERATION {
-		CREATE, // Create the object type if does not exist and insert the object
-		INSERT, // Insert the object if it does not exist
-		DELETE, // Delete the object
-		UPDATE  // Update the object if exists or CREATE/INSERT if does not exist
-	}
-	public void init(final String dbStore, final String conf);
-	public void close();
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/INetMapTopologyObjects.java b/src/main/java/net/onrc/onos/ofcontroller/core/INetMapTopologyObjects.java
deleted file mode 100644
index 26c9a98..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/core/INetMapTopologyObjects.java
+++ /dev/null
@@ -1,591 +0,0 @@
-package net.onrc.onos.ofcontroller.core;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-import com.tinkerpop.blueprints.Direction;
-import com.tinkerpop.frames.Adjacency;
-import com.tinkerpop.frames.Property;
-import com.tinkerpop.frames.annotations.gremlin.GremlinGroovy;
-import com.tinkerpop.frames.annotations.gremlin.GremlinParam;
-import com.tinkerpop.frames.VertexFrame;
-
-import net.floodlightcontroller.core.web.serializers.IPv4Serializer;
-
-/*
- * This is the interfaces to make the objects for Cassandra DB.
- * They are interfaces, but it is also implementation,
- * so this handles various control to the objects.  
- * Please take a look at tinkerpop/frames annotation doc to understand more.
- */
-public interface INetMapTopologyObjects {
-	
-	public interface IBaseObject extends VertexFrame {
-		
-		@JsonProperty("state")
-		@Property("state")
-		public String getState();
-		
-		@Property("state")
-		public void setState(final String state);
-		
-		@JsonIgnore
-		@Property("type")
-		public String getType();
-		@Property("type")
-		public void setType(final String type);
-		
-	}
-	
-	public interface ISwitchObject extends IBaseObject{
-		
-		@JsonProperty("dpid")
-		@Property("dpid")
-		public String getDPID();
-		
-		@Property("dpid")
-		public void setDPID(String dpid);
-				
-		@JsonProperty("ports")
-		@Adjacency(label="on")
-		public Iterable<IPortObject> getPorts();
-
-		// Requires Frames 2.3.0		
-		@JsonIgnore
-		@GremlinGroovy("it.out('on').has('number',port_num)")
-		public IPortObject getPort(@GremlinParam("port_num") final short port_num);
-		
-		@Adjacency(label="on")
-		public void addPort(final IPortObject port);
-		
-		@Adjacency(label="on")
-		public void removePort(final IPortObject port);
-		
-		@JsonIgnore
-		@GremlinGroovy("it.out('on').out('host')")
-		public Iterable<IDeviceObject> getDevices();
-		
-		@JsonIgnore
-		@Adjacency(label="switch",direction = Direction.IN)
-		public Iterable<IFlowEntry> getFlowEntries();
-
-	}
-	
-	public interface IPortObject extends IBaseObject{
-				
-		@JsonProperty("number")
-		@Property("number")
-		public Short getNumber();
-		
-		@JsonIgnore
-		@Property("port_id")
-		public void setPortId(String id);
-		
-		@JsonIgnore
-		@Property("port_id")
-		public String getPortId();
-		
-		@Property("number")
-		public void setNumber(Short n);
-		
-		@JsonProperty("desc")
-		@Property("desc")
-		public String getDesc();
-		
-		@Property("desc")
-		public void setDesc(String s);
-		
-		@JsonIgnore
-		@Property("port_state")
-		public Integer getPortState();
-		
-		@Property("port_state")
-		public void setPortState(Integer s);
-		
-		@JsonIgnore
-		@Adjacency(label="on",direction = Direction.IN)
-		public ISwitchObject getSwitch();
-				
-		@JsonProperty("devices")
-		@Adjacency(label="host")
-		public Iterable<IDeviceObject> getDevices();
-		
-		@Adjacency(label="host")
-		public void setDevice(final IDeviceObject device);
-		
-		@Adjacency(label="host")
-		public void removeDevice(final IDeviceObject device);
-		
-		
-		@JsonIgnore
-		@Adjacency(label="inport",direction = Direction.IN)
-		public Iterable<IFlowEntry> getInFlowEntries();
-		
-		@JsonIgnore
-		@Adjacency(label="outport",direction = Direction.IN)
-		public Iterable<IFlowEntry> getOutFlowEntries();
-		
-		
-		@JsonIgnore
-		@Adjacency(label="link")
-		public Iterable<IPortObject> getLinkedPorts();
-
-		@JsonIgnore
-		@Adjacency(label="link",direction = Direction.IN)
-		public Iterable<IPortObject> getReverseLinkedPorts();
-		
-		@Adjacency(label="link")
-		public void removeLink(final IPortObject dest_port);
-		
-		@Adjacency(label="link")
-		public void setLinkPort(final IPortObject dest_port);			
-		
-		// @JsonIgnore
-		// @Adjacency(label="link")
-		// public Iterable<ILinkObject> getLinks();
-	}
-	
-	public interface IDeviceObject extends IBaseObject {
-		
-		@JsonProperty("mac")
-		@Property("dl_addr")
-		public String getMACAddress();
-		
-		@Property("dl_addr")
-		public void setMACAddress(String macaddr);
-		
-		@JsonIgnore
-		@Adjacency(label="host",direction = Direction.IN)
-		public Iterable<IPortObject> getAttachedPorts();
-			
-		@JsonIgnore
-		@Adjacency(label="host",direction=Direction.IN)
-		public void setHostPort(final IPortObject port);
-		
-		@JsonIgnore
-		@Adjacency(label="host",direction=Direction.IN)
-		public void removeHostPort(final IPortObject port);
-		
-		@JsonIgnore
-		@GremlinGroovy("it.in('host').in('on')")
-		public Iterable<ISwitchObject> getSwitch();
-		
-		//
-		// IPv4 Addresses
-		//
-		@JsonProperty("ipv4addresses")
-		@Adjacency(label="hasAddress")
-		public Iterable<IIpv4Address> getIpv4Addresses();
-
-		@JsonIgnore
-		@GremlinGroovy("it.out('hasAddress').has('ipv4_address', ipv4Address)")
-		public IIpv4Address getIpv4Address(@GremlinParam("ipv4Address") final int ipv4Address);
-		
-		@Adjacency(label="hasAddress")
-		public void addIpv4Address(final IIpv4Address ipv4Address);
-		
-		@Adjacency(label="hasAddress")
-		public void removeIpv4Address(final IIpv4Address ipv4Address);
-		
-/*		@JsonProperty("dpid")
-		@GremlinGroovy("_().in('host').in('on').next().getProperty('dpid')")
-		public Iterable<String> getSwitchDPID();
-		
-		@JsonProperty("number")
-		@GremlinGroovy("_().in('host').transform{it.number}")
-		public Iterable<Short> getPortNumber();
-		
-		@JsonProperty("AttachmentPoint")
-		@GremlinGroovy("_().in('host').in('on').path(){it.number}{it.dpid}")
-		public Iterable<SwitchPort> getAttachmentPoints();*/
-	}
-		
-	public interface IIpv4Address extends IBaseObject {
-		
-		@JsonProperty("ipv4")
-		@Property("ipv4_address")
-		@JsonSerialize(using=IPv4Serializer.class)
-		public int getIpv4Address();
-		
-		@Property("ipv4_address")
-		public void setIpv4Address(int ipv4Address);
-		
-		@JsonIgnore
-		//@GremlinGroovy("it.in('hasAddress')")
-		@Adjacency(label = "hasAddress", direction = Direction.IN)
-		public IDeviceObject getDevice();
-	}
-	
-	public interface IFlowPath extends IBaseObject {
-		@JsonProperty("flowId")
-		@Property("flow_id")
-		public String getFlowId();
-
-		@Property("flow_id")
-		public void setFlowId(String flowId);
-
-		@JsonProperty("installerId")
-		@Property("installer_id")
-		public String getInstallerId();
-
-		@Property("installer_id")
-		public void setInstallerId(String installerId);
-
-		@JsonProperty("flowPathType")
-		@Property("flow_path_type")
-		public String getFlowPathType();
-
-		@Property("flow_path_type")
-		public void setFlowPathType(String flowPathType);
-
-		@JsonProperty("flowPathUserState")
-		@Property("user_state")
-		public String getFlowPathUserState();
-
-		@Property("user_state")
-		public void setFlowPathUserState(String userState);
-
-		@JsonProperty("flowPathFlags")
-		@Property("flow_path_flags")
-		public Long getFlowPathFlags();
-
-		@Property("flow_path_flags")
-		public void setFlowPathFlags(Long flowPathFlags);
-
-		@JsonProperty("idleTimeout")
-		@Property("idle_timeout")
-		public Integer getIdleTimeout();
-
-		@Property("idle_timeout")
-		public void setIdleTimeout(Integer idleTimeout);
-
-		@JsonProperty("hardTimeout")
-		@Property("hard_timeout")
-		public Integer getHardTimeout();
-
-		@Property("hard_timeout")
-		public void setHardTimeout(Integer hardTimeout);
-
-		@JsonProperty("priority")
-		@Property("priority")
-		public Integer getPriority();
-
-		@Property("priority")
-		public void setPriority(Integer priority);
-
-		@JsonProperty("srcDpid")
-		@Property("src_switch")
-		public String getSrcSwitch();
-
-		@Property("src_switch")
-		public void setSrcSwitch(String srcSwitch);
-
-		@JsonProperty("srcPort")
-		@Property("src_port")
-		public Short getSrcPort();
-
-		@Property("src_port")
-		public void setSrcPort(Short srcPort);
-
-		@JsonProperty("dstDpid")
-		@Property("dst_switch")
-		public String getDstSwitch();
-
-		@Property("dst_switch")
-		public void setDstSwitch(String dstSwitch);
-
-		@JsonProperty("dstPort")
-		@Property("dst_port")
-		public Short getDstPort();
-
-		@Property("dst_port")
-		public void setDstPort(Short dstPort);
-
-		@JsonIgnore
-		@Adjacency(label="flow", direction=Direction.IN)
-		public Iterable<IFlowEntry> getFlowEntries();
-
-		@Adjacency(label="flow", direction=Direction.IN)
-		public void addFlowEntry(final IFlowEntry flowEntry);
-
-		@Adjacency(label="flow", direction=Direction.IN)
-		public void removeFlowEntry(final IFlowEntry flowEntry);
-
-		//
-		// Matching fields
-		//
-		@JsonIgnore
-		@Property("matchSrcMac")
-		public String getMatchSrcMac();
-
-		@Property("matchSrcMac")
-		public void setMatchSrcMac(String matchSrcMac);
-
-		@JsonIgnore
-		@Property("matchDstMac")
-		public String getMatchDstMac();
-
-		@Property("matchDstMac")
-		public void setMatchDstMac(String matchDstMac);
-
-		@JsonIgnore
-		@Property("matchEthernetFrameType")
-		public Short getMatchEthernetFrameType();
-
-		@Property("matchEthernetFrameType")
-		public void setMatchEthernetFrameType(Short matchEthernetFrameType);
-
-		@JsonIgnore
-		@Property("matchVlanId")
-		public Short getMatchVlanId();
-
-		@Property("matchVlanId")
-		public void setMatchVlanId(Short matchVlanId);
-
-		@JsonIgnore
-		@Property("matchVlanPriority")
-		public Byte getMatchVlanPriority();
-
-		@Property("matchVlanPriority")
-		public void setMatchVlanPriority(Byte matchVlanPriority);
-
-		@JsonIgnore
-		@Property("matchSrcIPv4Net")
-		public String getMatchSrcIPv4Net();
-
-		@Property("matchSrcIPv4Net")
-		public void setMatchSrcIPv4Net(String matchSrcIPv4Net);
-
-		@JsonIgnore
-		@Property("matchDstIPv4Net")
-		public String getMatchDstIPv4Net();
-
-		@Property("matchDstIPv4Net")
-		public void setMatchDstIPv4Net(String matchDstIPv4Net);
-
-		@JsonIgnore
-		@Property("matchIpProto")
-		public Byte getMatchIpProto();
-
-		@Property("matchIpProto")
-		public void setMatchIpProto(Byte matchIpProto);
-
-		@JsonIgnore
-		@Property("matchIpToS")
-		public Byte getMatchIpToS();
-
-		@Property("matchIpToS")
-		public void setMatchIpToS(Byte matchIpToS);
-
-		@JsonIgnore
-		@Property("matchSrcTcpUdpPort")
-		public Short getMatchSrcTcpUdpPort();
-
-		@Property("matchSrcTcpUdpPort")
-		public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort);
-
-		@JsonIgnore
-		@Property("matchDstTcpUdpPort")
-		public Short getMatchDstTcpUdpPort();
-
-		@Property("matchDstTcpUdpPort")
-		public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort);
-
-		//
-		// Action-related fields
-		//
-		@Property("actions")
-		public String getActions();
-
-		@Property("actions")
-		public void setActions(String actionsStr);
-
-		//
-		// Other fields
-		//
-		@JsonIgnore
-		@GremlinGroovy("it.in('flow').out('switch')")
-		public Iterable<ISwitchObject> getSwitches();
-		
-		@JsonIgnore
-		@Property("state")
-		public String getState();
-	}
-
-	public interface IFlowEntry extends IBaseObject {
-		@Property("flow_entry_id")
-		public String getFlowEntryId();
-
-		@Property("flow_entry_id")
-		public void setFlowEntryId(String flowEntryId);
-
-		@JsonProperty("idleTimeout")
-		@Property("idle_timeout")
-		public Integer getIdleTimeout();
-
-		@Property("idle_timeout")
-		public void setIdleTimeout(Integer idleTimeout);
-
-		@JsonProperty("hardTimeout")
-		@Property("hard_timeout")
-		public Integer getHardTimeout();
-
-		@Property("hard_timeout")
-		public void setHardTimeout(Integer hardTimeout);
-
-		@JsonProperty("priority")
-		@Property("priority")
-		public Integer getPriority();
-
-		@Property("priority")
-		public void setPriority(Integer priority);
-
-		@Property("switch_dpid")
-		public String getSwitchDpid();
-
-		@Property("switch_dpid")
-		public void setSwitchDpid(String switchDpid);
-
-		@Property("user_state")
-		public String getUserState();
-
-		@Property("user_state")
-		public void setUserState(String userState);
-
-		@Property("switch_state")
-		public String getSwitchState();
-
-		@Property("switch_state")
-		public void setSwitchState(String switchState);
-
-		@Property("error_state_type")
-		public String getErrorStateType();
-
-		@Property("error_state_type")
-		public void setErrorStateType(String errorStateType);
-
-		@Property("error_state_code")
-		public String getErrorStateCode();
-
-		@Property("error_state_code")
-		public void setErrorStateCode(String errorStateCode);
-
-		//
-		// Matching fields
-		//
-		@Property("matchInPort")
-		public Short getMatchInPort();
-
-		@Property("matchInPort")
-		public void setMatchInPort(Short matchInPort);
-
-		@Property("matchSrcMac")
-		public String getMatchSrcMac();
-
-		@Property("matchSrcMac")
-		public void setMatchSrcMac(String matchSrcMac);
-
-		@Property("matchDstMac")
-		public String getMatchDstMac();
-
-		@Property("matchDstMac")
-		public void setMatchDstMac(String matchDstMac);
-
-		@Property("matchEthernetFrameType")
-		public Short getMatchEthernetFrameType();
-
-		@Property("matchEthernetFrameType")
-		public void setMatchEthernetFrameType(Short matchEthernetFrameType);
-
-		@Property("matchVlanId")
-		public Short getMatchVlanId();
-
-		@Property("matchVlanId")
-		public void setMatchVlanId(Short matchVlanId);
-
-		@Property("matchVlanPriority")
-		public Byte getMatchVlanPriority();
-
-		@Property("matchVlanPriority")
-		public void setMatchVlanPriority(Byte matchVlanPriority);
-
-		@Property("matchSrcIPv4Net")
-		public String getMatchSrcIPv4Net();
-
-		@Property("matchSrcIPv4Net")
-		public void setMatchSrcIPv4Net(String matchSrcIPv4Net);
-
-		@Property("matchDstIPv4Net")
-		public String getMatchDstIPv4Net();
-
-		@Property("matchDstIPv4Net")
-		public void setMatchDstIPv4Net(String matchDstIPv4Net);
-
-		@Property("matchIpProto")
-		public Byte getMatchIpProto();
-
-		@Property("matchIpProto")
-		public void setMatchIpProto(Byte matchIpProto);
-
-		@Property("matchIpToS")
-		public Byte getMatchIpToS();
-
-		@Property("matchIpToS")
-		public void setMatchIpToS(Byte matchIpToS);
-
-		@Property("matchSrcTcpUdpPort")
-		public Short getMatchSrcTcpUdpPort();
-
-		@Property("matchSrcTcpUdpPort")
-		public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort);
-
-		@Property("matchDstTcpUdpPort")
-		public Short getMatchDstTcpUdpPort();
-
-		@Property("matchDstTcpUdpPort")
-		public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort);
-
-		//
-		// Action-related fields
-		//
-		@Property("actionOutputPort")
-		public Short getActionOutputPort();
-
-		@Property("actionOutputPort")
-		public void setActionOutputPort(Short actionOutputPort);
-
-		@Property("actions")
-		public String getActions();
-
-		@Property("actions")
-		public void setActions(String actionsStr);
-
-		//
-		// Other fields
-		//
-		@Adjacency(label="flow")
-		public IFlowPath getFlow();
-
-		@Adjacency(label="flow")
-		public void setFlow(IFlowPath flow);
-
-		@Adjacency(label="switch")
-		public ISwitchObject getSwitch();
-
-		@Adjacency(label="switch")
-		public void setSwitch(ISwitchObject sw);
-
-		@Adjacency(label="inport")
-		public IPortObject getInPort();
-
-		@Adjacency(label="inport")
-		public void setInPort(IPortObject port);
-
-		@Adjacency(label="outport")
-		public IPortObject getOutPort();
-
-		@Adjacency(label="outport")
-		public void setOutPort(IPortObject port);
-	}
-}
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 4c78d23..533e05a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -22,8 +22,6 @@
 import net.floodlightcontroller.threadpool.IThreadPoolService;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.datagrid.IDatagridService;
-import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
@@ -140,9 +138,9 @@
     }
 
     protected void switchCleanup() {
+	/*
     	//op.close();
-    	// Iterable<ISwitchObject> switches = op.getActiveSwitches();
-    	Iterable<ISwitchObject> switches = null;
+    	Iterable<ISwitchObject> switches = op.getActiveSwitches();
 
     	log.debug("Checking for inactive switches");
     	// For each switch check if a controller exists in controller registry
@@ -166,6 +164,7 @@
 			}
 		}
     	// op.close();
+	*/
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java
index 83edc49..1f426b3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java
@@ -24,8 +24,6 @@
 import org.slf4j.LoggerFactory;
 
 import net.floodlightcontroller.core.IOFSwitch;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService.MsgPriority;
 import net.onrc.onos.ofcontroller.util.Dpid;
 import net.onrc.onos.ofcontroller.util.FlowEntry;
@@ -43,13 +41,13 @@
 
     private static Logger log = LoggerFactory.getLogger(FlowSynchronizer.class);
 
-    // TODO: fix after FlowSynchronizer is refactored
+    // TODO: fix when FlowSynchronizer is refactored
     // private DBOperation dbHandler;
     protected IFlowPusherService pusher;
     private Map<IOFSwitch, FutureTask<SyncResult>> switchThreads; 
 
     public FlowSynchronizer() {
-	// TODO: fix after FlowSynchronizer is refactored
+	// TODO: fix when FlowSynchronizer is refactored
 	// dbHandler = GraphDBManager.getDBOperation();
 	switchThreads = new HashMap<IOFSwitch, FutureTask<SyncResult>>();
     }
@@ -86,12 +84,13 @@
      */
 	protected class Synchronizer implements Callable<SyncResult> {
 	IOFSwitch sw;
-	ISwitchObject swObj;
+	// TODO: fix when FlowSynchronizer is refactored
+	// ISwitchObject swObj;
 
 	public Synchronizer(IOFSwitch sw) {
 	    this.sw = sw;
 	    Dpid dpid = new Dpid(sw.getId());
-	    // TODO: fix after FlowSynchronizer is refactored
+	    // TODO: fix when FlowSynchronizer is refactored
 	    // this.swObj = dbHandler.searchSwitch(dpid.toString());
 	}
 
@@ -186,10 +185,14 @@
 	 */
 	private Set<FlowEntryWrapper> getFlowEntriesFromGraph() {
 	    Set<FlowEntryWrapper> entries = new HashSet<FlowEntryWrapper>();
+
+	    // TODO: fix when FlowSynchronizer is refactored
+	    /*
 	    for(IFlowEntry entry : swObj.getFlowEntries()) {
 		FlowEntryWrapper fe = new FlowEntryWrapper(entry);
 		entries.add(fe);
 	    }
+	    */
 	    return entries;	    
 	}
 
@@ -254,14 +257,18 @@
      */
     class FlowEntryWrapper {
     FlowEntryId flowEntryId;
-    IFlowEntry iFlowEntry;
+    // TODO: fix when FlowSynchronizer is refactored
+    // IFlowEntry iFlowEntry;
     OFFlowStatisticsReply statisticsReply;
 
 
+	// TODO: fix when FlowSynchronizer is refactored
+	/*
 	public FlowEntryWrapper(IFlowEntry entry) {
 	    flowEntryId = new FlowEntryId(entry.getFlowEntryId());
 	    iFlowEntry = entry;
-    }
+	}
+	*/
 
 	public FlowEntryWrapper(OFFlowStatisticsReply entry) {
 	    flowEntryId = new FlowEntryId(entry.getCookie());
@@ -282,16 +289,19 @@
 
 	    double startDB = System.nanoTime();
 	    // Get the Flow Entry state from the Network Graph
+	    // TODO: fix when FlowSynchronizer is refactored
+	    /*
 	    if (iFlowEntry == null) {
             try {
-		// TODO: fix after FlowSynchronizer is refactored
-            	// iFlowEntry = dbHandler.searchFlowEntry(flowEntryId);
+		// TODO: fix when FlowSynchronizer is refactored
+            	iFlowEntry = dbHandler.searchFlowEntry(flowEntryId);
             } catch (Exception e) {
             	log.error("Error finding flow entry {} in Network Graph",
             			flowEntryId);
             	return;
             }
 	    }
+	    */
 	    dbTime = System.nanoTime() - startDB;
 
 	    //
diff --git a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
index 97b3e28..8dfd3e3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
@@ -20,9 +20,6 @@
 import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.datagrid.IDatagridService;
-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.devicemanager.IOnosDeviceService;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.ofcontroller.proxyarp.BroadcastPacketOutNotification;
@@ -298,6 +295,8 @@
 		}
 	}
 
+	// TODO: Fix the code below because IDeviceObject was removed
+	/*
 	private void continueHandlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth, IDeviceObject deviceObject) {
 		log.debug("Start continuehandlePacketIn");
 
@@ -431,6 +430,7 @@
 		// TODO: Add the flow by using the new Path Intent framework
 		// flowService.addFlow(flowPath);
 	}
+	*/
 
 	private OFPacketOut constructPacketOut(OFPacketIn pi, IOFSwitch sw) {	
 		OFPacketOut po = new OFPacketOut();
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
index f405e0f..1593369 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -29,9 +29,6 @@
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.datagrid.IDatagridService;
 import net.onrc.onos.ofcontroller.bgproute.Interface;
-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.config.IConfigInfoService;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
 import net.onrc.onos.ofcontroller.util.Dpid;
@@ -345,8 +342,9 @@
 		IDeviceObject targetDevice = 
 				deviceStorage.getDeviceByIP(InetAddresses.coerceToInteger(target));
 		*/
-		IDeviceObject targetDevice = null;
-		
+
+		// TODO: Fix the code below after deviceStorage was removed
+		/*
 		if (targetDevice == null) {
 			if (log.isTraceEnabled()) {
 				log.trace("No device info found for {} - broadcasting",
@@ -390,10 +388,9 @@
 					//long outSwitch = 0;
 					//short outPort = 0;
 
-					/*
-					if (!portObject.getLinkedPorts().iterator().hasNext()) {
-						outPort = portObject.getNumber();					
-					}*/
+					// if (!portObject.getLinkedPorts().iterator().hasNext()) {
+					//	outPort = portObject.getNumber();					
+					// }
 					if (portObject.getLinkedPorts().iterator().hasNext()) {
 						continue;
 					}
@@ -414,6 +411,7 @@
 				}
 			}
 		}
+		*/
 	}
 	
 	private void handleArpReply(IOFSwitch sw, OFPacketIn pi, ARP arp){
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java
index 0371046..c7806a2 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java
@@ -2,10 +2,6 @@
 
 import java.util.ArrayList;
 
-import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
-
 import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonProperty;
 
@@ -42,166 +38,6 @@
     }
 
     /**
-     * Constructor to instantiate from object in Network Map
-     */
-    public FlowPath(IFlowPath flowObj) {
-    	dataPath = new DataPath();
-    	this.setFlowId(new FlowId(flowObj.getFlowId()));
-    	this.setInstallerId(new CallerId(flowObj.getInstallerId()));
-	this.setFlowPathType(FlowPathType.valueOf(flowObj.getFlowPathType()));
-	this.setFlowPathUserState(FlowPathUserState.valueOf(flowObj.getFlowPathUserState()));
-	this.setFlowPathFlags(new FlowPathFlags(flowObj.getFlowPathFlags()));
-	this.setIdleTimeout(flowObj.getIdleTimeout());
-	this.setHardTimeout(flowObj.getHardTimeout());
-	this.setPriority(flowObj.getPriority());
-    	this.dataPath().srcPort().setDpid(new Dpid(flowObj.getSrcSwitch()));
-    	this.dataPath().srcPort().setPort(new Port(flowObj.getSrcPort()));
-    	this.dataPath().dstPort().setDpid(new Dpid(flowObj.getDstSwitch()));
-    	this.dataPath().dstPort().setPort(new Port(flowObj.getDstPort()));
-	//
-	// Extract the match conditions that are common for all Flow Entries
-	//
-	{
-    	    FlowEntryMatch match = new FlowEntryMatch();
-    	    String matchSrcMac = flowObj.getMatchSrcMac();
-    	    if (matchSrcMac != null)
-    		match.enableSrcMac(MACAddress.valueOf(matchSrcMac));
-    	    String matchDstMac = flowObj.getMatchDstMac();
-    	    if (matchDstMac != null)
-    		match.enableDstMac(MACAddress.valueOf(matchDstMac));
-    	    Short matchEthernetFrameType = flowObj.getMatchEthernetFrameType();
-    	    if (matchEthernetFrameType != null)
-    		match.enableEthernetFrameType(matchEthernetFrameType);
-    	    Short matchVlanId = flowObj.getMatchVlanId();
-    	    if (matchVlanId != null)
-    		match.enableVlanId(matchVlanId);
-    	    Byte matchVlanPriority = flowObj.getMatchVlanPriority();
-    	    if (matchVlanPriority != null)
-    		match.enableVlanPriority(matchVlanPriority);
-    	    String matchSrcIPv4Net = flowObj.getMatchSrcIPv4Net();
-    	    if (matchSrcIPv4Net != null)
-    		match.enableSrcIPv4Net(new IPv4Net(matchSrcIPv4Net));
-    	    String matchDstIPv4Net = flowObj.getMatchDstIPv4Net();
-    	    if (matchDstIPv4Net != null)
-    		match.enableDstIPv4Net(new IPv4Net(matchDstIPv4Net));
-    	    Byte matchIpProto = flowObj.getMatchIpProto();
-    	    if (matchIpProto != null)
-    		match.enableIpProto(matchIpProto);
-    	    Byte matchIpToS = flowObj.getMatchIpToS();
-    	    if (matchIpToS != null)
-    		match.enableIpToS(matchIpToS);
-    	    Short matchSrcTcpUdpPort = flowObj.getMatchSrcTcpUdpPort();
-    	    if (matchSrcTcpUdpPort != null)
-    		match.enableSrcTcpUdpPort(matchSrcTcpUdpPort);
-    	    Short matchDstTcpUdpPort = flowObj.getMatchDstTcpUdpPort();
-    	    if (matchDstTcpUdpPort != null)
-    		match.enableDstTcpUdpPort(matchDstTcpUdpPort);
-
-    	    this.setFlowEntryMatch(match);
-	}
-
-	//
-	// Extract the actions for the first Flow Entry
-	//
-	{
-	    FlowEntryActions actions = new FlowEntryActions();
-
-	    String actionsStr = flowObj.getActions();
-	    if (actions != null)
-		actions = new FlowEntryActions(actionsStr);
-
-	    this.setFlowEntryActions(actions);
-	}
-
-    	//
-    	// Extract all Flow Entries
-    	//
-    	Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
-    	for (IFlowEntry flowEntryObj : flowEntries) {
-    	    FlowEntry flowEntry = new FlowEntry();
-    	    flowEntry.setFlowEntryId(new FlowEntryId(flowEntryObj.getFlowEntryId()));
-    	    flowEntry.setDpid(new Dpid(flowEntryObj.getSwitchDpid()));
-
-    	    //
-    	    // Extract the match conditions
-    	    //
-    	    FlowEntryMatch match = new FlowEntryMatch();
-	    //
-    	    Short matchInPort = flowEntryObj.getMatchInPort();
-    	    if (matchInPort != null)
-    		match.enableInPort(new Port(matchInPort));
-	    //
-    	    String matchSrcMac = flowEntryObj.getMatchSrcMac();
-    	    if (matchSrcMac != null)
-    		match.enableSrcMac(MACAddress.valueOf(matchSrcMac));
-	    //
-    	    String matchDstMac = flowEntryObj.getMatchDstMac();
-    	    if (matchDstMac != null)
-    		match.enableDstMac(MACAddress.valueOf(matchDstMac));
-	    //
-    	    Short matchEthernetFrameType = flowEntryObj.getMatchEthernetFrameType();
-    	    if (matchEthernetFrameType != null)
-    		match.enableEthernetFrameType(matchEthernetFrameType);
-	    //
-    	    Short matchVlanId = flowEntryObj.getMatchVlanId();
-    	    if (matchVlanId != null)
-    		match.enableVlanId(matchVlanId);
-	    //
-    	    Byte matchVlanPriority = flowEntryObj.getMatchVlanPriority();
-    	    if (matchVlanPriority != null)
-    		match.enableVlanPriority(matchVlanPriority);
-	    //
-    	    String matchSrcIPv4Net = flowEntryObj.getMatchSrcIPv4Net();
-    	    if (matchSrcIPv4Net != null)
-    		match.enableSrcIPv4Net(new IPv4Net(matchSrcIPv4Net));
-	    //
-    	    String matchDstIPv4Net = flowEntryObj.getMatchDstIPv4Net();
-    	    if (matchDstIPv4Net != null)
-    		match.enableDstIPv4Net(new IPv4Net(matchDstIPv4Net));
-	    //
-    	    Byte matchIpProto = flowEntryObj.getMatchIpProto();
-    	    if (matchIpProto != null)
-    		match.enableIpProto(matchIpProto);
-	    //
-    	    Byte matchIpToS = flowEntryObj.getMatchIpToS();
-    	    if (matchIpToS != null)
-    		match.enableIpToS(matchIpToS);
-	    //
-    	    Short matchSrcTcpUdpPort = flowEntryObj.getMatchSrcTcpUdpPort();
-    	    if (matchSrcTcpUdpPort != null)
-    		match.enableSrcTcpUdpPort(matchSrcTcpUdpPort);
-	    //
-    	    Short matchDstTcpUdpPort = flowEntryObj.getMatchDstTcpUdpPort();
-    	    if (matchDstTcpUdpPort != null)
-    		match.enableDstTcpUdpPort(matchDstTcpUdpPort);
-	    //
-    	    flowEntry.setFlowEntryMatch(match);
-
-	    //
-	    // Extract the actions
-	    //
-	    {
-		FlowEntryActions actions = new FlowEntryActions();
-
-		String actionsStr = flowEntryObj.getActions();
-		if (actions != null)
-		    actions = new FlowEntryActions(actionsStr);
-
-		flowEntry.setFlowEntryActions(actions);
-	    }
-
-    	    String userState = flowEntryObj.getUserState();
-    	    flowEntry.setFlowEntryUserState(FlowEntryUserState.valueOf(userState));
-    	    String switchState = flowEntryObj.getSwitchState();
-    	    flowEntry.setFlowEntrySwitchState(FlowEntrySwitchState.valueOf(switchState));
-	    //
-	    // TODO: Take care of the FlowEntryErrorState.
-	    //
-    	    this.dataPath().flowEntries().add(flowEntry);
-    	}
-    }
-
-    /**
      * Get the flow path Flow ID.
      *
      * @return the flow path Flow ID.
diff --git a/src/main/resources/floodlightdefault.properties b/src/main/resources/floodlightdefault.properties
index 9f83ec8..a8fbd05 100644
--- a/src/main/resources/floodlightdefault.properties
+++ b/src/main/resources/floodlightdefault.properties
@@ -5,11 +5,8 @@
 net.floodlightcontroller.counter.CounterStore,\
 net.floodlightcontroller.perfmon.PktInProcessingTime,\
 net.floodlightcontroller.ui.web.StaticWebRoutable,\
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher, \
 net.onrc.onos.registry.controller.ZookeeperRegistry
 net.floodlightcontroller.restserver.RestApiServer.port = 8080
 net.floodlightcontroller.core.FloodlightProvider.openflowport = 6633
 net.floodlightcontroller.forwarding.Forwarding.idletimeout = 5
 net.floodlightcontroller.forwarding.Forwarding.hardtimeout = 0
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.dbconf = /tmp/cassandra.titan
-net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher.EnableCleanup = True
diff --git a/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java b/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java
deleted file mode 100644
index 4e6477b..0000000
--- a/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package net.floodlightcontroller.core.internal;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.commons.io.FileUtils;
-import org.junit.Assert;
-
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
-import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.blueprints.util.io.graphml.GraphMLReader;
-
-@SuppressWarnings("deprecation")
-public class TestDatabaseManager {
-	private static final String testDbLocation = "/tmp/onos-testdb";
-	
-	//private static final String testDbGraphML = "<?xml version=\"1.0\" ?><graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">    <key id=\"id\" for=\"node\" attr.name=\"id\" attr.type=\"string\"></key>    <key id=\"type\" for=\"node\" attr.name=\"type\" attr.type=\"string\"></key>    <key id=\"dpid\" for=\"node\" attr.name=\"dpid\" attr.type=\"string\"></key>    <key id=\"desc\" for=\"node\" attr.name=\"desc\" attr.type=\"string\"></key>    <key id=\"number\" for=\"node\" attr.name=\"number\" attr.type=\"int\"></key>    <key id=\"dl_addr\" for=\"node\" attr.name=\"dl_addr\" attr.type=\"string\"></key>    <key id=\"nw_addr\" for=\"node\" attr.name=\"nw_addr\" attr.type=\"string\"></key>    <key id=\"id\" for=\"edge\" attr.name=\"id\" attr.type=\"string\"></key>    <key id=\"source\" for=\"edge\" attr.name=\"source\" attr.type=\"string\"></key>    <key id=\"target\" for=\"edge\" attr.name=\"target\" attr.type=\"string\"></key>    <key id=\"label\" for=\"edge\" attr.name=\"label\" attr.type=\"string\"></key>    <graph id=\"G\" edgedefault=\"directed\">        <node id=\"1\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:01</data>            <data key=\"desc\">OpenFlow Switch at SEA</data>        </node>        <node id=\"2\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:02</data>            <data key=\"desc\">OpenFlow Switch at LAX</data>        </node>        <node id=\"3\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:03</data>            <data key=\"desc\">OpenFlow Switch at CHI</data>        </node>        <node id=\"4\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:04</data>            <data key=\"desc\">OpenFlow Switch at IAH</data>        </node>        <node id=\"5\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:05</data>            <data key=\"desc\">OpenFlow Switch at NYC</data>        </node>        <node id=\"6\">            <data key=\"type\">switch</data>            <data key=\"dpid\">00:00:00:00:00:00:0a:06</data>            <data key=\"desc\">OpenFlow Switch at ATL</data>        </node>        <node id=\"100\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at SEA Switch</data>        </node>        <node id=\"101\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at SEA Switch</data>        </node>        <node id=\"102\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at SEA Switch</data>        </node>        <node id=\"103\">            <data key=\"type\">port</data>            <data key=\"number\">4</data>            <data key=\"desc\">port 4 at SEA Switch</data>        </node>        <node id=\"104\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at LAX Switch</data>        </node>        <node id=\"105\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at LAX Switch</data>        </node>        <node id=\"106\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at LAX Switch</data>        </node>        <node id=\"107\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at CHI Switch</data>        </node>        <node id=\"108\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at CHI Switch</data>        </node>        <node id=\"109\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at CHI Switch</data>        </node>        <node id=\"110\">            <data key=\"type\">port</data>            <data key=\"number\">4</data>            <data key=\"desc\">port 4 at CHI Switch</data>        </node>        <node id=\"111\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at IAH Switch</data>        </node>        <node id=\"112\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at IAH Switch</data>        </node>        <node id=\"113\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at IAH Switch</data>        </node>        <node id=\"114\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at NYC Switch</data>        </node>        <node id=\"115\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at NYC Switch</data>        </node>        <node id=\"116\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at NYC Switch</data>        </node>        <node id=\"117\">            <data key=\"type\">port</data>            <data key=\"number\">1</data>            <data key=\"desc\">port 1 at ATL Switch</data>        </node>        <node id=\"118\">            <data key=\"type\">port</data>            <data key=\"number\">2</data>            <data key=\"desc\">port 2 at ATL Switch</data>        </node>        <node id=\"119\">            <data key=\"type\">port</data>            <data key=\"number\">3</data>            <data key=\"desc\">port 3 at ATL Switch</data>        </node>        <node id=\"1000\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">20:c9:d0:4a:e1:73</data>            <data key=\"nw_addr\">192.168.10.101</data>        </node>        <node id=\"1001\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">20:c9:d0:4a:e1:62</data>            <data key=\"nw_addr\">192.168.20.101</data>        </node>        <node id=\"1002\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">10:40:f3:e6:8d:55</data>            <data key=\"nw_addr\">192.168.10.1</data>        </node>        <node id=\"1003\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">a0:b3:cc:9c:c6:88</data>            <data key=\"nw_addr\">192.168.20.1</data>        </node>        <node id=\"1004\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">00:04:20:e2:50:a2</data>            <data key=\"nw_addr\">192.168.30.1</data>        </node>        <node id=\"1005\">            <data key=\"type\">device</data>            <data key=\"dl_addr\">58:55:ca:c4:1b:a0</data>            <data key=\"nw_addr\">192.168.40.1</data>        </node>        <edge id=\"10000\" source=\"1\" target=\"101\" label=\"on\"></edge>        <edge id=\"10001\" source=\"1\" target=\"102\" label=\"on\"></edge>        <edge id=\"10002\" source=\"1\" target=\"103\" label=\"on\"></edge>        <edge id=\"10003\" source=\"2\" target=\"104\" label=\"on\"></edge>        <edge id=\"10004\" source=\"2\" target=\"105\" label=\"on\"></edge>        <edge id=\"10005\" source=\"2\" target=\"106\" label=\"on\"></edge>        <edge id=\"10006\" source=\"3\" target=\"107\" label=\"on\"></edge>        <edge id=\"10007\" source=\"3\" target=\"108\" label=\"on\"></edge>        <edge id=\"10008\" source=\"3\" target=\"109\" label=\"on\"></edge>        <edge id=\"10009\" source=\"3\" target=\"110\" label=\"on\"></edge>        <edge id=\"10010\" source=\"4\" target=\"111\" label=\"on\"></edge>        <edge id=\"10011\" source=\"4\" target=\"112\" label=\"on\"></edge>        <edge id=\"10012\" source=\"4\" target=\"113\" label=\"on\"></edge>        <edge id=\"10013\" source=\"5\" target=\"114\" label=\"on\"></edge>        <edge id=\"10014\" source=\"5\" target=\"115\" label=\"on\"></edge>        <edge id=\"10015\" source=\"5\" target=\"116\" label=\"on\"></edge>        <edge id=\"10016\" source=\"6\" target=\"117\" label=\"on\"></edge>        <edge id=\"10017\" source=\"6\" target=\"118\" label=\"on\"></edge>        <edge id=\"10018\" source=\"6\" target=\"119\" label=\"on\"></edge>        <edge id=\"11000\" source=\"101\" target=\"107\" label=\"link\"></edge>         <edge id=\"11003\" source=\"105\" target=\"111\" label=\"link\"></edge>        <edge id=\"11004\" source=\"107\" target=\"101\" label=\"link\"></edge>        <edge id=\"11005\" source=\"108\" target=\"112\" label=\"link\"></edge>        <edge id=\"11006\" source=\"109\" target=\"114\" label=\"link\"></edge>        <edge id=\"11007\" source=\"111\" target=\"105\" label=\"link\"></edge>        <edge id=\"11008\" source=\"112\" target=\"108\" label=\"link\"></edge>        <edge id=\"11009\" source=\"113\" target=\"117\" label=\"link\"></edge>        <edge id=\"11010\" source=\"114\" target=\"109\" label=\"link\"></edge>        <edge id=\"11011\" source=\"115\" target=\"118\" label=\"link\"></edge>        <edge id=\"11012\" source=\"117\" target=\"113\" label=\"link\"></edge>        <edge id=\"11013\" source=\"118\" target=\"115\" label=\"link\"></edge>        <edge id=\"12000\" source=\"103\" target=\"1000\" label=\"host\"></edge>        <edge id=\"12001\" source=\"103\" target=\"1001\" label=\"host\"></edge>        <edge id=\"12002\" source=\"110\" target=\"1002\" label=\"host\"></edge>        <edge id=\"12003\" source=\"116\" target=\"1003\" label=\"host\"></edge>        <edge id=\"12004\" source=\"106\" target=\"1004\" label=\"host\"></edge>        <edge id=\"12005\" source=\"119\" target=\"1005\" label=\"host\"></edge>      </graph>    </graphml>";
-	
-	private static final String testDataLocation = "titan/schema/test-network.xml";
-	
-	public static TitanGraph getTestDatabase(){
-		//return TitanFactory.open(testDbLocation);
-//		return TitanFactory.openInMemoryGraph();
-		return TitanFactory.open(testDbLocation);
-	}
-	
-	public static void populateTestData(TitanGraph titanGraph){
-		Set<String> s = titanGraph.getIndexedKeys(Vertex.class);
-        if (!s.contains("dpid")) {
-           titanGraph.createKeyIndex("dpid", Vertex.class);
-           titanGraph.stopTransaction(Conclusion.SUCCESS);
-        }
-        if (!s.contains("type")) {
-        	titanGraph.createKeyIndex("type", Vertex.class);
-        	titanGraph.stopTransaction(Conclusion.SUCCESS);
-        }
-        
-        //InputStream graphMLStream = new ByteArrayInputStream(testDbGraphML.getBytes());
-        
-        try {
-        	InputStream graphMLStream = new FileInputStream(testDataLocation);
-			GraphMLReader.inputGraph(titanGraph, graphMLStream);
-		} catch (FileNotFoundException e) {
-			Assert.fail("Test data file not found: " + testDataLocation);
-		} catch (IOException e) {
-			e.printStackTrace();
-			Assert.fail("IOException thrown");
-		}
-        
-        //Change the type of all port numbers to short in the database
-        Iterator<Vertex> it = titanGraph.getVertices("type", "port").iterator();
-        while (it.hasNext()){
-        	Vertex port = it.next();
-
-        	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);
-	}
-	
-	public static void deleteTestDatabase(){
-		try {
-			FileUtils.deleteDirectory(new File(testDbLocation));
-		} catch (IOException e) {
-			System.out.println("delete failed");
-			e.printStackTrace();
-		}
-	}
-	
-}
diff --git a/src/test/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizerTest.java b/src/test/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizerTest.java
index 03c9f4f..3e9e46d 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizerTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizerTest.java
@@ -9,8 +9,6 @@
 import java.util.concurrent.Future;
 
 import net.floodlightcontroller.core.IOFSwitch;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
-import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService.MsgPriority;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowSyncService.SyncResult;
 import net.onrc.onos.ofcontroller.util.FlowEntry;
