Merge branch 'dev'
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java b/src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java
index b56cfef..ce2379b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java
@@ -8,33 +8,33 @@
 public interface ILinkStorage extends INetMapStorage {
 	
     /*
-     * Link creation
-     */
-	public void update(Link link, DM_OPERATION op);
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op);
-	public void update(List<Link> List, DM_OPERATION op);
-
-	/*
-	 *  Add Linkinfo
+	 * Init with Storage conf
 	 */
-	public void updateLink (Link link, LinkInfo linkinfo, DM_OPERATION op);
+	public void init(String conf);
 	
 	/*
-	 * Delete a single link
+	 * Generic operation method
+	 */
+	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op);
+	
+	/*
+     * Link creation
+     */
+	public void addLink(Link link);
+	public void addLinks(List<Link> links);
+	
+	/*
+	 * Link deletion
 	 */
 	public void deleteLink(Link link);
+	public void deleteLinks(List<Link> links);
 
 	/*
-	 * Delete links associated with dpid and port 
+	 * Utility method to delete links associated with dpid and port 
 	 * If only dpid is used, All links associated for switch are removed
 	 * Useful for port up/down and also switch join/remove events
 	 */ 
 	public void deleteLinksOnPort(Long dpid, short port);
-	
-	/*
-	 * Delete a list of links
-	 */
-	public void deleteLinks(List<Link> links);
 
 	/*
 	 * Get Links from Storage
@@ -44,10 +44,6 @@
 	public List<Link> getLinks(Long dpid, short port);
 	public List<Link> getLinks(String dpid);
 	public List<Link> getActiveLinks();
-	
-	/*
-	 * Init with Storage conf
-	 */
-	public void init(String conf);
 
+	public LinkInfo getLinkInfo(Link link);
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java b/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
index 4fcebb2..bc50049 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
@@ -12,6 +12,10 @@
 	}
 	
 	/*
+	 * Initialize
+	 */
+	public void init(String conf);
+	/*
 	 * Update the switch details
 	 */
 	public void update(String dpid,SwitchState state, DM_OPERATION op);
@@ -20,6 +24,10 @@
 	 */
 	public void addPort(String dpid, OFPhysicalPort port);
 	/*
+	 * Delete a port on a switch by num
+	 */
+	public void deletePort(String dpid, short port);
+	/*
 	 * Add a switch and all its associated ports
 	 */
 	public void addSwitch(IOFSwitch sw);
@@ -31,14 +39,6 @@
 	 * Delete switch and associated ports
 	 */
 	public void deleteSwitch(String dpid);
