diff --git a/web/gui/src/main/webapp/app/fw/remote/rest.js b/web/gui/src/main/webapp/app/fw/remote/rest.js
index 9361afc..a7640cd 100644
--- a/web/gui/src/main/webapp/app/fw/remote/rest.js
+++ b/web/gui/src/main/webapp/app/fw/remote/rest.js
@@ -22,9 +22,6 @@
 
     var $log;
 
-    var urlSuffix = '/onos/ui/rs/';
-
-
 
     // TODO: remove temporary test code
     var fakeData = {
@@ -119,7 +116,7 @@
                     callback(getFakeData(url));
                     return;
                 }
-                var fullUrl = ufs.urlPrefix() + urlSuffix + url;
+                var fullUrl = ufs.rsUrl(url);
 
                 $http.get(fullUrl).then(function (response) {
                     // success
diff --git a/web/gui/src/main/webapp/app/fw/remote/urlfn.js b/web/gui/src/main/webapp/app/fw/remote/urlfn.js
index 1301ea3..fcb373c 100644
--- a/web/gui/src/main/webapp/app/fw/remote/urlfn.js
+++ b/web/gui/src/main/webapp/app/fw/remote/urlfn.js
@@ -20,15 +20,43 @@
 (function () {
     'use strict';
 
+    var uiContext = '/onos/ui/',
+        rsSuffix = uiContext + 'rs/',
+        wsSuffix = uiContext + 'ws/';
+
     angular.module('onosRemote')
         .factory('UrlFnService', ['$location', function ($loc) {
 
-            function urlPrefix() {
-                return $loc.protocol() + '://' + $loc.host() + ':' + $loc.port();
+            function matchSecure(protocol) {
+                var p = $loc.protocol(),
+                    secure = (p === 'https' || p === 'wss');
+                return secure ? protocol + 's' : protocol;
+            }
+
+            function urlBase(protocol) {
+                return matchSecure(protocol) + '://' +
+                    $loc.host() + ':' + $loc.port();
+            }
+
+            function httpPrefix(suffix) {
+                return urlBase('http') + suffix;
+            }
+
+            function wsPrefix(suffix) {
+                return urlBase('ws') + suffix;
+            }
+
+            function rsUrl(path) {
+                return httpPrefix(rsSuffix) + path;
+            }
+
+            function wsUrl(path) {
+                return wsPrefix(wsSuffix) + path;
             }
 
             return {
-               urlPrefix: urlPrefix
+                rsUrl: rsUrl,
+                wsUrl: wsUrl
             };
         }]);
 
diff --git a/web/gui/src/main/webapp/app/fw/remote/websocket.js b/web/gui/src/main/webapp/app/fw/remote/websocket.js
new file mode 100644
index 0000000..273f711
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/websocket.js
@@ -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.
+ */
+
+/*
+ ONOS GUI -- Remote -- Web Socket Service
+ */
+(function () {
+    'use strict';
+
+    angular.module('onosRemote')
+    .factory('WebSocketService', ['$location', 'UrlFnService',
+        function ($loc, ufs) {
+
+            // creates a web socket for the given path, returning a "handle"
+            function createWebSocket(path) {
+                return {
+                    path: ufs.wsUrl(path)
+                    // TODO: complete implementation...
+                };
+            }
+
+            return {
+                createWebSocket: createWebSocket
+            };
+    }]);
+
+}());
diff --git a/web/gui/src/main/webapp/app/fw/remote/wsevent.js b/web/gui/src/main/webapp/app/fw/remote/wsevent.js
new file mode 100644
index 0000000..c410592
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/wsevent.js
@@ -0,0 +1,31 @@
+/*
+ * 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 -- Remote -- Web Socket Event Service
+ */
+(function () {
+    'use strict';
+
+    angular.module('onosRemote')
+        .factory('WsEventService', ['$location', function ($loc) {
+            
+            return {
+               tbd: function () {}
+            };
+        }]);
+
+}());
diff --git a/web/gui/src/main/webapp/app/index.html b/web/gui/src/main/webapp/app/index.html
index f455406..7dfcdbd 100644
--- a/web/gui/src/main/webapp/app/index.html
+++ b/web/gui/src/main/webapp/app/index.html
@@ -52,6 +52,8 @@
     <script src="fw/remote/remote.js"></script>
     <script src="fw/remote/urlfn.js"></script>
     <script src="fw/remote/rest.js"></script>
+    <script src="fw/remote/websocket.js"></script>
+    <script src="fw/remote/wsevent.js"></script>
 
     <!-- Framework and library stylesheets included here -->
     <!-- TODO: use a single catenated-minified file here -->
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 d185dc1..802ecc7 100644
--- a/web/gui/src/main/webapp/app/view/topo/topo.js
+++ b/web/gui/src/main/webapp/app/view/topo/topo.js
@@ -23,11 +23,12 @@
 
     var moduleDependencies = [
         'onosUtil',
-        'onosSvg'
+        'onosSvg',
+        'onosRemote'
     ];
 
     // references to injected services etc.
-    var $log, ks, zs, gs, ms;
+    var $log, ks, zs, gs, ms, wss;
 
     // DOM elements
     var ovtopo, svg, defs, zoomLayer, map;
@@ -128,6 +129,15 @@
         //showCallibrationPoints();
     }
 
+    // --- Web Socket Connection -----------------------------------------
+
+    function setUpWebSocket() {
+        var wsHandle = wss.createWebSocket('topology');
+        $log.log('created web socket', wsHandle);
+        // TODO: complete implementation
+
+    }
+
     // --- Controller Definition -----------------------------------------
 
     angular.module('ovTopo', moduleDependencies)
@@ -135,14 +145,16 @@
         .controller('OvTopoCtrl', [
             '$log',
             'KeyService', 'ZoomService', 'GlyphService', 'MapService',
+            'WebSocketService',
 
-        function (_$log_, _ks_, _zs_, _gs_, _ms_) {
+        function (_$log_, _ks_, _zs_, _gs_, _ms_, _wss_) {
             var self = this;
             $log = _$log_;
             ks = _ks_;
             zs = _zs_;
             gs = _gs_;
             ms = _ms_;
+            wss = _wss_;
 
             self.notifyResize = function () {
                 svgResized(svg.style('width'), svg.style('height'));
@@ -156,6 +168,7 @@
             setUpDefs();
             setUpZoom();
             setUpMap();
+            setUpWebSocket();
 
             $log.log('OvTopoCtrl has been created');
         }]);
diff --git a/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js b/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js
index cf41a13..9886fc3 100644
--- a/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js
@@ -20,14 +20,16 @@
 describe('factory: fw/remote/urlfn.js', function () {
     var $log, $loc, ufs, fs;
 
+    var protocol, host, port;
+
     beforeEach(module('onosRemote'));
 
     beforeEach(module(function($provide) {
        $provide.factory('$location', function (){
         return {
-            protocol: function () { return 'http'; },
-            host: function () { return 'foo'; },
-            port: function () { return '80'; }
+            protocol: function () { return protocol; },
+            host: function () { return host; },
+            port: function () { return port; }
         };
        })
     }));
@@ -39,17 +41,39 @@
         fs = FnService;
     }));
 
+    function setLoc(prot, h, p) {
+        protocol = prot;
+        host = h;
+        port = p;
+    }
+
     it('should define UrlFnService', function () {
         expect(ufs).toBeDefined();
     });
 
     it('should define api functions', function () {
         expect(fs.areFunctions(ufs, [
-            'urlPrefix'
+            'rsUrl', 'wsUrl'
         ])).toBeTruthy();
     });
 
-    it('should build the url prefix', function () {
-       expect(ufs.urlPrefix()).toEqual('http://foo:80');
+    it('should return the correct (http) RS url', function () {
+        setLoc('http', 'foo', '123');
+        expect(ufs.rsUrl('path')).toEqual('http://foo:123/onos/ui/rs/path');
+    });
+
+    it('should return the correct (https) RS url', function () {
+        setLoc('https', 'foo', '123');
+        expect(ufs.rsUrl('path')).toEqual('https://foo:123/onos/ui/rs/path');
+    });
+
+    it('should return the correct (ws) WS url', function () {
+        setLoc('http', 'foo', '123');
+        expect(ufs.wsUrl('path')).toEqual('ws://foo:123/onos/ui/ws/path');
+    });
+
+    it('should return the correct (wss) WS url', function () {
+        setLoc('https', 'foo', '123');
+        expect(ufs.wsUrl('path')).toEqual('wss://foo:123/onos/ui/ws/path');
     });
 });
