diff --git a/src/main/java/net/floodlightcontroller/core/INetMapTopologyService.java b/src/main/java/net/floodlightcontroller/core/INetMapTopologyService.java
index da00e0f..f0c7f7f 100644
--- a/src/main/java/net/floodlightcontroller/core/INetMapTopologyService.java
+++ b/src/main/java/net/floodlightcontroller/core/INetMapTopologyService.java
@@ -2,15 +2,16 @@
 
 import java.util.List;
 
+import net.floodlightcontroller.core.ISwitchStorage.ISwitchObject;
 import net.floodlightcontroller.routing.Link;
 import net.floodlightcontroller.topology.NodePortTuple;
 
 public interface INetMapTopologyService extends INetMapService {
 
 	public interface ITopoSwitchService {
-		List<String> GetActiveSwitches();
-		List<String> GetAllSwitches();
-		List<String> GetInactiveSwitches();
+		Iterable<ISwitchObject> GetActiveSwitches();
+		Iterable<ISwitchObject> GetAllSwitches();
+		Iterable<ISwitchObject> GetInactiveSwitches();
 		List<String> GetPortsOnSwitch(String dpid);
 	}
 	
@@ -24,7 +25,7 @@
 	}
 	
 	public interface ITopoRouteService {
-		List<NodePortTuple> GetShortestpath(NodePortTuple src, NodePortTuple dest);
+		List<NodePortTuple> GetShortestPath(NodePortTuple src, NodePortTuple dest);
 		Boolean RouteExists(NodePortTuple src, NodePortTuple dest);
 	}
 	
diff --git a/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java b/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
index 8060c4d..28e6a5d 100644
--- a/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
+++ b/src/main/java/net/floodlightcontroller/core/ISwitchStorage.java
@@ -3,15 +3,67 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.map.ser.StdSerializers;
 import org.openflow.protocol.OFPhysicalPort;
 
