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.