-	/*
-	 * Delete a port on a switch by num
-	 */
-	public void deletePort(String dpid, short port);
-	/*
-	 * Initialize
-	 */
-	public void init(String conf);
 	
 
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
index 8ee346b..753563e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
@@ -20,32 +20,117 @@
 import com.tinkerpop.pipes.transform.PathPipe;
 
 /**
- * This is the class for storing the information of links into CassandraDB
+ * This is the class for storing the information of links into GraphDB
  */
 public class LinkStorageImpl implements ILinkStorage {
 	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
 	protected GraphDBOperation dbop;
 
+	
+	/**
+	 * Initialize the object. Open LinkStorage using given configuration file.
+	 * @param conf Path (absolute path for now) to configuration file.
+	 */
+	@Override
+	public void init(String conf) {
+		this.dbop = new GraphDBOperation(conf);
+	}
+
 	/**
 	 * Update a record in the LinkStorage in a way provided by op.
 	 * @param link Record of a link to be updated.
 	 * @param op Operation to be done.
 	 */
 	@Override
-	public void update(Link link, DM_OPERATION op) {
-		update(link, (LinkInfo)null, op);
+	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
+		switch (op) {
+		case CREATE:
+		case INSERT:
+			addLinkImpl(link,op);
+			break;
+		case UPDATE:
+			if (linkinfo != null) {
+				setLinkInfo(link, linkinfo);
+			} else {
+				deleteLinkInfo(link);
+			}
+			break;
+		case DELETE:
+			deleteLink(link);
+			break;
+		}
 	}
 
+	@Override
+	public void addLink(Link link) {
+		addLinkImpl(link, DM_OPERATION.INSERT);
+	}
+	
 	/**
 	 * Update multiple records in the LinkStorage in a way provided by op.
 	 * @param links List of records to be updated.
 	 * @param op Operation to be done.
 	 */
 	@Override
-	public void update(List<Link> links, DM_OPERATION op) {
+	public void addLinks(List<Link> links) {
 		for (Link lt: links) {
-			update(lt, (LinkInfo)null, op);
+			addLinkImpl(lt, DM_OPERATION.INSERT);
+		}
+	}
+
+	/**
+		 * Delete a record in the LinkStorage.
+		 * @param lt Record to be deleted.
+		 */
+		@Override
+		public void deleteLink(Link lt) {
+			IPortObject vportSrc = null, vportDst = null;
+			
+			log.debug("deleteLink(): {}", lt);
+			
+	        try {
+	            // get source port vertex
+	         	String dpid = HexString.toHexString(lt.getSrc());
+	         	short port = lt.getSrcPort();
+	         	vportSrc = dbop.searchPort(dpid, port);
+	            
+	            // get dst port vertex
+	         	dpid = HexString.toHexString(lt.getDst());
+	         	port = lt.getDstPort();
+	         	vportDst = dbop.searchPort(dpid, port);
+	     		// FIXME: This needs to remove all edges
+	         	
+	         	if (vportSrc != null && vportDst != null) {
+	         		vportSrc.removeLink(vportDst);
+	        		dbop.commit();
+	            	log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
+	            			lt, vportSrc, vportDst});
+	            	
+	        		// TODO publish DELETE_LINK event here
+	            } else {
+	            	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
+	            	dbop.rollback();
+	            }
+	         	
+	        } catch (TitanException e) {
+	            /*
+	             * retry till we succeed?
+	             */
+	        	log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
+	        	dbop.rollback();
+	        	e.printStackTrace();
+	        }
+		}
+
+	/**
+	 * Delete multiple records in LinkStorage.
+	 * @param links List of records to be deleted.
+	 */
+	@Override
+	public void deleteLinks(List<Link> links) {
+		for (Link lt : links) {
+			deleteLink(lt);
 		}
 	}
 
@@ -55,30 +140,28 @@
 	 * @param linkinfo Meta-information of a link to be updated.
 	 * @param op Operation to be done.
 	 */
-	@Override
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
-		switch (op) {
-		case UPDATE:
-		case CREATE:
-		case INSERT:
-			updateLink(link, linkinfo, op);
-			break;
-		case DELETE:
-			deleteLink(link);
-			break;
-		}
+	private void setLinkInfo(Link link, LinkInfo linkinfo) {
+		// TODO implement this
+		
+		// TODO publish UPDATE_LINK event here
 	}
 	
+	private void deleteLinkInfo(Link link) {
+		// TODO implement this
+		
+		// TODO publish UPDATE_LINK event here
+	}
+
 	/**
 	 * Perform INSERT/CREATE/UPDATE operation to update the LinkStorage.
 	 * @param lt Record of a link to be updated.
 	 * @param linkinfo Meta-information of a link to be updated.
 	 * @param op Operation to be done. (only INSERT/CREATE/UPDATE is acceptable)
 	 */
-	public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
+	private void addLinkImpl(Link lt, DM_OPERATION op) {
 		IPortObject vportSrc = null, vportDst = null;
 	
-		log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
+		log.trace("updateLink(): op {} {}", new Object[]{op, lt});
 		
         try {
             // get source port vertex
@@ -101,7 +184,6 @@
             	}
 
             	if (currLinks.contains(vportDst)) {
-            		// TODO: update linkinfo
             		if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
             			log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}", 
             					new Object[]{op, lt, vportSrc, vportDst});
@@ -111,6 +193,8 @@
 
             		dbop.commit();
             		log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
