Added app, tests, lint to BUCK file for web/gui2

Change-Id: I94912cb18f31db26971b66c9d851fb57f022df54
diff --git a/web/gui2/src/main/tslint.json b/web/gui2/src/main/tslint.json
index cb6dee5..0e12d1d 100644
--- a/web/gui2/src/main/tslint.json
+++ b/web/gui2/src/main/tslint.json
@@ -18,7 +18,6 @@
     "forin": true,
     "import-blacklist": [
       true,
-      "rxjs",
       "rxjs/Rx"
     ],
     "import-spacing": true,
diff --git a/web/gui2/src/main/webapp/app/detectbrowser.directive.ts b/web/gui2/src/main/webapp/app/detectbrowser.directive.ts
index 2c2b335..b69ca39 100644
--- a/web/gui2/src/main/webapp/app/detectbrowser.directive.ts
+++ b/web/gui2/src/main/webapp/app/detectbrowser.directive.ts
@@ -37,10 +37,14 @@
         let browser = '';
         if (fs.isChrome()) {
             browser = 'chrome';
+        } else if (fs.isChromeHeadless()) {
+            browser = 'chromeheadless';
         } else if (fs.isSafari()) {
             browser = 'safari';
         } else if (fs.isFirefox()) {
             browser = 'firefox';
+        } else {
+            this.log.warn('Unknown browser:', window.navigator.vendor);
         }
         body.classList.add(browser);
 //        body.classed(browser, true);
