diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
index 3fa4ad9..71ef16e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
@@ -15,82 +15,99 @@
 import org.slf4j.LoggerFactory;
 
 public class AbstractNetworkGraph implements NetworkGraph {
-    @SuppressWarnings("unused")
-    private static final Logger log = LoggerFactory
-	    .getLogger(AbstractNetworkGraph.class);
+	@SuppressWarnings("unused")
+	private static final Logger log = LoggerFactory.getLogger(AbstractNetworkGraph.class);
 
-    // DPID -> Switch
-    protected ConcurrentMap<Long, Switch> switches;
+	// DPID -> Switch
+	protected ConcurrentMap<Long, Switch> switches;
 
-    protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
-    protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
+	protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
+	protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
 
-    public AbstractNetworkGraph() {
-	// TODO: Does these object need to be stored in Concurrent Collection?
-	switches = new ConcurrentHashMap<>();
-	addr2Device = new ConcurrentHashMap<>();
-	mac2Device = new ConcurrentHashMap<>();
-    }
-
-    @Override
-    public Switch getSwitch(long dpid) {
-	// TODO Check if it is safe to directly return this Object.
-	return switches.get(dpid);
-    }
-
-    @Override
-    public Iterable<Switch> getSwitches() {
-	// TODO Check if it is safe to directly return this Object.
-	return Collections.unmodifiableCollection(switches.values());
-    }
-
-    @Override
-    public Iterable<Link> getLinks() {
-	List<Link> linklist = new LinkedList<>();
-
-	for (Switch sw : switches.values()) {
-	    Iterable<Link> links = sw.getLinks();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
+	public AbstractNetworkGraph() {
+		// TODO: Does these object need to be stored in Concurrent Collection?
+		switches = new ConcurrentHashMap<>();
+		addr2Device = new ConcurrentHashMap<>();
+		mac2Device = new ConcurrentHashMap<>();
 	}
-	return linklist;
-    }
 
-    @Override
-    public Iterable<Link> getLinksFromSwitch(long dpid) {
-	Switch sw = getSwitch(dpid);
-	if (sw == null) {
-	    return Collections.emptyList();
+	@Override
+	public Switch getSwitch(Long dpid) {
+		// TODO Check if it is safe to directly return this Object.
+		return switches.get(dpid);
 	}
-	Iterable<Link> links = sw.getLinks();
-	if (links instanceof Collection) {
-	    return Collections.unmodifiableCollection((Collection<Link>) links);
-	} else {
-	    List<Link> linklist = new LinkedList<>();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
-	    return linklist;
-	}
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
-	Set<Device> devices = addr2Device.get(ipAddress);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Switch> getSwitches() {
+		// TODO Check if it is safe to directly return this Object.
+		return Collections.unmodifiableCollection(switches.values());
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByMac(MACAddress address) {
-	Set<Device> devices = mac2Device.get(address);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Link> getLinks() {
+		List<Link> linklist = new LinkedList<>();
+
+		for (Switch sw : switches.values()) {
+			Iterable<Link> links = sw.getOutgoingLinks();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+		}
+		return linklist;
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
+	@Override
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getOutgoingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+	
+	@Override
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getIncomingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+
+
+	@Override
+	public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+		Set<Device> devices = addr2Device.get(ipAddress);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
+
+	@Override
+	public Iterable<Device> getDeviceByMac(MACAddress address) {
+		Set<Device> devices = mac2Device.get(address);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
 }
