Single Graph handle across all controller
diff --git a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
index 73b21fe..4a03327 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapTopologyObjects.java
@@ -44,10 +44,11 @@
 		@JsonProperty("ports")
 		@Adjacency(label="on")
 		public Iterable<IPortObject> getPorts();
-		
-		@JsonIgnore
-		@GremlinGroovy("_().out('on').has('number',port_num)")
-		public IPortObject getPort(final short port_num);
+
+// Requires Frames 2.3.0		
+//		@JsonIgnore
+//		@GremlinGroovy("_().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);
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index f040881..b8197b7 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -48,7 +48,7 @@
 			log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
 		} 	else {
 			conn.endTx(Transaction.ROLLBACK);
-			log.info("SwitchStorage:setStatus dpid:{} state: {} failed", dpid, state);
+			log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
 		}
 	}
 
@@ -83,9 +83,12 @@
             		conn.endTx(Transaction.COMMIT);
   
             	}
+            } else {
+        		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
+			e.printStackTrace();
 			conn.endTx(Transaction.ROLLBACK);
 			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
 		}	
@@ -115,32 +118,37 @@
 		
 		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
 		
-        try {
-        	ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
-            if (sw != null) {
-                    /*
-                     *  Do nothing or throw exception?
-                     */
-            	
-            		log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
-            		sw.setState(SwitchState.ACTIVE.toString());
-            		conn.endTx(Transaction.COMMIT);
-            } else {
-                    sw = conn.utils().newSwitch(conn);
+		try {
+			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			if (sw != null) {
+				/*
+				 *  Do nothing or throw exception?
+				 */
 
-                    sw.setType("switch");
-                    sw.setDPID(dpid);
-                    sw.setState(SwitchState.ACTIVE.toString());
-                    conn.endTx(Transaction.COMMIT);
-                    log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
-            }
-    } catch (Exception e) {
-            /*
-             * retry?
-             */
-    	conn.endTx(Transaction.ROLLBACK);
-    	log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
-    }
+				log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+				sw.setState(SwitchState.ACTIVE.toString());
+				conn.endTx(Transaction.COMMIT);
+			} else {
+				sw = conn.utils().newSwitch(conn);
+
+				if (sw != null) {
+					sw.setType("switch");
+					sw.setDPID(dpid);
+					sw.setState(SwitchState.ACTIVE.toString());
+					conn.endTx(Transaction.COMMIT);
+					log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
+				} else {
+					log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
+				}
+			}
+		} catch (Exception e) {
+			/*
+			 * retry?
+			 */
+			e.printStackTrace();
+			conn.endTx(Transaction.ROLLBACK);
+			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
+		}
 
 
 	}
@@ -160,6 +168,7 @@
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
+			e.printStackTrace();
 			conn.endTx(Transaction.ROLLBACK);			
 			log.error("SwitchStorage:deleteSwitch {} failed", dpid);
 		}
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index 9f63fd7..931802e 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -1,14 +1,14 @@
 package net.floodlightcontroller.core.internal;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
 import net.onrc.onos.util.GraphDBConnection;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class TopoSwitchServiceImpl implements ITopoSwitchService {
 	
 	private GraphDBConnection conn;
@@ -21,7 +21,7 @@
 	
 	@Override
 	public void close() {
-		conn.endTx(Transaction.COMMIT);
+
 		conn.close();
 	}
 	
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 0ab52e2..d62d65b 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -1,9 +1,7 @@
 package net.floodlightcontroller.linkdiscovery.internal;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
@@ -13,7 +11,6 @@
 import net.floodlightcontroller.linkdiscovery.LinkInfo;
 import net.floodlightcontroller.routing.Link;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
 
 import org.openflow.util.HexString;
@@ -21,20 +18,15 @@
 import org.slf4j.LoggerFactory;
 
 import com.thinkaurelius.titan.core.TitanException;
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
 import com.tinkerpop.blueprints.Direction;
-import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
-import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.blueprints.Edge;
-import com.tinkerpop.blueprints.util.wrappers.event.EventGraph;
-import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
+import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.gremlin.java.GremlinPipeline;
 import com.tinkerpop.pipes.PipeFunction;
 import com.tinkerpop.pipes.transform.PathPipe;
 
 public class LinkStorageImpl implements ILinkStorage {
-	public TitanGraph graph;
+	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
 	protected String conf;
 
@@ -63,18 +55,6 @@
 			break;
 		}
 	}
