diff --git a/web/gui/src/main/webapp/_dev/overlaywork/AppUiTopoOverlay.java b/web/gui/src/main/webapp/_dev/overlaywork/AppUiTopoOverlay.java
deleted file mode 100644
index 784630b..0000000
--- a/web/gui/src/main/webapp/_dev/overlaywork/AppUiTopoOverlay.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.meowster.over;
-
-import org.onosproject.ui.UiTopoOverlay;
-import org.onosproject.ui.topo.ButtonId;
-import org.onosproject.ui.topo.PropertyPanel;
-import org.onosproject.ui.topo.TopoConstants.CoreButtons;
-import org.onosproject.ui.topo.TopoConstants.Glyphs;
-
-import static org.onosproject.ui.topo.TopoConstants.Properties.*;
-
-/**
- * Our topology overlay.
- */
-public class AppUiTopoOverlay extends UiTopoOverlay {
-
-    // NOTE: this must match the ID defined in topov.js
-    private static final String OVERLAY_ID = "meowster-overlay";
-
-    private static final String MY_TITLE = "I changed the title";
-    private static final String MY_VERSION = "Beta-1.0.0042";
-
-    private static final ButtonId FOO_BUTTON = new ButtonId("foo");
-    private static final ButtonId BAR_BUTTON = new ButtonId("bar");
-
-    public AppUiTopoOverlay() {
-        super(OVERLAY_ID);
-    }
-
-
-    @Override
-    public void modifySummary(PropertyPanel pp) {
-        pp.title("My App Rocks!")
-                .typeId(Glyphs.CROWN)
-                .removeProps(
-                        TOPOLOGY_SSCS,
-                        INTENTS,
-                        TUNNELS,
-                        FLOWS,
-                        VERSION
-                )
-                .addProp(VERSION, MY_VERSION);
-
-    }
-
-    @Override
-    public void modifyDeviceDetails(PropertyPanel pp) {
-        pp.title(MY_TITLE);
-        pp.removeProps(LATITUDE, LONGITUDE);
-
-        pp.addButton(FOO_BUTTON)
-                .addButton(BAR_BUTTON);
-
-        pp.removeButtons(CoreButtons.SHOW_PORT_VIEW)
-                .removeButtons(CoreButtons.SHOW_GROUP_VIEW)
-                .removeButtons(CoreButtons.SHOW_METER_VIEW);
-    }
-
-}
diff --git a/web/gui/src/main/webapp/_dev/overlaywork/README.txt b/web/gui/src/main/webapp/_dev/overlaywork/README.txt
deleted file mode 100644
index d7dcbec..0000000
--- a/web/gui/src/main/webapp/_dev/overlaywork/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-NOTE:
-
-This directory is putting under revision control some key files from
-an example stand-alone app, as I develop the topology overlay functionality.
diff --git a/web/gui/src/main/webapp/_dev/overlaywork/topov.js b/web/gui/src/main/webapp/_dev/overlaywork/topov.js
deleted file mode 100644
index 068c30c..0000000
--- a/web/gui/src/main/webapp/_dev/overlaywork/topov.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// sample topology overlay - client side
-(function () {
-    'use strict';
-
-    // injected refs
-    var $log, tov;
-
-    // internal state
-    var someStateValue = true;
-
-    // our overlay definition
-    var overlay = {
-        // NOTE: this must match the ID defined in AppUiTopoOverlay
-        overlayId: 'meowster-overlay',
-        glyphId: '*star4',
-        tooltip: 'Sample Meowster Topo Overlay',
-
-        // These glyphs get installed using the overlayId as a prefix.
-        // e.g. 'star4' is installed as 'meowster-overlay-star4'
-        // They can be referenced (from this overlay) as '*star4'
-        // That is, the '*' prefix stands in for 'meowster-overlay-'
-        glyphs: {
-            star4: {
-                vb: '0 0 8 8',
-                d: 'M1,4l2,-1l1,-2l1,2l2,1l-2,1l-1,2l-1,-2z'
-            },
-            banner: {
-                vb: '0 0 6 6',
-                d: 'M1,1v4l2,-2l2,2v-4z'
-            }
-        },
-
-        activate: function () {
-            $log.debug("sample topology overlay ACTIVATED");
-        },
-        deactivate: function () {
-            $log.debug("sample topology overlay DEACTIVATED");
-        },
-
-
-
-
-
-        // detail panel button definitions
-        buttons: {
-            foo: {
-                gid: 'chain',
-                tt: 'A FOO action',
-                cb: function (data) {
-                    $log.debug('FOO action invoked with data:', data);
-                }
-            },
-            bar: {
-                gid: '*banner',
-                tt: 'A BAR action',
-                cb: function (data) {
-                    $log.debug('BAR action invoked with data:', data);
-                }
-            }
-        },
-
-        // Key bindings for traffic overlay buttons
-        // NOTE: fully qual. button ID is derived from overlay-id and key-name
-        keyBindings: {
-            V: {
-                cb: buttonCallback,
-                tt: 'Uses the V key',
-                gid: '*banner'
-            },
-            F: {
-                cb: buttonCallback,
-                tt: 'Uses the F key',
-                gid: 'chain'
-            },
-            G: {
-                cb: buttonCallback,
-                tt: 'Uses the G key',
-                gid: 'crown'
-            },
-
-            T: {
-                cb: buttonCallback,
-                tt: 'Uses the T key',
-                gid: 'switch'
-            },
-
-            R: {
-                cb: buttonCallback,
-                tt: 'Uses the R key',
-                gid: 'endstation'
-            },
-
-            0: {
-                cb: buttonCallback,
-                tt: 'Uses the ZERO key',
-                gid: 'xMark'
-            },
-
-            _keyOrder: [
-                '0', 'V', 'F', 'G', 'T', 'R'
-            ]
-
-            // NOTE: T and R should be rejected (not installed)
-            //       T is reserved for 'toggle Theme'
-            //       R is reserved for 'Reset pan and zoom'
-        },
-
-        hooks: {
-            // hook for handling escape key
-            // Must return true to consume ESC, false otherwise.
-            escape: cancelState,
-
-            // hooks for when the selection changes...
-            empty: function () {
-                selectionCallback('empty');
-            },
-            single: function (data) {
-                selectionCallback('single', data);
-            },
-            multi: function (selectOrder) {
-                selectionCallback('multi', selectOrder);
-                tov.addDetailButton('foo');
-                tov.addDetailButton('bar');
-            }
-        }
-
-    };
-
-    // invoked when the escape key is pressed
-    function cancelState() {
-        if (someStateValue) {
-            someStateValue = false;
-            // we consumed the ESC event
-            return true;
-        }
-        return false;
-    }
-
-    function buttonCallback(x) {
-        $log.debug('Toolbar-button callback', x);
-    }
-
-    function selectionCallback(x, d) {
-        $log.debug('Selection callback', x, d);
-    }
-
-    // invoke code to register with the overlay service
-    angular.module('ovSample')
-        .run(['$log', 'TopoOverlayService',
-
-            function (_$log_, _tov_) {
-                $log = _$log_;
-                tov = _tov_;
-                tov.register(overlay);
-            }]);
-
-}());
