diff --git a/core/api/src/main/java/org/onosproject/ui/topo/ButtonDescriptor.java b/core/api/src/main/java/org/onosproject/ui/topo/ButtonDescriptor.java
deleted file mode 100644
index e797130..0000000
--- a/core/api/src/main/java/org/onosproject/ui/topo/ButtonDescriptor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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;
-
-/**
- * Designates a descriptor for a button on the topology view panels.
- */
-public class ButtonDescriptor {
-
-    private final String id;
-    private final String glyphId;
-    private final String tooltip;
-
-    /**
-     * Creates a button descriptor with the given identifier, glyph ID, and
-     * tooltip text. To reference a custom glyph defined in the overlay itself,
-     * prefix its ID with an asterisk, (e.g. {@code "*myGlyph"}). Alternatively,
-     * use one of the {@link TopoConstants.Glyphs predefined constant}.
-     *
-     * @param id identifier for the button
-     * @param glyphId identifier for the glyph
-     * @param tooltip tooltip text
-     */
-    public ButtonDescriptor(String id, String glyphId, String tooltip) {
-        this.id = id;
-        this.glyphId = glyphId;
-        this.tooltip = tooltip;
-    }
-
-    /**
-     * Returns the identifier for this button.
-     *
-     * @return identifier
-     */
-    public String id() {
-        return id;
-    }
-
-    /**
-     * Returns the glyph identifier for this button.
-     *
-     * @return glyph identifier
-     */
-    public String glyphId() {
-        return glyphId;
-    }
-
-    /**
-     * Returns the tooltip text for this button.
-     *
-     * @return tooltip text
-     */
-    public String tooltip() {
-        return tooltip;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ButtonDescriptor that = (ButtonDescriptor) o;
-        return id.equals(that.id);
-
-    }
-
-    @Override
-    public int hashCode() {
-        return id.hashCode();
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/ButtonId.java b/core/api/src/main/java/org/onosproject/ui/topo/ButtonId.java
new file mode 100644
index 0000000..ca2eccc
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/ButtonId.java
@@ -0,0 +1,70 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+
+/**
+ * Designates the identity of a button on the topology view panels.
+ */
+public class ButtonId {
+
+    private final String id;
+
+    /**
+     * Creates a button ID with the given identifier.
+     *
+     * @param id identifier for the button
+     */
+    public ButtonId(String id) {
+        this.id = id;
+    }
+
+    /**
+     * Returns the identifier for this button.
+     *
+     * @return identifier
+     */
+    public String id() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("id", id()).toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        ButtonId that = (ButtonId) o;
+        return id.equals(that.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return id.hashCode();
+    }
+}
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/PropertyPanel.java b/core/api/src/main/java/org/onosproject/ui/topo/PropertyPanel.java
index 43364ea..121e083 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/PropertyPanel.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/PropertyPanel.java
@@ -35,7 +35,7 @@
     private String typeId;
     private String id;
     private List<Prop> properties = new ArrayList<>();
-    private List<ButtonDescriptor> buttons = new ArrayList<>();
+    private List<ButtonId> buttons = new ArrayList<>();
 
     /**
      * Constructs a property panel model with the given title and
@@ -181,7 +181,7 @@
      * @return the button list
      */
     // TODO: consider protecting this?
-    public List<ButtonDescriptor> buttons() {
+    public List<ButtonId> buttons() {
         return buttons;
     }
 
@@ -243,7 +243,7 @@
      * @param button button descriptor
      * @return self, for chaining
      */
-    public PropertyPanel addButton(ButtonDescriptor button) {
+    public PropertyPanel addButton(ButtonId button) {
         buttons.add(button);
         return this;
     }
@@ -254,10 +254,10 @@
      * @param descriptors descriptors to remove
      * @return self, for chaining
      */
-    public PropertyPanel removeButtons(ButtonDescriptor... descriptors) {
-        Set<ButtonDescriptor> forRemoval = Sets.newHashSet(descriptors);
-        List<ButtonDescriptor> toKeep = new ArrayList<>();
-        for (ButtonDescriptor bd: buttons) {
+    public PropertyPanel removeButtons(ButtonId... descriptors) {
+        Set<ButtonId> forRemoval = Sets.newHashSet(descriptors);
+        List<ButtonId> toKeep = new ArrayList<>();
+        for (ButtonId bd: buttons) {
             if (!forRemoval.contains(bd)) {
                 toKeep.add(bd);
             }
diff --git a/core/api/src/main/java/org/onosproject/ui/topo/TopoConstants.java b/core/api/src/main/java/org/onosproject/ui/topo/TopoConstants.java
index a48c253..38a8f03 100644
--- a/core/api/src/main/java/org/onosproject/ui/topo/TopoConstants.java
+++ b/core/api/src/main/java/org/onosproject/ui/topo/TopoConstants.java
@@ -108,30 +108,22 @@
         public static final String VLAN = "VLAN";
     }
 
-    private static final class CoreButton extends ButtonDescriptor {
-        private CoreButton(String tag, String glyphId, boolean extra) {
-            super("show" + tag + "View",
-                  glyphId,
-                  "Show " + tag + " View" + (extra ? " for this Device" : ""));
-        }
-    }
-
     /**
-     * Defines constants for core buttons that appear on the topology
+     * Defines identities of core buttons that appear on the topology
      * details panel.
      */
     public static final class CoreButtons {
-        public static final ButtonDescriptor SHOW_DEVICE_VIEW =
-                new CoreButton("Device", Glyphs.SWITCH, false);
+        public static final ButtonId SHOW_DEVICE_VIEW =
+                new ButtonId("showDeviceView");
 
-        public static final ButtonDescriptor SHOW_FLOW_VIEW =
-                new CoreButton("Flow", Glyphs.FLOW_TABLE, true);
+        public static final ButtonId SHOW_FLOW_VIEW =
+                new ButtonId("showFlowView");
 
-        public static final ButtonDescriptor SHOW_PORT_VIEW =
-                new CoreButton("Port", Glyphs.PORT_TABLE, true);
+        public static final ButtonId SHOW_PORT_VIEW =
+                new ButtonId("showPortView");
 
-        public static final ButtonDescriptor SHOW_GROUP_VIEW =
-                new CoreButton("Group", Glyphs.GROUP_TABLE, true);
+        public static final ButtonId SHOW_GROUP_VIEW =
+                new ButtonId("showGroupView");
     }
 
 }
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/ButtonDescriptorTest.java b/core/api/src/test/java/org/onosproject/ui/topo/ButtonDescriptorTest.java
deleted file mode 100644
index 1f47a09..0000000
--- a/core/api/src/test/java/org/onosproject/ui/topo/ButtonDescriptorTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Unit tests for {@link ButtonDescriptor}.
- */
-public class ButtonDescriptorTest {
-
-    private static final String ID = "my-id";
-    private static final String GID = "my-glyphId";
-    private static final String TT = "my-tewltyp";
-
-    private ButtonDescriptor bd;
-
-
-    @Test
-    public void basic() {
-        bd = new ButtonDescriptor(ID, GID, TT);
-
-        assertEquals("bad id", ID, bd.id());
-        assertEquals("bad gid", GID, bd.glyphId());
-        assertEquals("bad tt", TT, bd.tooltip());
-    }
-
-}
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/ButtonIdTest.java b/core/api/src/test/java/org/onosproject/ui/topo/ButtonIdTest.java
new file mode 100644
index 0000000..04c6dc1
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/ButtonIdTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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 org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link ButtonId}.
+ */
+public class ButtonIdTest {
+
+    private static final String ID1 = "id-1";
+    private static final String ID2 = "id-2";
+
+    private ButtonId b1, b2;
+
+
+    @Test
+    public void basic() {
+        b1 = new ButtonId(ID1);
+    }
+
+    @Test
+    public void same() {
+        b1 = new ButtonId(ID1);
+        b2 = new ButtonId(ID1);
+        assertFalse("same ref?", b1 == b2);
+        assertTrue("not equal?", b1.equals(b2));
+    }
+
+    @Test
+    public void notSame() {
+        b1 = new ButtonId(ID1);
+        b2 = new ButtonId(ID2);
+        assertFalse("same ref?", b1 == b2);
+        assertFalse("equal?", b1.equals(b2));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/PropertyPanelTest.java b/core/api/src/test/java/org/onosproject/ui/topo/PropertyPanelTest.java
index e97c037..b08ee4d 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/PropertyPanelTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/PropertyPanelTest.java
@@ -47,14 +47,6 @@
     private static final String VALUE_B = "Bee";
     private static final String VALUE_C = "Sea";
     private static final String VALUE_Z = "Zed";
-    private static final String GID_A = "gid-A";
-    private static final String GID_B = "gid-B";
-    private static final String GID_C = "gid-C";
-    private static final String GID_Z = "gid-Z";
-    private static final String TT_A = "toolTip-A";
-    private static final String TT_B = "toolTip-B";
-    private static final String TT_C = "toolTip-C";
-    private static final String TT_Z = "toolTip-Z";
 
     private static final Map<String, Prop> PROP_MAP = new HashMap<>();
 
@@ -211,17 +203,13 @@
         validateProp(KEY_B, ">byyy<");
     }
 
-    private static final ButtonDescriptor BD_A =
-            new ButtonDescriptor(KEY_A, GID_A, TT_A);
-    private static final ButtonDescriptor BD_B =
-            new ButtonDescriptor(KEY_B, GID_B, TT_B);
-    private static final ButtonDescriptor BD_C =
-            new ButtonDescriptor(KEY_C, GID_C, TT_C);
-    private static final ButtonDescriptor BD_Z =
-            new ButtonDescriptor(KEY_Z, GID_Z, TT_Z);
+    private static final ButtonId BD_A = new ButtonId(KEY_A);
+    private static final ButtonId BD_B = new ButtonId(KEY_B);
+    private static final ButtonId BD_C = new ButtonId(KEY_C);
+    private static final ButtonId BD_Z = new ButtonId(KEY_Z);
 
     private void verifyButtons(String... keys) {
-        Iterator<ButtonDescriptor> iter = pp.buttons().iterator();
+        Iterator<ButtonId> iter = pp.buttons().iterator();
         for (String k: keys) {
             assertEquals("wrong button", k, iter.next().id());
         }