-
-	private Vertex getPortVertex(String dpid, short port) {
-		Vertex vsw, vport = null;
-        if ((vsw = graph.getVertices("dpid", dpid).iterator().next()) != null) {
-        	GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();        	
-        	pipe.start(vsw).out("on").has("number", port);
-        	if (pipe.hasNext()) {
-        		vport = pipe.next();
-        	}
-        }
-        return vport;
-	}
 	
 	public void addOrUpdateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
 		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
@@ -96,9 +76,9 @@
             if (vportSrc != null && vportDst != null) {
          	       	
             	// check if the link exists
-            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
-            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
             	
+            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
+            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
             	for (IPortObject V : currPorts) {
             		currLinks.add(V);
             	}
@@ -110,20 +90,21 @@
             					new Object[]{op, lt, vportSrc, vportDst});
             		}
             	} else {
-            		conn.getFramedGraph().addEdge(null, vportSrc.asVertex(), vportDst.asVertex(), "link");
+            		vportSrc.setLinkPort(vportDst);
+
             		conn.endTx(Transaction.COMMIT);
             		log.debug("addOrUpdateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
             	}
             } else {
             	log.error("addOrUpdateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+ //           	conn.endTx(Transaction.ROLLBACK);
             }
         } catch (TitanException e) {
             /*
              * retry till we succeed?
              */
-        	log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
         	e.printStackTrace();
+        	log.error("addOrUpdateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
         }
 	}
 	
@@ -155,7 +136,6 @@
          	port = lt.getDstPort();
          	vportDst = conn.utils().searchPort(conn, dpid, port);
      		// FIXME: This needs to remove all edges
-         	// FIXME: Events will only be generated on singleton graph object (GraphDBConnection)
          	
          	if (vportSrc != null && vportDst != null) {
 
@@ -174,7 +154,7 @@
             	
             } else {
             	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+//            	conn.endTx(Transaction.ROLLBACK);
             }
          	
         } catch (TitanException e) {
@@ -189,13 +169,15 @@
 	// TODO: Fix me
 	@Override
 	public List<Link> getLinks(Long dpid, short port) {
-		Vertex vportSrc, vportDst;
+		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
+		IPortObject vportSrc, vportDst;
     	List<Link> links = null;
     	Link lt;
     	
-		vportSrc = getPortVertex(HexString.toHexString(dpid), port);
+		vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
 		if (vportSrc != null) {
-     		for (Edge e : vportSrc.getEdges(Direction.OUT)) {
+			
+     		for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
      			if (e.getLabel().equals("link")) {
      				break;
      			}
@@ -209,18 +191,7 @@
 		//TODO extract the DB location from properties
 	
 		this.conf = conf;
-        graph = TitanFactory.open(this.conf);
-        
-        // FIXME: These keys are not needed for Links but we better create it before using it as per titan
-        Set<String> s = graph.getIndexedKeys(Vertex.class);
-        if (!s.contains("dpid")) {
-           graph.createKeyIndex("dpid", Vertex.class);
-           graph.stopTransaction(Conclusion.SUCCESS);
-        }
-        if (!s.contains("type")) {
-        	graph.createKeyIndex("type", Vertex.class);
-        	graph.stopTransaction(Conclusion.SUCCESS);
-        }
+		
 	}
 
 	@Override
@@ -237,9 +208,9 @@
 
 	public List<Link> getActiveLinks() {
 
-		ITopoSwitchService swService = new TopoSwitchServiceImpl();
+		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
 		
-		Iterable<ISwitchObject> switches = swService.getActiveSwitches();
+		Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
 
 		List<Link> links = new ArrayList<Link>(); 
 		for (ISwitchObject sw : switches) {
@@ -292,7 +263,7 @@
 	@Override
 	public void close() {
 		// TODO Auto-generated method stub
-		graph.shutdown();		
+//		graph.shutdown();		
 	}
 
 
diff --git a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
index 6d8087b..e07196f 100644
--- a/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
+++ b/src/main/java/net/floodlightcontroller/onoslistener/OnosPublisher.java
@@ -51,7 +51,7 @@
 	protected static final String CleanupEnabled = "EnableCleanup";
 	protected IThreadPoolService threadPool;
 	
-	protected final int CLEANUP_TASK_INTERVAL = 10; // 10 sec
+	protected final int CLEANUP_TASK_INTERVAL = 60; // 1 min
 	protected SingletonTask cleanupTask;
 	
 	/**