diff --git a/web/gui2/src/main/webapp/app/fw/layer/detailspanel.service.ts b/web/gui2/src/main/webapp/app/fw/layer/detailspanel.service.ts
index dcd33b0..5699262 100644
--- a/web/gui2/src/main/webapp/app/fw/layer/detailspanel.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/layer/detailspanel.service.ts
@@ -29,7 +29,7 @@
 export class DetailsPanelService {
 
   constructor(
-      private etc: EditableTextService,
+      private ets: EditableTextService,
       private fs: FnService,
       private is: IconService,
       private log: LogService,
diff --git a/web/gui2/src/main/webapp/app/fw/layer/loading.service.ts b/web/gui2/src/main/webapp/app/fw/layer/loading.service.ts
index 6c31f15..0d03ad6 100644
--- a/web/gui2/src/main/webapp/app/fw/layer/loading.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/layer/loading.service.ts
@@ -36,7 +36,7 @@
 @Injectable()
 export class LoadingService {
     images: any[] = [];
-    idx: number = 0;
+    idx = 0;
     img: any;
     theme: string;
     task: any;
@@ -60,7 +60,7 @@
         let idx: number;
 
         this.dbg('preload images start...');
-        for (idx=1; idx<=nImgs; idx++) {
+        for (idx = 1; idx <= nImgs ; idx++) {
             this.addImg('light', idx);
             this.addImg('dark', idx);
         }
@@ -68,7 +68,7 @@
     }
 
     addImg(theme: string, idx: number) {
-        let img = new Image();
+        const img = new Image();
         img.src = this.fname(idx, theme);
         this.images.push(img);
     }
@@ -87,7 +87,7 @@
     startAnim() {
         this.dbg('start ANIMATION');
         this.theme = this.ts.getTheme();
-        let div = d3.select('#'+id);
+        let div = d3.select('#' + id);
         if (div.empty()) {
             div = d3.select('body')
                 .append('div')
@@ -107,7 +107,7 @@
             clearInterval(this.task);
             this.task = null;
         }
-        d3.select('#'+id).remove();
+        d3.select('#' + id).remove();
     }
 
     // schedule function to start animation in the future
diff --git a/web/gui2/src/main/webapp/app/fw/remote/websocket.service.ts b/web/gui2/src/main/webapp/app/fw/remote/websocket.service.ts
index 4189418..0691c72 100644
--- a/web/gui2/src/main/webapp/app/fw/remote/websocket.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/remote/websocket.service.ts
@@ -89,12 +89,12 @@
      *  host:   if defined, is the host address to use
      */
     createWebSocket(opts, _host_: string = '') {
-        let wsport = (opts && opts.wsport) || null;
+        const wsport = (opts && opts.wsport) || null;
 
         this.webSockOpts = opts; // preserved for future calls
 
 //        this.host = _host_ || this.host();
-        let url = this.ufs.wsUrl('core', wsport, _host_);
+        const url = this.ufs.wsUrl('core', wsport, _host_);
 
         this.log.debug('Attempting to open websocket to: ' + url);
         this.ws = this.wsock.newWebSocket(url);
@@ -126,10 +126,10 @@
      * If the websocket is not up yet, we store it in a pending list.
      */
     sendEvent(evType, payload) {
-        let ev = <EventType> {
+        const ev = <EventType> {
             event: evType,
             payload: payload
-        }
+        };
 
         if (this.wsUp) {
             this._send(ev);
diff --git a/web/gui2/src/main/webapp/app/fw/svg/glyph.service.ts b/web/gui2/src/main/webapp/app/fw/svg/glyph.service.ts
index 5b080ea..7e8adb4 100644
--- a/web/gui2/src/main/webapp/app/fw/svg/glyph.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/svg/glyph.service.ts
@@ -96,7 +96,7 @@
     registerGlyphs(data: Map<string, string>, overwrite: boolean = false): boolean {
         const dups: string[] = [];
         const missvb: string[] = [];
-        for (let [key, value] of data.entries()) {
+        for (const [key, value] of data.entries()) {
             const vbk = '_' + key;
             const vb = data.get(vbk);
 
@@ -120,7 +120,7 @@
             return false;
         }
 
-        for (let [key, value] of data.entries()) {
+        for (const [key, value] of data.entries()) {
 //        angular.forEach(data, function (value, key) {
             if (key[0] !== '_') {
                 this.addToMap(key, value, vb, overwrite, dups);
diff --git a/web/gui2/src/main/webapp/app/fw/svg/icon.directive.ts b/web/gui2/src/main/webapp/app/fw/svg/icon.directive.ts
index 95699d0..a8de561 100644
--- a/web/gui2/src/main/webapp/app/fw/svg/icon.directive.ts
+++ b/web/gui2/src/main/webapp/app/fw/svg/icon.directive.ts
@@ -29,7 +29,7 @@
 })
 export class IconDirective implements OnInit {
     @Input() iconId: string;
-    @Input() iconSize: number = 20;
+    @Input() iconSize = 20;
 
     constructor(
         private el: ElementRef,
diff --git a/web/gui2/src/main/webapp/app/fw/svg/icon.service.ts b/web/gui2/src/main/webapp/app/fw/svg/icon.service.ts
index 8d9d3c6..674cbbf 100644
--- a/web/gui2/src/main/webapp/app/fw/svg/icon.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/svg/icon.service.ts
@@ -27,65 +27,65 @@
     // Maps icon ID to the glyph ID it uses.
     // NOTE: icon ID maps to a CSS class for styling that icon
     ['active', 'checkMark'],
-    ['inactive','xMark'],
+    ['inactive', 'xMark'],
 
-    ['plus','plus'],
-    ['minus','minus'],
-    ['play','play'],
-    ['stop','stop'],
+    ['plus', 'plus'],
+    ['minus', 'minus'],
+    ['play', 'play'],
+    ['stop', 'stop'],
 
-    ['upload','upload'],
-    ['download','download'],
-    ['delta','delta'],
-    ['nonzero','nonzero'],
-    ['close','xClose'],
+    ['upload', 'upload'],
+    ['download', 'download'],
+    ['delta', 'delta'],
+    ['nonzero', 'nonzero'],
+    ['close', 'xClose'],
 
-    ['topo','topo'],
+    ['topo', 'topo'],
 
-    ['refresh','refresh'],
-    ['query','query'],
-    ['garbage','garbage'],
+    ['refresh', 'refresh'],
+    ['query', 'query'],
+    ['garbage', 'garbage'],
 
 
-    ['upArrow','triangleUp'],
-    ['downArrow','triangleDown'],
+    ['upArrow', 'triangleUp'],
+    ['downArrow', 'triangleDown'],
 
-    ['appInactive','unknown'],
+    ['appInactive', 'unknown'],
 
-    ['node','node'],
-    ['devIcon_SWITCH','switch'],
-    ['devIcon_ROADM','roadm'],
-    ['devIcon_OTN','otn'],
+    ['node', 'node'],
+    ['devIcon_SWITCH', 'switch'],
+    ['devIcon_ROADM', 'roadm'],
+    ['devIcon_OTN', 'otn'],
 
-    ['portIcon_DEFAULT','m_ports'],
+    ['portIcon_DEFAULT', 'm_ports'],
 
-    ['meter','meterTable'], // TODO: m_meter icon?
+    ['meter', 'meterTable'], // TODO: m_meter icon?
 
-    ['deviceTable','switch'],
-    ['flowTable','flowTable'],
-    ['portTable','portTable'],
-    ['groupTable','groupTable'],
-    ['meterTable','meterTable'],
-    ['pipeconfTable','pipeconfTable'],
+    ['deviceTable', 'switch'],
+    ['flowTable', 'flowTable'],
+    ['portTable', 'portTable'],
+    ['groupTable', 'groupTable'],
+    ['meterTable', 'meterTable'],
+    ['pipeconfTable', 'pipeconfTable'],
 
-    ['hostIcon_endstation','endstation'],
-    ['hostIcon_router','router'],
-    ['hostIcon_bgpSpeaker','bgpSpeaker'],
+    ['hostIcon_endstation', 'endstation'],
+    ['hostIcon_router', 'router'],
+    ['hostIcon_bgpSpeaker', 'bgpSpeaker'],
 
     // navigation menu icons...
-    ['nav_apps','bird'],
-    ['nav_settings','cog'],
-    ['nav_cluster','node'],
-    ['nav_processors','allTraffic'],
+    ['nav_apps', 'bird'],
+    ['nav_settings', 'cog'],
+    ['nav_cluster', 'node'],
+    ['nav_processors', 'allTraffic'],
 
-    ['nav_topo','topo'],
-    ['nav_topo2','m_cloud'],
-    ['nav_devs','switch'],
-    ['nav_links','ports'],
-    ['nav_hosts','endstation'],
-    ['nav_intents','relatedIntents'],
-    ['nav_tunnels','ports'], // TODO: use tunnel glyph, when available
-    ['nav_yang','yang'],
+    ['nav_topo', 'topo'],
+    ['nav_topo2', 'm_cloud'],
+    ['nav_devs', 'switch'],
+    ['nav_links', 'ports'],
+    ['nav_hosts', 'endstation'],
+    ['nav_intents', 'relatedIntents'],
+    ['nav_tunnels', 'ports'], // TODO: use tunnel glyph, when available
+    ['nav_yang', 'yang'],
 ]);
 
 /**
@@ -104,7 +104,7 @@
     }
 
     ensureIconLibDefs() {
-        let body = d3.select('body');
+        const body = d3.select('body');
         let svg = body.select('svg#IconLibDefs');
         if (svg.empty()) {
             svg = body.append('svg').attr('id', 'IconLibDefs');
@@ -125,9 +125,9 @@
      *      Defaults to 'embeddedIcon'.
      */
     loadIcon(div, glyphId: string = 'unknown', size: number = 20, installGlyph: boolean = true, svgClass: string = 'embeddedIcon') {
-        let dim = size || 20;
-        let svgCls = svgClass || 'embeddedIcon';
-        let gid = glyphId || 'unknown';
+        const dim = size || 20;
+        const svgCls = svgClass || 'embeddedIcon';
+        const gid = glyphId || 'unknown';
         let g;
         let svgIcon: any;
 
@@ -168,7 +168,7 @@
      * @param svgClass The CSS class used to identify the SVG layer.
      *      Defaults to 'embeddedIcon'.
      */
-    loadIconByClass(div, iconCls: string, size: number, installGlyph: boolean, svgClass='embeddedIcon') {
+    loadIconByClass(div, iconCls: string, size: number, installGlyph: boolean, svgClass= 'embeddedIcon') {
         this.loadIcon(div, glyphMapping.get(iconCls), size, installGlyph, svgClass);
         div.select('svg g').classed(iconCls, true);
     }
@@ -202,7 +202,7 @@
      * Returns the D3 selection of the glyph (use) element.
      */
     addDeviceIcon(elem, glyphId, iconDim) {
-        let gid = this.gs.glyphDefined(glyphId) ? glyphId : 'query';
+        const gid = this.gs.glyphDefined(glyphId) ? glyphId : 'query';
         return elem.append('use').attr({
             'xlink:href': '#' + gid,
             width: iconDim,
@@ -211,9 +211,9 @@
     }
 
     addHostIcon(elem, radius, glyphId) {
-        let dim = radius * 1.5;
-        let xlate = -dim / 2;
-        let g = elem.append('g')
+        const dim = radius * 1.5;
+        const xlate = -dim / 2;
+        const g = elem.append('g')
                 .attr('class', 'svgIcon hostIcon');
 
         g.append('circle').attr('r', radius);
diff --git a/web/gui2/src/main/webapp/app/fw/svg/icon/icon.component.ts b/web/gui2/src/main/webapp/app/fw/svg/icon/icon.component.ts
index 99b94d2..45be81f 100644
--- a/web/gui2/src/main/webapp/app/fw/svg/icon/icon.component.ts
+++ b/web/gui2/src/main/webapp/app/fw/svg/icon/icon.component.ts
@@ -35,7 +35,7 @@
 })
 export class IconComponent implements OnInit {
     @Input() iconId: string;
-    @Input() iconSize: number = 20;
+    @Input() iconSize = 20;
 
     constructor(
         private is: IconService,
diff --git a/web/gui2/src/main/webapp/app/fw/util/fn.service.ts b/web/gui2/src/main/webapp/app/fw/util/fn.service.ts
index 25a0558..0726afc 100644
--- a/web/gui2/src/main/webapp/app/fw/util/fn.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/util/fn.service.ts
@@ -24,43 +24,43 @@
 // TODO Move all this trie stuff to its own class
 // Angular>=2 Tightened up on types to avoid compiler errors
 interface TrieC {
-    p: any,
-    s: string[]
+    p: any;
+    s: string[];
 }
 // trie operation
 function _trieOp(op: string, trie, word: string, data) {
-    var p = trie,
-        w: string = word.toUpperCase(),
-        s: Array<string> = w.split(''),
-        c:TrieC = { p: p, s: s },
-        t = [],
-        x: number = 0,
-        f1 = op === '+' ? add : probe,
-        f2 = op === '+' ? insert : remove;
+    const p = trie;
+    const w: string = word.toUpperCase();
+    const s: Array<string> = w.split('');
+    let c: TrieC = { p: p, s: s };
+    let t = [];
+    let  x = 0;
+    const f1 = op === '+' ? add : probe;
+    const f2 = op === '+' ? insert : remove;
 
-    function add(c):TrieC {
-        var q = c.s.shift(),
-            np = c.p[q];
+    function add(cAdded): TrieC {
+        const q = cAdded.s.shift();
+        let np = cAdded.p[q];
 
         if (!np) {
-            c.p[q] = {};
-            np = c.p[q];
+            cAdded.p[q] = {};
+            np = cAdded.p[q];
             x = 1;
         }
-        return { p: np, s: c.s };
+        return { p: np, s: cAdded.s };
     }
 
-    function probe(c):TrieC {
-        var q = c.s.shift(),
-            k:number = Object.keys(c.p).length,
-            np = c.p[q];
+    function probe(cProbed): TrieC {
+        const q = cProbed.s.shift();
+        const k: number = Object.keys(cProbed.p).length;
+        const np = cProbed.p[q];
 
-        t.push({ q: q, k: k, p: c.p });
+        t.push({ q: q, k: k, p: cProbed.p });
         if (!np) {
             t = [];
             return { p: [], s: [] };
         }
-        return { p: np, s: c.s };
+        return { p: np, s: cProbed.s };
     }
 
     function insert() {
@@ -72,7 +72,7 @@
         if (t.length) {
             t = t.reverse();
             while (t.length) {
-                let d = t.shift();
+                const d = t.shift();
                 delete d.p[d.q];
                 if (d.k > 1) {
                     t = [];
@@ -109,9 +109,9 @@
 //    -1 for a partial match (word is a prefix to an existing word)
 //    data for the word for an exact match
 function trieLookup(trie, word) {
-    var s = word.toUpperCase().split(''),
-        p = trie,
-        n;
+    const s = word.toUpperCase().split('');
+    let p = trie;
+    let n;
 
     while (s.length) {
         n = s.shift();
@@ -142,10 +142,11 @@
         private log: LogService
     ) {
         this.route.queryParams.subscribe(params => {
-            let debugparam: string = params['debug'];
+            const debugparam: string = params['debug'];
+            log.debug('Param:', debugparam);
             this.parseDebugFlags(debugparam);
         });
-        log.debug("FnService constructed");
+        log.debug('FnService constructed');
     }
 
     isF(f) {
@@ -174,8 +175,8 @@
      * Returns true if current browser determined to be a mobile device
      */
     isMobile() {
-        var ua = window.navigator.userAgent,
-            patt = /iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/;
+        const ua = window.navigator.userAgent;
+        const patt = /iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/;
         return patt.test(ua);
     }
 
@@ -183,14 +184,21 @@
      * Returns true if the current browser determined to be Chrome
      */
     isChrome() {
-        let isChromium = (window as any).chrome;
-        let vendorName = window.navigator.vendor;
+        const isChromium = (window as any).chrome;
+        const vendorName = window.navigator.vendor;
 
-        let isOpera = window.navigator.userAgent.indexOf('OPR') > -1;
+        const isOpera = window.navigator.userAgent.indexOf('OPR') > -1;
         return (isChromium !== null &&
         isChromium !== undefined &&
         vendorName === 'Google Inc.' &&
-        isOpera == false);
+        isOpera === false);
+    }
+
+    isChromeHeadless() {
+        const vendorName = window.navigator.vendor;
+        const headlessChrome = window.navigator.userAgent.indexOf('HeadlessChrome') > -1;
+
+        return (vendorName === 'Google Inc.' && headlessChrome === true);
     }
 
     /**
@@ -226,8 +234,8 @@
     }
 
     parseDebugFlags(dbgstr: string): void {
-        let bits = dbgstr ? dbgstr.split(',') : [];
-        bits.forEach(function (key) {
+        const bits = dbgstr ? dbgstr.split(',') : [];
+        bits.forEach((key) => {
             this.debugFlags.set(key, true);
         });
         this.log.debug('Debug flags:', dbgstr);
diff --git a/web/gui2/src/main/webapp/app/fw/util/lion.service.ts b/web/gui2/src/main/webapp/app/fw/util/lion.service.ts
index 0090734..a33ef6b 100644
--- a/web/gui2/src/main/webapp/app/fw/util/lion.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/util/lion.service.ts
@@ -67,7 +67,7 @@
         this.log.info('LION service: Locale... [' + data.locale + ']');
         this.log.info('LION service: Bundles installed...');
 
-        for (let p in this.ubercache) {
+        for (const p in this.ubercache) {
             if (this.ubercache[p]) {
                 this.log.info('            :=> ', p);
             }
diff --git a/web/gui2/src/main/webapp/app/fw/util/theme.service.ts b/web/gui2/src/main/webapp/app/fw/util/theme.service.ts
index 884fe5d..e5c9564 100644
--- a/web/gui2/src/main/webapp/app/fw/util/theme.service.ts
+++ b/web/gui2/src/main/webapp/app/fw/util/theme.service.ts
@@ -23,7 +23,7 @@
 @Injectable()
 export class ThemeService {
     themes: string[] = ['light', 'dark'];
-    thidx: number = 0;
+    thidx = 0;
 
     constructor(
         private log: LogService
diff --git a/web/gui2/src/main/webapp/app/onos.module.ts b/web/gui2/src/main/webapp/app/onos.module.ts
index 717893e..8e4af34 100644
--- a/web/gui2/src/main/webapp/app/onos.module.ts
+++ b/web/gui2/src/main/webapp/app/onos.module.ts
@@ -39,10 +39,10 @@
 import { OnosService } from './onos.service';
 
 const onosRoutes: Routes = [
-  { path: 'apps', component: AppsComponent },        // All except default should be driven by
-  { path: 'device', component: DeviceComponent },    // servlet like {INJECTED-VIEW-DATA-START}
-  { path: '**', component: DeviceComponent } //Change to Topo(2) when it's ready for normal behaviour
-]
+  { path: 'apps', component: AppsComponent },     // All except default should be driven by
+  { path: 'device', component: DeviceComponent }, // servlet like {INJECTED-VIEW-DATA-START}
+  { path: '**', component: DeviceComponent } // Change to Topo(2) when it's ready for normal behaviour
+];
 
 /**
  * ONOS GUI -- Main Application Module
diff --git a/web/gui2/src/main/webapp/app/view/apps/triggerform.directive.ts b/web/gui2/src/main/webapp/app/view/apps/triggerform.directive.ts
index 2bf9cd7..7134c3a 100644
--- a/web/gui2/src/main/webapp/app/view/apps/triggerform.directive.ts
+++ b/web/gui2/src/main/webapp/app/view/apps/triggerform.directive.ts
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 import { Directive } from '@angular/core';
+import { LogService } from '../../log.service';
 
 /**
  * ONOS GUI -- Apps -- Trigger Form Directive
@@ -23,6 +24,10 @@
 })
 export class TriggerFormDirective {
 
-  constructor() { }
+    constructor(
+        private log: LogService,
+    ) {
+        this.log.debug('TriggerFormDirective constructed');
+    }
 
 }
diff --git a/web/gui2/src/main/webapp/tests/app/detectbrowser.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/detectbrowser.directive.spec.ts
index 380a7be..06715cd 100644
--- a/web/gui2/src/main/webapp/tests/app/detectbrowser.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/detectbrowser.directive.spec.ts
@@ -13,48 +13,57 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { DetectBrowserDirective } from '../../app/detectbrowser.directive';
+import { TestBed, inject } from '@angular/core/testing';
+
 import { LogService } from '../../app/log.service';
+import { ConsoleLoggerService } from '../../app/consolelogger.service';
+import { DetectBrowserDirective } from '../../app/detectbrowser.directive';
+import { ActivatedRoute, Params } from '@angular/router';
 import { FnService } from '../../app/fw/util/fn.service';
 import { OnosService } from '../../app/onos.service';
-import { ActivatedRoute, Router} from '@angular/router';
+import { of } from 'rxjs';
 
-class MockOnosService extends OnosService {
-    // Override things as necessary
+class MockFnService extends FnService {
+    constructor(ar: ActivatedRoute, log: LogService) {
+        super(ar, log);
+    }
 }
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
+class MockOnosService {}
+
+class MockActivatedRoute extends ActivatedRoute {
+    constructor(params: Params) {
+        super();
+        this.queryParams = of(params);
+    }
 }
 
 /**
  * ONOS GUI -- Detect Browser Directive - Unit Tests
  */
 describe('DetectBrowserDirective', () => {
-
-    let onos: MockOnosService;
-    let fs: MockFunctionService;
     let log: LogService;
     let ar: ActivatedRoute;
-    let directive: DetectBrowserDirective;
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        onos = new MockOnosService(log);
-        fs = new MockFunctionService(ar, log);
-        directive = new DetectBrowserDirective(fs, log, onos);
+        log = new ConsoleLoggerService();
+        ar = new MockActivatedRoute(['debug', 'DetectBrowserDirective']);
+
+        TestBed.configureTestingModule({
+            providers: [ DetectBrowserDirective,
+                { provide: FnService, useValue: new MockFnService(ar, log) },
+                { provide: LogService, useValue: log },
+                { provide: OnosService, useClass: MockOnosService },
+                { provide: Document, useValue: document },
+            ]
+        });
     });
 
     afterEach(() => {
-        onos = null;
-        fs = null;
         log = null;
-        ar = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([DetectBrowserDirective], (directive: DetectBrowserDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/detailspanel.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/detailspanel.service.spec.ts
index 982200b..80f8d5a 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/detailspanel.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/detailspanel.service.spec.ts
@@ -15,19 +15,51 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { DetailsPanelService } from '../../../../app/fw/layer/detailspanel.service';
+import { EditableTextService } from '../../../../app/fw/layer/editabletext.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { IconService } from '../../../../app/fw/svg/icon.service';
+import { MastService } from '../../../../app/fw/mast/mast.service';
+import { PanelService } from '../../../../app/fw/layer/panel.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockEditableTextService {}
+
+class MockIconService {}
+
+class MockFnService {}
+
+class MockMastService {}
+
+class MockPanelService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Layer -- Details Panel Service - Unit Tests
  */
 describe('DetailsPanelService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [DetailsPanelService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([DetailsPanelService], (service: DetailsPanelService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [DetailsPanelService,
+                { provide: EditableTextService, useClass: MockEditableTextService },
+                { provide: FnService, useClass: MockFnService },
+                { provide: IconService, useClass: MockIconService },
+                { provide: LogService, useValue: log },
+                { provide: MastService, useClass: MockMastService },
+                { provide: PanelService, useClass: MockPanelService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([DetailsPanelService], (service: DetailsPanelService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/dialog.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/dialog.service.spec.ts
index 3035122..66d3b85 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/dialog.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/dialog.service.spec.ts
@@ -15,19 +15,39 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { DialogService } from '../../../../app/fw/layer/dialog.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { KeyService } from '../../../../app/fw/util/key.service';
+import { PanelService } from '../../../../app/fw/layer/panel.service';
+
+class MockFnService {}
+
+class MockKeyService {}
+
+class MockPanelService {}
 
 /**
  * ONOS GUI -- Layer -- Dialog Service - Unit Tests
  */
 describe('DialogService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [DialogService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([DialogService], (service: DialogService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [DialogService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: PanelService, useClass: MockPanelService },
+            ]
+        });
+    });
+
+    it('should be created', inject([DialogService], (service: DialogService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/editabletext.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/editabletext.service.spec.ts
index 5ae266a..05663c7 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/editabletext.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/editabletext.service.spec.ts
@@ -15,19 +15,35 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { EditableTextService } from '../../../../app/fw/layer/editabletext.service';
+import { KeyService } from '../../../../app/fw/util/key.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockKeyService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Layer -- Editable Text Service - Unit Tests
  */
 describe('EditableTextService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [EditableTextService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([EditableTextService], (service: EditableTextService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [EditableTextService,
+                { provide: LogService, useValue: log },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([EditableTextService], (service: EditableTextService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/flash.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/flash.service.spec.ts
index 339742b..3b0eb3e 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/flash.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/flash.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { FlashService } from '../../../../app/fw/layer/flash.service';
 
 /**
  * ONOS GUI -- Layer -- Flash Service - Unit Tests
  */
 describe('FlashService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [FlashService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([FlashService], (service: FlashService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [FlashService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([FlashService], (service: FlashService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/loading.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/loading.service.spec.ts
index 551f72d..92655fa 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/loading.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/loading.service.spec.ts
@@ -15,19 +15,42 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { LoadingService } from '../../../../app/fw/layer/loading.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { ThemeService } from '../../../../app/fw/util/theme.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockFnService {
+    debug() {
+    }
+}
+
+class MockThemeService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Layer -- Loading Service - Unit Tests
  */
 describe('LoadingService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [LoadingService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([LoadingService], (service: LoadingService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [LoadingService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+                { provide: ThemeService, useClass: MockThemeService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([LoadingService], (service: LoadingService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/panel.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/panel.service.spec.ts
index dfa760d..4ba7f69 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/panel.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/panel.service.spec.ts
@@ -16,18 +16,30 @@
 import { TestBed, inject } from '@angular/core/testing';
 
 import { PanelService } from '../../../../app/fw/layer/panel.service';
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Layer -- Panel Service - Unit Tests
  */
 describe('PanelService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [PanelService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([PanelService], (service: PanelService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [PanelService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([PanelService], (service: PanelService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/quickhelp.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/quickhelp.service.spec.ts
index 19ce774..fa8f8ea 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/quickhelp.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/quickhelp.service.spec.ts
@@ -15,19 +15,43 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { QuickHelpService } from '../../../../app/fw/layer/quickhelp.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { LionService } from '../../../../app/fw/util/lion.service';
+import { LoadingService } from '../../../../app/fw/layer/loading.service';
+import { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
+
+class MockFnService {}
+
+class MockLionService {}
+
+class MockLoadingService {}
+
+class MockSvgUtilService {}
 
 /**
  * ONOS GUI -- Layer -- Quick Help Service - Unit Tests
  */
 describe('QuickHelpService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [QuickHelpService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([QuickHelpService], (service: QuickHelpService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [QuickHelpService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+                { provide: LionService, useClass: MockLionService },
+                { provide: LoadingService, useClass: MockLoadingService },
+                { provide: SvgUtilService, useClass: MockSvgUtilService },
+            ]
+        });
+    });
+
+    it('should be created', inject([QuickHelpService], (service: QuickHelpService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/layer/veil.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/layer/veil.service.spec.ts
index e99bf61..3d5509b 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/layer/veil.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/veil.service.spec.ts
@@ -15,19 +15,43 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { GlyphService } from '../../../../app/fw/svg/glyph.service';
+import { KeyService } from '../../../../app/fw/util/key.service';
 import { VeilService } from '../../../../app/fw/layer/veil.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockFnService {}
+
+class MockGlyphService {}
+
+class MockKeyService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Layer -- Veil Service - Unit Tests
  */
 describe('VeilService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [VeilService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([VeilService], (service: VeilService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [VeilService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: LogService, useValue: log },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([VeilService], (service: VeilService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/mast/mast.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/mast/mast.service.spec.ts
index 58eba10..5c00e67 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/mast/mast.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/mast/mast.service.spec.ts
@@ -16,18 +16,32 @@
 import { TestBed, inject } from '@angular/core/testing';
 
 import { MastService } from '../../../../app/fw/mast/mast.service';
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {
+    isMobile() {}
+}
 
 /**
  * ONOS GUI -- Masthead Service - Unit Tests
  */
 describe('MastService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [MastService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([MastService], (service: MastService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [MastService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([MastService], (service: MastService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/mast/mast/mast.component.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/mast/mast/mast.component.spec.ts
index 94f0f16..fe97527 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/mast/mast/mast.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/mast/mast/mast.component.spec.ts
@@ -15,29 +15,50 @@
  */
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
+import { LogService } from '../../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../../app/consolelogger.service';
 import { MastComponent } from '../../../../../app/fw/mast/mast/mast.component';
+import { IconComponent } from '../../../../../app/fw/svg/icon/icon.component';
+import { DialogService } from '../../../../../app/fw/layer/dialog.service';
+import { LionService } from '../../../../../app/fw/util/lion.service';
+import { IconService } from '../../../../../app/fw/svg/icon.service';
+import { NavService } from '../../../../../app/fw/nav/nav.service';
+import { WebSocketService } from '../../../../../app/fw/remote/websocket.service';
+
+class MockDialogService {}
+
+class MockLionService {}
+
+class MockNavService {}
+
+class MockWebSocketService {}
+
+class MockIconService {}
 
 /**
  * ONOS GUI -- Masthead Controller - Unit Tests
  */
 describe('MastComponent', () => {
-  let component: MastComponent;
-  let fixture: ComponentFixture<MastComponent>;
+    let log: LogService;
 
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ MastComponent ]
-    })
-    .compileComponents();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+        TestBed.configureTestingModule({
+            declarations: [ MastComponent, IconComponent ],
+            providers: [
+                { provide: DialogService, useClass: MockDialogService },
+                { provide: LionService, useClass: MockLionService },
+                { provide: LogService, useValue: log },
+                { provide: NavService, useClass: MockNavService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+                { provide: IconService, useClass: MockIconService },
+            ]
+        });
+    });
 
-  beforeEach(() => {
-    fixture = TestBed.createComponent(MastComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+    it('should create', () => {
+        const fixture = TestBed.createComponent(MastComponent);
+        const component = fixture.componentInstance;
+        expect(component).toBeTruthy();
+    });
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/nav/nav.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/nav/nav.service.spec.ts
index 87df70a..44920df 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/nav/nav.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/nav/nav.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { NavService } from '../../../../app/fw/nav/nav.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Util -- Navigation Service - Unit Tests
  */
 describe('NavService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [NavService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([NavService], (service: NavService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [NavService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([NavService], (service: NavService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/nav/nav/nav.component.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/nav/nav/nav.component.spec.ts
index adff327..8d86c80 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/nav/nav/nav.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/nav/nav/nav.component.spec.ts
@@ -15,29 +15,38 @@
  */
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
+import { LogService } from '../../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../../app/consolelogger.service';
 import { NavComponent } from '../../../../../app/fw/nav/nav/nav.component';
+import { IconComponent } from '../../../../../app/fw/svg/icon/icon.component';
+import { IconService } from '../../../../../app/fw/svg/icon.service';
+import { NavService } from '../../../../../app/fw/nav/nav.service';
+
+class MockNavService {}
+
+class MockIconService {}
 
 /**
  * ONOS GUI -- Util -- Navigation Component - Unit Tests
  */
 describe('NavComponent', () => {
-  let component: NavComponent;
-  let fixture: ComponentFixture<NavComponent>;
+    let log: LogService;
 
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ NavComponent ]
-    })
-    .compileComponents();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+        TestBed.configureTestingModule({
+            declarations: [ NavComponent, IconComponent ],
+            providers: [
+                { provide: LogService, useValue: log },
+                { provide: IconService, useClass: MockIconService },
+                { provide: NavService, useClass: MockNavService },
+            ]
+        });
+    });
 
-  beforeEach(() => {
-    fixture = TestBed.createComponent(NavComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+    it('should create', () => {
+        const fixture = TestBed.createComponent(NavComponent);
+        const component = fixture.componentInstance;
+        expect(component).toBeTruthy();
+    });
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/remote/rest.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/remote/rest.service.spec.ts
index e88c522..45576f6 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/remote/rest.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/rest.service.spec.ts
@@ -15,19 +15,35 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { RestService } from '../../../../app/fw/remote/rest.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { UrlFnService } from '../../../../app/fw/remote/urlfn.service';
+
+class MockFnService {}
+
+class MockUrlFnService {}
 
 /**
  * ONOS GUI -- Remote -- REST Service - Unit Tests
  */
 describe('RestService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [RestService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([RestService], (service: RestService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [RestService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+                { provide: UrlFnService, useClass: MockUrlFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([RestService], (service: RestService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/remote/urlfn.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/remote/urlfn.service.spec.ts
index 5891260..a54458b 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/remote/urlfn.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/urlfn.service.spec.ts
@@ -15,19 +15,29 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { UrlFnService } from '../../../../app/fw/remote/urlfn.service';
 
 /**
  * ONOS GUI -- Remote -- General Functions - Unit Tests
  */
 describe('UrlFnService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [UrlFnService]
-    });
-  });
+    let log: LogService;
+    const windowMock = <any>{ location: <any> { hostname: 'localhost' } };
 
-  it('should be created', inject([UrlFnService], (service: UrlFnService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [UrlFnService,
+                { provide: LogService, useValue: log },
+                { provide: Window, useValue: windowMock },
+            ]
+        });
+    });
+
+    it('should be created', inject([UrlFnService], (service: UrlFnService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/remote/websocket.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/remote/websocket.service.spec.ts
index 7f448a8..d18dda4 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/remote/websocket.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/websocket.service.spec.ts
@@ -15,19 +15,45 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { GlyphService } from '../../../../app/fw/svg/glyph.service';
+import { UrlFnService } from '../../../../app/fw/remote/urlfn.service';
+import { WSock } from '../../../../app/fw/remote/wsock.service';
+
+class MockFnService {}
+
+class MockGlyphService {}
+
+class MockUrlFnService {}
+
+class MockWSock {}
 
 /**
  * ONOS GUI -- Remote -- Web Socket Service - Unit Tests
  */
 describe('WebSocketService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [WebSocketService]
-    });
-  });
+    let log: LogService;
+    const windowMock = <any>{ location: <any> { hostname: 'localhost' } };
 
-  it('should be created', inject([WebSocketService], (service: WebSocketService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [WebSocketService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: UrlFnService, useClass: MockUrlFnService },
+                { provide: WSock, useClass: MockWSock },
+                { provide: Window, useValue: windowMock },
+            ]
+        });
+    });
+
+    it('should be created', inject([WebSocketService], (service: WebSocketService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/remote/wsock.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/remote/wsock.service.spec.ts
index 0dcfce8..61d5ab4 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/remote/wsock.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/wsock.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { WSock } from '../../../../app/fw/remote/wsock.service';
 
 /**
  * ONOS GUI -- Remote -- WSock Service - Unit Tests
  */
 describe('WSock', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [WSock]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([WSock], (service: WSock) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [WSock,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([WSock], (service: WSock) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/geodata.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/geodata.service.spec.ts
index 3acc8fe..3057897 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/geodata.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/geodata.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { GeoDataService } from '../../../../app/fw/svg/geodata.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- SVG -- GeoData Service - Unit Tests
  */
 describe('GeoDataService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [GeoDataService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([GeoDataService], (service: GeoDataService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [GeoDataService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([GeoDataService], (service: GeoDataService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/glyph.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/glyph.service.spec.ts
index 53ac558..538cd9f 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/glyph.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/glyph.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { GlyphService } from '../../../../app/fw/svg/glyph.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- SVG -- Glyph Service - Unit Tests
  */
 describe('GlyphService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [GlyphService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([GlyphService], (service: GlyphService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [GlyphService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([GlyphService], (service: GlyphService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/glyphdata.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/glyphdata.service.spec.ts
index de6ddf2..5fbf137 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/glyphdata.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/glyphdata.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { GlyphDataService } from '../../../../app/fw/svg/glyphdata.service';
 
 /**
  * ONOS GUI -- SVG -- Glyph Data Service - Unit Tests
  */
 describe('GlyphDataService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [GlyphDataService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([GlyphDataService], (service: GlyphDataService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [GlyphDataService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([GlyphDataService], (service: GlyphDataService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/icon.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.directive.spec.ts
index f00b8ca..4c5c252 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/icon.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.directive.spec.ts
@@ -13,55 +13,50 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-import { IconDirective } from '../../../../app/fw/svg/icon.directive';
+import { TestBed, inject } from '@angular/core/testing';
+
+import { ElementRef } from '@angular/core';
 import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
+import { IconDirective } from '../../../../app/fw/svg/icon.directive';
 import { IconService } from '../../../../app/fw/svg/icon.service';
 import { GlyphService } from '../../../../app/fw/svg/glyph.service';
 import { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
 import { FnService } from '../../../../app/fw//util/fn.service';
 import { ActivatedRoute, Router} from '@angular/router';
 
-class MockGlyphService extends GlyphService {
-    // Override things as necessary
-}
+class MockFnService {}
 
-class MockSvgUtilService extends SvgUtilService {
-    // Override things as necessary
-}
+class MockGlyphService {}
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockIconService {}
 
 /**
  * ONOS GUI -- SVG -- Icon Directive - Unit Tests
  */
 describe('IconDirective', () => {
-    let ar: ActivatedRoute;
     let log: LogService;
-    let fs: MockFunctionService;
-    let gs: GlyphService;
-    let is: IconService;
-    let sus: SvgUtilService;
-    let directive: IconDirective;
+    const elementMock = <any>{ };
 
     beforeEach(() => {
-        ar = new ActivatedRoute();
-        log = new LogService();
-        fs = new MockFunctionService(ar, log);
-        sus = new MockSvgUtilService(fs, log);
-        gs = new GlyphService(log);
-        is = new IconService(gs, log, sus);
-        directive = new IconDirective(is, log);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ IconDirective,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+                { provide: ElementRef, useValue: elementMock },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: IconService, useClass: MockIconService },
+            ]
+        });
     });
 
     afterEach(() => {
-        is = null;
         log = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([IconDirective], (directive: IconDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/icon.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.service.spec.ts
index 47bef85..e6e54dc 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/icon.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.service.spec.ts
@@ -15,19 +15,36 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { IconService } from '../../../../app/fw/svg/icon.service';
+import { GlyphService } from '../../../../app/fw/svg/glyph.service';
+import { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
+
+class MockGlyphService {}
+
+class MockSvgUtilService {}
 
 /**
  * ONOS GUI -- SVG -- Icon Service - Unit Tests
  */
 describe('IconService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [IconService]
-    });
-  });
 
-  it('should be created', inject([IconService], (service: IconService) => {
-    expect(service).toBeTruthy();
-  }));
+    let log: LogService;
+
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [IconService,
+                { provide: LogService, useValue: log },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: SvgUtilService, useClass: MockSvgUtilService },
+            ]
+        });
+    });
+
+    it('should be created', inject([IconService], (service: IconService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/icon/icon.component.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/icon/icon.component.spec.ts
index 84cd80a..3ca58e3 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/icon/icon.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon/icon.component.spec.ts
@@ -1,25 +1,30 @@
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
+import { LogService } from '../../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../../app/consolelogger.service';
 import { IconComponent } from '../../../../../app/fw/svg/icon/icon.component';
+import { IconService } from '../../../../../app/fw/svg/icon.service';
+
+class MockIconService {}
 
 describe('IconComponent', () => {
-  let component: IconComponent;
-  let fixture: ComponentFixture<IconComponent>;
+    let log: LogService;
 
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ IconComponent ]
-    })
-    .compileComponents();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
 
-  beforeEach(() => {
-    fixture = TestBed.createComponent(IconComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
+        TestBed.configureTestingModule({
+            declarations: [ IconComponent ],
+            providers: [
+                { provide: LogService, useValue: log },
+                { provide: IconService, useClass: MockIconService },
+            ]
+        });
+    });
 
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+    it('should create', () => {
+        const fixture = TestBed.createComponent(IconComponent);
+        const component = fixture.componentInstance;
+        expect(component).toBeTruthy();
+    });
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/map.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/map.service.spec.ts
index d5c3cd1..347db99 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/map.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/map.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { MapService } from '../../../../app/fw/svg/map.service';
+import { GlyphDataService } from '../../../../app/fw/svg/glyphdata.service';
+
+class MockGlyphDataService {}
 
 /**
  * ONOS GUI -- SVG -- Map Service - Unit Tests
  */
 describe('MapService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [MapService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([MapService], (service: MapService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [MapService,
+                { provide: LogService, useValue: log },
+                { provide: GlyphDataService, useClass: MockGlyphDataService },
+            ]
+        });
+    });
+
+    it('should be created', inject([MapService], (service: MapService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/sprite.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/sprite.service.spec.ts
index 8996b4f..9c352c9 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/sprite.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/sprite.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { SpriteService } from '../../../../app/fw/svg/sprite.service';
 
 /**
  * ONOS GUI -- SVG -- Sprite Service - Unit Tests
  */
 describe('SpriteService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [SpriteService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([SpriteService], (service: SpriteService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [SpriteService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([SpriteService], (service: SpriteService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/spritedata.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/spritedata.service.spec.ts
index 1d14006..0e20c85 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/spritedata.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/spritedata.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { SpriteDataService } from '../../../../app/fw/svg/spritedata.service';
 
 /**
  * ONOS GUI -- SVG -- Sprite Data Service - Unit Tests
  */
 describe('SpriteDataService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [SpriteDataService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([SpriteDataService], (service: SpriteDataService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [SpriteDataService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([SpriteDataService], (service: SpriteDataService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/svgutil.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/svgutil.service.spec.ts
index 8d4a21e..593f5ad 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/svgutil.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/svgutil.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- SVG -- Svg Util Service - Unit Tests
  */
 describe('SvgUtilService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [SvgUtilService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([SvgUtilService], (service: SvgUtilService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [SvgUtilService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([SvgUtilService], (service: SvgUtilService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/svg/zoom.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/svg/zoom.service.spec.ts
index 4016500..360ff41 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/svg/zoom.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/zoom.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ZoomService } from '../../../../app/fw/svg/zoom.service';
 
 /**
  * ONOS GUI -- SVG -- Zoom Service - Unit Tests
  */
 describe('ZoomService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ZoomService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ZoomService], (service: ZoomService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ZoomService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([ZoomService], (service: ZoomService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/ee.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/ee.service.spec.ts
index 157e2bc..90c00d0 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/ee.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/ee.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { EeService } from '../../../../app/fw/util/ee.service';
 
 /**
  * ONOS GUI -- Util -- EE functions - Unit Tests
  */
 describe('EeService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [EeService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([EeService], (service: EeService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [EeService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([EeService], (service: EeService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/fn.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/fn.service.spec.ts
index c07e858..ff6ceaf 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/fn.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/fn.service.spec.ts
@@ -15,19 +15,39 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { FnService } from '../../../../app/fw/util/fn.service';
+import { ActivatedRoute, Params } from '@angular/router';
+import { of } from 'rxjs';
+
+class MockActivatedRoute extends ActivatedRoute {
+    constructor(params: Params) {
+        super();
+        this.queryParams = of(params);
+    }
+}
 
 /**
  * ONOS GUI -- Util -- General Purpose Functions - Unit Tests
  */
 describe('FnService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [FnService]
-    });
-  });
+    let log: LogService;
+    let ar: ActivatedRoute;
 
-  it('should be created', inject([FnService], (service: FnService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+        ar = new MockActivatedRoute({'debug': 'TestService'});
+
+        TestBed.configureTestingModule({
+            providers: [FnService,
+                { provide: LogService, useValue: log },
+                { provide: ActivatedRoute, useValue: ar },
+            ]
+        });
+    });
+
+    it('should be created', inject([FnService], (service: FnService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/key.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/key.service.spec.ts
index c277344..7ceadb8 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/key.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/key.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { KeyService } from '../../../../app/fw/util/key.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Key Handler Service - Unit Tests
  */
 describe('KeyService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [KeyService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([KeyService], (service: KeyService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [KeyService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([KeyService], (service: KeyService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/lion.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/lion.service.spec.ts
index fc8c4fc..d471005 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/lion.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/lion.service.spec.ts
@@ -16,19 +16,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { LionService } from '../../../../app/fw/util/lion.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Lion -- Localization Utilities - Unit Tests
  */
 describe('LionService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [LionService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([LionService], (service: LionService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [LionService,
+                { provide: LogService, useValue: log },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([LionService], (service: LionService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/prefs.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/prefs.service.spec.ts
index b27662f..0aeed99 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/prefs.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/prefs.service.spec.ts
@@ -15,19 +15,35 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { PrefsService } from '../../../../app/fw/util/prefs.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockFnService {}
+
+class MockWebSocketService {}
 
 /**
- ONOS GUI -- Util -- User Preference Service - Unit Tests
+ * ONOS GUI -- Util -- User Preference Service - Unit Tests
  */
 describe('PrefsService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [PrefsService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([PrefsService], (service: PrefsService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [PrefsService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([PrefsService], (service: PrefsService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/random.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/random.service.spec.ts
index 969ad69..726fc92 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/random.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/random.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { RandomService } from '../../../../app/fw/util/random.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Random -- Encapsulated randomness - Unit Tests
  */
 describe('RandomService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [RandomService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([RandomService], (service: RandomService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [RandomService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([RandomService], (service: RandomService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/util/theme.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/util/theme.service.spec.ts
index b5a1ff8..f69cc5b 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/util/theme.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/theme.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ThemeService } from '../../../../app/fw/util/theme.service';
 
 /**
  * ONOS GUI -- Util -- Theme Service - Unit Tests
  */
 describe('ThemeService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ThemeService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ThemeService], (service: ThemeService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ThemeService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([ThemeService], (service: ThemeService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/button.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/button.service.spec.ts
index d2bb5b9..cc8113b 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/button.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/button.service.spec.ts
@@ -15,19 +15,39 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ButtonService } from '../../../../app/fw/widget/button.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { IconService } from '../../../../app/fw/svg/icon.service';
+import { TooltipService } from '../../../../app/fw/widget/tooltip.service';
+
+class MockIconService {}
+
+class MockFnService {}
+
+class MockTooltipService {}
 
 /**
  * ONOS GUI -- Widget -- Button Service - Unit Tests
  */
 describe('ButtonService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ButtonService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ButtonService], (service: ButtonService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ButtonService,
+                { provide: LogService, useValue: log },
+                { provide: IconService, useClass: MockIconService },
+                { provide: FnService, useClass: MockFnService },
+                { provide: TooltipService, useClass: MockTooltipService },
+            ]
+        });
+    });
+
+    it('should be created', inject([ButtonService], (service: ButtonService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/chartbuilder.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/chartbuilder.service.spec.ts
index 6840fe3..dbb806d 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/chartbuilder.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/chartbuilder.service.spec.ts
@@ -15,19 +15,39 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ChartBuilderService } from '../../../../app/fw/widget/chartbuilder.service';
+import { LoadingService } from '../../../../app/fw/layer/loading.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockFnService {}
+
+class MockLoadingService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Widget -- Chart Builder Service - Unit Tests
  */
 describe('ChartBuilderService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ChartBuilderService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ChartBuilderService], (service: ChartBuilderService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ChartBuilderService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+                { provide: LoadingService, useClass: MockLoadingService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        });
+    });
+
+    it('should be created', inject([ChartBuilderService], (service: ChartBuilderService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/flashchanges.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/flashchanges.directive.spec.ts
index f301cfc..fd87910 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/flashchanges.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/flashchanges.directive.spec.ts
@@ -13,40 +13,37 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { FlashChangesDirective } from '../../../../app/fw/widget/flashchanges.directive';
+import { TestBed, inject } from '@angular/core/testing';
 
 import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
+import { FlashChangesDirective } from '../../../../app/fw/widget/flashchanges.directive';
 import { FnService } from '../../../../app/fw/util/fn.service';
-import { ActivatedRoute, Router} from '@angular/router';
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockFnService {}
 
 /**
  * ONOS GUI -- Widget -- Table Flash Changes Directive - Unit Tests
  */
 describe('FlashChangesDirective', () => {
-    let fs: MockFunctionService;
     let log: LogService;
-    let ar: ActivatedRoute;
-    let directive: FlashChangesDirective;
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        fs = new MockFunctionService(ar, log);
-        directive = new FlashChangesDirective(fs, log);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ FlashChangesDirective,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
     });
 
     afterEach(() => {
-        fs = null;
         log = null;
-        ar = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([FlashChangesDirective], (directive: FlashChangesDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/list.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/list.service.spec.ts
index 0285417..7380270 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/list.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/list.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ListService } from '../../../../app/fw/widget/list.service';
 
 /**
  * ONOS GUI -- Widget -- List Service - Unit Tests
  */
 describe('ListService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ListService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ListService], (service: ListService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ListService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([ListService], (service: ListService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/sortableheader.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/sortableheader.directive.spec.ts
index 7d15dfc..993430b 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/sortableheader.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/sortableheader.directive.spec.ts
@@ -13,55 +13,45 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { TestBed, inject } from '@angular/core/testing';
+
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { SortableHeaderDirective } from '../../../../app/fw/widget/sortableheader.directive';
 import { IconService } from '../../../../app/fw/svg/icon.service';
 import { GlyphService } from '../../../../app/fw/svg/glyph.service';
-import { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
-import { LogService } from '../../../../app/log.service';
 import { FnService } from '../../../../app/fw/util/fn.service';
-import { ActivatedRoute, Router} from '@angular/router';
 
-class MockGlyphService extends GlyphService {
-    // Override things as necessary
-}
+class MockFnService {}
 
-class MockSvgUtilService extends SvgUtilService {
-    // Override things as necessary
-}
+class MockGlyphService {}
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockIconService {}
 
 /**
  * ONOS GUI -- Widget -- Table Sortable Header Directive - Unit Tests
  */
 describe('SortableHeaderDirective', () => {
-    let gs: MockGlyphService;
-    let sus: MockSvgUtilService;
-    let icon: IconService;
     let log: LogService;
-    let fs: MockFunctionService;
-    let ar: ActivatedRoute;
-    let directive: SortableHeaderDirective;
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        fs = new MockFunctionService(ar, log);
-        gs = new MockGlyphService(log);
-        sus = new MockSvgUtilService(fs, log);
-        icon = new IconService(gs, log, sus);
-        directive = new SortableHeaderDirective(icon, log);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ SortableHeaderDirective,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: IconService, useClass: MockIconService },
+            ]
+        });
     });
 
     afterEach(() => {
         log = null;
-        icon = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([SortableHeaderDirective], (directive: SortableHeaderDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/tablebuilder.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/tablebuilder.service.spec.ts
index fb4aac7..1126d28 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/tablebuilder.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tablebuilder.service.spec.ts
@@ -15,19 +15,40 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { TableBuilderService } from '../../../../app/fw/widget/tablebuilder.service';
+import { FnService } from '../../../../app/fw//util/fn.service';
+import { LoadingService } from '../../../../app/fw/layer/loading.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockFnService {}
+
+class MockLoadingService {}
+
+class MockWebSocketService {}
 
 /*
  ONOS GUI -- Widget -- Table Builder Service - Unit Tests
  */
 describe('TableBuilderService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [TableBuilderService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([TableBuilderService], (service: TableBuilderService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [TableBuilderService,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LoadingService, useClass: MockLoadingService },
+                { provide: LogService, useValue: log },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+
+            ]
+        });
+    });
+
+    it('should be created', inject([TableBuilderService], (service: TableBuilderService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/tabledetail.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/tabledetail.service.spec.ts
index 5df608c..8854413e 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/tabledetail.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tabledetail.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { TableDetailService } from '../../../../app/fw/widget/tabledetail.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Widget -- Table Detail Service - Unit Tests
  */
 describe('TableDetailService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [TableDetailService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([TableDetailService], (service: TableDetailService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [TableDetailService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([TableDetailService], (service: TableDetailService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/tableresize.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/tableresize.directive.spec.ts
index a8241ea..3fa6fe0 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/tableresize.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tableresize.directive.spec.ts
@@ -13,44 +13,41 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { TestBed, inject } from '@angular/core/testing';
+
 import { TableResizeDirective } from '../../../../app/fw/widget/tableresize.directive';
 import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { FnService } from '../../../../app/fw/util/fn.service';
 import { MastService } from '../../../../app/fw/mast/mast.service';
-import { ActivatedRoute, Router} from '@angular/router';
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockFnService {}
+
+class MockMastService {}
 
 /**
  * ONOS GUI -- Widget -- Table Resize Directive - Unit Tests
  */
 describe('TableResizeDirective', () => {
-
-    let fs: MockFunctionService;
     let log: LogService;
-    let ar: ActivatedRoute;
-    let ms: MastService;
-    let directive: TableResizeDirective;
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        fs = new MockFunctionService(ar, log);
-        ms = new MastService(fs, log);
-        directive = new TableResizeDirective(fs, log, ms);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ TableResizeDirective,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+                { provide: MastService, useClass: MockMastService },
+            ]
+        });
     });
 
     afterEach(() => {
-        fs = null;
         log = null;
-        ar = null;
-        ms = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([TableResizeDirective], (directive: TableResizeDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/toolbar.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/toolbar.service.spec.ts
index 467462a..522586f 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/toolbar.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/toolbar.service.spec.ts
@@ -15,19 +15,43 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { ToolbarService } from '../../../../app/fw/widget/toolbar.service';
+import { ButtonService } from '../../../../app/fw/widget/button.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { IconService } from '../../../../app/fw/svg/icon.service';
+import { PanelService } from '../../../../app/fw/layer/panel.service';
+
+class MockButtonService {}
+
+class MockIconService {}
+
+class MockFnService {}
+
+class MockPanelService {}
 
 /**
  * ONOS GUI -- Widget -- Toolbar Service - Unit Tests
  */
 describe('ToolbarService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [ToolbarService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([ToolbarService], (service: ToolbarService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ToolbarService,
+                { provide: LogService, useValue: log },
+                { provide: ButtonService, useClass: MockButtonService },
+                { provide: IconService, useClass: MockIconService },
+                { provide: FnService, useClass: MockFnService },
+                { provide: PanelService, useClass: MockPanelService },
+            ]
+        });
+    });
+
+    it('should be created', inject([ToolbarService], (service: ToolbarService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.directive.spec.ts
index f8f41da..7445a05 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.directive.spec.ts
@@ -13,39 +13,37 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { TestBed, inject } from '@angular/core/testing';
+
 import { TooltipDirective } from '../../../../app/fw/widget/tooltip.directive';
 import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { FnService } from '../../../../app/fw/util/fn.service';
-import { ActivatedRoute, Router} from '@angular/router';
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockFnService {}
 
 /**
  * ONOS GUI -- Widget -- Tooltip Directive - Unit Tests
  */
 describe('TooltipDirective', () => {
-    let fs: MockFunctionService;
     let log: LogService;
-    let ar: ActivatedRoute;
-    let directive: TooltipDirective;
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        fs = new MockFunctionService(ar, log);
-        directive = new TooltipDirective(fs, log);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ TooltipDirective,
+                { provide: FnService, useClass: MockFnService },
+                { provide: LogService, useValue: log },
+            ]
+        });
     });
 
     afterEach(() => {
-        fs = null;
         log = null;
-        ar = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([TooltipDirective], (directive: TooltipDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.service.spec.ts b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.service.spec.ts
index 651ef5d..98a5a18 100644
--- a/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.service.spec.ts
@@ -15,19 +15,31 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { TooltipService } from '../../../../app/fw/widget/tooltip.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+
+class MockFnService {}
 
 /**
  * ONOS GUI -- Widget -- Tooltip Service - Unit Tests
  */
 describe('TooltipService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [TooltipService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([TooltipService], (service: TooltipService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [TooltipService,
+                { provide: LogService, useValue: log },
+                { provide: FnService, useClass: MockFnService },
+            ]
+        });
+    });
+
+    it('should be created', inject([TooltipService], (service: TooltipService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/onos.component.spec.ts b/web/gui2/src/main/webapp/tests/app/onos.component.spec.ts
index 1808eb6..d82bdc2 100644
--- a/web/gui2/src/main/webapp/tests/app/onos.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/onos.component.spec.ts
@@ -14,33 +14,107 @@
  * limitations under the License.
  */
 import { TestBed, async } from '@angular/core/testing';
+import { RouterModule, RouterOutlet, ChildrenOutletContexts } from '@angular/router';
+import { LogService } from '../../app/log.service';
+import { ConsoleLoggerService } from '../../app/consolelogger.service';
+import { IconComponent } from '../../app/fw/svg/icon/icon.component';
+import { MastComponent } from '../../app/fw/mast/mast/mast.component';
+import { NavComponent } from '../../app/fw/nav/nav/nav.component';
 import { OnosComponent } from '../../app/onos.component';
+import { DialogService } from '../../app/fw/layer/dialog.service';
+import { EeService } from '../../app/fw/util/ee.service';
+import { FlashService } from '../../app/fw/layer/flash.service';
+import { GlyphService } from '../../app/fw/svg/glyph.service';
+import { IconService } from '../../app/fw/svg/icon.service';
+import { KeyService } from '../../app/fw/util/key.service';
+import { LionService } from '../../app/fw/util/lion.service';
+import { NavService } from '../../app/fw/nav/nav.service';
+import { OnosService } from '../../app/onos.service';
+import { PanelService } from '../../app/fw/layer/panel.service';
+import { QuickHelpService } from '../../app/fw/layer/quickhelp.service';
+import { ThemeService } from '../../app/fw/util/theme.service';
+import { SpriteService } from '../../app/fw/svg/sprite.service';
+import { VeilService } from '../../app/fw/layer/veil.service';
+import { WebSocketService } from '../../app/fw/remote/websocket.service';
+
+class MockDialogService {}
+
+class MockEeService {}
+
+class MockFlashService {}
+
+class MockGlyphService {}
+
+class MockIconService {}
+
+class MockKeyService {}
+
+class MockLionService {}
+
+class MockNavService {}
+
+class MockOnosService {}
+
+class MockPanelService {}
+
+class MockQuickHelpService {}
+
+class MockSpriteService {}
+
+class MockThemeService {}
+
+class MockVeilService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Onos Component - Unit Tests
  */
 describe('OnosComponent', () => {
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [
-        OnosComponent
-      ],
-    }).compileComponents();
-  }));
-  it('should create the app', async(() => {
-    const fixture = TestBed.createComponent(OnosComponent);
-    const app = fixture.debugElement.componentInstance;
-    expect(app).toBeTruthy();
-  }));
-  it(`should have as title 'onos'`, async(() => {
-    const fixture = TestBed.createComponent(OnosComponent);
-    const app = fixture.debugElement.componentInstance;
-    expect(app.title).toEqual('onos');
-  }));
-  it('should render title in a h1 tag', async(() => {
-    const fixture = TestBed.createComponent(OnosComponent);
-    fixture.detectChanges();
-    const compiled = fixture.debugElement.nativeElement;
-    expect(compiled.querySelector('h1').textContent).toContain('Welcome to onos!');
-  }));
+    let log: LogService;
+
+    beforeEach(async(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            declarations: [
+                IconComponent,
+                MastComponent,
+                NavComponent,
+                OnosComponent,
+                RouterOutlet
+            ],
+            providers: [
+                { provide: ChildrenOutletContexts, useClass: ChildrenOutletContexts },
+                { provide: DialogService, useClass: MockDialogService },
+                { provide: EeService, useClass: MockEeService },
+                { provide: FlashService, useClass: MockFlashService },
+                { provide: GlyphService, useClass: MockGlyphService },
+                { provide: IconService, useClass: MockIconService },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: LionService, useClass: MockLionService },
+                { provide: LogService, useValue: log },
+                { provide: NavService, useClass: MockNavService },
+                { provide: OnosService, useClass: MockOnosService },
+                { provide: QuickHelpService, useClass: MockQuickHelpService },
+                { provide: PanelService, useClass: MockPanelService },
+                { provide: SpriteService, useClass: MockSpriteService },
+                { provide: ThemeService, useClass: MockThemeService },
+                { provide: VeilService, useClass: MockVeilService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+            ]
+        }).compileComponents();
+    }));
+
+    it('should create the app', async(() => {
+        const fixture = TestBed.createComponent(OnosComponent);
+        const app = fixture.debugElement.componentInstance;
+        expect(app).toBeTruthy();
+    }));
+
+    it(`should have as title 'onos'`, async(() => {
+        const fixture = TestBed.createComponent(OnosComponent);
+        const app = fixture.debugElement.componentInstance;
+        expect(app.title).toEqual('onos');
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/onos.service.spec.ts b/web/gui2/src/main/webapp/tests/app/onos.service.spec.ts
index 867f14a..01d5aef 100644
--- a/web/gui2/src/main/webapp/tests/app/onos.service.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/onos.service.spec.ts
@@ -15,19 +15,27 @@
  */
 import { TestBed, inject } from '@angular/core/testing';
 
+import { LogService } from '../../app/log.service';
+import { ConsoleLoggerService } from '../../app/consolelogger.service';
 import { OnosService } from '../../app/onos.service';
 
 /**
  * ONOS GUI -- Onos Service - Unit Tests
  */
 describe('OnosService', () => {
-  beforeEach(() => {
-    TestBed.configureTestingModule({
-      providers: [OnosService]
-    });
-  });
+    let log: LogService;
 
-  it('should be created', inject([OnosService], (service: OnosService) => {
-    expect(service).toBeTruthy();
-  }));
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [OnosService,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    it('should be created', inject([OnosService], (service: OnosService) => {
+        expect(service).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/view/apps/apps.component.spec.ts b/web/gui2/src/main/webapp/tests/app/view/apps/apps.component.spec.ts
index f6ca0f8..a998cb0 100644
--- a/web/gui2/src/main/webapp/tests/app/view/apps/apps.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/view/apps/apps.component.spec.ts
@@ -1,25 +1,89 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.
+ */
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { AppsComponent } from '../../../../app/view/apps/apps.component';
+import { DialogService } from '../../../../app/fw/layer/dialog.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { IconService } from '../../../../app/fw/svg/icon.service';
+import { KeyService } from '../../../../app/fw/util/key.service';
+import { LionService } from '../../../../app/fw/util/lion.service';
+import { PanelService } from '../../../../app/fw/layer/panel.service';
+import { TableBuilderService } from '../../../../app/fw/widget/tablebuilder.service';
+import { UrlFnService } from '../../../../app/fw/remote/urlfn.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
 
+class MockDialogService {}
+
+class MockFnService {}
+
+class MockIconService {}
+
+class MockKeyService {}
+
+class MockLionService {}
+
+class MockPanelService {}
+
+class MockTableBuilderService {}
+
+class MockUrlFnService {}
+
+class MockWebSocketService {}
+
+/**
+ * ONOS GUI -- Apps View -- Unit Tests
+ */
 describe('AppsComponent', () => {
-  let component: AppsComponent;
-  let fixture: ComponentFixture<AppsComponent>;
+    let log: LogService;
+    let component: AppsComponent;
+    let fixture: ComponentFixture<AppsComponent>;
+    const windowMock = <any>{ location: <any> { hostname: 'localhost' } };
 
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ AppsComponent ]
-    })
-    .compileComponents();
-  }));
+    beforeEach(async(() => {
+        log = new ConsoleLoggerService();
 
-  beforeEach(() => {
-    fixture = TestBed.createComponent(AppsComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
+        TestBed.configureTestingModule({
+            declarations: [ AppsComponent ],
+            providers: [
+                { provide: DialogService, useClass: MockDialogService },
+                { provide: FnService, useClass: MockFnService },
+                { provide: IconService, useClass: MockIconService },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: LionService, useClass: MockLionService },
+                { provide: LogService, useValue: log },
+                { provide: PanelService, useClass: MockPanelService },
+                { provide: TableBuilderService, useClass: MockTableBuilderService },
+                { provide: UrlFnService, useClass: MockUrlFnService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+                { provide: Window, useValue: windowMock },
+            ]
+        })
+        .compileComponents();
+    }));
 
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+    beforeEach(() => {
+        fixture = TestBed.createComponent(AppsComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
 });
diff --git a/web/gui2/src/main/webapp/tests/app/view/apps/triggerform.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/view/apps/triggerform.directive.spec.ts
index 6ec3d73..be1be65 100644
--- a/web/gui2/src/main/webapp/tests/app/view/apps/triggerform.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/view/apps/triggerform.directive.spec.ts
@@ -1,8 +1,42 @@
+/*
+ * Copyright 2015-present Open Networking Foundation
+ *
+ * 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.
+ */
+import { TestBed, inject } from '@angular/core/testing';
+
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { TriggerFormDirective } from '../../../../app/view/apps/triggerform.directive';
 
 describe('TriggerFormDirective', () => {
-  it('should create an instance', () => {
-    const directive = new TriggerFormDirective();
-    expect(directive).toBeTruthy();
-  });
+    let log: LogService;
+
+    beforeEach(() => {
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ TriggerFormDirective,
+                { provide: LogService, useValue: log },
+            ]
+        });
+    });
+
+    afterEach(() => {
+        log = null;
+    });
+
+    it('should create an instance', inject([TriggerFormDirective], (directive: TriggerFormDirective) => {
+        expect(directive).toBeTruthy();
+    }));
 });
diff --git a/web/gui2/src/main/webapp/tests/app/view/device/device.component.spec.ts b/web/gui2/src/main/webapp/tests/app/view/device/device.component.spec.ts
index e4e06a1..edfaed4 100644
--- a/web/gui2/src/main/webapp/tests/app/view/device/device.component.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/view/device/device.component.spec.ts
@@ -15,29 +15,87 @@
  */
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { DeviceComponent } from '../../../../app/view/device/device.component';
+import { DetailsPanelService } from '../../../../app/fw/layer/detailspanel.service';
+import { FnService } from '../../../../app/fw/util/fn.service';
+import { IconService } from '../../../../app/fw/svg/icon.service';
+import { KeyService } from '../../../../app/fw/util/key.service';
+import { LoadingService } from '../../../../app/fw/layer/loading.service';
+import { NavService } from '../../../../app/fw/nav/nav.service';
+import { MastService } from '../../../../app/fw/mast/mast.service';
+import { PanelService } from '../../../../app/fw/layer/panel.service';
+import { TableBuilderService } from '../../../../app/fw/widget/tablebuilder.service';
+import { TableDetailService } from '../../../../app/fw/widget/tabledetail.service';
+import { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+class MockDetailsPanelService {}
+
+class MockFnService {}
+
+class MockIconService {}
+
+class MockKeyService {}
+
+class MockLoadingService {
+    startAnim() {
+        // Do nothing
+    }
+}
+
+class MockNavService {}
+
+class MockMastService {}
+
+class MockPanelService {}
+
+class MockTableBuilderService {}
+
+class MockTableDetailService {}
+
+class MockWebSocketService {}
 
 /**
  * ONOS GUI -- Device View Module - Unit Tests
  */
 describe('DeviceComponent', () => {
-  let component: DeviceComponent;
-  let fixture: ComponentFixture<DeviceComponent>;
+    let log: LogService;
+    let component: DeviceComponent;
+    let fixture: ComponentFixture<DeviceComponent>;
+    const windowMock = <any>{ location: <any> { hostname: 'localhost' } };
 
-  beforeEach(async(() => {
-    TestBed.configureTestingModule({
-      declarations: [ DeviceComponent ]
-    })
-    .compileComponents();
-  }));
+    beforeEach(async(() => {
+        log = new ConsoleLoggerService();
 
-  beforeEach(() => {
-    fixture = TestBed.createComponent(DeviceComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
+        TestBed.configureTestingModule({
+            declarations: [ DeviceComponent ],
+            providers: [
+                { provide: DetailsPanelService, useClass: MockDetailsPanelService },
+                { provide: FnService, useClass: MockFnService },
+                { provide: IconService, useClass: MockIconService },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: LoadingService, useClass: MockLoadingService },
+                { provide: MastService, useClass: MockMastService },
+                { provide: NavService, useClass: MockNavService },
+                { provide: LogService, useValue: log },
+                { provide: PanelService, useClass: MockPanelService },
+                { provide: TableBuilderService, useClass: MockTableBuilderService },
+                { provide: TableDetailService, useClass: MockTableDetailService },
+                { provide: WebSocketService, useClass: MockWebSocketService },
+                { provide: Window, useValue: windowMock },
+             ]
+        })
+        .compileComponents();
+    }));
 
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
+    beforeEach(() => {
+        fixture = TestBed.createComponent(DeviceComponent);
+            component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
 });
diff --git a/web/gui2/src/main/webapp/tests/app/view/device/devicedetailspanel.directive.spec.ts b/web/gui2/src/main/webapp/tests/app/view/device/devicedetailspanel.directive.spec.ts
index bbf3062..83a7f78 100644
--- a/web/gui2/src/main/webapp/tests/app/view/device/devicedetailspanel.directive.spec.ts
+++ b/web/gui2/src/main/webapp/tests/app/view/device/devicedetailspanel.directive.spec.ts
@@ -13,47 +13,39 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { TestBed, inject } from '@angular/core/testing';
+
+import { LogService } from '../../../../app/log.service';
+import { ConsoleLoggerService } from '../../../../app/consolelogger.service';
 import { DeviceDetailsPanelDirective } from '../../../../app/view/device/devicedetailspanel.directive';
 import { KeyService } from '../../../../app/fw/util/key.service';
-import { LogService } from '../../../../app/log.service';
-import { FnService } from '../../../../app/fw/util/fn.service';
-import { ActivatedRoute, Router} from '@angular/router';
 
-class MockFunctionService extends FnService {
-    // Override things as necessary
-}
+class MockKeyService {}
 
-class MockKeyService extends KeyService {
-    // Override things as necessary
-}
 /**
  * ONOS GUI -- Device View Module - Unit Tests
  */
 describe('DeviceDetailsPanelDirective', () => {
-    let ar: ActivatedRoute;
     let log: LogService;
-    let ks: KeyService;
-    let fs: MockFunctionService;
-    let window: Window
-    let directive: DeviceDetailsPanelDirective;
+    const windowMock = <any>{ location: <any> { hostname: 'localhost' } };
 
     beforeEach(() => {
-        log = new LogService();
-        ar = new ActivatedRoute();
-        fs = new MockFunctionService(ar, log);
-        ks = new MockKeyService(fs, log);
-        directive = new DeviceDetailsPanelDirective(ks, log, window);
+        log = new ConsoleLoggerService();
+
+        TestBed.configureTestingModule({
+            providers: [ DeviceDetailsPanelDirective,
+                { provide: LogService, useValue: log },
+                { provide: KeyService, useClass: MockKeyService },
+                { provide: Window, useValue: windowMock },
+            ]
+        });
     });
 
     afterEach(() => {
-        fs = null;
-        ks = null;
         log = null;
-        ar = null;
-        directive = null;
     });
 
-    it('should create an instance', () => {
+    it('should create an instance', inject([DeviceDetailsPanelDirective], (directive: DeviceDetailsPanelDirective) => {
         expect(directive).toBeTruthy();
-    });
+    }));
 });
diff --git a/web/gui2/src/test/java/org/onosproject/ui/impl/DummyTest.java b/web/gui2/src/test/java/org/onosproject/ui/impl/DummyTest.java
new file mode 100644
index 0000000..1648002
--- /dev/null
+++ b/web/gui2/src/test/java/org/onosproject/ui/impl/DummyTest.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.impl;
+
+/**
+ * This is just a dummy file to get BUCK going.
+ */
+public class DummyTest {
+}