diff --git a/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java b/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java
new file mode 100644
index 0000000..23cd7d8
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/AbstractHighlight.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 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.topo;
+
+/**
+ * Partial implementation of the types of highlight to apply to topology
+ * elements.
+ */
+public abstract class AbstractHighlight {
+    private final TopoElementType type;
+    private final String elementId;
+
+    public AbstractHighlight(TopoElementType type, String elementId) {
+        this.type = type;
+        this.elementId = elementId;
+    }
+
+    public TopoElementType type() {
+        return type;
+    }
+
+    public String elementId() {
+        return elementId;
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/DeviceHighlight.java b/core/api/src/main/java/org/onosproject/ui/topo/DeviceHighlight.java
new file mode 100644
index 0000000..1b721b8
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/DeviceHighlight.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 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.topo;
+
+/**
+ * Denotes the types of highlight to apply to a link.
+ */
+public class DeviceHighlight extends AbstractHighlight {
+
+    public DeviceHighlight(String deviceId) {
+        super(TopoElementType.DEVICE, deviceId);
+    }
+
+
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
new file mode 100644
index 0000000..107fdd3
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/Highlights.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 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.topo;
+
+import java.text.DecimalFormat;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Encapsulates highlights to be applied to the topology view, such as
+ * highlighting links, displaying link labels, perhaps even decorating
+ * nodes with badges, etc.
+ */
+public class Highlights {
+
+    private static final DecimalFormat DF0 = new DecimalFormat("#,###");
+
+    private final Set<DeviceHighlight> devices = new HashSet<>();
+    private final Set<HostHighlight> hosts = new HashSet<>();
+    private final Set<LinkHighlight> links = new HashSet<>();
+
+
+    public Highlights add(DeviceHighlight d) {
+        devices.add(d);
+        return this;
+    }
+
+    public Highlights add(HostHighlight h) {
+        hosts.add(h);
+        return this;
+    }
+
+    public Highlights add(LinkHighlight lh) {
+        links.add(lh);
+        return this;
+    }
+
+
+    public Set<DeviceHighlight> devices() {
+        return Collections.unmodifiableSet(devices);
+    }
+
+    public Set<HostHighlight> hosts() {
+        return Collections.unmodifiableSet(hosts);
+    }
+
+    public Set<LinkHighlight> links() {
+        return Collections.unmodifiableSet(links);
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/HostHighlight.java b/core/api/src/main/java/org/onosproject/ui/topo/HostHighlight.java
new file mode 100644
index 0000000..ff8b3be
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/HostHighlight.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 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.topo;
+
+/**
+ * Denotes the types of highlight to apply to a link.
+ */
+public class HostHighlight extends AbstractHighlight {
+
+    public HostHighlight(String hostId) {
+        super(TopoElementType.HOST, hostId);
+    }
+
+
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/LinkHighlight.java b/core/api/src/main/java/org/onosproject/ui/topo/LinkHighlight.java
new file mode 100644
index 0000000..d8e4279
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/LinkHighlight.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2015 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.topo;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.TreeSet;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Denotes the highlighting to be applied to a link.
+ * {@link Flavor} is a closed set of NO-, PRIMARY-, or SECONDARY- highlighting.
+ * {@link Mod} is an open ended set of additional modifications (CSS classes)
+ * to apply. Note that {@link #MOD_OPTICAL} and {@link #MOD_ANIMATED} are
+ * pre-defined mods.
+ * Label text may be set, which will also be displayed on the link.
+ */
+public class LinkHighlight extends AbstractHighlight {
+
+    private static final String PLAIN = "plain";
+    private static final String PRIMARY = "primary";
+    private static final String SECONDARY = "secondary";
+    private static final String EMPTY = "";
+    private static final String SPACE = " ";
+
+    private final Flavor flavor;
+    private final Set<Mod> mods = new TreeSet<>();
+    private String label = EMPTY;
+
+    /**
+     * Constructs a link highlight entity.
+     *
+     * @param linkId the link identifier
+     * @param flavor the highlight flavor
+     */
+    public LinkHighlight(String linkId, Flavor flavor) {
+        super(TopoElementType.LINK, linkId);
+        this.flavor = checkNotNull(flavor);
+    }
+
+    /**
+     * Adds a highlighting modification to this link highlight.
+     *
+     * @param mod mod to be added
+     * @return self, for chaining
+     */
+    public LinkHighlight addMod(Mod mod) {
+        mods.add(checkNotNull(mod));
+        return this;
+    }
+
+    /**
+     * Adds a label to be displayed on the link.
+     *
+     * @param label the label text
+     * @return self, for chaining
+     */
+    public LinkHighlight setLabel(String label) {
+        this.label = label == null ? EMPTY : label;
+        return this;
+    }
+
+    /**
+     * Returns the highlight flavor.
+     *
+     * @return highlight flavor
+     */
+    public Flavor flavor() {
+        return flavor;
+    }
+
+    /**
+     * Returns the highlight modifications.
+     *
+     * @return highlight modifications
+     */
+    public Set<Mod> mods() {
+        return Collections.unmodifiableSet(mods);
+    }
+
+    /**
+     * Generates the CSS classes string from the {@link #flavor} and
+     * any optional {@link #mods}.
+     *
+     * @return CSS classes string
+     */
+    public String cssClasses() {
+        StringBuilder sb = new StringBuilder(flavor.toString());
+        mods.forEach(m -> sb.append(SPACE).append(m));
+        return sb.toString();
+    }
+
+    /**
+     * Returns the label text.
+     *
+     * @return label text
+     */
+    public String label() {
+        return label;
+    }
+
+    /**
+     * Link highlighting flavor.
+     */
+    public enum Flavor {
+        NO_HIGHLIGHT(PLAIN),
+        PRIMARY_HIGHLIGHT(PRIMARY),
+        SECONDARY_HIGHLIGHT(SECONDARY);
+
+        private String cssName;
+
+        Flavor(String s) {
+            cssName = s;
+        }
+
+        @Override
+        public String toString() {
+            return cssName;
+        }
+    }
+
+    /**
+     * Link highlighting modification.
+     * <p>
+     * Note that this translates to a CSS class name that is applied to
+     * the link in the Topology UI.
+     */
+    public static final class Mod implements Comparable<Mod> {
+        private final String modId;
+
+        public Mod(String modId) {
+            this.modId = checkNotNull(modId);
+        }
+
+        @Override
+        public String toString() {
+            return modId;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            Mod mod = (Mod) o;
+            return modId.equals(mod.modId);
+        }
+
+        @Override
+        public int hashCode() {
+            return modId.hashCode();
+        }
+
+
+        @Override
+        public int compareTo(Mod o) {
+            return this.modId.compareTo(o.modId);
+        }
+    }
+
+    /**
+     * Denotes a link to be tagged as an optical link.
+     */
+    public static final Mod MOD_OPTICAL = new Mod("optical");
+
+    /**
+     * Denotes a link to be tagged with animated traffic ("marching ants").
+     */
+    public static final Mod MOD_ANIMATED = new Mod("animated");
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/TopoElementType.java b/core/api/src/main/java/org/onosproject/ui/topo/TopoElementType.java
new file mode 100644
index 0000000..dc32746
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/TopoElementType.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 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.topo;
+
+/**
+ * The topology element types to which a highlight can be applied.
+ */
+public enum TopoElementType {
+    DEVICE, HOST, LINK
+}
