diff --git a/web/gui/src/main/webapp/app/fw/remote/remote.js b/web/gui/src/main/webapp/app/fw/remote/remote.js
new file mode 100644
index 0000000..b0f4848
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/remote.js
@@ -0,0 +1,28 @@
+/*
+ * 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 Communications Module
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+(function () {
+    'use strict';
+
+    angular.module('onosRemote', ['onosUtil']);
+
+}());
diff --git a/web/gui/src/main/webapp/app/fw/remote/rest.js b/web/gui/src/main/webapp/app/fw/remote/rest.js
new file mode 100644
index 0000000..ceff93a
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/rest.js
@@ -0,0 +1,48 @@
+/*
+ * 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 Communications Module -- REST Service
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+(function () {
+    'use strict';
+
+    var $log;
+
+    angular.module('onosRemote')
+        .factory('RestService', ['$log', '$http', function (_$log_, $http) {
+            $log = _$log_;
+
+            function get(url, callback) {
+                $http.get(url).then(function (response) {
+                    // success
+                    callback(response.data);
+                }, function (response) {
+                    // error
+                    $log.warn('Failed to retrieve JSON data: ' + url,
+                        response.status, response.data);
+                });
+            }
+
+            return {
+                get: get
+            };
+        }]);
+
+}());
diff --git a/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js b/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
new file mode 100644
index 0000000..ecfcba7
--- /dev/null
+++ b/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
@@ -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.
+ */
+
+/*
+ ONOS GUI -- Remote -- REST Service - Unit Tests
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+describe('factory: fw/remote/rest.js', function() {
+    var $log, $httpBackend, fs, rs, promise;
+
+    beforeEach(module('onosUtil', 'onosRemote'));
+
+    beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) {
+        $log = _$log_;
+        $httpBackend = _$httpBackend_;
+        fs = FnService;
+        rs = RestService;
+    }));
+
+    it('should define RestService', function () {
+        expect(rs).toBeDefined();
+    });
+
+    it('should define api functions', function () {
+        expect(fs.areFunctions(rs, [
+            'get'
+        ])).toBeTruthy();
+    });
+
+    var mockData = {
+        id: 1,
+        prop: 'abc'
+    };
+
+    it('should fetch remote data', function () {
+        var called = 0,
+            capture = null;
+        $httpBackend.expectGET('/bar').respond(mockData);
+        spyOn($log, 'warn');
+
+        rs.get('/bar', function (data) {
+            called++;
+            capture = data;
+        });
+
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        $httpBackend.flush();
+        expect(called).toEqual(1);
+        expect(capture).toEqual(mockData);
+        expect($log.warn).not.toHaveBeenCalled();
+    });
+
+    it('should fail to fetch remote data', function () {
+        var called = 0,
+            capture = null;
+        $httpBackend.expectGET('/bar').respond(404, 'Not Found');
+        spyOn($log, 'warn');
+
+        rs.get('/bar', function (data) {
+            called++;
+            capture = data;
+        });
+
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        $httpBackend.flush();
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        expect($log.warn)
+            .toHaveBeenCalledWith('Failed to retrieve JSON data: /bar',
+                                    404, 'Not Found');
+    });
+
+});
diff --git a/web/gui/src/main/webapp/tests/karma.conf.js b/web/gui/src/main/webapp/tests/karma.conf.js
index 6f0628f..a08167a 100644
--- a/web/gui/src/main/webapp/tests/karma.conf.js
+++ b/web/gui/src/main/webapp/tests/karma.conf.js
@@ -29,6 +29,7 @@
         '../app/directives.js',
         '../app/fw/util/util.js',
         '../app/fw/svg/svg.js',
+        '../app/fw/remote/remote.js',
         // now load services etc. that augment the modules
         '../app/**/*.js',
 