+            		
+            		// TODO publish ADD_LINK event here
             	}
             } else {
             	log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
@@ -126,78 +210,11 @@
 	}
 	
 	/**
-	 * Delete multiple records in LinkStorage.
-	 * @param links List of records to be deleted.
-	 */
-	@Override
-	public void deleteLinks(List<Link> links) {
-
-		for (Link lt : links) {
-			deleteLink(lt);
-		}
-	}
-	
-	/**
-	 * Delete a record in the LinkStorage.
-	 * @param lt Record to be deleted.
-	 */
-	@Override
-	public void deleteLink(Link lt) {
-		IPortObject vportSrc = null, vportDst = null;
-		
-		log.debug("deleteLink(): {}", lt);
-		
-        try {
-            // get source port vertex
-         	String dpid = HexString.toHexString(lt.getSrc());
-         	short port = lt.getSrcPort();
-         	vportSrc = dbop.searchPort(dpid, port);
-            
-            // get dst port vertex
-         	dpid = HexString.toHexString(lt.getDst());
-         	port = lt.getDstPort();
-         	vportDst = dbop.searchPort(dpid, port);
-     		// FIXME: This needs to remove all edges
-         	
-         	if (vportSrc != null && vportDst != null) {
-/*
-        		int count = 0;
-         		for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
-         			log.debug("deleteLink(): {} in {} out {}", 
-         					new Object[]{e.getLabel(), e.getVertex(Direction.IN), e.getVertex(Direction.OUT)});
-         			if (e.getLabel().equals("link") && e.getVertex(Direction.IN).equals(vportDst)) {
-         				graph.removeEdge(e);
-         				count++;
-         			}
-         		}
-*/
-         		vportSrc.removeLink(vportDst);
-        		dbop.commit();
-            	log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
-            			lt, vportSrc, vportDst});
-            	
-            } else {
-            	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
-            	dbop.rollback();
-            }
-         	
-        } catch (TitanException e) {
-            /*
-             * retry till we succeed?
-             */
-        	log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
-        	dbop.rollback();
-        	e.printStackTrace();
-        }
-	}
-
-	/**
 	 * Get list of all links connected to the port specified by given DPID and port number.
 	 * @param dpid DPID of desired port.
 	 * @param port Port number of desired port.
 	 * @return List of links. Empty list if no port was found.
 	 */
-	// TODO: Fix me
 	@Override
 	public List<Link> getLinks(Long dpid, short port) {
     	List<Link> links = new ArrayList<Link>();
@@ -221,24 +238,13 @@
 	}
 	
 	/**
-	 * Initialize the object. Open LinkStorage using given configuration file.
-	 * @param conf Path (absolute path for now) to configuration file.
-	 */
-	@Override
-	public void init(String conf) {
-		//TODO extract the DB location from properties
-		this.dbop = new GraphDBOperation(conf);
-	}
-
-	/**
 	 * Delete records of the links connected to the port specified by given DPID and port number.
 	 * @param dpid DPID of desired port.
 	 * @param port Port number of desired port.
 	 */
-	// TODO: Fix me
 	@Override
 	public void deleteLinksOnPort(Long dpid, short port) {
-		List<Link> linksToDelete = getLinks(dpid,port);
+		List<Link> linksToDelete = getLinks(dpid, port);
 		
 		for(Link l : linksToDelete) {
 			deleteLink(l);
@@ -250,7 +256,6 @@
 	 * @param dpid DPID of desired switch.
 	 * @return List of links. Empty list if no port was found.
 	 */
-	// TODO: Fix me
 	@Override
 	public List<Link> getLinks(String dpid) {
 		List<Link> links = new ArrayList<Link>();
@@ -302,12 +307,34 @@
 		return links;
 	}
 	
+	@Override
+	public LinkInfo getLinkInfo(Link link) {
+		// TODO implement this
+		return null;
+	}
+
+	/**
+	 * Finalize the object.
+	 */
+	public void finalize() {
+		close();
+	}
+
+	/**
+	 * Close LinkStorage.
+	 */
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+//		graph.shutdown();		
+	}
+
+	// TODO should be moved to TopoLinkServiceImpl (never used in this class)
 	static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
 	
 		@SuppressWarnings("unchecked")
 		@Override
 		public Link compute(PathPipe<Vertex> pipe ) {
-			// TODO Auto-generated method stub
 			long s_dpid = 0;
 			long d_dpid = 0;
 			short s_port = 0;
@@ -328,22 +355,6 @@
 			return l;
 		}
 	}
