diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiEdgeLink.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiEdgeLink.java
index f52fbcb..e2dc7fd 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiEdgeLink.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiEdgeLink.java
@@ -16,22 +16,14 @@
 
 package org.onosproject.ui.model.topo;
 
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.EdgeLink;
-import org.onosproject.net.PortNumber;
-
 /**
  * Designates a link between a device and a host; that is, an edge link.
  */
 public class UiEdgeLink extends UiLink {
 
-    private static final String E_UNASSOC =
-            "backing link not associated with this UI edge link: ";
-
-    // private (synthetic) host link
-    private DeviceId edgeDevice;
-    private PortNumber edgePort;
-    private EdgeLink edgeLink;
+    private final String hostId;
+    private final String edgeDevice;
+    private final String edgePort;
 
     /**
      * Creates a UI link.
@@ -41,51 +33,25 @@
      */
     public UiEdgeLink(UiTopology topology, UiLinkId id) {
         super(topology, id);
+        hostId = id.idA();
+        edgeDevice = id.elementB().toString();
+        edgePort = id.portB().toString();
     }
 
     @Override
     public String endPointA() {
-        return edgeLink.hostId().toString();
+        return hostId;
     }
 
     @Override
     public String endPointB() {
-        return edgeDevice + UiLinkId.ID_PORT_DELIMITER + edgePort;
+        return edgeDevice;
     }
 
     // no port for end-point A
 
     @Override
     public String endPortB() {
-        return edgePort.toString();
+        return edgePort;
     }
-
-    @Override
-    protected void destroy() {
-        edgeDevice = null;
-        edgePort = null;
-        edgeLink = null;
-    }
-
-    /**
-     * Attaches the given edge link to this UI link. This method will
-     * throw an exception if this UI link is not representative of the
-     * supplied link.
-     *
-     * @param elink edge link to attach
-     * @throws IllegalArgumentException if the link is not appropriate
-     */
-    public void attachEdgeLink(EdgeLink elink) {
-        UiLinkId.Direction d = id.directionOf(elink);
-        // Expected direction of edge links is A-to-B (Host to device)
-        // but checking not null is a sufficient test
-        if (d == null) {
-            throw new IllegalArgumentException(E_UNASSOC + elink);
-        }
-
-        edgeLink = elink;
-        edgeDevice = elink.hostLocation().deviceId();
-        edgePort = elink.hostLocation().port();
-    }
-
 }
diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiLinkId.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiLinkId.java
index ca85fb2..c8dae05 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiLinkId.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiLinkId.java
@@ -19,6 +19,7 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
+import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.region.RegionId;
@@ -49,7 +50,7 @@
         B_TO_A
     }
 
-    private static final String CP_DELIMITER = "~";
+    static final String CP_DELIMITER = "~";
     static final String ID_PORT_DELIMITER = "/";
 
     private final RegionId regionA;
@@ -61,6 +62,8 @@
     private final PortNumber portB;
 
     private final String idStr;
