diff --git a/core/api/src/main/java/org/onosproject/ui/model/topo/UiDeviceLink.java b/core/api/src/main/java/org/onosproject/ui/model/topo/UiDeviceLink.java
new file mode 100644
index 0000000..4575678
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/model/topo/UiDeviceLink.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.model.topo;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.PortNumber;
+
+/**
+ * Represents a link between two devices; that is, an infrastructure link.
+ */
+public class UiDeviceLink extends UiLink {
+
+    private static final String E_UNASSOC =
+            "backing link not associated with this UI device link: ";
+
+    // devices and ports at either end of this link
+    private DeviceId deviceA;
+    private DeviceId deviceB;
+    private PortNumber portA;
+    private PortNumber portB;
+
+    // two unidirectional links underlying this link...
+    private Link linkAtoB;
+    private Link linkBtoA;
+
+
+    /**
+     * Creates a device to device UI link.
+     *
+     * @param topology parent topology
+     * @param id       canonicalized link identifier
+     */
+    public UiDeviceLink(UiTopology topology, UiLinkId id) {
+        super(topology, id);
+    }
+
+    @Override
+    public String endPointA() {
+        return deviceA + UiLinkId.ID_PORT_DELIMITER + portA;
+    }
+
+    @Override
+    public String endPointB() {
+        return deviceB + UiLinkId.ID_PORT_DELIMITER + portB;
+    }
+
+
+    @Override
+    protected void destroy() {
+        deviceA = null;
+        deviceB = null;
+        portA = null;
+        portB = null;
+        linkAtoB = null;
+        linkBtoA = null;
+    }
+
+
+    /**
+     * Attaches the given backing link to this UI link. This method will
+     * throw an exception if this UI link is not representative of the
+     * supplied link.
+     *
+     * @param link backing link to attach
+     * @throws IllegalArgumentException if the link is not appropriate
+     */
+    public void attachBackingLink(Link link) {
+        UiLinkId.Direction d = id.directionOf(link);
+
+        if (d == UiLinkId.Direction.A_TO_B) {
+            linkAtoB = link;
+            deviceA = link.src().deviceId();
+            portA = link.src().port();
+            deviceB = link.dst().deviceId();
+            portB = link.dst().port();
+
+        } else if (d == UiLinkId.Direction.B_TO_A) {
+            linkBtoA = link;
+            deviceB = link.src().deviceId();
+            portB = link.src().port();
+            deviceA = link.dst().deviceId();
+            portA = link.dst().port();
+
+        } else {
+            throw new IllegalArgumentException(E_UNASSOC + link);
+        }
+    }
+
+    /**
+     * Detaches the given backing link from this UI link, returning true if the
+     * reverse link is still attached, or false otherwise.
+     *
+     * @param link the backing link to detach
+     * @return true if other link still attached, false otherwise
+     * @throws IllegalArgumentException if the link is not appropriate
+     */
+    public boolean detachBackingLink(Link link) {
+        UiLinkId.Direction d = id.directionOf(link);
+        if (d == UiLinkId.Direction.A_TO_B) {
+            linkAtoB = null;
+            return linkBtoA != null;
+        }
+        if (d == UiLinkId.Direction.B_TO_A) {
+            linkBtoA = null;
+            return linkAtoB != null;
+        }
+        throw new IllegalArgumentException(E_UNASSOC + link);
+    }
+
+
+    /**
+     * Returns the identity of device A.
+     *
+     * @return device A ID
+     */
+    public DeviceId deviceA() {
+        return deviceA;
+    }
+
+    /**
+     * Returns the port number of device A.
+     *
+     * @return port A
+     */
+    public PortNumber portA() {
+        return portA;
+    }
+
+    /**
+     * Returns the identity of device B.
+     *
+     * @return device B ID
+     */
+    public DeviceId deviceB() {
+        return deviceB;
+    }
+
+    /**
+     * Returns the port number of device B.
+     *
+     * @return port B
+     */
+    public PortNumber portB() {
+        return portB;
+    }
+
+    /**
+     * Returns backing link from A to B.
+     *
+     * @return backing link A to B
+     */
+    public Link linkAtoB() {
+        return linkAtoB;
+    }
+
+    /**
+     * Returns backing link from B to A.
+     *
+     * @return backing link B to A
+     */
+    public Link linkBtoA() {
+        return linkBtoA;
+    }
+
+}