-	
-	/**
-	 * Finalize the object.
-	 */
-	public void finalize() {
-		close();
-	}
-
-	/**
-	 * Close LinkStorage.
-	 */
-	@Override
-	public void close() {
-		// TODO Auto-generated method stub
-//		graph.shutdown();		
-	}
 
 
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
index b7c97f8..d9f24e0 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
@@ -1,5 +1,8 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import net.floodlightcontroller.core.IOFSwitch;
 import net.onrc.onos.graph.GraphDBConnection;
 import net.onrc.onos.graph.GraphDBOperation;
@@ -55,6 +58,7 @@
 				sw.setState(state.toString());
 				op.commit();
 				log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
+			    // TODO publish UPDATE_SWITCH event here
 			}
 		} catch(Exception e) {
 			e.printStackTrace();
@@ -64,43 +68,6 @@
 	}
 
 	/***
-	 * This function is for adding the switch into the DB.
-	 * @param dpid The switch dpid you want to add into the DB.
-	 */
-	@Override
-	public void addSwitch(String dpid) {
-		
-		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
-		try {
-			ISwitchObject sw = newSwitch(dpid);
-			if ( sw == null ) throw new RuntimeException();
-            op.commit();
-		} catch (Exception e) {
-			e.printStackTrace();
-			op.rollback();
-			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
-		}
-	}
-	
-	private ISwitchObject newSwitch(String dpid) {
-		ISwitchObject sw = op.searchSwitch(dpid);
-		if (sw != null) {
-			//If existing the switch. set The SW state ACTIVE. 
-			log.info("SwitchStorage:newSwitch dpid:{} already exists", dpid);
-			sw.setState(SwitchState.ACTIVE.toString());
-		} else {
-			sw = op.newSwitch(dpid);
-			if (sw != null) {
-				sw.setState(SwitchState.ACTIVE.toString());
-				log.info("SwitchStorage:newSwitch dpid:{} added", dpid);
-			} else {
-				log.error("switchStorage:newSwitch dpid:{} failed -> newSwitch failed", dpid);
-			}
-		}
-		return sw;
-	}
-	
-	/***
 	 * This function is for updating the switch into the DB.
 	 * @param dpid The switch dpid you want to update from the DB
 	 * @param state The state of the switch like ACTIVE, INACTIVE
@@ -109,20 +76,193 @@
 	@Override
 	public void update(String dpid, SwitchState state, DM_OPERATION dmope) {
 		log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
-        switch(dmope) {
-        	case UPDATE:
-        	case INSERT:
-        	case CREATE:
-                addSwitch(dpid);
-                if (state != SwitchState.ACTIVE) {
-                	setStatus(dpid, state);
-                }
-                break;
-        	case DELETE:
-                deleteSwitch(dpid);
-                break;
-        	default:
-        }
+	    switch(dmope) {
+	    	case UPDATE:
+	    	case INSERT:
+	    	case CREATE:
+	            addSwitch(dpid);
+	            if (state != SwitchState.ACTIVE) {
+	            	setStatus(dpid, state);
+	            }
+	            break;
+	    	case DELETE:
+	            deleteSwitch(dpid);
+	            break;
+	    	default:
+	    }
+	}
+
+	/***
+	 * This function is for adding the switch port into the DB.
+	 * @param dpid The switch dpid that has the port.
+	 * @param port The port you want to add the switch.
+	 */
+	@Override
+	public void addPort(String dpid, OFPhysicalPort port) {
+		
+	   if(((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
+	    					((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0)) {
+		     deletePort(dpid, port.getPortNumber());
+	         return;  
+	   }
+	
+		try {
+			ISwitchObject sw = op.searchSwitch(dpid);
+	
+	        if (sw != null) {
+	        	IPortObject p = op.searchPort(dpid, port.getPortNumber());
+	        	log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
+	        	if (p != null) {
+	        		log.error("SwitchStorage:addPort dpid:{} port:{} exists setting as ACTIVE", dpid, port.getPortNumber());
+	        		p.setState("ACTIVE");
+	        		p.setPortState(port.getState());
+	        		p.setDesc(port.getName());
+	        		op.commit();
+	        		
+	    		    // TODO publish UPDATE_PORT event here
+	        	} else {
+	        		p = op.newPort(dpid, port.getPortNumber());
+	        		p.setState("ACTIVE");
+	        		p.setPortState(port.getState());
+	        		p.setDesc(port.getName());
+	        		sw.addPort(p);
+	        		op.commit();
+	        		
+	    		    // TODO publish ADD_PORT event here
+	        	}
+	        } else {
+	    		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
+	        }
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
+		}	
+	
+	}
+
+	/***
+	 * This function is for deleting the switch port from the DB.
+	 * @param dpid The switch dpid that has the port.
+	 * @param port The port you want to delete the switch.
+	 */
+	@Override
+	public void deletePort(String dpid, short port) {
+		try {
+			ISwitchObject sw = op.searchSwitch(dpid);
+	
+	        if (sw != null) {
+	        	IPortObject p = op.searchPort(dpid, port);
+	            if (p != null) {
+	        		log.info("SwitchStorage:deletePort dpid:{} port:{} found and set INACTIVE", dpid, port);
+	        		p.setState("INACTIVE");
+	        		op.commit();
+	    		    // TODO publish DELETE_PORT event here
+	        	}
+	        }
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
+		}	
+	}
+
+	@Override
+	public void addSwitch(IOFSwitch sw) {
+		String dpid = sw.getStringId();
+		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
+		
+		ISwitchObject curr = op.searchSwitch(dpid);
+		if (curr != null) {
+			//If existing the switch. set The SW state ACTIVE. 
+			log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+			setSwitchStateImpl(curr, SwitchState.ACTIVE);
+		} else {
+			curr = addSwitchImpl(dpid);
+		}
+
+		try {
+			List<IPortObject> added_ports = new ArrayList<IPortObject>();
+			List<IPortObject> updated_ports = new ArrayList<IPortObject>();
+			for (OFPhysicalPort port: sw.getPorts()) {
+				IPortObject p = op.searchPort(dpid, port.getPortNumber());
+				if (p != null) {
+		    		log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
+		    		p.setState("ACTIVE");
+		    		p.setPortState(port.getState());
+		    		p.setDesc(port.getName());
+		    		
+		       		added_ports.add(p);
+				} else {
+		    		p = op.newPort(dpid, port.getPortNumber());
+		    		p.setState("ACTIVE");
+		    		p.setPortState(port.getState());
+		    		p.setDesc(port.getName());           		
+		    		curr.addPort(p);
+		    		
+		       		updated_ports.add(p);
+				}         		
+			}
+	
+			op.commit();
+		    
+		    // TODO publish ADD_PORT event here
+		    // TODO publish UPDATE_PORT event here
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
+		}		
+	}
+
+	/***
+	 * This function is for adding the switch into the DB.
+	 * @param dpid The switch dpid you want to add into the DB.
+	 */
+	@Override
+	public void addSwitch(String dpid) {
+		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
+		
+		ISwitchObject sw = op.searchSwitch(dpid);
+		if (sw != null) {
+			//If existing the switch. set The SW state ACTIVE. 
+			log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+			setSwitchStateImpl(sw, SwitchState.ACTIVE);
+		} else {
+			addSwitchImpl(dpid);
+		}
+	}
+	
+	private ISwitchObject addSwitchImpl(String dpid) {
+		try {
+			ISwitchObject sw = op.newSwitch(dpid);
+			if (sw != null) {
+				sw.setState(SwitchState.ACTIVE.toString());
+				log.info("SwitchStorage:addSwitchImpl dpid:{} added", dpid);
+			} else {
+				log.error("switchStorage:addSwitchImpl dpid:{} failed", dpid);
+				throw new RuntimeException();
+			}
+
+            op.commit();
+            
+            // TODO publish ADD_SWITCH event here
+    		return sw;
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.info("SwitchStorage:addSwitchImpl dpid:{} failed", dpid);
+			return null;
+		}
+	}
+	
+	private void setSwitchStateImpl(ISwitchObject sw, SwitchState state) {
+		if (sw != null && state != null) {
+			sw.setState(state.toString());
+            op.commit();
+            
+			// TODO publish UPDATE_SWITCH event here
+		}
 	}
 
 	/***
@@ -137,6 +277,8 @@
             	op.removeSwitch(sw);
             	op.commit();
             	log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
+
+            	// TODO publish DELETE_SWITCH event here
             }
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -145,105 +287,5 @@
 		}
 
 	}
-
-	/***
-	 * This function is for adding the switch port into the DB.
-	 * @param dpid The switch dpid that has the port.
-	 * @param port The port you want to add the switch.
-	 */
-	@Override
-	public void addPort(String dpid, OFPhysicalPort port) {
-		
-       if(((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
-        					((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0)) {
-    	     deletePort(dpid, port.getPortNumber());
-             return;  
-       }
-
-		try {
-			ISwitchObject sw = op.searchSwitch(dpid);
-
-            if (sw != null) {
-            	IPortObject p = op.searchPort(dpid, port.getPortNumber());
-            	log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
-            	if (p != null) {
-            		log.error("SwitchStorage:addPort dpid:{} port:{} exists setting as ACTIVE", dpid, port.getPortNumber());
-            		p.setState("ACTIVE");
-            		p.setPortState(port.getState());
-            		p.setDesc(port.getName());
-            		op.commit();
-            	} else {
-            		p = op.newPort(dpid, port.getPortNumber());
-            		p.setState("ACTIVE");
-            		p.setPortState(port.getState());
-            		p.setDesc(port.getName());
-            		sw.addPort(p);
-            		op.commit();
-            	}
-            } else {
-        		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
-            }
-		} catch (Exception e) {
-			e.printStackTrace();
-			op.rollback();
-			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
-		}	
-
-	}
 	
-	/***
-	 * This function is for deleting the switch port from the DB.
-	 * @param dpid The switch dpid that has the port.
-	 * @param port The port you want to delete the switch.
-	 */
-	@Override
-	public void deletePort(String dpid, short port) {
-		try {
-			ISwitchObject sw = op.searchSwitch(dpid);
-
-            if (sw != null) {
-            	IPortObject p = op.searchPort(dpid, port);
-                if (p != null) {
-            		log.info("SwitchStorage:deletePort dpid:{} port:{} found and set INACTIVE", dpid, port);
-            		p.setState("INACTIVE");
-            		op.commit();
-            	}
-            }
-		} catch (Exception e) {
-			e.printStackTrace();
-			op.rollback();
-			log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
-		}	
-	}
-
-	@Override
-	public void addSwitch(IOFSwitch sw) {
-		// TODO Auto-generated method stub
-		String dpid = sw.getStringId();
-		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
-		try {
-			ISwitchObject switchObject = newSwitch(dpid);
-        	for (OFPhysicalPort port: sw.getPorts()) {
-        		IPortObject p = op.searchPort(dpid, port.getPortNumber());
-        		if (p != null) {
-            		log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
-            		p.setState("ACTIVE");
-            		p.setPortState(port.getState());
-            		p.setDesc(port.getName());
-            	} else {
-            		p = op.newPort(dpid, port.getPortNumber());
-            		p.setState("ACTIVE");
-            		p.setPortState(port.getState());
-            		p.setDesc(port.getName());           		
-            		switchObject.addPort(p);
-            	}         		
-        	}
-            op.commit();
-		} catch (Exception e) {
-			e.printStackTrace();
-			op.rollback();
-			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
-		}		
-		
-	}
 }
\ No newline at end of file
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 e0ac4e1..046a38b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -40,6 +40,7 @@
 import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
+import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
 import net.onrc.onos.registry.controller.IControllerRegistryService;
 import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
 import net.onrc.onos.registry.controller.RegistryException;
@@ -132,18 +133,20 @@
 		switch (update.getOperation()) {
 			case LINK_REMOVED:
 				log.debug("LinkDiscoveryUpdate(): Removing link {}", lt);
-				linkStore.update(lt, DM_OPERATION.DELETE);
+				linkStore.deleteLink(lt);
 				// TODO: Move network map link removal here
 				// reconcile paths here
 //				IPortObject srcPort = conn.utils().searchPort(conn, HexString.toHexString(update.getSrc()), update.getSrcPort());
 				break;
 			case LINK_UPDATED:
 				log.debug("LinkDiscoveryUpdate(): Updating link {}", lt);
-				linkStore.update(lt, DM_OPERATION.UPDATE);
+				LinkInfo linfo = linkStore.getLinkInfo(lt);
+				// TODO update "linfo" using portState derived using "update"
+				linkStore.update(lt, linfo, DM_OPERATION.UPDATE);
 				break;
 			case LINK_ADDED:
 				log.debug("LinkDiscoveryUpdate(): Adding link {}", lt);
-				linkStore.update(lt, DM_OPERATION.INSERT);
+				linkStore.addLink(lt);
 				break;
 					
 			default:
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
index 9b1c4d6..2d0e0d0 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
@@ -1,8 +1,6 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -134,12 +132,41 @@
 		linkStorage.close();
 	}
 	
+
+	/**
+	 * Test if {@link LinkStorageImpl#addLink(Link)} can correctly creates a Link.
+	 */
+	@Test
+	public void testAddLink() {
+		Link linkToCreate = createFeasibleLink();
+		Link linkToVerify = createFeasibleLink();
+		
+		//Use the link storage API to add the link
+		linkStorage.addLink(linkToCreate);
+		doTestLinkExist(linkToVerify);
+	}
+	
+	/**
+	 * Test if {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly creates multiple Links.
+	 */
+	@Test
+	public void testAddLinks() {
+		List<Link> linksToCreate = createFeasibleLinks();
+		List<Link> linksToVerify = createFeasibleLinks();
+	
+		// Test creation of new links
+		linkStorage.addLinks(linksToCreate);
+		for(Link l : linksToVerify) {
+			doTestLinkExist(l);
+		}
+	}
+
 	// TODO: remove @Ignore after UPDATE method is implemented
 	/**
-	 * Test if {@link LinkStorageImpl#update(Link, LinkInfo, DM_OPERATION)} can correctly updates LinkInfo for a Link.
+	 * Test if {@link LinkStorageImpl#updateLinkInfo(Link, LinkInfo, DM_OPERATION)} can correctly updates LinkInfo for a Link.
 	 */
 	@Ignore @Test
-	public void testUpdate_UpdateSingleLink() {
+	public void testUpdate_Update() {
 		Link linkToUpdate= createExistingLink();
 		long currentTime = System.currentTimeMillis();
 		LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
@@ -154,12 +181,12 @@
 	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)} can correctly creates a Link.
 	 */
 	@Test
-	public void testUpdate_CreateSingleLink() {
+	public void testUpdate_Create() {
 		Link linkToCreate = createFeasibleLink();
 		Link linkToVerify = createFeasibleLink();
 		
 		//Use the link storage API to add the link
-		linkStorage.update(linkToCreate, ILinkStorage.DM_OPERATION.CREATE);
+		linkStorage.update(linkToCreate, null, ILinkStorage.DM_OPERATION.CREATE);
 		doTestLinkExist(linkToVerify);
 	}
 
@@ -167,12 +194,12 @@
 	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)}can correctly inserts a Link.
 	 */
 	@Test
-	public void testUpdate_InsertSingleLink(){
+	public void testUpdate_Insert(){
 		Link linkToInsert = createFeasibleLink();
 		Link linkToVerify = createFeasibleLink();
 		
 		//Use the link storage API to add the link
-		linkStorage.update(linkToInsert, ILinkStorage.DM_OPERATION.INSERT);
+		linkStorage.update(linkToInsert, null, ILinkStorage.DM_OPERATION.INSERT);
 		doTestLinkExist(linkToVerify);
 	}
 	
@@ -180,125 +207,16 @@
 	 * Test if {@link LinkStorageImpl#update(Link, DM_OPERATION)} can correctly deletes a Link.
 	 */
 	@Test
-	public void testUpdate_DeleteSingleLink(){
+	public void testUpdate_Delete(){
 		Link linkToDelete = createExistingLink();
 		Link linkToVerify = createExistingLink();
 
 		// Test deletion of existing link
-		linkStorage.update(linkToDelete, DM_OPERATION.DELETE);
+		linkStorage.update(linkToDelete, null, DM_OPERATION.DELETE);
 		doTestLinkNotExist(linkToVerify);
 	}
 
 	/**
-	 * Test if {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly creates multiple Links.
-	 */
-	@Test
-	public void testUpdate_CreateLinks(){
-		List<Link> linksToCreate = createFeasibleLinks();
-		List<Link> linksToVerify = createFeasibleLinks();
-
-		// Test creation of new links
-		linkStorage.update(linksToCreate, ILinkStorage.DM_OPERATION.CREATE);
-		for(Link l : linksToVerify) {
-			doTestLinkExist(l);
-		}
-	}
-
-	/**
-	 * Test if {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly inserts multiple Links.
-	 */
-	@Test
-	public void testUpdate_InsertLinks(){
-		List<Link> linksToInsert = createFeasibleLinks();
-		List<Link> linksToVerify = createFeasibleLinks();
-		
-		// Test insertion of new links
-		linkStorage.update(linksToInsert, ILinkStorage.DM_OPERATION.INSERT);
-		for(Link l : linksToVerify) {
-			doTestLinkExist(l);
-		}
-	}
-	
-	/**
-	 * Test if  {@link LinkStorageImpl#update(List, DM_OPERATION)} can correctly deletes multiple Links.
-	 */
-	@Test
-	public void testUpdate_DeleteLinks(){
-		List<Link> linksToDelete = createExistingLinks();
-		List<Link> linksToVerify = createExistingLinks();
-		
-		// Test deletion of existing links
-		linkStorage.update(linksToDelete, ILinkStorage.DM_OPERATION.DELETE);
-		for(Link l : linksToVerify) {
-			doTestLinkNotExist(l);
-		}
-	}
-	
-	// TODO: remove @Ignore after UPDATE method is implemented
-	/**
-	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly updates LinkInfo for a Link.
-	 */
-	@Ignore @Test
-	public void testUpdateLink_Update() {
-		Link linkToUpdate= createExistingLink();
-		long currentTime = System.currentTimeMillis();
-		LinkInfo infoToUpdate = createFeasibleLinkInfo(currentTime);
-		LinkInfo infoToVerify = createFeasibleLinkInfo(currentTime);
-
-		linkStorage.updateLink(linkToUpdate, infoToUpdate, ILinkStorage.DM_OPERATION.UPDATE);
-		
-		doTestLinkHasStateOf(linkToUpdate, infoToVerify);
-	}
-	
-	/**
-	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly creates a Link.
-	 */
-	@Test
-	public void testUpdateLink_Create() {
-		Link linkToCreate = createFeasibleLink();
-		Link linkToVerify = createFeasibleLink();
-		
-		//Use the link storage API to add the link
-		linkStorage.updateLink(linkToCreate, null, ILinkStorage.DM_OPERATION.CREATE);
-		doTestLinkExist(linkToVerify);
-	}
-	
-	/**
-	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly inserts a Link.
-	 */
-	@Test
-	public void testUpdateLink_Insert() {
-		Link linkToInsert = createFeasibleLink();
-		Link linkToVerify = createFeasibleLink();
-		
-		//Use the link storage API to add the link
-		linkStorage.updateLink(linkToInsert, null, ILinkStorage.DM_OPERATION.INSERT);
-
-		doTestLinkExist(linkToVerify);
-	}
-	
-	// TODO: Check if addOrUpdateLink() should accept DELETE operation. If not, remove this test.
-	/**
-	 * Test if {@link LinkStorageImpl#updateLink(Link, LinkInfo, DM_OPERATION)} can correctly deletes a Link.
-	 */
-	@Ignore @Test
-	public void testUpdateLink_Delete() {
-		Link linkToDelete = createExistingLink();
-		Link linkToVerify = createExistingLink();
-
-		// Test deletion of existing link
-		linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
-		doTestLinkNotExist(linkToVerify);
-		
-		linkToDelete = createFeasibleLink();
-		linkToVerify = createFeasibleLink();
-
-		// Test deletion of not-existing link
-		linkStorage.updateLink(linkToDelete, null, DM_OPERATION.DELETE);
-		doTestLinkNotExist(linkToVerify);
-	}
-	
-	/**
 	 * Test if {@link LinkStorageImpl#getLinks(Long, short)} can correctly return Links connected to specific DPID and port.
 	 */
 	@Test
@@ -392,6 +310,14 @@
 		
 		doTestLinkNotExist(linkToVerify);
 	}
+	
+	/**
+	 * Test if {@link LinkStorageImpl#getLinkInfo(Link)} can delete Links.
+	 */
+	@Ignore @Test
+	public void testGetLinkInfo() {
+		fail("not yet implemented");
+	}
 
 	/**
 	 * Test if specific link exists