diff --git a/core/api/src/test/java/org/onosproject/ui/model/topo/UiLinkIdTest.java b/core/api/src/test/java/org/onosproject/ui/model/topo/UiLinkIdTest.java
index e129e26..80666d6 100644
--- a/core/api/src/test/java/org/onosproject/ui/model/topo/UiLinkIdTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/model/topo/UiLinkIdTest.java
@@ -17,17 +17,23 @@
 package org.onosproject.ui.model.topo;
 
 import org.junit.Test;
+import org.onlab.packet.MacAddress;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.region.RegionId;
 import org.onosproject.ui.model.AbstractUiModelTest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNull;
 import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.net.HostId.hostId;
+import static org.onosproject.net.PortNumber.P0;
 import static org.onosproject.net.PortNumber.portNumber;
 
 /**
@@ -35,8 +41,15 @@
  */
 public class UiLinkIdTest extends AbstractUiModelTest {
 
+    private static final RegionId REG_1 = RegionId.regionId("Region-1");
+    private static final RegionId REG_2 = RegionId.regionId("Region-2");
+
+    private static final MacAddress MAC_A = MacAddress.valueOf(0x123456L);
+    private static final HostId HOST_A = hostId(MAC_A);
+
     private static final DeviceId DEV_X = deviceId("device-X");
     private static final DeviceId DEV_Y = deviceId("device-Y");
+
     private static final PortNumber P1 = portNumber(1);
     private static final PortNumber P2 = portNumber(2);
     private static final PortNumber P3 = portNumber(3);
@@ -45,6 +58,8 @@
     private static final ConnectPoint CP_Y2 = new ConnectPoint(DEV_Y, P2);
     private static final ConnectPoint CP_Y3 = new ConnectPoint(DEV_Y, P3);
 
+    private static final ConnectPoint CP_HA = new ConnectPoint(HOST_A, P0);
+
     private static final Link LINK_X1_TO_Y2 = DefaultLink.builder()
             .providerId(ProviderId.NONE)
             .src(CP_X1)
@@ -66,6 +81,12 @@
             .type(Link.Type.DIRECT)
             .build();
 
+    private static final Link LINK_HA_TO_X1 = DefaultLink.builder()
+            .providerId(ProviderId.NONE)
+            .src(CP_HA)
+            .dst(CP_X1)
+            .type(Link.Type.EDGE)
+            .build();
 
     @Test
     public void canonical() {
@@ -86,4 +107,61 @@
         print("link other: %s", other);
         assertNotEquals("equiv?", one, other);
     }
+
+    @Test
+    public void edgeLink() {
+        title("edgeLink");
+        UiLinkId id = UiLinkId.uiLinkId(LINK_HA_TO_X1);
+        print("link: %s", id);
+        assertEquals("wrong port A", P0, id.portA());
+        assertEquals("wrong element A", HOST_A, id.elementA());
+        assertEquals("wrong port B", P1, id.portB());
+        assertEquals("wrong element B", DEV_X, id.elementB());
+        assertNull("region A?", id.regionA());
+        assertNull("region B?", id.regionB());
+    }
+
+    @Test
+    public void deviceLink() {
+        title("deviceLink");
+        UiLinkId id = UiLinkId.uiLinkId(LINK_X1_TO_Y2);
+        print("link: %s", id);
+        assertEquals("wrong port A", P1, id.portA());
+        assertEquals("wrong element A", DEV_X, id.elementA());
+        assertEquals("wrong port B", P2, id.portB());
+        assertEquals("wrong element B", DEV_Y, id.elementB());
+        assertNull("region A?", id.regionA());
+        assertNull("region B?", id.regionB());
+    }
+
+    @Test
+    public void regionLink() {
+        title("regionLink");
+        UiLinkId idFirst = UiLinkId.uiLinkId(REG_1, REG_2);
+        UiLinkId idSecond = UiLinkId.uiLinkId(REG_2, REG_1);
+        print(" first: %s", idFirst);
+        print("second: %s", idSecond);
+        assertEquals("Not same ID", idFirst, idSecond);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void identicalRegionBad() {
+        UiLinkId.uiLinkId(REG_1, REG_1);
+    }
+
+    @Test(expected = NullPointerException.class)
+    public void nullRegionBad() {
+        UiLinkId.uiLinkId(REG_1, (RegionId) null);
+    }
+
+    @Test
+    public void regionDeviceLink() {
+        title("regionDeviceLink");
+        UiLinkId id = UiLinkId.uiLinkId(REG_1, DEV_X, P1);
+        print("id: %s", id);
+        assertEquals("region ID", REG_1, id.regionA());
+        assertEquals("device ID", DEV_X, id.elementB());
+        assertEquals("port", P1, id.portB());
+    }
+
 }
