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 753563e..da34c22 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
@@ -14,7 +14,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.thinkaurelius.titan.core.TitanException;
 import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.pipes.PipeFunction;
 import com.tinkerpop.pipes.transform.PathPipe;
@@ -25,7 +24,7 @@
 public class LinkStorageImpl implements ILinkStorage {
 	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
-	protected GraphDBOperation dbop;
+	protected GraphDBOperation op;
 
 	
 	/**
@@ -34,37 +33,105 @@
 	 */
 	@Override
 	public void init(String conf) {
-		this.dbop = new GraphDBOperation(conf);
+		this.op = new GraphDBOperation(conf);
 	}
 
+	// Method designing policy:
+	//  op.commit() and op.rollback() MUST called in public (first-class) methods.
+	//  A first-class method MUST NOT call other first-class method.
+	//  Routine process should be implemented in private method.
+	//  A private method MUST NOT call commit or rollback.
+
+	
 	/**
-	 * Update a record in the LinkStorage in a way provided by op.
+	 * Update a record in the LinkStorage in a way provided by dmop.
 	 * @param link Record of a link to be updated.
-	 * @param op Operation to be done.
+	 * @param linkinfo Meta-information of a link to be updated.
+	 * @param dmop Operation to be done.
 	 */
 	@Override
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
-		switch (op) {
+	public boolean update(Link link, LinkInfo linkinfo, DM_OPERATION dmop) {
+		boolean success = false;
+		
+		switch (dmop) {
 		case CREATE:
 		case INSERT:
-			addLinkImpl(link,op);
+			if (link != null) {
+				try {
+					if (addLinkImpl(link)) {
+						op.commit();
+						success = true;
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+		        	log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
+			}
 			break;
 		case UPDATE:
-			if (linkinfo != null) {
-				setLinkInfo(link, linkinfo);
-			} else {
-				deleteLinkInfo(link);
+			if (link != null && linkinfo != null) {
+				try {
+					if (setLinkInfoImpl(link, linkinfo)) {
+						op.commit();
+						success = true;
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+		        	log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
 			}
 			break;
 		case DELETE:
-			deleteLink(link);
+			if (link != null) {
+				try {
+					if (deleteLinkImpl(link)) {
+						op.commit();
+						success = true;
+		            	log.debug("LinkStorageImpl:update {} link:{} succeeded", dmop, link);
+		            } else {
+						op.rollback();
+		            	log.debug("LinkStorageImpl:update {} link:{} failed", dmop, link);
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+					log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
+			}
 			break;
 		}
+		
+		return success;
 	}
 
 	@Override
-	public void addLink(Link link) {
-		addLinkImpl(link, DM_OPERATION.INSERT);
+	public boolean addLink(Link link) {
+		return addLink(link, null);
+	}
+
+	@Override
+	public boolean addLink(Link link, LinkInfo linfo) {
+		boolean success = false;
+		
+		try {
+			if (addLinkImpl(link)) {
+				// Set LinkInfo only if linfo is non-null.
+				if (linfo != null && (! setLinkInfoImpl(link, linfo))) {
+					op.rollback();
+				}
+				op.commit();
+				success = true;
+			} else {
+				op.rollback();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("LinkStorageImpl:addLink link:{} linfo:{} failed", link, linfo);
+		}
+		
+		return success;
 	}
 	
 	/**
@@ -73,143 +140,82 @@
 	 * @param op Operation to be done.
 	 */
 	@Override
-	public void addLinks(List<Link> links) {
+	public boolean addLinks(List<Link> links) {
+		boolean success = false;
+		
 		for (Link lt: links) {
-			addLinkImpl(lt, DM_OPERATION.INSERT);
+			if (! addLinkImpl(lt)) {
+				return false;
+			}
 		}
+		
+		try {
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("LinkStorageImpl:addLinks link:s{} failed", links);
+		}
+		
+		return success;
 	}
 
 	/**
-		 * 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 a record in the LinkStorage.
+	 * @param lt Record to be deleted.
+	 */
+	@Override
+	public boolean deleteLink(Link lt) {
+		boolean success = false;
+		
+		log.debug("LinkStorageImpl:deleteLink(): {}", lt);
+		
+        try {
+         	if (deleteLinkImpl(lt)) {
+        		op.commit();
+        		success = true;
+            	log.debug("LinkStorageImpl:deleteLink(): deleted edges {}", lt);
+            } else {
+            	op.rollback();
+            	log.error("LinkStorageImpl:deleteLink(): failed invalid vertices {}", lt);
+            }
+        } catch (Exception e) {
+        	op.rollback();
+        	log.error("LinkStorageImpl:deleteLink(): failed {} {}",
+        			new Object[]{lt, e.toString()});
+        	e.printStackTrace();
+        }
+        
+        return success;
+	}
 
 	/**
 	 * 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);
+	public boolean deleteLinks(List<Link> links) {
+		boolean success = false;
+		
+		try {
+			for (Link lt : links) {
+				if (! deleteLinkImpl(lt)) {
+					op.rollback();
+					return false;
+				}
+			}
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+        	op.rollback();
+			e.printStackTrace();
+        	log.error("LinkStorageImpl:deleteLinks failed invalid vertices {}", links);
 		}
-	}
-
-	/**
-	 * Update a record of link with meta-information in the LinkStorage in a way provided by op.
-	 * @param link Record of a link to update.
-	 * @param linkinfo Meta-information of a link to be updated.
-	 * @param op Operation to be done.
-	 */
-	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
+		return success;
 	}
 
 	/**
-	 * 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)
-	 */
-	private void addLinkImpl(Link lt, DM_OPERATION op) {
-		IPortObject vportSrc = null, vportDst = null;
-	
-		log.trace("updateLink(): op {} {}", new Object[]{op, lt});
-		
-        try {
-            // get source port vertex
-        	String dpid = HexString.toHexString(lt.getSrc());
-        	short port = lt.getSrcPort();
-        	vportSrc = dbop.searchPort(dpid, port);
-            
-            // get dest port vertex
-            dpid = HexString.toHexString(lt.getDst());
-            port = lt.getDstPort();
-            vportDst = dbop.searchPort(dpid, port);
-                        
-            if (vportSrc != null && vportDst != null) {
-            	// check if the link exists
-            	
-            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
-            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
-            	for (IPortObject V : currPorts) {
-            		currLinks.add(V);
-            	}
-
-            	if (currLinks.contains(vportDst)) {
-            		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});
-            		}
-            	} else {
-            		vportSrc.setLinkPort(vportDst);
-
-            		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});
-            	dbop.rollback();
-            }
-        } catch (TitanException e) {
-            /*
-             * retry till we succeed?
-             */
-        	e.printStackTrace();
-        	log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
-        }
-	}
-	
-	/**
 	 * 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.
@@ -219,7 +225,7 @@
 	public List<Link> getLinks(Long dpid, short port) {
     	List<Link> links = new ArrayList<Link>();
     	
-    	IPortObject srcPort = dbop.searchPort(HexString.toHexString(dpid), port);
+    	IPortObject srcPort = op.searchPort(HexString.toHexString(dpid), port);
     	ISwitchObject srcSw = srcPort.getSwitch();
     	
     	if(srcSw != null && srcPort != null) {
@@ -243,12 +249,27 @@
 	 * @param port Port number of desired port.
 	 */
 	@Override
-	public void deleteLinksOnPort(Long dpid, short port) {
-		List<Link> linksToDelete = getLinks(dpid, port);
+	public boolean deleteLinksOnPort(Long dpid, short port) {
+		boolean success = false;
 		
-		for(Link l : linksToDelete) {
-			deleteLink(l);
+		List<Link> linksToDelete = getLinks(dpid, port);
+		try {
+			for(Link l : linksToDelete) {
+				if (! deleteLinkImpl(l)) {
+					op.rollback();
+					log.error("LinkStorageImpl:deleteLinksOnPort dpid:{} port:{} failed", dpid, port);
+					return false;
+				}
+			}
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+        	op.rollback();
+			e.printStackTrace();
+        	log.error("LinkStorageImpl:deleteLinksOnPort dpid:{} port:{} failed", dpid, port);
 		}
+		
+		return success;
 	}
 
 	/**
@@ -260,7 +281,7 @@
 	public List<Link> getLinks(String dpid) {
 		List<Link> links = new ArrayList<Link>();
 
-		ISwitchObject srcSw = dbop.searchSwitch(dpid);
+		ISwitchObject srcSw = op.searchSwitch(dpid);
 		
 		if(srcSw != null) {
 			for(IPortObject srcPort : srcSw.getPorts()) {
@@ -285,7 +306,7 @@
 	 * @return List of active links. Empty list if no port was found.
 	 */
 	public List<Link> getActiveLinks() {
-		Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
+		Iterable<ISwitchObject> switches = op.getActiveSwitches();
 
 		List<Link> links = new ArrayList<Link>(); 
 		
@@ -329,6 +350,79 @@
 //		graph.shutdown();		
 	}
 
+	/**
+	 * Update a record of link with meta-information in the LinkStorage.
+	 * @param link Record of a link to update.
+	 * @param linkinfo Meta-information of a link to be updated.
+	 */
+	private boolean setLinkInfoImpl(Link link, LinkInfo linkinfo) {
+		// TODO implement this
+		
+		return false;
+	}
+
+	private boolean addLinkImpl(Link lt) {
+		boolean success = false;
+		
+		IPortObject vportSrc = null, vportDst = null;
+		
+		// get source port vertex
+		String dpid = HexString.toHexString(lt.getSrc());
+		short port = lt.getSrcPort();
+		vportSrc = op.searchPort(dpid, port);
+		
+		// get dest port vertex
+		dpid = HexString.toHexString(lt.getDst());
+		port = lt.getDstPort();
+		vportDst = op.searchPort(dpid, port);
+		            
+		if (vportSrc != null && vportDst != null) {
+			IPortObject portExist = null;
+			// check if the link exists
+			for (IPortObject V : vportSrc.getLinkedPorts()) {
+				if (V.equals(vportDst)) {
+					portExist = V;
+					break;
+				}
+			}
+		
+			if (portExist == null) {
+				vportSrc.setLinkPort(vportDst);
+				success = true;
+			} else {
+				log.debug("LinkStorageImpl:addLinkImpl failed link exists {} {} src {} dst {}", 
+						new Object[]{op, lt, vportSrc, vportDst});
+			}
+		}
+		
+		return success;
+	}
+
+	private boolean deleteLinkImpl(Link lt) {
+		boolean success = false;
+		IPortObject vportSrc = null, vportDst = null;
+	
+	    // get source port vertex
+	 	String dpid = HexString.toHexString(lt.getSrc());
+	 	short port = lt.getSrcPort();
+	 	vportSrc = op.searchPort(dpid, port);
+	    
+	    // get dst port vertex
+	 	dpid = HexString.toHexString(lt.getDst());
+	 	port = lt.getDstPort();
+	 	vportDst = op.searchPort(dpid, port);
+	 	
+		// FIXME: This needs to remove all edges
+	 	if (vportSrc != null && vportDst != null) {
+	 		vportSrc.removeLink(vportDst);
+	    	log.debug("deleteLinkImpl(): deleted edges src {} dst {}", new Object[]{
+	    			lt, vportSrc, vportDst});
+	    	success = true;
+	    }
+	    
+	 	return success;
+	}
+
 	// TODO should be moved to TopoLinkServiceImpl (never used in this class)
 	static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {
 	
