diff --git a/web/gui/src/main/webapp/app/index.html b/web/gui/src/main/webapp/app/index.html
index beeb2d3..bad7a6c 100644
--- a/web/gui/src/main/webapp/app/index.html
+++ b/web/gui/src/main/webapp/app/index.html
@@ -73,6 +73,7 @@
     <!-- {INJECTED-JAVASCRIPT} -->
     <script src="view/sample/sample.js"></script>
     <script src="view/topo/topo.js"></script>
+    <script src="view/topo/topoEvent.js"></script>
     <script src="view/device/device.js"></script>
     <!-- TODO: inject javascript refs server-side -->
 
diff --git a/web/gui/src/main/webapp/app/view/topo/topo.js b/web/gui/src/main/webapp/app/view/topo/topo.js
index 5addda8..480e499 100644
--- a/web/gui/src/main/webapp/app/view/topo/topo.js
+++ b/web/gui/src/main/webapp/app/view/topo/topo.js
@@ -28,13 +28,13 @@
     ];
 
     // references to injected services etc.
-    var $log, ks, zs, gs, ms, wss, ps;
+    var $log, ks, zs, gs, ms, ps, wss, tes;
 
     // DOM elements
     var ovtopo, svg, defs, zoomLayer, map;
 
     // Internal state
-    var zoomer, wsock;
+    var zoomer, wsock, evDispatcher;
 
     // Note: "exported" state should be properties on 'self' variable
 
@@ -130,20 +130,21 @@
     }
 
     // --- Web Socket Connection -----------------------------------------
+    // TODO: migrate this code to be encapsulated by TopoEventService
 
     function onWsOpen() {
         $log.log('web socket opened...');
-
+        evDispatcher.sendEvent('requestSummary');
     }
 
     function onWsMessage(ev) {
-        $log.log('got JSON event: ', ev);
-
+        evDispatcher.handleEvent(ev);
     }
 
     function onWsClose(reason) {
         $log.log('web socket closed; reason=', reason);
-
+        wsock = null;
+        tes.bindSock(null);
     }
 
     // wsport indicates web-socket-server port other than the default.
@@ -156,6 +157,8 @@
             wsport: wsport
         });
 
+        tes.bindSock(wsock);
+
         // TODO: handle "guiSuccessor" functionality (replace host)
         // TODO: implement retry on close functionality
 
@@ -172,18 +175,19 @@
         .controller('OvTopoCtrl', [
             '$scope', '$log', '$location', '$timeout',
             'KeyService', 'ZoomService', 'GlyphService', 'MapService',
-            'WebSocketService', 'PanelService',
+            'PanelService', 'WebSocketService', 'TopoEventService',
 
         function ($scope, _$log_, $loc, $timeout,
-                  _ks_, _zs_, _gs_, _ms_, _wss_, _ps_) {
+                  _ks_, _zs_, _gs_, _ms_, _ps_, _wss_, _tes_) {
             var self = this;
             $log = _$log_;
             ks = _ks_;
             zs = _zs_;
             gs = _gs_;
             ms = _ms_;
-            wss = _wss_;
             ps = _ps_;
+            wss = _wss_;
+            tes = _tes_;
 
             self.notifyResize = function () {
                 svgResized(svg.style('width'), svg.style('height'));
@@ -194,6 +198,7 @@
                 $log.log('OvTopoCtrl is saying Buh-Bye!');
                 wsock && wsock.close();
                 wsock = null;
+                tes.bindSock(null);
                 ps.destroyPanel('topo-p-summary');
             });
 
@@ -201,6 +206,9 @@
             ovtopo = d3.select('#ov-topo');
             svg = ovtopo.select('svg');
 
+            // bind to topo event service..
+            evDispatcher = tes.dispatcher;
+
             setUpKeys();
             setUpDefs();
             setUpZoom();
diff --git a/web/gui/src/main/webapp/app/view/topo/topoEvent.js b/web/gui/src/main/webapp/app/view/topo/topoEvent.js
new file mode 100644
index 0000000..943c883
--- /dev/null
+++ b/web/gui/src/main/webapp/app/view/topo/topoEvent.js
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ */
+
+/*
+ ONOS GUI -- Topology Event Module.
+ Defines event handling for events received from the server.
+ */
+
+(function () {
+    'use strict';
+
+    var $log, wes;
+
+    var evHandler = {
+        showSummary: showSummary,
+        addInstance: addInstance
+    };
+
+    function unknownEvent(ev) {
+        $log.warn('Unknown event (ignored):', ev);
+    }
+
+    // === Event Handlers ===
+
+    function showSummary(ev) {
+        $log.log('  **** Show Summary ****  ', ev.payload);
+    }
+
+    function addInstance(ev) {
+        $log.log(' *** We got an ADD INSTANCE event: ', ev);
+    }
+
+    angular.module('ovTopo')
+        .factory('TopoEventService', ['$log', 'WsEventService',
+        function (_$log_, _wes_) {
+            $log = _$log_;
+            wes = _wes_;
+
+            var wsock;
+
+            return {
+                dispatcher: {
+                    handleEvent: function (ev) {
+                        (evHandler[ev.event] || unknownEvent)(ev);
+                    },
+                    sendEvent: function (evType, payload) {
+                        if (wsock) {
+                            wes.sendEvent(wsock, evType, payload);
+                        } else {
+                            $log.warn('sendEvent: no websocket open:',
+                                evType, payload);
+                        }
+                    }
+                },
+                bindSock: function (ws) {
+                    wsock = ws;
+                }
+            }
+        }]);
+}());
