Initial import of Angular5 components services and modules

Change-Id: I3953f1fbf7d5697a1c6d432808dd17d816ec285a
diff --git a/web/gui2/src/main/webapp/tests/app/consolelogger.service.spec.ts b/web/gui2/src/main/webapp/tests/app/consolelogger.service.spec.ts
new file mode 100644
index 0000000..1b01809
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/consolelogger.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TestBed, inject } from '@angular/core/testing';
+
+import { ConsoleLoggerService } from '../../app/consolelogger.service';
+
+/**
+ * ONOS GUI -- Console Logger Service - Unit Tests
+ */
+describe('ConsoleloggerService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ConsoleLoggerService]
+    });
+  });
+
+  it('should be created', inject([ConsoleLoggerService], (service: ConsoleLoggerService) => {
+    expect(service).toBeTruthy();
+  }));
+});
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
new file mode 100644
index 0000000..380a7be
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/detectbrowser.directive.spec.ts
@@ -0,0 +1,60 @@
+/*
+ * 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 { DetectBrowserDirective } from '../../app/detectbrowser.directive';
+import { LogService } from '../../app/log.service';
+import { FnService } from '../../app/fw/util/fn.service';
+import { OnosService } from '../../app/onos.service';
+import { ActivatedRoute, Router} from '@angular/router';
+
+class MockOnosService extends OnosService {
+    // Override things as necessary
+}
+
+class MockFunctionService extends FnService {
+    // Override things as necessary
+}
+
+/**
+ * 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);
+    });
+
+    afterEach(() => {
+        onos = null;
+        fs = null;
+        log = null;
+        ar = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..982200b
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/detailspanel.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { DetailsPanelService } from '../../../../app/fw/layer/detailspanel.service';
+
+/**
+ * ONOS GUI -- Layer -- Details Panel Service - Unit Tests
+ */
+describe('DetailsPanelService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [DetailsPanelService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..3035122
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/dialog.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017-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 { DialogService } from '../../../../app/fw/layer/dialog.service';
+
+/**
+ * ONOS GUI -- Layer -- Dialog Service - Unit Tests
+ */
+describe('DialogService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [DialogService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..5ae266a
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/editabletext.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017-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 { EditableTextService } from '../../../../app/fw/layer/editabletext.service';
+
+/**
+ * ONOS GUI -- Layer -- Editable Text Service - Unit Tests
+ */
+describe('EditableTextService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [EditableTextService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..339742b
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/flash.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { FlashService } from '../../../../app/fw/layer/flash.service';
+
+/**
+ * ONOS GUI -- Layer -- Flash Service - Unit Tests
+ */
+describe('FlashService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [FlashService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..551f72d
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/loading.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  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 { LoadingService } from '../../../../app/fw/layer/loading.service';
+
+/**
+ * ONOS GUI -- Layer -- Loading Service - Unit Tests
+ */
+describe('LoadingService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [LoadingService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..dfa760d
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/panel.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { PanelService } from '../../../../app/fw/layer/panel.service';
+
+/**
+ * ONOS GUI -- Layer -- Panel Service - Unit Tests
+ */
+describe('PanelService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [PanelService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..19ce774
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/quickhelp.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { QuickHelpService } from '../../../../app/fw/layer/quickhelp.service';
+
+/**
+ * ONOS GUI -- Layer -- Quick Help Service - Unit Tests
+ */
+describe('QuickHelpService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [QuickHelpService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..e99bf61
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/layer/veil.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { VeilService } from '../../../../app/fw/layer/veil.service';
+
+/**
+ * ONOS GUI -- Layer -- Veil Service - Unit Tests
+ */
+describe('VeilService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [VeilService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..58eba10
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/mast/mast.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { MastService } from '../../../../app/fw/mast/mast.service';
+
+/**
+ * ONOS GUI -- Masthead Service - Unit Tests
+ */
+describe('MastService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [MastService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..94f0f16
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/mast/mast/mast.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MastComponent } from '../../../../../app/fw/mast/mast/mast.component';
+
+/**
+ * ONOS GUI -- Masthead Controller - Unit Tests
+ */
+describe('MastComponent', () => {
+  let component: MastComponent;
+  let fixture: ComponentFixture<MastComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ MastComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(MastComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    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
new file mode 100644
index 0000000..87df70a
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/nav/nav.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { NavService } from '../../../../app/fw/nav/nav.service';
+
+/**
+ * ONOS GUI -- Util -- Navigation Service - Unit Tests
+ */
+describe('NavService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [NavService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..adff327
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/nav/nav/nav.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NavComponent } from '../../../../../app/fw/nav/nav/nav.component';
+
+/**
+ * ONOS GUI -- Util -- Navigation Component - Unit Tests
+ */
+describe('NavComponent', () => {
+  let component: NavComponent;
+  let fixture: ComponentFixture<NavComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ NavComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(NavComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    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
new file mode 100644
index 0000000..e88c522
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/rest.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { RestService } from '../../../../app/fw/remote/rest.service';
+
+/**
+ * ONOS GUI -- Remote -- REST Service - Unit Tests
+ */
+describe('RestService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [RestService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..5891260
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/urlfn.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { UrlFnService } from '../../../../app/fw/remote/urlfn.service';
+
+/**
+ * ONOS GUI -- Remote -- General Functions - Unit Tests
+ */
+describe('UrlFnService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [UrlFnService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..7f448a8
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/websocket.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { WebSocketService } from '../../../../app/fw/remote/websocket.service';
+
+/**
+ * ONOS GUI -- Remote -- Web Socket Service - Unit Tests
+ */
+describe('WebSocketService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [WebSocketService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..0dcfce8
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/remote/wsock.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { WSock } from '../../../../app/fw/remote/wsock.service';
+
+/**
+ * ONOS GUI -- Remote -- WSock Service - Unit Tests
+ */
+describe('WSock', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [WSock]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..3acc8fe
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/geodata.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { GeoDataService } from '../../../../app/fw/svg/geodata.service';
+
+/**
+ * ONOS GUI -- SVG -- GeoData Service - Unit Tests
+ */
+describe('GeoDataService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [GeoDataService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..53ac558
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/glyph.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { GlyphService } from '../../../../app/fw/svg/glyph.service';
+
+/**
+ * ONOS GUI -- SVG -- Glyph Service - Unit Tests
+ */
+describe('GlyphService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [GlyphService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..de6ddf2
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/glyphdata.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2016-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 { GlyphDataService } from '../../../../app/fw/svg/glyphdata.service';
+
+/**
+ * ONOS GUI -- SVG -- Glyph Data Service - Unit Tests
+ */
+describe('GlyphDataService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [GlyphDataService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..f00b8ca
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.directive.spec.ts
@@ -0,0 +1,67 @@
+/*
+ *  Copyright 2016-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 { IconDirective } from '../../../../app/fw/svg/icon.directive';
+import { LogService } from '../../../../app/log.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';
+import { FnService } from '../../../../app/fw//util/fn.service';
+import { ActivatedRoute, Router} from '@angular/router';
+
+class MockGlyphService extends GlyphService {
+    // Override things as necessary
+}
+
+class MockSvgUtilService extends SvgUtilService {
+    // Override things as necessary
+}
+
+class MockFunctionService extends FnService {
+    // Override things as necessary
+}
+
+/**
+ * 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;
+
+    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);
+    });
+
+    afterEach(() => {
+        is = null;
+        log = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..47bef85
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2016-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 { IconService } from '../../../../app/fw/svg/icon.service';
+
+/**
+ * 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();
+  }));
+});
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
new file mode 100644
index 0000000..84cd80a
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/icon/icon.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { IconComponent } from '../../../../../app/fw/svg/icon/icon.component';
+
+describe('IconComponent', () => {
+  let component: IconComponent;
+  let fixture: ComponentFixture<IconComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ IconComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(IconComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    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
new file mode 100644
index 0000000..d5c3cd1
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/map.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2016-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 { MapService } from '../../../../app/fw/svg/map.service';
+
+/**
+ * ONOS GUI -- SVG -- Map Service - Unit Tests
+ */
+describe('MapService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [MapService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..8996b4f
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/sprite.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2016-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 { SpriteService } from '../../../../app/fw/svg/sprite.service';
+
+/**
+ * ONOS GUI -- SVG -- Sprite Service - Unit Tests
+ */
+describe('SpriteService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [SpriteService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..1d14006
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/spritedata.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { SpriteDataService } from '../../../../app/fw/svg/spritedata.service';
+
+/**
+ * ONOS GUI -- SVG -- Sprite Data Service - Unit Tests
+ */
+describe('SpriteDataService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [SpriteDataService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..8d4a21e
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/svgutil.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { SvgUtilService } from '../../../../app/fw/svg/svgutil.service';
+
+/**
+ * ONOS GUI -- SVG -- Svg Util Service - Unit Tests
+ */
+describe('SvgUtilService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [SvgUtilService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..4016500
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/svg/zoom.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { ZoomService } from '../../../../app/fw/svg/zoom.service';
+
+/**
+ * ONOS GUI -- SVG -- Zoom Service - Unit Tests
+ */
+describe('ZoomService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ZoomService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..157e2bc
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/ee.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2016-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 { EeService } from '../../../../app/fw/util/ee.service';
+
+/**
+ * ONOS GUI -- Util -- EE functions - Unit Tests
+ */
+describe('EeService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [EeService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..c07e858
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/fn.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2014-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 { FnService } from '../../../../app/fw/util/fn.service';
+
+/**
+ * ONOS GUI -- Util -- General Purpose Functions - Unit Tests
+ */
+describe('FnService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [FnService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..c277344
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/key.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2014-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 { KeyService } from '../../../../app/fw/util/key.service';
+
+/**
+ * ONOS GUI -- Key Handler Service - Unit Tests
+ */
+describe('KeyService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [KeyService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..fc8c4fc
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/lion.service.spec.ts
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017-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 { LionService } from '../../../../app/fw/util/lion.service';
+
+/**
+ * ONOS GUI -- Lion -- Localization Utilities - Unit Tests
+ */
+describe('LionService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [LionService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..b27662f
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/prefs.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { PrefsService } from '../../../../app/fw/util/prefs.service';
+
+/**
+ ONOS GUI -- Util -- User Preference Service - Unit Tests
+ */
+describe('PrefsService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [PrefsService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..969ad69
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/random.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { RandomService } from '../../../../app/fw/util/random.service';
+
+/**
+ * ONOS GUI -- Random -- Encapsulated randomness - Unit Tests
+ */
+describe('RandomService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [RandomService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..b5a1ff8
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/util/theme.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2014-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 { ThemeService } from '../../../../app/fw/util/theme.service';
+
+/**
+ * ONOS GUI -- Util -- Theme Service - Unit Tests
+ */
+describe('ThemeService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ThemeService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..d2bb5b9
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/button.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016-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 { ButtonService } from '../../../../app/fw/widget/button.service';
+
+/**
+ * ONOS GUI -- Widget -- Button Service - Unit Tests
+ */
+describe('ButtonService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ButtonService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..6840fe3
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/chartbuilder.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016-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 { ChartBuilderService } from '../../../../app/fw/widget/chartbuilder.service';
+
+/**
+ * ONOS GUI -- Widget -- Chart Builder Service - Unit Tests
+ */
+describe('ChartBuilderService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ChartBuilderService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..f301cfc
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/flashchanges.directive.spec.ts
@@ -0,0 +1,52 @@
+/*
+ * 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 { FlashChangesDirective } from '../../../../app/fw/widget/flashchanges.directive';
+
+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
+}
+
+/**
+ * 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);
+    });
+
+    afterEach(() => {
+        fs = null;
+        log = null;
+        ar = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..0285417
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/list.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2016-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 { ListService } from '../../../../app/fw/widget/list.service';
+
+/**
+ * ONOS GUI -- Widget -- List Service - Unit Tests
+ */
+describe('ListService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ListService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..7d15dfc
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/sortableheader.directive.spec.ts
@@ -0,0 +1,67 @@
+/*
+ * 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 { 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 MockSvgUtilService extends SvgUtilService {
+    // Override things as necessary
+}
+
+class MockFunctionService extends FnService {
+    // Override things as necessary
+}
+
+/**
+ * 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);
+    });
+
+    afterEach(() => {
+        log = null;
+        icon = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..fb4aac7
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tablebuilder.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TableBuilderService } from '../../../../app/fw/widget/tablebuilder.service';
+
+/*
+ ONOS GUI -- Widget -- Table Builder Service - Unit Tests
+ */
+describe('TableBuilderService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [TableBuilderService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..5df608c
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tabledetail.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TableDetailService } from '../../../../app/fw/widget/tabledetail.service';
+
+/**
+ * ONOS GUI -- Widget -- Table Detail Service - Unit Tests
+ */
+describe('TableDetailService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [TableDetailService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..a8241ea
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tableresize.directive.spec.ts
@@ -0,0 +1,56 @@
+/*
+ * 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 { TableResizeDirective } from '../../../../app/fw/widget/tableresize.directive';
+import { LogService } from '../../../../app/log.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
+}
+
+/**
+ * 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);
+    });
+
+    afterEach(() => {
+        fs = null;
+        log = null;
+        ar = null;
+        ms = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..467462a
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/toolbar.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { ToolbarService } from '../../../../app/fw/widget/toolbar.service';
+
+/**
+ * ONOS GUI -- Widget -- Toolbar Service - Unit Tests
+ */
+describe('ToolbarService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [ToolbarService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..f8f41da
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.directive.spec.ts
@@ -0,0 +1,51 @@
+/*
+ * 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 { TooltipDirective } from '../../../../app/fw/widget/tooltip.directive';
+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
+}
+
+/**
+ * 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);
+    });
+
+    afterEach(() => {
+        fs = null;
+        log = null;
+        ar = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        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
new file mode 100644
index 0000000..651ef5d
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/fw/widget/tooltip.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TooltipService } from '../../../../app/fw/widget/tooltip.service';
+
+/**
+ * ONOS GUI -- Widget -- Tooltip Service - Unit Tests
+ */
+describe('TooltipService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [TooltipService]
+    });
+  });
+
+  it('should be created', inject([TooltipService], (service: TooltipService) => {
+    expect(service).toBeTruthy();
+  }));
+});
diff --git a/web/gui2/src/main/webapp/tests/app/log.service.spec.ts b/web/gui2/src/main/webapp/tests/app/log.service.spec.ts
new file mode 100644
index 0000000..5307028
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/log.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TestBed, inject } from '@angular/core/testing';
+
+import { LogService } from '../../app/log.service';
+
+/**
+ * ONOS GUI -- Log Service - Unit Tests
+ */
+describe('LogService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [LogService]
+    });
+  });
+
+  it('should be created', inject([LogService], (service: LogService) => {
+    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
new file mode 100644
index 0000000..1808eb6
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/onos.component.spec.ts
@@ -0,0 +1,46 @@
+/*
+ * 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 { TestBed, async } from '@angular/core/testing';
+import { OnosComponent } from '../../app/onos.component';
+
+/**
+ * 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!');
+  }));
+});
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
new file mode 100644
index 0000000..867f14a
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/onos.service.spec.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { TestBed, inject } from '@angular/core/testing';
+
+import { OnosService } from '../../app/onos.service';
+
+/**
+ * ONOS GUI -- Onos Service - Unit Tests
+ */
+describe('OnosService', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [OnosService]
+    });
+  });
+
+  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
new file mode 100644
index 0000000..f6ca0f8
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/view/apps/apps.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AppsComponent } from '../../../../app/view/apps/apps.component';
+
+describe('AppsComponent', () => {
+  let component: AppsComponent;
+  let fixture: ComponentFixture<AppsComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ AppsComponent ]
+    })
+    .compileComponents();
+  }));
+
+  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
new file mode 100644
index 0000000..6ec3d73
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/view/apps/triggerform.directive.spec.ts
@@ -0,0 +1,8 @@
+import { TriggerFormDirective } from '../../../../app/view/apps/triggerform.directive';
+
+describe('TriggerFormDirective', () => {
+  it('should create an instance', () => {
+    const directive = new 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
new file mode 100644
index 0000000..e4e06a1
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/view/device/device.component.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * 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 { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceComponent } from '../../../../app/view/device/device.component';
+
+/**
+ * ONOS GUI -- Device View Module - Unit Tests
+ */
+describe('DeviceComponent', () => {
+  let component: DeviceComponent;
+  let fixture: ComponentFixture<DeviceComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ DeviceComponent ]
+    })
+    .compileComponents();
+  }));
+
+  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
new file mode 100644
index 0000000..bbf3062
--- /dev/null
+++ b/web/gui2/src/main/webapp/tests/app/view/device/devicedetailspanel.directive.spec.ts
@@ -0,0 +1,59 @@
+/*
+ * 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 { 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 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;
+
+    beforeEach(() => {
+        log = new LogService();
+        ar = new ActivatedRoute();
+        fs = new MockFunctionService(ar, log);
+        ks = new MockKeyService(fs, log);
+        directive = new DeviceDetailsPanelDirective(ks, log, window);
+    });
+
+    afterEach(() => {
+        fs = null;
+        ks = null;
+        log = null;
+        ar = null;
+        directive = null;
+    });
+
+    it('should create an instance', () => {
+        expect(directive).toBeTruthy();
+    });
+});