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
new file mode 100644
index 0000000..e797130
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/ui/topo/ButtonDescriptor.java
@@ -0,0 +1,90 @@
+/*
+ * 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/PropertyPanel.java b/core/api/src/main/java/org/onosproject/ui/topo/PropertyPanel.java
index 03ff2a3..43364ea 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<Button> buttons = new ArrayList<>();
+    private List<ButtonDescriptor> 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<Button> buttons() {
+    public List<ButtonDescriptor> buttons() {
         return buttons;
     }
 
@@ -216,14 +216,14 @@
      * @return self, for chaining
      */
     public PropertyPanel removeProps(String... keys) {
-        Set<String> keysForRemoval = Sets.newHashSet(keys);
-        List<Prop> propsToKeep = new ArrayList<>();
+        Set<String> forRemoval = Sets.newHashSet(keys);
+        List<Prop> toKeep = new ArrayList<>();
         for (Prop p: properties) {
-            if (!keysForRemoval.contains(p.key())) {
-                propsToKeep.add(p);
+            if (!forRemoval.contains(p.key())) {
+                toKeep.add(p);
             }
         }
-        properties = propsToKeep;
+        properties = toKeep;
         return this;
     }
 
@@ -238,13 +238,41 @@
     }
 
     /**
-     * Adds a button descriptor with the given identifier, to the panel data.
+     * Adds the given button descriptor to the panel data.
      *
-     * @param id button identifier
+     * @param button button descriptor
      * @return self, for chaining
      */
-    public PropertyPanel addButton(String id) {
-        buttons.add(new Button(id));
+    public PropertyPanel addButton(ButtonDescriptor button) {
+        buttons.add(button);
+        return this;
+    }
+
+    /**
+     * Removes buttons with the given descriptors from the list.
+     *
+     * @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) {
+            if (!forRemoval.contains(bd)) {
+                toKeep.add(bd);
+            }
+        }
+        buttons = toKeep;
+        return this;
+    }
+
+    /**
+     * Removes all currently defined buttons.
+     *
+     * @return self, for chaining
+     */
+    public PropertyPanel removeAllButtons() {
+        buttons.clear();
         return this;
     }
 
@@ -322,29 +350,4 @@
         }
     }
 
-    /**
-     * Button descriptor. Note that these work in conjunction with
-     * "buttons" defined in the JavaScript code for the overlay.
-     */
-    public static class Button {
-        private final String id;
-
-        /**
-         * Constructs a button descriptor with the given identifier.
-         *
-         * @param id button identifier
-         */
-        public Button(String id) {
-            this.id = id;
-        }
-
-        /**
-         * Returns the identifier for this button.
-         *
-         * @return button identifier
-         */
-        public String id() {
-            return id;
-        }
-    }
 }
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 d44ba9f..a48c253 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
@@ -79,6 +79,8 @@
      * details panels.
      */
     public static final class Properties {
+        public static final String SEPARATOR = "-";
+
         // summary panel
         public static final String DEVICES = "Devices";
         public static final String LINKS = "Links";
@@ -106,4 +108,30 @@
         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
+     * details panel.
+     */
+    public static final class CoreButtons {
+        public static final ButtonDescriptor SHOW_DEVICE_VIEW =
+                new CoreButton("Device", Glyphs.SWITCH, false);
+
+        public static final ButtonDescriptor SHOW_FLOW_VIEW =
+                new CoreButton("Flow", Glyphs.FLOW_TABLE, true);
+
+        public static final ButtonDescriptor SHOW_PORT_VIEW =
+                new CoreButton("Port", Glyphs.PORT_TABLE, true);
+
+        public static final ButtonDescriptor SHOW_GROUP_VIEW =
+                new CoreButton("Group", Glyphs.GROUP_TABLE, true);
+    }
+
 }
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
new file mode 100644
index 0000000..1f47a09
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/ui/topo/ButtonDescriptorTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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/PropertyPanelTest.java b/core/api/src/test/java/org/onosproject/ui/topo/PropertyPanelTest.java
index 7ca9ce5..e97c037 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
@@ -25,9 +25,7 @@
 import java.util.Iterator;
 import java.util.Map;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 /**
  * Unit tests for {@link PropertyPanel}.
@@ -43,11 +41,20 @@
     private static final String KEY_A = "A";
     private static final String KEY_B = "B";
     private static final String KEY_C = "C";
+    private static final String SEP = "-";
     private static final String KEY_Z = "Z";
     private static final String VALUE_A = "Hay";
     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<>();
 
@@ -73,6 +80,7 @@
         PROP_MAP.put(KEY_B, new Prop(KEY_B, VALUE_B));
         PROP_MAP.put(KEY_C, new Prop(KEY_C, VALUE_C));
         PROP_MAP.put(KEY_Z, new Prop(KEY_Z, VALUE_Z));
+        PROP_MAP.put(SEP, new PropertyPanel.Separator());
     }
 
     @Test
@@ -82,6 +90,7 @@
         assertEquals("wrong type", TYPE_ORIG, pp.typeId());
         assertNull("id?", pp.id());
         assertEquals("unexpected props", 0, pp.properties().size());
+        assertEquals("unexpected buttons", 0, pp.buttons().size());
     }
 
     @Test
@@ -141,6 +150,16 @@
     }
 
     @Test
+    public void separator() {
+        props();
+        pp.addSeparator()
+            .addProp(KEY_Z, VALUE_Z);
+
+        assertEquals("bad props", 5, pp.properties().size());
+        validateProps(KEY_A, KEY_B, KEY_C, SEP, KEY_Z);
+    }
+
+    @Test
     public void removeAllProps() {
         props();
         assertEquals("wrong props", 3, pp.properties().size());
@@ -192,4 +211,40 @@
         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 void verifyButtons(String... keys) {
+        Iterator<ButtonDescriptor> iter = pp.buttons().iterator();
+        for (String k: keys) {
+            assertEquals("wrong button", k, iter.next().id());
+        }
+        assertFalse("too many buttons", iter.hasNext());
+    }
+
+    @Test
+    public void buttons() {
+        basic();
+        pp.addButton(BD_A)
+                .addButton(BD_B);
+        assertEquals("wrong buttons", 2, pp.buttons().size());
+        verifyButtons(KEY_A, KEY_B);
+
+        pp.removeButtons(BD_B)
+                .addButton(BD_C)
+                .addButton(BD_Z);
+        assertEquals("wrong buttons", 3, pp.buttons().size());
+        verifyButtons(KEY_A, KEY_C, KEY_Z);
+
+        pp.removeAllButtons()
+                .addButton(BD_B);
+        assertEquals("wrong buttons", 1, pp.buttons().size());
+        verifyButtons(KEY_B);
+    }
 }
