rename onos.util to onos.graph
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
new file mode 100644
index 0000000..53235ab
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
@@ -0,0 +1,158 @@
+package net.onrc.onos.graph;
+
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.thinkaurelius.titan.core.TitanFactory;
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.blueprints.TransactionalGraph;
+import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
+import com.tinkerpop.frames.FramedGraph;
+
+public class GraphDBConnection implements IDBConnection {
+	public enum Transaction {
+		COMMIT, ROLLBACK
+	}
+
+	public enum GenerateEvent {
+		TRUE, FALSE
+	}
+
+	class TransactionHandle {
+		protected TransactionalGraph tr;
+
+		public void create() {
+			tr = graph.newTransaction();
+		}
+	}
+
+	protected static Logger log = LoggerFactory
+			.getLogger(GraphDBConnection.class);
+	private static GraphDBConnection singleton = new GraphDBConnection();
+	private static TitanGraph graph;
+	private static EventTransactionalGraph<TitanGraph> eg;
+	private static String configFile;
+
+	/*
+	 * A private Constructor prevents any other class from instantiating.
+	 */
+	private GraphDBConnection() {
+	}
+
+	/* Static 'instance' method */
+	/**
+	 * Get the instance of GraphDBConnection class.
+	 * @param conf the path to the database configuration file.
+	 * @return GraphDBConnection instance.
+	 */
+	public static synchronized GraphDBConnection getInstance(final String conf) {
+		if (GraphDBConnection.configFile == null
+				|| GraphDBConnection.configFile.isEmpty()) {
+			GraphDBConnection.configFile = conf;
+			log.debug("GraphDBConnection::Setting Config File {}",
+					GraphDBConnection.configFile);
+		}
+		if (!GraphDBConnection.configFile.isEmpty()
+				&& (graph == null || graph.isOpen() == Boolean.FALSE)) {
+			graph = TitanFactory.open(GraphDBConnection.configFile);
+			// FIXME: Creation on Indexes should be done only once
+			Set<String> s = graph.getIndexedKeys(Vertex.class);
+			if (!s.contains("dpid")) {
+				graph.createKeyIndex("dpid", Vertex.class);
+			}
+			if (!s.contains("type")) {
+				graph.createKeyIndex("type", Vertex.class);
+			}
+			if (!s.contains("dl_address")) {
+				graph.createKeyIndex("dl_address", Vertex.class);
+			}
+			if (!s.contains("flow_id")) {
+				graph.createKeyIndex("flow_id", Vertex.class);
+			}
+			if (!s.contains("flow_entry_id")) {
+				graph.createKeyIndex("flow_entry_id", Vertex.class);
+			}
+			if (!s.contains("switch_state")) {
+				graph.createKeyIndex("switch_state", Vertex.class);
+			}
+			graph.commit();
+			eg = new EventTransactionalGraph<TitanGraph>(graph);
+		}
+		return singleton;
+	}
+
+	/** 
+	 * Get a FramedGraph instance of the graph.
+	 */
+	public FramedGraph<TitanGraph> getFramedGraph() {
+		if (isValid()) {
+			FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
+			return fg;
+		} else {
+			log.error("new FramedGraph failed");
+			return null;
+		}
+	}
+
+	/**
+	 * Get EventTransactionalGraph of the titan graph.
+	 * @return EventTransactionalGraph of the titan graph
+	 */
+	protected EventTransactionalGraph<TitanGraph> getEventGraph() {
+		if (isValid()) {
+			return eg;
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * Add LocalGraphChangedLister for the graph.
+	 */
+	public void addEventListener(final LocalGraphChangedListener listener) {
+		EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
+		eg.addListener(listener);
+		log.debug("Registered listener {}", listener.getClass());
+	}
+
+	/**
+	 * Return whether this connection is valid.
+	 */
+	public Boolean isValid() {
+		return (graph != null || graph.isOpen());
+	}
+
+	/**
+	 * Commit changes for the graph operations.
+	 */
+	public void commit() {
+		try {
+			graph.commit();
+		}
+		catch (Exception e) {
+			log.error("{}", e.toString());
+		}
+	}
+
+	/**
+	 * Rollback changes for the graph operations.
+	 */
+	public void rollback() {
+		try {
+			graph.rollback();
+		}
+		catch (Exception e) {
+			log.error("{}", e.toString());
+		}
+	}
+
+	/**
+	 * Close this database connection.
+	 */
+	public void close() {
+		commit();
+	}
+}
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBOperation.java b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
new file mode 100644
index 0000000..0718db2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
@@ -0,0 +1,362 @@
+package net.onrc.onos.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
+import net.onrc.onos.ofcontroller.util.FlowEntryId;
+import net.onrc.onos.ofcontroller.util.FlowId;
+
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.frames.FramedGraph;
+import com.tinkerpop.frames.structures.FramedVertexIterable;
+import com.tinkerpop.gremlin.java.GremlinPipeline;
+
+public class GraphDBOperation implements IDBOperation {
+	private GraphDBConnection conn;
+
+	/**
+	 * Create a GraphDBOperation instance from specified GraphDBConnection's instance.
+	 * @param dbConnection an instance of GraphDBConnection
+	 */
+	public GraphDBOperation(GraphDBConnection dbConnection) {
+		this.conn = dbConnection;
+	}
+
+	/**
+	 * Create a GraphDBOperation instance from database configuration path.
+	 * @param dbConfPath a path for database configuration file.
+	 */
+	public GraphDBOperation(final String dbConfPath) {
+		this.conn = GraphDBConnection.getInstance(dbConfPath);
+	}
+
+	/**
+	 * Create a new switch and return the created switch object.
+	 * @param dpid DPID of the switch
+	 */
+	public ISwitchObject newSwitch(String dpid) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		ISwitchObject obj = fg.addVertex(null,ISwitchObject.class);
+		if (obj != null) {
+			obj.setType("switch");
+			obj.setDPID(dpid);
+		}
+		return obj;
+	}
+
+	/**
+	 * Search and get a switch object with DPID.
+	 * @param dpid DPID of the switch 
+	 */
+	public ISwitchObject searchSwitch(String dpid) {
+		// TODO Auto-generated method stub
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return (fg != null && fg.getVertices("dpid",dpid).iterator().hasNext()) ? 
+				fg.getVertices("dpid",dpid,ISwitchObject.class).iterator().next() : null;
+				
+	}
+
+	/**
+	 * Search and get an active switch object with DPID.
+	 * @param dpid DPID of the switch 
+	 */
+	public ISwitchObject searchActiveSwitch(String dpid) {
+	
+	    ISwitchObject sw = searchSwitch(dpid);
+	    if ((sw != null) &&
+	        sw.getState().equals(SwitchState.ACTIVE.toString())) {
+	        return sw;
+	    }
+	    return null;
+	}
+
+	/**
+	 * Get all switch objects.
+	 */
+	public Iterable<ISwitchObject> getAllSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		return switches;
+	}
+
+	/**
+	 * Get all active switch objects.
+	 */
+	public Iterable<ISwitchObject> getActiveSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
+	
+		for (ISwitchObject sw: switches) {
+			if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
+				activeSwitches.add(sw);
+			}
+		}
+		return activeSwitches;
+	}
+
+	/**
+	 * Get all inactive switch objects.
+	 */
+	public Iterable<ISwitchObject> getInactiveSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
+	
+		for (ISwitchObject sw: switches) {
+			if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
+				inactiveSwitches.add(sw);
+			}
+		}
+		return inactiveSwitches;
+	}
+
+	/**
+	 * Get all flow entries' objects where their switches are not updated.
+	 */
+	public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		//TODO: Should use an enum for flow_switch_state
+		return fg.getVertices("switch_state", "FE_SWITCH_NOT_UPDATED", IFlowEntry.class);
+	}
+
+	/**
+	 * Remove specified switch.
+	 * @param sw switch object to remove
+	 */
+	public void removeSwitch(ISwitchObject sw) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		fg.removeVertex(sw.asVertex());		
+	}
+
+	/**
+	 * Create a port having specified port number.
+	 * @param portNumber port number
+	 */
+	public IPortObject newPort(Short portNumber) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IPortObject obj = fg.addVertex(null,IPortObject.class);
+		if (obj != null) {
+			obj.setType("port");
+			obj.setNumber(portNumber);
+		}
+		return obj;
+	}
+
+	/**
+	 * Search and get a port object of specified switch and port number.
+	 * @param dpid DPID of a switch
+	 * @param number port number of the switch's port
+	 */
+	public IPortObject searchPort(String dpid, short number) {
+		ISwitchObject sw = searchSwitch(dpid);
+		if (sw != null) {
+			
+			IPortObject port = null;
+			
+			// Requires Frames 2.3.0
+			
+			try {
+				port = sw.getPort(number);
+			} catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			
+			return port;
+		}
+			
+	//		if (sw != null) {
+	//			GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
+	//			pipe.start(sw.asVertex());
+	//			pipe.out("on").has("number", number);
+	//			FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
+	//			return r != null && r.iterator().hasNext() ? r.iterator().next() : null;
+	//		}
+		return null;
+	}
+
+	/**
+	 * Remove the specified switch port.
+	 * @param port switch port object to remove
+	 */
+	public void removePort(IPortObject port) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+//		EventGraph<TitanGraph> eg = conn.getEventGraph();
+		if (fg != null) fg.removeVertex(port.asVertex());		
+	}
+
+	/**
+	 * Create and return a device object.
+	 */
+	public IDeviceObject newDevice() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IDeviceObject obj = fg.addVertex(null,IDeviceObject.class);
+		if (obj != null) obj.setType("device");
+		return obj;
+	}
+
+	/**
+	 * Search and get a device object having specified MAC address.
+	 * @param macAddr MAC address to search and get
+	 */
+	public IDeviceObject searchDevice(String macAddr) {
+		// TODO Auto-generated method stub
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		return (fg != null && fg.getVertices("dl_addr",macAddr).iterator().hasNext()) ?
+			fg.getVertices("dl_addr",macAddr, IDeviceObject.class).iterator().next() : null;
+	}
+
+	/**
+	 * Get all devices.
+	 */
+	public Iterable<IDeviceObject> getDevices() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		return fg != null ? fg.getVertices("type","device",IDeviceObject.class) : null;
+	}
+
+	/**
+	 * Remove the specified device.
+	 * @param dev a device object to remove
+	 */
+	public void removeDevice(IDeviceObject dev) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		if (fg != null) fg.removeVertex(dev.asVertex());		
+	}
+
+	/**
+	 * Create and return a flow path object.
+	 */
+	public IFlowPath newFlowPath() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IFlowPath flowPath = fg.addVertex(null, IFlowPath.class);
+		if (flowPath != null) flowPath.setType("flow");
+		return flowPath;
+	}
+
+	/**
+	 * Search and get a flow path object with specified flow ID.
+	 * @param flowId flow ID to search
+	 */
+	public IFlowPath searchFlowPath(FlowId flowId) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return fg.getVertices("flow_id", flowId.toString()).iterator().hasNext() ? 
+		    fg.getVertices("flow_id", flowId.toString(),
+				   IFlowPath.class).iterator().next() : null;
+	}
+
+	/**
+	 * Get a flow path object with a flow entry.
+	 * @param flowEntry flow entry object
+	 */
+	public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry) {
+		GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
+		pipe.start(flowEntry.asVertex());
+		pipe.out("flow");
+		FramedVertexIterable<IFlowPath> r = new FramedVertexIterable(conn.getFramedGraph(), (Iterable) pipe, IFlowPath.class);
+		return r.iterator().hasNext() ? r.iterator().next() : null;
+	}
+
+	/**
+	 * Get all flow path objects.
+	 */
+    public Iterable<IFlowPath> getAllFlowPaths() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<IFlowPath> flowPaths = fg.getVertices("type", "flow", IFlowPath.class);
+		
+		List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
+
+		for (IFlowPath fp: flowPaths) {
+			if (fp.getFlowId() != null) {
+				nonNullFlows.add(fp);
+			}
+		}
+		return nonNullFlows;
+	}
+
+    /**
+     * Remove the specified flow path.
+     * @param flowPath flow path object to remove
+     */
+	public void removeFlowPath(IFlowPath flowPath) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		fg.removeVertex(flowPath.asVertex());
+	}
+
+	/**
+	 * Create and return a flow entry object.
+	 */
+	public IFlowEntry newFlowEntry() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IFlowEntry flowEntry = fg.addVertex(null, IFlowEntry.class);
+		if (flowEntry != null) flowEntry.setType("flow_entry");
+		return flowEntry;
+	}
+
+	/**
+	 * Search and get a flow entry object with flow entry ID.
+	 * @param flowEntryId flow entry ID to search
+	 */
+	public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return fg.getVertices("flow_entry_id", flowEntryId.toString()).iterator().hasNext() ? 
+		    fg.getVertices("flow_entry_id", flowEntryId.toString(),
+				   IFlowEntry.class).iterator().next() : null;
+	}
+
+	/**
+	 * Get all flow entry objects.
+	 */
+	public Iterable<IFlowEntry> getAllFlowEntries() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return fg.getVertices("type", "flow_entry", IFlowEntry.class);
+	}
+
+	/**
+	 * Remove the specified flow entry.
+	 * @param flowEntry flow entry object to remove
+	 */
+	public void removeFlowEntry(IFlowEntry flowEntry) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		fg.removeVertex(flowEntry.asVertex());
+	}
+	
+	/**
+	 * Get the instance of GraphDBConnection assigned to this class.
+	 */
+	public IDBConnection getDBConnection() {
+		return conn;
+	}
+	
+	/**
+	 * Commit changes for the graph.
+	 */
+	public void commit() {
+		conn.commit();
+	}
+
+	/**
+	 * Rollback changes for the graph.
+	 */
+	public void rollback() {
+		conn.rollback();
+	}
+
+	/**
+	 * Close the connection of the assigned GraphDBConnection.
+	 */
+	public void close() {
+		conn.close();
+	}
+}
diff --git a/src/main/java/net/onrc/onos/graph/IDBConnection.java b/src/main/java/net/onrc/onos/graph/IDBConnection.java
new file mode 100644
index 0000000..82ebba2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/IDBConnection.java
@@ -0,0 +1,13 @@
+package net.onrc.onos.graph;
+
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.frames.FramedGraph;
+
+public interface IDBConnection {
+	public FramedGraph<TitanGraph> getFramedGraph();
+	public void addEventListener(final LocalGraphChangedListener listener);
+	public Boolean isValid();
+	public void commit();
+	public void rollback();
+	public void close();
+}
diff --git a/src/main/java/net/onrc/onos/graph/IDBOperation.java b/src/main/java/net/onrc/onos/graph/IDBOperation.java
new file mode 100644
index 0000000..73e7651
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/IDBOperation.java
@@ -0,0 +1,45 @@
+package net.onrc.onos.graph;
+
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.ofcontroller.util.FlowEntryId;
+import net.onrc.onos.ofcontroller.util.FlowId;
+
+public interface IDBOperation {
+	public ISwitchObject newSwitch(String dpid);
+	public ISwitchObject searchSwitch(String dpid);
+	public ISwitchObject searchActiveSwitch(String dpid);
+	public Iterable<ISwitchObject> getActiveSwitches();
+	public Iterable<ISwitchObject> getAllSwitches();
+	public Iterable<ISwitchObject> getInactiveSwitches();
+	public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries();
+	public void removeSwitch(ISwitchObject sw);
+	
+	public IPortObject newPort(Short portNumber);
+	public IPortObject searchPort(String dpid, short number);
+	public void removePort(IPortObject port);
+	
+	public IDeviceObject newDevice();
+	public IDeviceObject searchDevice(String macAddr);
+	public Iterable<IDeviceObject> getDevices();
+	public void removeDevice(IDeviceObject dev);
+
+	public IFlowPath newFlowPath();
+	public IFlowPath searchFlowPath(FlowId flowId);
+	public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry);
+	public Iterable<IFlowPath> getAllFlowPaths();
+	public void removeFlowPath(IFlowPath flowPath);
+
+	public IFlowEntry newFlowEntry();
+	public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId);
+	public Iterable<IFlowEntry> getAllFlowEntries();
+	public void removeFlowEntry(IFlowEntry flowEntry);
+	
+	public IDBConnection getDBConnection();	
+	public void commit();
+	public void rollback();
+	public void close();
+}
diff --git a/src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java b/src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java
new file mode 100644
index 0000000..5f3bbf1
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java
@@ -0,0 +1,7 @@
+package net.onrc.onos.graph;
+
+import com.tinkerpop.blueprints.util.wrappers.event.listener.GraphChangedListener;
+
+public interface LocalGraphChangedListener extends GraphChangedListener {
+
+}
diff --git a/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
new file mode 100644
index 0000000..f83e7c2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
@@ -0,0 +1,104 @@
+package net.onrc.onos.graph;
+
+import net.onrc.onos.flow.FlowManagerImpl;
+import net.onrc.onos.flow.IFlowManager;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.thinkaurelius.titan.core.TitanEdge;
+import com.tinkerpop.blueprints.Direction;
+import com.tinkerpop.blueprints.Edge;
+import com.tinkerpop.blueprints.Vertex;
+
+public class LocalTopologyEventListener implements LocalGraphChangedListener {
+	
+	protected static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
+	protected static GraphDBConnection conn;
+	
+	public LocalTopologyEventListener(GraphDBConnection conn) {
+		LocalTopologyEventListener.conn = conn;		
+	}
+
+	@Override
+	public void edgeAdded(Edge arg0) {
+		// TODO Auto-generated method stub
+		// Convert this Event into NetMapEvent (LinkAdded, FlowEntryEnabled, HostAttached, PortEnabled)
+	}
+
+
+	@Override
+	public void edgePropertyRemoved(Edge arg0, String arg1, Object arg2) {
+		// TODO Auto-generated method stub
+		// Currently not needed
+
+	}
+
+	@Override
+	public void edgeRemoved(Edge e) {
+		// TODO Auto-generated method stub
+		// Fire NetMapEvents (LinkRemoved, FlowEntryRemoved, HostRemoved, PortRemoved)
+		TitanEdge edge = (TitanEdge) e;
+		log.debug("TopologyEvents: Received edge removed event: {}",edge.toString());
+		String label = edge.getLabel();
+		if (label.equals("link")) {
+			Vertex v = edge.getVertex(Direction.IN);
+			IPortObject src_port = conn.getFramedGraph().frame(v, IPortObject.class);
+			v = edge.getVertex(Direction.OUT);
+			IPortObject dest_port = conn.getFramedGraph().frame(v, IPortObject.class);
+
+			log.debug("TopologyEvents: link broken {}", new Object []{src_port.getSwitch().getDPID(),
+																src_port.getNumber(),
+																dest_port.getSwitch().getDPID(),
+																dest_port.getNumber()});
+			IFlowManager manager = new FlowManagerImpl();
+			// TODO: Find the flows and add to reconcile queue
+			manager.reconcileFlows(src_port);
+		}
+	}
+
+	@Override
+	public void vertexAdded(Vertex arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void vertexPropertyRemoved(Vertex arg0, String arg1, Object arg2) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void vertexRemoved(Vertex vertex) {
+		// TODO Auto-generated method stub
+		// Generate NetMapEvents 
+		String type = (String) vertex.getProperty("type");
+		log.debug("TopologyEvents: Received vertex removed event: {}",vertex.toString());
+		if (type.equals("port")) {
+			// port is removed...lets fire reconcile here directly for now
+			
+			IPortObject src_port = conn.getFramedGraph().frame(vertex, IPortObject.class);
+			log.debug("TopologyEvents: Port removed: {}:{}",src_port.getSwitch().getDPID(),src_port.getNumber());
+			IFlowManager manager = new FlowManagerImpl();
+			manager.reconcileFlows(src_port);			
+		}
+	}
+
+
+	@Override
+	public void edgePropertyChanged(Edge arg0, String arg1, Object arg2,
+			Object arg3) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void vertexPropertyChanged(Vertex arg0, String arg1, Object arg2,
+			Object arg3) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}