diff --git a/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java b/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
index 6dbaf15..97f9843 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
@@ -21,18 +21,24 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import org.junit.Test;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultDevice;
 import org.onosproject.net.DefaultHost;
+import org.onosproject.net.DefaultLink;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
+import org.onosproject.net.Link;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.HostServiceAdapter;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.net.link.LinkServiceAdapter;
 
 import static org.junit.Assert.*;
+import static org.onosproject.net.Link.Type.DIRECT;
 
 /**
  * Unit tests for {@link NodeSelection}.
@@ -51,20 +57,31 @@
         }
     }
 
+    private static class FakeLink extends DefaultLink {
+        FakeLink(ConnectPoint src, ConnectPoint dst) {
+            super(null, src, dst, DIRECT, Link.State.ACTIVE);
+        }
+    }
+
     private final ObjectMapper mapper = new ObjectMapper();
 
     private static final String IDS = "ids";
     private static final String HOVER = "hover";
 
-    private static final DeviceId DEVICE_1_ID = DeviceId.deviceId("Device-1");
-    private static final DeviceId DEVICE_2_ID = DeviceId.deviceId("Device-2");
+    private static final DeviceId DEVICE_1_ID = DeviceId.deviceId("Device1");
+    private static final DeviceId DEVICE_2_ID = DeviceId.deviceId("Device2");
     private static final HostId HOST_A_ID = HostId.hostId("aa:aa:aa:aa:aa:aa/1");
     private static final HostId HOST_B_ID = HostId.hostId("bb:bb:bb:bb:bb:bb/2");
+    private static final String LINK_1_ID = "Device1/1-Device2/2";
+    private static final ConnectPoint CP_SRC = ConnectPoint.deviceConnectPoint("Device1/1");
+    private static final ConnectPoint CP_DST = ConnectPoint.deviceConnectPoint("Device2/2");
 
     private static final Device DEVICE_1 = new FakeDevice(DEVICE_1_ID);
     private static final Device DEVICE_2 = new FakeDevice(DEVICE_2_ID);
     private static final Host HOST_A = new FakeHost(HOST_A_ID);
     private static final Host HOST_B = new FakeHost(HOST_B_ID);
+    private static final Link LINK_A = new FakeLink(CP_SRC, CP_DST);
+    private static final Link LINK_B = new FakeLink(CP_DST, CP_SRC);
 
     // ==================
     // == FAKE SERVICES
@@ -94,8 +111,21 @@
         }
     }
 
+    private static class FakeLinks extends LinkServiceAdapter {
+        @Override
+        public Link getLink(ConnectPoint src, ConnectPoint dst) {
+            if (CP_SRC.equals(src) && CP_DST.equals(dst)) {
+                return LINK_A;
+            } else if (CP_SRC.equals(dst) && CP_DST.equals(src)) {
+                return LINK_B;
+            }
+            return null;
+        }
+    }
+
     private DeviceService deviceService = new FakeDevices();
     private HostService hostService = new FakeHosts();
+    private LinkService linkService = new FakeLinks();
 
     private NodeSelection ns;
 
@@ -108,7 +138,7 @@
     }
 
     private NodeSelection createNodeSelection(ObjectNode payload) {
-        return new NodeSelection(payload, deviceService, hostService);
+        return new NodeSelection(payload, deviceService, hostService, linkService);
     }
 
     // selection JSON payload creation methods
@@ -134,6 +164,13 @@
         ids.add(HOST_A_ID.toString());
         return payload;
     }
+    private ObjectNode oneLinkSelected() {
+        ObjectNode payload = objectNode();
+        ArrayNode ids = arrayNode();
+        payload.set(IDS, ids);
+        ids.add(LINK_1_ID.toString());
+        return payload;
+    }
 
     private ObjectNode twoHostsOneDeviceSelected() {
         ObjectNode payload = objectNode();
@@ -204,6 +241,21 @@
     }
 
     @Test
+    public void oneLink() {
+        ns = createNodeSelection(oneLinkSelected());
+        assertEquals("unexpected devices", 0, ns.devices().size());
+        assertEquals("unexpected devices w/hover", 0, ns.devicesWithHover().size());
+        assertEquals("unexpected hosts", 0, ns.hosts().size());
+        assertEquals("unexpected hosts w/hover", 0, ns.hostsWithHover().size());
+        assertEquals("missing link", 1, ns.links().size());
+        assertTrue("missing link A", ns.links().contains(LINK_A));
+        assertEquals("missing link w/hover", 1, ns.linksWithHover().size());
+        assertTrue("missing link A w/hover", ns.linksWithHover().contains(LINK_A));
+        assertFalse("unexpected selection", ns.none());
+        assertNull("hover?", ns.hovered());
+    }
+
+    @Test
     public void twoHostsOneDevice() {
         ns = createNodeSelection(twoHostsOneDeviceSelected());
         assertEquals("missing device", 1, ns.devices().size());