+    private final String idA;
+    private final String idB;
 
     /**
      * Creates a UI link identifier. It is expected that A comes before B when
@@ -82,8 +85,10 @@
         regionA = null;
         regionB = null;
 
-        idStr = a + ID_PORT_DELIMITER + pa + CP_DELIMITER +
-                b + ID_PORT_DELIMITER + pb;
+        // NOTE: for edgelinks, hosts are always element A
+        idA = (a instanceof HostId) ? a.toString() : a + ID_PORT_DELIMITER + pa;
+        idB = b + ID_PORT_DELIMITER + pb;
+        idStr = idA + CP_DELIMITER + idB;
     }
 
     /**
@@ -102,7 +107,9 @@
         portA = null;
         portB = null;
 
-        idStr = a + CP_DELIMITER + b;
+        idA = a.toString();
+        idB = b.toString();
+        idStr = idA + CP_DELIMITER + idB;
     }
 
     /**
@@ -122,7 +129,9 @@
         elementA = null;
         portA = null;
 
-        idStr = r + CP_DELIMITER + elementB + ID_PORT_DELIMITER + portB;
+        idA = r.toString();
+        idB = elementB + ID_PORT_DELIMITER + portB;
+        idStr = idA + CP_DELIMITER + idB;
     }
 
     @Override
@@ -131,6 +140,24 @@
     }
 
     /**
+     * String representation of endpoint A.
+     *
+     * @return string rep of endpoint A
+     */
+    public String idA() {
+        return idA;
+    }
+
+    /**
+     * String representation of endpoint B.
+     *
+     * @return string rep of endpoint B
+     */
+    public String idB() {
+        return idB;
+    }
+
+    /**
      * Returns the identifier of the first element. Note that the returned
      * value will be null if this identifier is for a region-region link.
      *
diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
index f4ffb02..744c996 100644
--- a/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiTopology.java
@@ -490,12 +490,24 @@
             log.debug("Synthetic link: {}", synthetic);
         });
 
+        slinks.addAll(wrapHostLinks(nullRegion()));
+        for (UiRegion r: allRegions()) {
+            slinks.addAll(wrapHostLinks(r));
+        }
 
         synthLinks.clear();
         synthLinks.addAll(slinks);
+    }
 
-        // TODO : compute and add host-device links to synthLinks...
+    private Set<UiSynthLink> wrapHostLinks(UiRegion region) {
+        RegionId regionId = region.id();
+        return region.hosts().stream().map(h -> wrapHostLink(regionId, h))
+                .collect(Collectors.toSet());
+    }
 
+    private UiSynthLink wrapHostLink(RegionId regionId, UiHost host) {
+        UiEdgeLink elink = new UiEdgeLink(this, host.edgeLinkId());
+        return new UiSynthLink(regionId, elink);
     }
 
     private UiSynthLink inferSyntheticLink(UiDeviceLink link) {
diff --git a/core/api/src/test/java/org/onosproject/ui/model/topo/UiEdgeLinkTest.java b/core/api/src/test/java/org/onosproject/ui/model/topo/UiEdgeLinkTest.java
index d5b213a..97a5480 100644
--- a/core/api/src/test/java/org/onosproject/ui/model/topo/UiEdgeLinkTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/model/topo/UiEdgeLinkTest.java
@@ -32,7 +32,8 @@
 public class UiEdgeLinkTest extends AbstractUiModelTest {
 
     private static final String PHANTOM_HOST_ID = "00:00:00:00:00:00/None";
-    private static final String D1_P8 = "dev-1/8";
+    private static final String S_D1 = "dev-1";
+    private static final String S_P8 = "8";
 
     private static final DeviceId DEV = DeviceId.deviceId("dev-1");
     private static final PortNumber P8 = PortNumber.portNumber(8);
@@ -46,12 +47,16 @@
         title("basic");
         UiLinkId id = UiLinkId.uiLinkId(EDGE_LINK);
         UiEdgeLink link = new UiEdgeLink(null, id);
-        link.attachEdgeLink(EDGE_LINK);
         print(link);
         print(link.endPointA());
+        print(link.endPortA());
         print(link.endPointB());
+        print(link.endPortB());
 
         assertEquals("bad end point A", PHANTOM_HOST_ID, link.endPointA());
-        assertEquals("bad end point B", D1_P8, link.endPointB());
+        assertEquals("bad end port A", null, link.endPortA());
+
+        assertEquals("bad end point B", S_D1, link.endPointB());
+        assertEquals("bad end port B", S_P8, link.endPortB());
     }
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
index 69c8c8f..8259fb3 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/ModelCache.java
@@ -431,27 +431,26 @@
         host.setEdgeLinkId(elinkId);
 
         // add synthesized edge link to the topology
-        UiEdgeLink edgeLink = addNewEdgeLink(elinkId);
-        edgeLink.attachEdgeLink(elink);
+        addNewEdgeLink(elinkId);
 
         return host;
     }
 
-    private void insertNewUiEdgeLink(UiLinkId id, EdgeLink e) {
-        UiEdgeLink newEdgeLink = addNewEdgeLink(id);
-        newEdgeLink.attachEdgeLink(e);
+    private void insertNewUiEdgeLink(UiLinkId id) {
+        addNewEdgeLink(id);
     }
 
     private void updateHost(UiHost uiHost, Host h) {
         UiEdgeLink existing = uiTopology.findEdgeLink(uiHost.edgeLinkId());
 
+        // TODO: review - do we need EdgeLink now that we are creating from id only?
         EdgeLink currentElink = synthesizeLink(h);
         UiLinkId currentElinkId = uiLinkId(currentElink);
 
         if (existing != null) {
             if (!currentElinkId.equals(existing.id())) {
                 // edge link has changed
-                insertNewUiEdgeLink(currentElinkId, currentElink);
+                insertNewUiEdgeLink(currentElinkId);
                 uiHost.setEdgeLinkId(currentElinkId);
 
                 uiTopology.remove(existing);
@@ -459,7 +458,7 @@
 
         } else {
             // no previously existing edge link
-            insertNewUiEdgeLink(currentElinkId, currentElink);
+            insertNewUiEdgeLink(currentElinkId);
             uiHost.setEdgeLinkId(currentElinkId);
 
         }