+import com.tinkerpop.blueprints.Direction;
+import com.tinkerpop.frames.Adjacency;
+import com.tinkerpop.frames.Incidence;
+import com.tinkerpop.frames.Property;
+
 public interface ISwitchStorage extends INetMapStorage {
 	
 	public enum SwitchState {
 		INACTIVE,
 		ACTIVE
 	}
+
+	public interface ISwitchObject {
+		
+		@JsonProperty("dpid")
+		@Property("dpid")
+		public String getDPID();
+		
+		@JsonProperty("state")
+		@Property("state")
+		public String getState();
+		
+		@JsonIgnore
+		@Property("type")
+		public String getType();
+		
+		@JsonProperty("ports")
+		@Adjacency(label="on")
+		public Iterable<IPortObject> getPorts();
+	}
 	
+	public interface IPortObject {
+		
+		@JsonProperty("state")
+		@Property("state")
+		public int getState();
+		
+		@JsonIgnore
+		@Property("type")
+		public String getType();
+		
+		@JsonProperty("number")
+		@Property("number")
+		public Short getNumber();
+		
+		@JsonProperty("desc")
+		@Property("desc")
+		public String getDesc();
+		
+		@JsonIgnore
+		@Incidence(label="on",direction = Direction.IN)
+		public ISwitchObject getSwitch();
+	}
 	/*
 	 * Update the switch details
 	 */
@@ -49,9 +101,9 @@
 	 */
 	public void deletePort(String dpid, String portName);
 	
-	public List<String> getActiveSwitches();
-	public List<String> getAllSwitches();
-	public List<String> getInactiveSwitches();
+	public Iterable<ISwitchObject> getActiveSwitches();
+	public Iterable<ISwitchObject> getAllSwitches();
+	public Iterable<ISwitchObject> getInactiveSwitches();
 	
 	/*
 	 * Initialize
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
index be33659..dbb985e 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImpl.java
@@ -19,6 +19,7 @@
 import com.tinkerpop.blueprints.TransactionalGraph.Conclusion;
 import com.tinkerpop.blueprints.Edge;
 import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.frames.FramedGraph;
 import net.floodlightcontroller.core.ISwitchStorage;
 
 public class SwitchStorageImpl implements ISwitchStorage {
@@ -198,15 +199,19 @@
 	}
 
 	@Override
-	public List<String> getActiveSwitches() {
+	public Iterable<ISwitchObject> getActiveSwitches() {
 		// TODO Add unit test
-		List<String> switches = new ArrayList<String>();
-    	for (Vertex V : graph.getVertices("type","switch")) {
-    		if (V.getProperty("state").equals(SwitchState.ACTIVE.toString())) {
-    		     switches.add((String) V.getProperty("dpid"));
-    		}
-    	}
-		return switches;
+		FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
+		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;
 	}
 
 	@Override
@@ -227,25 +232,32 @@
 	}
 
 	@Override
-	public List<String> getAllSwitches() {
+	public Iterable<ISwitchObject> getAllSwitches() {
 		// TODO Auto-generated method stub
-		List<String> switches = new ArrayList<String>();
-    	for (Vertex V : graph.getVertices("type","switch")) {
-    		switches.add((String) V.getProperty("dpid"));
-    	}
+		FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+
+		for (ISwitchObject sw: switches) {
+			log.debug("switch: {}", sw.getDPID());
+		}
+
 		return switches;
 	}
 
 	@Override
-	public List<String> getInactiveSwitches() {
+	public Iterable<ISwitchObject> getInactiveSwitches() {
 		// TODO Auto-generated method stub
-		List<String> switches = new ArrayList<String>();
-    	for (Vertex V : graph.getVertices("type","switch")) {
-    		if (V.getProperty("state").equals(SwitchState.INACTIVE.toString())) {
-    		     switches.add((String) V.getProperty("dpid"));
-    		}
-    	}
-		return switches;
+		FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
+		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;
 	}
 
 	
diff --git a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImplStubs.java b/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImplStubs.java
deleted file mode 100644
index 88f94db..0000000
--- a/src/main/java/net/floodlightcontroller/core/internal/SwitchStorageImplStubs.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
- * 
- */
-package net.floodlightcontroller.core.internal;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.openflow.protocol.OFPhysicalPort;
-
-import net.floodlightcontroller.core.ISwitchStorage;
-
-/**
- * @author pankaj
- *
- */
-public class SwitchStorageImplStubs implements ISwitchStorage {
-
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#addPort(long, org.openflow.protocol.OFPhysicalPort)
-	 */
-	@Override
-	public void addPort(String dpid, OFPhysicalPort port) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#getPorts(long)
-	 */
-	@Override
-	public Collection<OFPhysicalPort> getPorts(long dpid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#getPort(long, short)
-	 */
-	@Override
-	public OFPhysicalPort getPort(String dpid, short portnum) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#getPort(long, java.lang.String)
-	 */
-	@Override
-	public OFPhysicalPort getPort(String dpid, String portName) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#addSwitch(long)
-	 */
-	@Override
-	public void addSwitch(String dpid) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#deleteSwitch(long)
-	 */
-	@Override
-	public void deleteSwitch(String dpid) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#deletePort(long, short)
-	 */
-	@Override
-	public void deletePort(String dpid, short port) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#deletePort(long, java.lang.String)
-	 */
-	@Override
-	public void deletePort(String dpid, String portName) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/* (non-Javadoc)
-	 * @see net.floodlightcontroller.core.ISwitchStorage#init(java.lang.String)
-	 */
-	@Override
-	public void init(String conf) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void update(String dpid, SwitchState state, DM_OPERATION op) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public List<String> getActiveSwitches() {
-		return null;
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public List<String> getAllSwitches() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public List<String> getInactiveSwitches() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
index 99f291d..0edc35e 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 import net.floodlightcontroller.core.INetMapTopologyService.ITopoSwitchService;
+import net.floodlightcontroller.core.ISwitchStorage.ISwitchObject;
 
 public class TopoSwitchServiceImpl implements ITopoSwitchService {
 	
@@ -19,19 +20,19 @@
 	SwitchStorageImpl swStore = store.get();
 	
 	@Override
-	public List<String> GetActiveSwitches() {
+	public Iterable<ISwitchObject> GetActiveSwitches() {
 		// TODO Auto-generated method stub
 		return swStore.getActiveSwitches();
 	}
 
 	@Override
-	public List<String> GetAllSwitches() {
+	public Iterable<ISwitchObject> GetAllSwitches() {
 		// TODO Auto-generated method stub
 		return swStore.getAllSwitches();
 	}
 
 	@Override
-	public List<String> GetInactiveSwitches() {
+	public Iterable<ISwitchObject> GetInactiveSwitches() {
 		// TODO Auto-generated method stub
 		return swStore.getInactiveSwitches();
 	}
diff --git a/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java b/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
index a73b0b4..11dbcb1 100644
--- a/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/TopoSwitchesResource.java
@@ -2,6 +2,7 @@
 
 import java.util.Iterator;
 
+import net.floodlightcontroller.core.ISwitchStorage.ISwitchObject;
 import net.floodlightcontroller.core.internal.TopoSwitchServiceImpl;
 
 import org.restlet.resource.Get;
@@ -10,18 +11,18 @@
 public class TopoSwitchesResource extends ServerResource {
 	
 	@Get("json")
-	public Iterator<String> retrieve() {
+	public Iterator<ISwitchObject> retrieve() {
 		TopoSwitchServiceImpl impl = new TopoSwitchServiceImpl();
 		
 		String filter = (String) getRequestAttributes().get("filter");
 		
 		if (filter.equals("active")) {
-			return (Iterator<String>) impl.GetActiveSwitches().iterator();
+			return (Iterator<ISwitchObject>) impl.GetActiveSwitches().iterator();
 		}
 		if (filter.equals("inactive")) {
-			return (Iterator<String>) impl.GetInactiveSwitches().iterator();
+			return (Iterator<ISwitchObject>) impl.GetInactiveSwitches().iterator();
 		}
-		return (Iterator<String>) impl.GetAllSwitches().iterator();				
+		return (Iterator<ISwitchObject>) impl.GetAllSwitches().iterator();				
 	}
 
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
index a764227..eb2fac9 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/ILinkStorage.java
@@ -42,9 +42,12 @@
 	 *  If only dpid is set all links associated with Switch are retrieved
 	 */
 	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);
+
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index 249d626..70d93c9 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -207,4 +207,16 @@
 		
 	}
 
+	@Override
+	public List<Link> getLinks(String dpid) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public List<Link> getActiveLinks() {
+		// TODO Auto-generated method stub
+		
+		return null;
+	}
+
 }
