Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/angular.json
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/angular.json	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/angular.json	(working copy)
@@ -70,7 +70,10 @@
               "buildTarget": "gui:build:development"
             }
           },
-          "defaultConfiguration": "development"
+          "defaultConfiguration": "development",
+          "options": {
+            "proxyConfig": "proxy.conf.json"
+          }
         },
         "extract-i18n": {
           "builder": "@angular/build:extract-i18n"
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/package.json
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/package.json	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/package.json	(working copy)
@@ -11,15 +11,16 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/common": "^20.0.0",
-    "@angular/compiler": "^20.0.0",
-    "@angular/core": "^20.0.0",
-    "@angular/forms": "^20.0.0",
+    "@angular/animations": "^20.0.4",
+    "@angular/common": "^20.0.4",
+    "@angular/compiler": "^20.0.4",
+    "@angular/core": "^20.0.4",
+    "@angular/forms": "^20.0.4",
     "@angular/material": "^20.0.0",
-    "@angular/platform-browser": "^20.0.0",
-    "@angular/platform-server": "^20.0.0",
-    "@angular/router": "^20.0.0",
-    "@angular/ssr": "^20.0.2",
+    "@angular/platform-browser": "^20.0.4",
+    "@angular/platform-server": "^20.0.4",
+    "@angular/router": "^20.0.4",
+    "@angular/ssr": "^20.0.3",
     "@fortawesome/angular-fontawesome": "^2.0.1",
     "@fortawesome/fontawesome-svg-core": "^6.7.2",
     "@fortawesome/free-regular-svg-icons": "^6.7.2",
@@ -30,9 +31,9 @@
     "zone.js": "~0.15.0"
   },
   "devDependencies": {
-    "@angular/build": "^20.0.2",
-    "@angular/cli": "^20.0.2",
-    "@angular/compiler-cli": "^20.0.0",
+    "@angular/build": "^20.0.3",
+    "@angular/cli": "^20.0.3",
+    "@angular/compiler-cli": "^20.0.4",
     "@types/express": "^5.0.1",
     "@types/jasmine": "~5.1.0",
     "@types/node": "^20.17.19",
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/proxy.conf.json
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/proxy.conf.json	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/proxy.conf.json	(working copy)
@@ -0,0 +1,8 @@
+{
+  "/api": {
+    "target": "https://192.168.85.47:8888",
+    "secure": false,
+    "changeOrigin": true,
+    "pathRewrite": { "^/api": "" }
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.config.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.config.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.config.ts	(working copy)
@@ -1,13 +1,20 @@
-import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core';
-import { provideRouter } from '@angular/router';
+import {ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection} from '@angular/core';
+import {provideRouter} from '@angular/router';
+import {routes} from './app.routes';
+import {provideHttpClient, withFetch, withInterceptors} from '@angular/common/http';
+import {provideAnimations} from '@angular/platform-browser/animations';
+import {csrfInterceptorFn} from './interceptors/csrf-interceptor';
+import {loadingInterceptorFn} from './interceptors/loading-interceptor-interceptor'; // Correct case
 
-import { routes } from './app.routes';
-import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
-
 export const appConfig: ApplicationConfig = {
   providers: [
     provideBrowserGlobalErrorListeners(),
-    provideZoneChangeDetection({ eventCoalescing: true }),
-    provideRouter(routes), provideClientHydration(withEventReplay())
+    provideZoneChangeDetection({eventCoalescing: true}),
+    provideRouter(routes),
+    provideHttpClient(
+      withFetch(),
+      withInterceptors([csrfInterceptorFn, loadingInterceptorFn])
+    ),
+    provideAnimations(),
   ]
 };
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.html	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.html	(working copy)
@@ -2,8 +2,15 @@
   @if (currentUser) {
     <app-navigation></app-navigation>
   }
-  <div class="main-content" [class.no-navigation-margin]="!currentUser">
+  <div class="main-content" [class.no-navigation-margin]="!currentUser"
+       [ngStyle]="{
+    marginLeft: isSidebarCollapsed ? '60px' : '250px',
+    width: isSidebarCollapsed ? 'calc(100% - 60px)' : 'calc(100% - 250px)'
+  }">
     <div class="main-content-inner">
+      @if (loading$ | async) {
+        <app-loading></app-loading>
+      }
       <router-outlet></router-outlet>
     </div>
   </div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts	(working copy)
@@ -1,8 +1,12 @@
-import { Routes } from '@angular/router';
+import {Routes} from '@angular/router';
 import {Login} from './components/login/login';
 import {AuthGuard} from './guards/auth-guard';
 import {Dashboard} from './components/dashboard/dashboard';
+import {GeneralSettings} from './components/general-settings/general-settings';
+import {DeviceGroups} from './components/sub-components/device-groups/device-groups';
+import {Devices} from './components/sub-components/devices/devices';
 
+
 export const routes: Routes = [
   {path: 'login', component: Login},
   {
@@ -10,8 +14,38 @@
     canActivate: [AuthGuard],
     children: [
       {path: 'dashboard', component: Dashboard, data: {roles: ['super_admin', 'device_admin', 'common_admin']}},
+      {
+        path: 'inventory',
+        children: [
+          {
+            path: 'devices',
+            component: Devices,
+            data: {roles: ['super_admin', 'device_admin', 'common_admin']}
+          },
+        ]
+      },
+      {
+        path: 'inventory',
+        children: [
+          {
+            path: 'device-groups',
+            component: DeviceGroups,
+            data: {roles: ['super_admin', 'device_admin', 'common_admin']}
+          },
+        ]
+      },
+      {
+        path: 'system',
+        children: [
+          {
+            path: 'general',
+            component: GeneralSettings,
+            data: {roles: ['super_admin', 'device_admin', 'common_admin']}
+          },
+        ]
+      },
       {path: '', redirectTo: 'dashboard', pathMatch: 'full'},
-      { path: '**', redirectTo: 'dashboard' }
+      {path: '**', redirectTo: 'dashboard'}
     ]
   },
   {path: '**', redirectTo: 'login'}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.scss	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.scss	(working copy)
@@ -9,9 +9,8 @@
 
 .main-content {
   flex-grow: 1;
-  padding: 20px;
   transition: margin-left 0.3s ease, margin-top 0.3s ease;
-  margin-top: 60px;
+  margin-top: 45px;
   margin-left: 250px;
   width: calc(100% - 250px);
   box-sizing: border-box;
@@ -35,4 +34,3 @@
   padding: 0 !important;
   overflow: hidden;
 }
-
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.ts	(working copy)
@@ -5,35 +5,37 @@
 import {Navigation} from './components/navigation/navigation';
 import {FontAwesomeModule} from '@fortawesome/angular-fontawesome';
 import {User} from './models/user';
+import {AsyncPipe, NgStyle} from '@angular/common';
+import {Layout} from './services/layout';
+import {Loading as LoadingService} from './services/loading';
+import {Loading} from './components/common/loading/loading';
 
 @Component({
   selector: 'app-root',
-  imports: [RouterOutlet, Navigation, FontAwesomeModule],
+  imports: [RouterOutlet, Navigation, FontAwesomeModule, NgStyle, AsyncPipe, Loading],
   templateUrl: './app.html',
   styleUrl: './app.scss'
 })
 export class App implements OnInit, OnDestroy {
-  protected title = 'Array Management Platform';
   currentUser: User | null = null;
+  isSidebarCollapsed: boolean = true;
+  loading$;
+  protected title = 'Array Management Platform';
   private authSubscription!: Subscription;
 
-  isSidebarCollapsed: boolean = false;
-
-  constructor(private authService: Auth) {
+  constructor(private authService: Auth, private layoutService: Layout, private loadingService: LoadingService) {
+    this.loading$ = this.loadingService.loading$
   }
 
+
   ngOnInit(): void {
-    // Subscribe to authentication status changes
     this.authSubscription = this.authService.currentUser.subscribe(user => {
       this.currentUser = user;
-    })
-    // this.authSubscription = this.authService.isLoggedIn.subscribe((loggedInStatus: boolean) => {
-    //   this.isLoggedIn = loggedInStatus;
-    //   // If logged out, reset sidebar state (optional, but good practice)
-    //   if (!loggedInStatus) {
-    //     this.isSidebarCollapsed = false;
-    //   }
-    // });
+    });
+
+    this.layoutService.getSidebarCollapsed().subscribe(
+      (state) => this.isSidebarCollapsed = state
+    );
   }
 
   ngOnDestroy(): void {
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.html	(working copy)
@@ -0,0 +1 @@
+<p>admin-tools works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AdminTools } from './admin-tools';
+
+describe('AdminTools', () => {
+  let component: AdminTools;
+  let fixture: ComponentFixture<AdminTools>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AdminTools]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AdminTools);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/admin-tools/admin-tools.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-admin-tools',
+  imports: [],
+  templateUrl: './admin-tools.html',
+  styleUrl: './admin-tools.scss'
+})
+export class AdminTools {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.html	(working copy)
@@ -0,0 +1 @@
+<p>alerting works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Alerting } from './alerting';
+
+describe('Alerting', () => {
+  let component: Alerting;
+  let fixture: ComponentFixture<Alerting>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Alerting]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Alerting);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/alerting/alerting.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-alerting',
+  imports: [],
+  templateUrl: './alerting.html',
+  styleUrl: './alerting.scss'
+})
+export class Alerting {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.html	(working copy)
@@ -0,0 +1,8 @@
+<div class="notification {{data.type}}" role="alert">
+  <span class="message">{{ data.message }}</span>
+  <button class="dismiss-btn" (click)="dismiss()" aria-label="Dismiss notification">
+    <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
+      <path d="M18 6L6 18M6 6l12 12"/>
+    </svg>
+  </button>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.scss	(working copy)
@@ -0,0 +1,47 @@
+.notification {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 12px 20px;
+  max-width: 500px;
+  font-family: 'Inter', sans-serif;
+  font-size: 15px;
+  font-weight: 500;
+  color: #fff;
+  border-radius: 8px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  animation: slideIn 0.3s ease-out;
+  transition: opacity 0.3s ease-out;
+}
+.success {
+  background: linear-gradient(135deg, #2ecc71, #27ae60);
+}
+.error {
+  background: linear-gradient(135deg, #e74c3c, #c0392b);
+}
+.message {
+  flex: 1;
+  margin-right: 10px;
+}
+.dismiss-btn {
+  background: none;
+  border: none;
+  cursor: pointer;
+  color: #fff;
+  opacity: 0.7;
+  transition: opacity 0.2s;
+  padding: 4px;
+}
+.dismiss-btn:hover {
+  opacity: 1;
+}
+@keyframes slideIn {
+  from {
+    transform: translateY(-20px);
+    opacity: 0;
+  }
+  to {
+    transform: translateY(0);
+    opacity: 1;
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AppNotification } from './app-notification';
+
+describe('AppNotification', () => {
+  let component: AppNotification;
+  let fixture: ComponentFixture<AppNotification>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AppNotification]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AppNotification);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/app-notification/app-notification.ts	(working copy)
@@ -0,0 +1,21 @@
+import {Component, Inject} from '@angular/core';
+import {MAT_SNACK_BAR_DATA, MatSnackBarRef} from '@angular/material/snack-bar';
+
+@Component({
+  selector: 'app-app-notification',
+  imports: [],
+  templateUrl: './app-notification.html',
+  styleUrl: './app-notification.scss'
+})
+export class AppNotification {
+
+
+  constructor(
+    @Inject(MAT_SNACK_BAR_DATA) public data: { message: string; type: 'success' | 'error' },
+    private snackBarRef: MatSnackBarRef<AppNotification>) {
+  }
+
+  dismiss() {
+    this.snackBarRef.dismiss();
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.html	(working copy)
@@ -0,0 +1 @@
+<p>avx-management works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxManagement } from './avx-management';
+
+describe('AvxManagement', () => {
+  let component: AvxManagement;
+  let fixture: ComponentFixture<AvxManagement>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxManagement]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxManagement);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/avx-management/avx-management.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-avx-management',
+  imports: [],
+  templateUrl: './avx-management.html',
+  styleUrl: './avx-management.scss'
+})
+export class AvxManagement {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.html	(working copy)
@@ -0,0 +1,14 @@
+<h2 mat-dialog-title>{{ data.title || 'Alert!' }}</h2>
+
+<mat-dialog-content>
+  <p>{{ data.message || 'Are you sure you want to delete this item?' }}</p>
+</mat-dialog-content>
+
+<mat-dialog-actions align="end">
+  <button
+    mat-button
+    [color]="data.cancelButtonColor || 'basic'"
+    (click)="onCancel()">
+    {{ data.cancelButtonText || 'Ok' }}
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.scss	(working copy)
@@ -0,0 +1,8 @@
+mat-dialog-content {
+  font-size: 16px;
+  line-height: 1.5;
+}
+
+mat-dialog-title {
+  padding-bottom: 0;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AlertMsgDialog } from './alert-msg-dialog';
+
+describe('AlertMsgDialog', () => {
+  let component: AlertMsgDialog;
+  let fixture: ComponentFixture<AlertMsgDialog>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AlertMsgDialog]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AlertMsgDialog);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/alert-msg-dialog/alert-msg-dialog.ts	(working copy)
@@ -0,0 +1,29 @@
+import {Component, Inject} from '@angular/core';
+import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
+import {SharedModule} from '../../../shared/shared-module';
+
+export interface AlertMsgDialogData {
+  title: string;
+  message: string;
+  cancelButtonText?: string;
+  cancelButtonColor?: 'basic' | 'primary' | 'accent' | 'warn';
+}
+
+@Component({
+  selector: 'app-alert-msg-dialog',
+  imports: [SharedModule],
+  templateUrl: './alert-msg-dialog.html',
+  styleUrl: './alert-msg-dialog.scss'
+})
+export class AlertMsgDialog {
+  constructor(
+    public dialogRef: MatDialogRef<AlertMsgDialog>,
+    @Inject(MAT_DIALOG_DATA) public data: AlertMsgDialogData
+  ) {
+  }
+
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.html	(working copy)
@@ -0,0 +1,20 @@
+<h2 mat-dialog-title>{{ data.title || 'Confirm Deletion' }}</h2>
+
+<mat-dialog-content>
+  <p>{{ data.message || 'Are you sure you want to delete this item?' }}</p>
+</mat-dialog-content>
+
+<mat-dialog-actions align="end">
+  <button
+    mat-button
+    [color]="data.cancelButtonColor || 'basic'"
+    (click)="onCancel()">
+    {{ data.cancelButtonText || 'Cancel' }}
+  </button>
+  <button
+    mat-raised-button
+    [color]="data.confirmButtonColor || 'warn'"
+    (click)="onConfirm()">
+    {{ data.confirmButtonText || 'Delete' }}
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.scss	(working copy)
@@ -0,0 +1,8 @@
+mat-dialog-content {
+  font-size: 16px;
+  line-height: 1.5;
+}
+
+mat-dialog-title {
+  padding-bottom: 0;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeleteConfirmationDialog } from './delete-confirmation-dialog';
+
+describe('DeleteConfirmationDialog', () => {
+  let component: DeleteConfirmationDialog;
+  let fixture: ComponentFixture<DeleteConfirmationDialog>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeleteConfirmationDialog]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeleteConfirmationDialog);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/delete-confirmation-dialog/delete-confirmation-dialog.ts	(working copy)
@@ -0,0 +1,34 @@
+import {Component, Inject} from '@angular/core';
+import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
+import {SharedModule} from '../../../shared/shared-module';
+
+export interface DeleteConfirmDialogData {
+  title: string;
+  message: string;
+  confirmButtonText?: string;
+  cancelButtonText?: string;
+  confirmButtonColor?: 'primary' | 'accent' | 'warn';
+  cancelButtonColor?: 'basic' | 'primary' | 'accent' | 'warn';
+}
+
+@Component({
+  selector: 'app-delete-confirmation-dialog',
+  imports: [SharedModule,],
+  templateUrl: './delete-confirmation-dialog.html',
+  styleUrl: './delete-confirmation-dialog.scss'
+})
+export class DeleteConfirmationDialog {
+
+  constructor(
+    public dialogRef: MatDialogRef<DeleteConfirmationDialog>,
+    @Inject(MAT_DIALOG_DATA) public data: DeleteConfirmDialogData
+  ) { }
+
+  onConfirm(): void {
+    this.dialogRef.close(true);
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.html	(working copy)
@@ -0,0 +1,7 @@
+<div class="loading-overlay">
+  <div class="sleek-spinner">
+    <div class="ring"></div>
+    <div class="ring"></div>
+    <div class="ring"></div>
+  </div>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.scss	(working copy)
@@ -0,0 +1,48 @@
+.loading-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 9999;
+}
+.sleek-spinner {
+  position: relative;
+  width: 60px;
+  height: 60px;
+}
+.ring {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  border: 3px solid transparent;
+  border-top-color: #00ddeb;
+  border-radius: 50%;
+  animation: spin 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
+}
+.ring:nth-child(2) {
+  animation-delay: 0.15s;
+  border-top-color: #ff4081;
+}
+.ring:nth-child(3) {
+  animation-delay: 0.3s;
+  border-top-color: #7c4dff;
+}
+@keyframes spin {
+  0% {
+    transform: rotate(0deg) scale(1);
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.6;
+  }
+  100% {
+    transform: rotate(360deg) scale(0.8);
+    opacity: 0.4;
+  }
+}
+
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Loading } from './loading';
+
+describe('Loading', () => {
+  let component: Loading;
+  let fixture: ComponentFixture<Loading>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Loading]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Loading);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/loading/loading.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-loading',
+  imports: [],
+  templateUrl: './loading.html',
+  styleUrl: './loading.scss'
+})
+export class Loading {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.html	(working copy)
@@ -0,0 +1 @@
+<p>config-hub works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ConfigHub } from './config-hub';
+
+describe('ConfigHub', () => {
+  let component: ConfigHub;
+  let fixture: ComponentFixture<ConfigHub>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ConfigHub]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ConfigHub);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/config-hub/config-hub.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-config-hub',
+  imports: [],
+  templateUrl: './config-hub.html',
+  styleUrl: './config-hub.scss'
+})
+export class ConfigHub {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.html	(working copy)
@@ -0,0 +1 @@
+<p>device-ha works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceHa } from './device-ha';
+
+describe('DeviceHa', () => {
+  let component: DeviceHa;
+  let fixture: ComponentFixture<DeviceHa>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceHa]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceHa);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ha/device-ha.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-ha',
+  imports: [],
+  templateUrl: './device-ha.html',
+  styleUrl: './device-ha.scss'
+})
+export class DeviceHa {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.html	(working copy)
@@ -0,0 +1 @@
+<p>device-services works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceServices } from './device-services';
+
+describe('DeviceServices', () => {
+  let component: DeviceServices;
+  let fixture: ComponentFixture<DeviceServices>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceServices]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceServices);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-services/device-services.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-services',
+  imports: [],
+  templateUrl: './device-services.html',
+  styleUrl: './device-services.scss'
+})
+export class DeviceServices {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.html	(working copy)
@@ -0,0 +1 @@
+<p>device-ssl works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceSsl } from './device-ssl';
+
+describe('DeviceSsl', () => {
+  let component: DeviceSsl;
+  let fixture: ComponentFixture<DeviceSsl>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceSsl]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceSsl);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-ssl',
+  imports: [],
+  templateUrl: './device-ssl.html',
+  styleUrl: './device-ssl.scss'
+})
+export class DeviceSsl {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.html	(working copy)
@@ -0,0 +1,14 @@
+<mat-tab-group animationDuration="0ms">
+  <mat-tab label="Host">Content 1</mat-tab>
+  <mat-tab label="System Update">Content 2</mat-tab>
+  <mat-tab label="System Time">Content 3</mat-tab>
+  <mat-tab label="NTP">Content 3</mat-tab>
+  <mat-tab label="Network">Content 3</mat-tab>
+  <mat-tab label="License">Content 3</mat-tab>
+  <mat-tab label="Back & Restore Settings">Content 3</mat-tab>
+  <mat-tab label="System HA">Content 3</mat-tab>
+  <mat-tab label="WebUI">Content 3</mat-tab>
+  <mat-tab label="Admin AAA">Content 3</mat-tab>
+  <mat-tab label="Log Settings">Content 3</mat-tab>
+  <mat-tab label="System Backup & Restore">Content 3</mat-tab>
+</mat-tab-group>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.scss	(working copy)
@@ -0,0 +1,4 @@
+mat-tab-group {
+  position: relative;
+  z-index: 100; /* Ensure tabs are above navigation */
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { GeneralSettings } from './general-settings';
+
+describe('GeneralSettings', () => {
+  let component: GeneralSettings;
+  let fixture: ComponentFixture<GeneralSettings>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [GeneralSettings]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(GeneralSettings);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/general-settings/general-settings.ts	(working copy)
@@ -0,0 +1,13 @@
+import {Component} from '@angular/core';
+import {MatTab, MatTabGroup} from '@angular/material/tabs';
+
+@Component({
+  selector: 'app-general-settings',
+  standalone: true,
+  imports: [MatTabGroup, MatTab],
+  templateUrl: './general-settings.html',
+  styleUrl: './general-settings.scss',
+})
+export class GeneralSettings {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.html	(working copy)
@@ -0,0 +1 @@
+<p>inventory works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Inventory } from './inventory';
+
+describe('Inventory', () => {
+  let component: Inventory;
+  let fixture: ComponentFixture<Inventory>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Inventory]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Inventory);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/inventory/inventory.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-inventory',
+  imports: [],
+  templateUrl: './inventory.html',
+  styleUrl: './inventory.scss'
+})
+export class Inventory {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.html	(working copy)
@@ -0,0 +1 @@
+<p>log-analysis works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LogAnalysis } from './log-analysis';
+
+describe('LogAnalysis', () => {
+  let component: LogAnalysis;
+  let fixture: ComponentFixture<LogAnalysis>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [LogAnalysis]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(LogAnalysis);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/log-analysis/log-analysis.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-log-analysis',
+  imports: [],
+  templateUrl: './log-analysis.html',
+  styleUrl: './log-analysis.scss'
+})
+export class LogAnalysis {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.html	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.html	(working copy)
@@ -48,11 +48,7 @@
             </mat-form-field>
           </div>
           <p class="text-center login-error">
-            @if (isError) {
-              <span>{{ errorMessage }}</span>
-            } @else {
-              <span></span>
-            }
+            <span>{{ errorMessage }}</span>
           </p>
           <button
             matButton="filled"
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/login/login.ts	(working copy)
@@ -1,4 +1,4 @@
-import {ChangeDetectionStrategy, Component} from '@angular/core';
+import {ChangeDetectorRef, Component, inject} from '@angular/core';
 import {Auth} from '../../services/auth';
 import {SharedModule} from '../../shared/shared-module';
 import {FormBuilder, FormGroup, Validators} from '@angular/forms';
@@ -11,8 +11,7 @@
     SharedModule,
   ],
   templateUrl: './login.html',
-  styleUrl: './login.scss',
-  changeDetection: ChangeDetectionStrategy.OnPush,
+  styleUrl: './login.scss'
 })
 export class Login {
   isError = false;
@@ -24,6 +23,7 @@
 
   systemStatus: any = null;
   copyRightYear: number = new Date().getUTCFullYear();
+  private cdr = inject(ChangeDetectorRef);
 
   constructor(private authService: Auth, private formBuilder: FormBuilder, private router: Router, private route: ActivatedRoute) {
     if (this.authService.currentUserValue) {
@@ -38,14 +38,16 @@
     this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/dashboard';
   }
 
-  get f() { return this.loginForm.controls; }
+  get f() {
+    return this.loginForm.controls;
+  }
 
   onLogin(): void | null {
     this.submitting = true;
     this.errorMessage = ''; // Clear previous errors
     if (!this.loginForm.valid) {
-      this.isError = true;
       this.errorMessage = 'Invalid login credentials.';
+      this.cdr.detectChanges();
       return null;
     }
     this.loading = true;
@@ -54,9 +56,10 @@
         this.router.navigate([this.returnUrl]);
       },
       error: error => {
-        this.errorMessage = error;
+        this.errorMessage = error.message;
         this.loading = false;
         this.submitting = false;
+        this.cdr.detectChanges();
       }
     })
   }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.html	(working copy)
@@ -0,0 +1 @@
+<p>monitoring works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Monitoring } from './monitoring';
+
+describe('Monitoring', () => {
+  let component: Monitoring;
+  let fixture: ComponentFixture<Monitoring>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Monitoring]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Monitoring);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/monitoring/monitoring.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-monitoring',
+  imports: [],
+  templateUrl: './monitoring.html',
+  styleUrl: './monitoring.scss'
+})
+export class Monitoring {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.html	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.html	(working copy)
@@ -7,10 +7,12 @@
       <span class="app-branding">Array </span><span class="app-platform">Management Platform</span>
     </div>
     <div class="top-right">
-      <fa-icon [icon]="['far', 'rectangle-list']" size="2x"></fa-icon> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-      <fa-icon [icon]="['far', 'bell']" size="2x"></fa-icon> &nbsp;&nbsp;&nbsp;&nbsp;
+      <fa-icon [icon]="['far', 'rectangle-list']" size="2x"></fa-icon>
+             
+      <fa-icon [icon]="['far', 'bell']" size="2x"></fa-icon>
+           
       <div class="user-dropdown-container">
-        <fa-icon [icon]="['fas', 'user-circle']" size="2x" (click)="toggleUserDropdown($event)"></fa-icon> &nbsp;
+        <fa-icon [icon]="['fas', 'user-circle']" size="2x" (click)="toggleUserDropdown($event)"></fa-icon>
         @if (isUserDropdownOpen) {
           <div class="user-dropdown-menu" [class.open]="isUserDropdownOpen">
             <a href="#" (click)="isUserDropdownOpen = false">
@@ -45,7 +47,8 @@
   </div>
   <div class="sidebar" [class.collapsed]="isSidebarCollapsed">
     <div class="sidebar-header">
-      <span class="app-title">Array Management Platform</span>
+      <span class="app-title">Array</span>
+      <!--      <img ngSrc="assets/images/array_logo_color_white.png" height="30" width="100" alt="AMP">-->
     </div>
 
     <nav class="sidebar-nav">
@@ -64,7 +67,11 @@
               </li>
             } @else {
               <li>
-                <a (click)="toggleSubMenu(item)" routerLinkActive="active">
+                <a
+                  (click)="toggleSubMenu(item)"
+                  [class.active]="isParentActive(item)"
+                  [class.expanded]="item.expanded"
+                >
                   @if (item.icon != '') {
                     <fa-icon [icon]="['fas', item.icon]"></fa-icon>
                   }
@@ -93,13 +100,13 @@
     </nav>
 
     <div class="sidebar-footer">
-      <a routerLink="/demo" routerLinkActive="active" (click)="isSidebarCollapsed && toggleSidebar()">
-        <fa-icon [icon]="['fas', 'user-circle']" size="1x"></fa-icon>
-        @if (!isSidebarCollapsed) {
-          &nbsp;&nbsp;<span>Peri</span>
-        }
-      </a>
-      <button class="toggle-button" (click)="toggleSidebar();">
+      <!--      <a routerLink="/demo" routerLinkActive="active" (click)="isSidebarCollapsed && toggleSidebar()">-->
+      <!--        <fa-icon [icon]="['fas', 'user-circle']" size="1x"></fa-icon>-->
+      <!--        @if (!isSidebarCollapsed) {-->
+      <!--          <span>Peri</span>-->
+      <!--        }-->
+      <!--      </a>-->
+      <button class="toggle-button" (click)="toggleSidebar()">
         @if (isSidebarCollapsed) {
           <fa-icon [icon]="['fas', 'angle-double-right']" [class.rotated]="isSidebarCollapsed"></fa-icon>
         } @else {
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.scss	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.scss	(working copy)
@@ -5,7 +5,7 @@
   position: fixed;
   left: 0;
   top: 0;
-  z-index: 1000;
+  z-index: 50;
   overflow: hidden; /* Prevent container overflow */
 }
 
@@ -19,8 +19,9 @@
   padding: 0 20px;
   box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
   width: 100vw;
-  z-index: 1001;
+  z-index: 51;
   box-sizing: border-box; /* Ensure padding doesn't cause overflow */
+  position: fixed;
 }
 
 .top-left {
@@ -31,7 +32,7 @@
 .top-left .menu-toggle {
   background: none;
   border: none;
-  font-size: 1.5em;
+  font-size: 1.2em;
   cursor: pointer;
   margin-right: 15px;
   color: #555;
@@ -46,7 +47,6 @@
   line-height: 45px;
   color: #1170cf;
   margin-left: 15px;
-  font-size: 18px;
   letter-spacing: 1px;
   font-weight: 500;
 }
@@ -55,7 +55,6 @@
   line-height: 45px;
   color: #fff;
   margin-left: 15px;
-  font-size: 16px;
   letter-spacing: 1px;
 }
 
@@ -79,7 +78,7 @@
 }
 
 .top-right .icon {
-  font-size: 1.3em;
+  font-size: 1em;
   margin-left: 20px;
   cursor: pointer;
   color: #555;
@@ -133,7 +132,7 @@
 }
 
 .sidebar-header {
-  padding: 15px;
+  padding: 12px;
   display: flex;
   align-items: center;
   border-bottom: 1px solid rgba(255, 255, 255, 0.1);
@@ -148,7 +147,6 @@
 
 .sidebar-header .app-title {
   font-size: 1.2em;
-  font-weight: bold;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
@@ -177,7 +175,7 @@
 .sidebar-nav a {
   display: flex;
   align-items: center;
-  padding: 10px 15px;
+  padding: 5px 8px;
   color: #ecf0f1;
   text-decoration: none;
   transition: background-color 0.2s ease;
@@ -195,7 +193,7 @@
 
 .sidebar-nav a .icon {
   margin-right: 15px;
-  font-size: 1.2em;
+  //font-size: 1.2em;
   min-width: 20px;
 }
 
@@ -209,19 +207,8 @@
   display: none;
 }
 
-/* Original .arrow styles - replaced by .fa-chevron-right */
-/* .sidebar-nav a .arrow {
-  margin-left: auto;
-  font-size: 0.8em;
-  opacity: 0.7;
-}
-
-.sidebar.collapsed .sidebar-nav a .arrow {
-  display: none;
-} */
-
 .sidebar-footer {
-  padding: 15px;
+  padding: 8px;
   border-top: 1px solid rgba(255, 255, 255, 0.1);
   display: flex;
   justify-content: space-between;
@@ -265,9 +252,6 @@
   transform: rotate(180deg);
 }
 
----
-  /* --- ADDITIONS FOR SUBMENU EXPANSION --- */
-
 .sidebar-nav ul ul {
   /* Initial state: Hidden and collapsed */
   list-style: none; /* Remove bullet points for nested lists */
@@ -329,7 +313,6 @@
 
 .user-dropdown-container {
   position: relative;
-  display: inline-block;
   cursor: pointer;
   height: 100%;
   display: flex;
@@ -352,7 +335,7 @@
   border-radius: 5px;
   box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
   min-width: 200px;
-  z-index: 1002;
+  z-index: 102;
   padding: 5px 0;
 
   /* Initial state for transition: hidden */
@@ -377,7 +360,7 @@
   padding: 10px 15px;
   color: #ecf0f1;
   text-decoration: none;
-  font-size: 0.95em;
+  font-size: 0.8em;
   white-space: nowrap;
   transition: background-color 0.2s ease, color 0.2s ease;
   width: 100%;
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/navigation/navigation.ts	(working copy)
@@ -1,35 +1,70 @@
-import {Component, HostListener, OnInit} from '@angular/core';
+import { Component, HostListener, OnInit } from '@angular/core';
+import { Auth } from '../../services/auth';
+import { SharedModule } from '../../shared/shared-module';
+import { MenuItem } from '../../models/menu-item';
+import { Observable } from 'rxjs';
+import { MENU_ITEMS } from '../../constants/menu';
+import { map, filter, take } from 'rxjs/operators';
+import { Router, NavigationEnd } from '@angular/router';
+import {Layout} from '../../services/layout';
+import {NgOptimizedImage} from '@angular/common';
 
-import {Auth} from '../../services/auth';
-import {SharedModule} from '../../shared/shared-module';
-import {MenuItem} from '../../models/menu-item';
-import {Observable} from 'rxjs';
-import {MENU_ITEMS} from '../../constants/menu';
-import {map} from 'rxjs/operators';
-import {Router} from '@angular/router';
-
 @Component({
-  selector: 'app-navigation', imports: [SharedModule,], templateUrl: './navigation.html', styleUrl: './navigation.scss'
+  selector: 'app-navigation',
+  imports: [SharedModule, NgOptimizedImage],
+  templateUrl: './navigation.html',
+  styleUrl: './navigation.scss'
 })
 export class Navigation implements OnInit {
   isSidebarCollapsed: boolean = false;
   isUserDropdownOpen: boolean = false;
-
   filteredMenu$: Observable<MenuItem[]> | undefined;
+  private menuItems: MenuItem[] = [];
 
-  constructor(private authService: Auth, private router: Router) {
-  }
+  constructor(private authService: Auth, private router: Router, private layoutService: Layout) {}
 
   ngOnInit() {
-    this.filteredMenu$ = this.authService.currentUser.pipe(map(user => this.filteredMenuItems(MENU_ITEMS, user)),)
+    this.isSidebarCollapsed = localStorage.getItem('sidebarCollapsed') === 'true';
+    this.filteredMenu$ = this.authService.currentUser.pipe(
+      map(user => this.filteredMenuItems(MENU_ITEMS, user))
+    );
+
+    this.filteredMenu$.subscribe(items => {
+      const savedState = JSON.parse(localStorage.getItem('menuState') || '{}');
+      this.menuItems = items.map(item => ({
+        ...item,
+        expanded: savedState[item.label] ?? item.expanded ?? false,
+        children: item.children
+          ? item.children.map(child => ({ ...child, expanded: child.expanded ?? false }))
+          : undefined
+      }));
+      this.updateMenuState();
+    });
+
+    this.router.events
+      .pipe(filter(event => event instanceof NavigationEnd))
+      .subscribe(() => {
+        this.updateMenuState();
+      });
+
+    this.router.events
+      .pipe(
+        filter(event => event instanceof NavigationEnd),
+        take(1)
+      )
+      .subscribe(() => {
+        this.updateMenuState();
+      });
   }
 
   toggleSidebar(): void {
     this.isSidebarCollapsed = !this.isSidebarCollapsed;
+    this.layoutService.setSidebarCollapsed(this.isSidebarCollapsed);
   }
 
-  toggleSubMenu(item: MenuItem) {
+  toggleSubMenu(item: MenuItem): void {
     item.expanded = !item.expanded;
+    this.saveMenuState();
   }
 
   toggleUserDropdown(event: Event): void {
@@ -37,7 +72,6 @@
     this.isUserDropdownOpen = !this.isUserDropdownOpen;
   }
 
-  // Close the dropdown if a click occurs outside of it
   @HostListener('document:click', ['$event'])
   onDocumentClick(event: Event): void {
     const target = event.target as HTMLElement;
@@ -48,37 +82,57 @@
 
   logout(): void {
     this.isUserDropdownOpen = false;
-    this.authService.logout(); // Call logout from Auth Service
+    this.authService.logout();
     this.router.navigate(['/login']);
   }
 
+  isParentActive(item: MenuItem): boolean {
+    if (!item.children) return false;
+    const currentUrl = this.router.url;
+    return item.children.some(child => child.routerLink && currentUrl.includes(child.routerLink));
+  }
+
+  private updateMenuState(): void {
+    const currentUrl = this.router.url;
+    this.menuItems.forEach(item => {
+      if (item.children) {
+        const isActive = item.children.some(child => child.routerLink && currentUrl.includes(child.routerLink));
+        item.expanded = isActive || item.expanded;
+      }
+    });
+    this.saveMenuState();
+  }
+
+  private saveMenuState(): void {
+    const state: { [key: string]: boolean } = {};
+    this.menuItems.forEach(item => {
+      if (item.children) {
+        state[item.label] = item.expanded ?? false;
+      }
+    });
+    localStorage.setItem('menuState', JSON.stringify(state));
+  }
+
   private filteredMenuItems(menuItems: MenuItem[], user: any | null): MenuItem[] {
-    if (!user) {
-      return [];
-    }
+    if (!user) return [];
 
-    return menuItems.filter(menuItem => {
-      if (menuItem.roles && menuItem.roles.length > 0) {
-        const hasRole = menuItem.roles.some(role => this.authService.hasRole(role));
-        if (!hasRole) {
-          return false;
-        }
+    return menuItems.filter(item => {
+      if (item.roles && item.roles.length > 0) {
+        const hasRole = item.roles.some(role => this.authService.hasRole(role));
+        if (!hasRole) return false;
       }
 
-      if (menuItem.permissions && menuItem.permissions.length > 0) {
-        const hasPermission = menuItem.permissions.some(permission => this.authService.hasPermission(permission));
-        if (!hasPermission) {
-          return false;
-        }
+      if (item.permissions && item.permissions.length > 0) {
+        const hasPermission = item.permissions.some(permission => this.authService.hasPermission(permission));
+        if (!hasPermission) return false;
       }
 
-      if (menuItem.children) {
-        menuItem.children = this.filteredMenuItems(menuItem.children, user);
-        return menuItem.children.length > 0 || (!menuItem.children && (menuItem.roles || menuItem.permissions));
+      if (item.children) {
+        item.children = this.filteredMenuItems(item.children, user);
+        return item.children.length > 0 || (!item.children && (item.roles || item.permissions));
       }
 
       return true;
-    })
-
+    });
   }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.html	(working copy)
@@ -0,0 +1 @@
+<p>notification works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Notification } from './notification';
+
+describe('Notification', () => {
+  let component: Notification;
+  let fixture: ComponentFixture<Notification>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Notification]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Notification);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/notification/notification.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-notification',
+  imports: [],
+  templateUrl: './notification.html',
+  styleUrl: './notification.scss'
+})
+export class Notification {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.html	(working copy)
@@ -0,0 +1 @@
+<p>observability works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Observability } from './observability';
+
+describe('Observability', () => {
+  let component: Observability;
+  let fixture: ComponentFixture<Observability>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Observability]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Observability);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/observability/observability.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-observability',
+  imports: [],
+  templateUrl: './observability.html',
+  styleUrl: './observability.scss'
+})
+export class Observability {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.html	(working copy)
@@ -0,0 +1 @@
+<p>reports works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Reports } from './reports';
+
+describe('Reports', () => {
+  let component: Reports;
+  let fixture: ComponentFixture<Reports>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Reports]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Reports);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/reports/reports.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-reports',
+  imports: [],
+  templateUrl: './reports.html',
+  styleUrl: './reports.scss'
+})
+export class Reports {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.html	(working copy)
@@ -0,0 +1 @@
+<p>storage works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Storage } from './storage';
+
+describe('Storage', () => {
+  let component: Storage;
+  let fixture: ComponentFixture<Storage>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Storage]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Storage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-storage',
+  imports: [],
+  templateUrl: './storage.html',
+  styleUrl: './storage.scss'
+})
+export class Storage {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.html	(working copy)
@@ -0,0 +1 @@
+<p>admin-aaa works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AdminAaa } from './admin-aaa';
+
+describe('AdminAaa', () => {
+  let component: AdminAaa;
+  let fixture: ComponentFixture<AdminAaa>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AdminAaa]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AdminAaa);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/admin-aaa/admin-aaa.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-admin-aaa',
+  imports: [],
+  templateUrl: './admin-aaa.html',
+  styleUrl: './admin-aaa.scss'
+})
+export class AdminAaa {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.html	(working copy)
@@ -0,0 +1 @@
+<p>alert-log works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AlertLog } from './alert-log';
+
+describe('AlertLog', () => {
+  let component: AlertLog;
+  let fixture: ComponentFixture<AlertLog>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AlertLog]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AlertLog);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-log/alert-log.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-alert-log',
+  imports: [],
+  templateUrl: './alert-log.html',
+  styleUrl: './alert-log.scss'
+})
+export class AlertLog {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>alert-rules-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AlertRulesOverview } from './alert-rules-overview';
+
+describe('AlertRulesOverview', () => {
+  let component: AlertRulesOverview;
+  let fixture: ComponentFixture<AlertRulesOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AlertRulesOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AlertRulesOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-rules-overview/alert-rules-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-alert-rules-overview',
+  imports: [],
+  templateUrl: './alert-rules-overview.html',
+  styleUrl: './alert-rules-overview.scss'
+})
+export class AlertRulesOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.html	(working copy)
@@ -0,0 +1 @@
+<p>alert-thresholds works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AlertThresholds } from './alert-thresholds';
+
+describe('AlertThresholds', () => {
+  let component: AlertThresholds;
+  let fixture: ComponentFixture<AlertThresholds>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AlertThresholds]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AlertThresholds);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/alert-thresholds/alert-thresholds.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-alert-thresholds',
+  imports: [],
+  templateUrl: './alert-thresholds.html',
+  styleUrl: './alert-thresholds.scss'
+})
+export class AlertThresholds {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.html	(working copy)
@@ -0,0 +1 @@
+<p>avx-devices works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxDevices } from './avx-devices';
+
+describe('AvxDevices', () => {
+  let component: AvxDevices;
+  let fixture: ComponentFixture<AvxDevices>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxDevices]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxDevices);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-devices/avx-devices.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-avx-devices',
+  imports: [],
+  templateUrl: './avx-devices.html',
+  styleUrl: './avx-devices.scss'
+})
+export class AvxDevices {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>avx-instances-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { AvxInstancesOverview } from './avx-instances-overview';
+
+describe('AvxInstancesOverview', () => {
+  let component: AvxInstancesOverview;
+  let fixture: ComponentFixture<AvxInstancesOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [AvxInstancesOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(AvxInstancesOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/avx-instances-overview/avx-instances-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-avx-instances-overview',
+  imports: [],
+  templateUrl: './avx-instances-overview.html',
+  styleUrl: './avx-instances-overview.scss'
+})
+export class AvxInstancesOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.html	(working copy)
@@ -0,0 +1 @@
+<p>backup-restore-settings works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { BackupRestoreSettings } from './backup-restore-settings';
+
+describe('BackupRestoreSettings', () => {
+  let component: BackupRestoreSettings;
+  let fixture: ComponentFixture<BackupRestoreSettings>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [BackupRestoreSettings]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(BackupRestoreSettings);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/backup-restore-settings/backup-restore-settings.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-backup-restore-settings',
+  imports: [],
+  templateUrl: './backup-restore-settings.html',
+  styleUrl: './backup-restore-settings.scss'
+})
+export class BackupRestoreSettings {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.html	(working copy)
@@ -0,0 +1 @@
+<p>device-cloned-files works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceClonedFiles } from './device-cloned-files';
+
+describe('DeviceClonedFiles', () => {
+  let component: DeviceClonedFiles;
+  let fixture: ComponentFixture<DeviceClonedFiles>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceClonedFiles]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceClonedFiles);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-cloned-files/device-cloned-files.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-cloned-files',
+  imports: [],
+  templateUrl: './device-cloned-files.html',
+  styleUrl: './device-cloned-files.scss'
+})
+export class DeviceClonedFiles {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>device-config-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceConfigOverview } from './device-config-overview';
+
+describe('DeviceConfigOverview', () => {
+  let component: DeviceConfigOverview;
+  let fixture: ComponentFixture<DeviceConfigOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceConfigOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceConfigOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-config-overview/device-config-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-config-overview',
+  imports: [],
+  templateUrl: './device-config-overview.html',
+  styleUrl: './device-config-overview.scss'
+})
+export class DeviceConfigOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>device-custom-config-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceCustomConfigOverview } from './device-custom-config-overview';
+
+describe('DeviceCustomConfigOverview', () => {
+  let component: DeviceCustomConfigOverview;
+  let fixture: ComponentFixture<DeviceCustomConfigOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceCustomConfigOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceCustomConfigOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-custom-config-overview/device-custom-config-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-custom-config-overview',
+  imports: [],
+  templateUrl: './device-custom-config-overview.html',
+  styleUrl: './device-custom-config-overview.scss'
+})
+export class DeviceCustomConfigOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/add-device-groups.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/add-device-groups.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/add-device-groups.html	(working copy)
@@ -0,0 +1,37 @@
+<h2 mat-dialog-title> Add a Device Group</h2>
+
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="deviceGroupForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="groupName" class="form-label">Group name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="groupName"
+          formControlName="groupName"
+          matInput
+          placeholder="Group name"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+  </form>
+</mat-dialog-content>
+
+<mat-dialog-actions align="end">
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Cancel
+  </button>
+  <button
+    mat-raised-button
+    color="primary"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.html	(working copy)
@@ -0,0 +1,58 @@
+<mat-card class="page-card" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>Device Groups</mat-card-title>
+    <div class="page-header-button-container">
+      <button mat-raised-button (click)="addDeviceGroup()">Add</button>
+    </div>
+  </mat-card-header>
+</mat-card>
+
+<div class="table-container">
+  <mat-form-field appearance="outline">
+    <mat-label>Search Group</mat-label>
+    <input matInput (keyup)="applyFilter($event)" placeholder="Ex. Array" #input>
+  </mat-form-field>
+
+  <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+    <ng-container matColumnDef="serial">
+      <th mat-header-cell *matHeaderCellDef> No.</th>
+      <td mat-cell *matCellDef="let element; let i = index;"> {{ i + 1 }}</td>
+    </ng-container>
+    <ng-container matColumnDef="name">
+      <th mat-header-cell *matHeaderCellDef> Group Name</th>
+      <td mat-cell *matCellDef="let element"> {{ element.group_name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="devices">
+      <th mat-header-cell *matHeaderCellDef class="action-header"> Managed Devices</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action">
+          @if (element.device_list && element.device_list.length > 0) {
+            <span
+              [matTooltip]="getTruncatedArrayString(element.device_list).full"
+              matTooltipPosition="above">
+          {{ getTruncatedArrayString(element.device_list).display }}
+        </span>
+          } @else {
+            -
+          }
+        </div>
+      </td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef class="action-header w-10"> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          <fa-icon [icon]="['far', 'trash-can']" class="delete-icon"
+                   (click)="confirmDelete(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+
+    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
+
+    <tr class="mat-row" *matNoDataRow>
+      <td class="mat-cell" colspan="4">No data matching the filter "{{ input.value }}"</td>
+    </tr>
+  </table>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.scss	(working copy)
@@ -0,0 +1,51 @@
+/* Structure */
+table {
+  width: 100%;
+}
+
+.mat-mdc-form-field {
+  font-size: 14px;
+  width: 100%;
+}
+
+mat-icon {
+  vertical-align: middle; /* Align icon with text baseline */
+}
+
+.page-card {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
+
+.action-header {
+  text-align: center;
+}
+
+.w-10 {
+  width: 10%;
+}
+
+.row-action {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-right: 12px;
+  gap: 8px;
+}
+
+.a-link {
+  cursor: pointer;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceGroups } from './device-groups';
+
+describe('DeviceGroups', () => {
+  let component: DeviceGroups;
+  let fixture: ComponentFixture<DeviceGroups>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceGroups]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceGroups);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-groups/device-groups.ts	(working copy)
@@ -0,0 +1,171 @@
+import {Component, inject} from '@angular/core';
+import {take} from 'rxjs/operators';
+import {NotificationService} from '../../../services/notification';
+import {DeviceService} from '../../../services/device-service';
+import {MatTableDataSource} from '@angular/material/table';
+import {SharedModule} from '../../../shared/shared-module';
+import {Confirmation} from '../../../services/confirmation';
+import {MatDialog, MatDialogRef} from '@angular/material/dialog';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {AlertMsg} from '../../../services/alert-msg';
+
+@Component({
+  selector: 'app-device-groups',
+  imports: [SharedModule],
+  templateUrl: './device-groups.html',
+  styleUrl: './device-groups.scss'
+})
+export class DeviceGroups {
+
+  deviceGroups: any[] = [];
+  displayedColumns: string[] = ['serial', 'name', 'devices', 'action'];
+  dataSource = new MatTableDataSource(this.deviceGroups);
+  dialog = inject(MatDialog);
+
+  constructor(
+    private notification: NotificationService,
+    private deviceService: DeviceService,
+    private alertMsg: AlertMsg,
+    private confirmationService: Confirmation
+  ) {
+    this.getDeviceGroups();
+  }
+
+  getDeviceGroups(): void {
+    this.deviceGroups = [];
+    // ToDo: Update with actual RoleId
+    let roleId = "0"
+    let rawPayload = new FormData();
+    rawPayload.set('action', 'FilterRoleDeviceGroups');
+    rawPayload.set('options', JSON.stringify({"role_id": roleId}));
+    this.deviceService.getDeviceGroups(rawPayload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[1] && 'result' in result[1]) {
+              this.deviceGroups = result[1].result;
+              this.dataSource = new MatTableDataSource(this.deviceGroups);
+            }
+          }
+        },
+        error: (error: { message: string; }) => {
+          console.log(error);
+          this.notification.showError(error.message);
+        }
+      })
+  }
+
+  applyFilter(event: Event) {
+    const filterValue = (event.target as HTMLInputElement).value;
+    this.dataSource.filter = filterValue.trim().toLowerCase();
+  }
+
+  getTruncatedArrayString(array: any[], maxLength: number = 15): { display: string, full: string } {
+    if (!array || array.length === 0) {
+      return {display: '', full: ''};
+    }
+
+    const devicesArray = array.map(item => item.ip);
+
+    const fullString = devicesArray.join(', ');
+    if (fullString.length > maxLength) {
+      return {display: fullString.substring(0, maxLength) + '...', full: fullString};
+    } else {
+      return {display: fullString, full: fullString};
+    }
+  }
+
+  confirmDelete(deviceGroup: any): void {
+    let groupName: string = deviceGroup.group_name;
+    let confirmMsg = `Are you sure you want to permanently delete "${groupName}"? This action cannot be undone.`
+    if (deviceGroup.device_list.length > 0) {
+      confirmMsg = "Deleting this device group will also remove all devices associated with it. Are you sure you want to proceed?"
+    }
+    this.confirmationService.openConfirmDialog({
+      title: `Delete ${groupName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        let rawPayload = new FormData();
+        rawPayload.set('pk', JSON.stringify({"name": groupName}));
+        this.deviceService.deleteDeviceGroup(rawPayload)
+          .pipe(take(1))
+          .subscribe({
+            next: (result: any) => {
+              // ToDo: Backend fix required.
+              if (result && result.length > 1) {
+                if (!result[0]) {
+                  this.notification.showError(`${result[1]}`);
+                } else {
+                  this.notification.showSuccess(`${groupName} deleted successfully!`);
+                  this.getDeviceGroups();
+                }
+              }
+            },
+            error: (err) => {
+              if (err.status === 200) {
+                // ToDo: Backend fix required.
+                this.notification.showSuccess(`${groupName} deleted successfully!`);
+                this.getDeviceGroups();
+              } else {
+                this.notification.showError('Deletion Failed.');
+              }
+            }
+          })
+      } else {
+        this.notification.showSuccess('Deletion cancelled.');
+      }
+    });
+  }
+
+  addDeviceGroup() {
+    const dialogRef = this.dialog.open(AddDeviceGroupsDialog);
+    dialogRef.afterClosed().subscribe(result => {
+      if (result) {
+        let rawPayload = new FormData();
+        rawPayload.set('post_data', JSON.stringify({"name": result?.groupName}));
+        this.deviceService.addDeviceGroup(rawPayload)
+          .pipe(take(1))
+          .subscribe({
+            next: () => {
+              this.notification.showSuccess(`${result?.groupName} added successfully!`);
+              this.getDeviceGroups();
+            },
+            error: () => {
+              this.notification.showError('Creation Failed.');
+            }
+          })
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'add-device-groups',
+  templateUrl: './add-device-groups.html',
+  imports: [SharedModule],
+})
+export class AddDeviceGroupsDialog {
+
+  readonly dialogRef = inject(MatDialogRef<AddDeviceGroupsDialog>);
+  deviceGroupForm: FormGroup;
+
+  constructor(private formBuilder: FormBuilder) {
+    this.deviceGroupForm = this.formBuilder.group({
+      groupName: ['', Validators.required],
+    })
+  }
+
+  onSubmit() {
+    this.dialogRef.close(this.deviceGroupForm.value);
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>device-ha-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceHaOverview } from './device-ha-overview';
+
+describe('DeviceHaOverview', () => {
+  let component: DeviceHaOverview;
+  let fixture: ComponentFixture<DeviceHaOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceHaOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceHaOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-overview/device-ha-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-ha-overview',
+  imports: [],
+  templateUrl: './device-ha-overview.html',
+  styleUrl: './device-ha-overview.scss'
+})
+export class DeviceHaOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.html	(working copy)
@@ -0,0 +1 @@
+<p>device-insights works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceInsights } from './device-insights';
+
+describe('DeviceInsights', () => {
+  let component: DeviceInsights;
+  let fixture: ComponentFixture<DeviceInsights>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceInsights]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceInsights);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-insights/device-insights.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-insights',
+  imports: [],
+  templateUrl: './device-insights.html',
+  styleUrl: './device-insights.scss'
+})
+export class DeviceInsights {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>device-ssl-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { DeviceSslOverview } from './device-ssl-overview';
+
+describe('DeviceSslOverview', () => {
+  let component: DeviceSslOverview;
+  let fixture: ComponentFixture<DeviceSslOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [DeviceSslOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(DeviceSslOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-device-ssl-overview',
+  imports: [],
+  templateUrl: './device-ssl-overview.html',
+  styleUrl: './device-ssl-overview.scss'
+})
+export class DeviceSslOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/add-device.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/add-device.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/add-device.html	(working copy)
@@ -0,0 +1,319 @@
+<h2 mat-dialog-title>Add Device</h2>
+
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="deviceForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="deviceName" class="form-label">Device name *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="deviceName"
+          formControlName="deviceName"
+          matInput
+          placeholder="Device name"
+          type="text"
+        />
+        @if (deviceForm.get('deviceName')?.invalid && deviceForm.get('deviceName')?.touched) {
+          <mat-error>
+            @if (deviceForm.get('deviceName')?.errors?.['required']) {
+              Device name is required.
+            } @else {
+              Invalid device name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="deviceType" class="form-label">Device Type *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="deviceType">
+          @for (type of data?.deviceType; track type) {
+            <mat-option [value]="type">{{ type }}</mat-option>
+          }
+        </mat-select>
+        @if (deviceForm.get('deviceType')?.invalid && deviceForm.get('deviceType')?.touched) {
+          <mat-error>
+            @if (deviceForm.get('deviceType')?.errors?.['required']) {
+              Device type is required.
+            } @else {
+              Invalid device type format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="ipAddressType" class="form-label">IP Type *</label>
+      <mat-radio-group formControlName="ipAddressType">
+        <mat-radio-button value="v4">IPv4</mat-radio-button>
+        <mat-radio-button value="v6">IPv6</mat-radio-button>
+      </mat-radio-group>
+    </div>
+    @if (deviceForm.get('ipAddressType')?.value == 'v4') {
+      <div class="form-field-wrapper">
+        <label for="ipAddress" class="form-label">IP Address *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="ipAddress"
+            formControlName="ipAddress"
+            matInput
+            placeholder="IP Address"
+            type="text"
+          />
+          @if (deviceForm.get('ipAddress')?.invalid && deviceForm.get('ipAddress')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('ipAddress')?.errors?.['required']) {
+                IPv4 address is required.
+              } @else if (deviceForm.get('ipAddress')?.errors?.['ipv4']) {
+                Invalid IPv4 address format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    } @else {
+      <div class="form-field-wrapper">
+        <label for="ipAddress" class="form-label">IP Address *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="ipAddress"
+            formControlName="ipAddress"
+            matInput
+            placeholder="IP Address"
+            type="text"
+          />
+          @if (deviceForm.get('ipAddress')?.invalid && deviceForm.get('ipAddress')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('ipAddress')?.errors?.['required']) {
+                IPv6 address is required.
+              } @else if (deviceForm.get('ipAddress')?.errors?.['ipv6']) {
+                Invalid IPv6 address format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    }
+    <div class="form-field-wrapper">
+      <label for="ipAddressType" class="form-label">API Protocol *</label>
+      <mat-radio-group formControlName="protocol">
+        <mat-radio-button value="restapi">REST API</mat-radio-button>
+        <mat-radio-button value="xmlrpc">XML RPC</mat-radio-button>
+      </mat-radio-group>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="portNumber" class="form-label">API Port *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="portNumber"
+          formControlName="portNumber"
+          matInput
+          placeholder="9997"
+          type="number"
+        />
+        @if (deviceForm.get('portNumber')?.invalid && deviceForm.get('portNumber')?.touched) {
+          <mat-error>
+            @if (deviceForm.get('portNumber')?.errors?.['required']) {
+              API port is required.
+            } @else {
+              Invalid port number format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="apiUsername" class="form-label">API Username *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="apiUsername"
+          formControlName="apiUsername"
+          matInput
+          placeholder="API Username"
+          type="text"
+        />
+        @if (deviceForm.get('apiUsername')?.invalid && deviceForm.get('apiUsername')?.touched) {
+          <mat-error>
+            @if (deviceForm.get('apiUsername')?.errors?.['required']) {
+              Username is required.
+            } @else {
+              Invalid username format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="apiPassword" class="form-label">API Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="apiPassword"
+          formControlName="apiPassword"
+          matInput
+          placeholder="API Password"
+          type="password"
+        />
+        @if (deviceForm.get('apiPassword')?.invalid && deviceForm.get('apiPassword')?.touched) {
+          <mat-error>
+            @if (deviceForm.get('apiPassword')?.errors?.['required']) {
+              Password is required.
+            } @else {
+              Invalid password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="webuiPortNumber" class="form-label">WebUI Port *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input id="webuiPortNumber" formControlName="webuiPortNumber" matInput placeholder="8888" type="number"/>
+      </mat-form-field>
+    </div>
+    @if (!['AG', 'vxAG'].includes(deviceForm.get('deviceType')?.value)) {
+      <div class="form-field-wrapper">
+        <label for="webuiUsername" class="form-label">WebUI Username</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="webuiUsername"
+            formControlName="webuiUsername"
+            matInput
+            placeholder="WebUI Username"
+            type="text"
+          />
+          @if (deviceForm.get('webuiUsername')?.invalid && deviceForm.get('webuiUsername')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('webuiUsername')?.errors?.['required']) {
+                Username is required.
+              } @else {
+                Invalid username format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="webuiPassword" class="form-label">WebUI Password *</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input
+            id="webuiPassword"
+            formControlName="webuiPassword"
+            matInput
+            placeholder="WebUI Password"
+            type="password"
+          />
+          @if (deviceForm.get('webuiPassword')?.invalid && deviceForm.get('webuiPassword')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('webuiPassword')?.errors?.['required']) {
+                Password is required.
+              } @else {
+                Invalid password format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    }
+    <div class="form-field-wrapper">
+      <label for="enablePassword" class="form-label">Enable Password</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input id="enablePassword" formControlName="enablePassword" matInput placeholder="Password" type="password"/>
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="gatewayDomain" class="form-label">Gateway Domain</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="gatewayDomain"
+          formControlName="gatewayDomain"
+          matInput
+          placeholder="Gateway Domain"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="location" class="form-label">Location</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="location"
+          formControlName="location"
+          matInput
+          placeholder="Location"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="deviceGroupSource" class="form-label">Device Group *</label>
+      <mat-radio-group formControlName="deviceGroupSource" id="deviceGroupSource">
+        <mat-radio-button value="new">New</mat-radio-button>
+        <mat-radio-button value="created">Created</mat-radio-button>
+      </mat-radio-group>
+    </div>
+    @if (deviceForm.get('deviceGroupSource')?.value === 'created') {
+      <div class="form-field-wrapper">
+        <label for="groupName" class="form-label">Device Type</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select formControlName="groupName">
+            @for (type of data?.groups; track type) {
+              <mat-option [value]="type">{{ type }}</mat-option>
+            }
+          </mat-select>
+          @if (deviceForm.get('groupName')?.invalid && deviceForm.get('groupName')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('groupName')?.errors?.['required']) {
+                Group name is required.
+              } @else {
+                Invalid group name format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    } @else {
+      <div class="form-field-wrapper">
+        <label for="groupName" class="form-label">Group Name</label>
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <input id="groupName" formControlName="groupName" matInput placeholder="Group Name" type="text"/>
+          @if (deviceForm.get('groupName')?.invalid && deviceForm.get('groupName')?.touched) {
+            <mat-error>
+              @if (deviceForm.get('groupName')?.errors?.['required']) {
+                Group name is required.
+              } @else {
+                Invalid group name format.
+              }
+            </mat-error>
+          }
+        </mat-form-field>
+      </div>
+    }
+    <div class="form-field-wrapper">
+      <label for="enableLog" class="form-label">Enable Log</label>
+      <mat-slide-toggle formControlName="enableLog"></mat-slide-toggle>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="backupConfiguration" class="form-label">Backup Configuration</label>
+      <mat-slide-toggle formControlName="backupConfiguration"></mat-slide-toggle>
+    </div>
+  </form>
+</mat-dialog-content>
+
+<mat-dialog-actions>
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Cancel
+  </button>
+  <button
+    mat-raised-button
+    color="primary"
+    (click)="onSubmit()">
+    Submit
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices-build-info.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices-build-info.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices-build-info.html	(working copy)
@@ -0,0 +1,49 @@
+<h2 mat-dialog-title>Device Build Info</h2>
+
+<mat-dialog-content>
+  <div class="table-container">
+    <!--    <mat-form-field appearance="outline">-->
+    <!--      <mat-label>Search Device</mat-label>-->
+    <!--      <input matInput (keyup)="applyFilter($event)" placeholder="Ex. Array" #input>-->
+    <!--    </mat-form-field>-->
+
+    <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+      <ng-container matColumnDef="serial">
+        <th mat-header-cell *matHeaderCellDef> No.</th>
+        <td mat-cell *matCellDef="let element; let i = index;"> {{ i + 1 }}</td>
+      </ng-container>
+      <ng-container matColumnDef="deviceName">
+        <th mat-header-cell *matHeaderCellDef> Device Name</th>
+        <td mat-cell *matCellDef="let element"> {{ element[0] }}</td>
+      </ng-container>
+      <ng-container matColumnDef="currentBuild">
+        <th mat-header-cell *matHeaderCellDef> Current Build</th>
+        <td mat-cell *matCellDef="let element"> {{ element[1] }}</td>
+      </ng-container>
+      <ng-container matColumnDef="availableBuild">
+        <th mat-header-cell *matHeaderCellDef> Available Build</th>
+        <td mat-cell *matCellDef="let element">
+          @if (element[2]) {
+            <span>{{ element[2] }}</span>
+          } @else {
+            -
+          }
+        </td>
+      </ng-container>
+      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
+      <tr class="mat-row" *matNoDataRow>
+        <td class="mat-cell" colspan="4">No data matching the filter."</td>
+      </tr>
+    </table>
+  </div>
+</mat-dialog-content>
+
+<mat-dialog-actions align="center">
+  <button
+    mat-button
+    color="basic"
+    (click)="onCancel()">
+    Cancel
+  </button>
+</mat-dialog-actions>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.html	(working copy)
@@ -0,0 +1,72 @@
+<mat-card class="page-card" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>Managed Devices</mat-card-title>
+    <div class="page-header-button-container">
+      <button mat-raised-button (click)="addDevice()">Add</button> &nbsp;&nbsp;
+      <button mat-raised-button (click)="getDeviceBuildInfo()">Check Build Info</button>
+    </div>
+  </mat-card-header>
+</mat-card>
+<div class="table-container">
+  <mat-form-field appearance="outline">
+    <mat-label>Search Device</mat-label>
+    <input matInput (keyup)="applyFilter($event)" placeholder="Ex. Array" #input>
+  </mat-form-field>
+
+  <table mat-table [dataSource]="dataSource" class="mat-elevation-z1">
+    <ng-container matColumnDef="serial">
+      <th mat-header-cell *matHeaderCellDef> No.</th>
+      <td mat-cell *matCellDef="let element; let i = index;"> {{ i + 1 }}</td>
+    </ng-container>
+    <ng-container matColumnDef="deviceName">
+      <th mat-header-cell *matHeaderCellDef> Device Name</th>
+      <td mat-cell *matCellDef="let element"> {{ element.name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="groupName">
+      <th mat-header-cell *matHeaderCellDef> Group Name</th>
+      <td mat-cell *matCellDef="let element"> {{ element.device_group }}</td>
+    </ng-container>
+    <ng-container matColumnDef="type">
+      <th mat-header-cell *matHeaderCellDef> Type</th>
+      <td mat-cell *matCellDef="let element"> {{ element.type }}</td>
+    </ng-container>
+    <ng-container matColumnDef="model">
+      <th mat-header-cell *matHeaderCellDef> Model</th>
+      <td mat-cell *matCellDef="let element"> {{ element.model }}</td>
+    </ng-container>
+    <ng-container matColumnDef="deviceIp">
+      <th mat-header-cell *matHeaderCellDef> Device IP</th>
+      <td mat-cell *matCellDef="let element"> {{ element.ip }}</td>
+    </ng-container>
+    <ng-container matColumnDef="protocol">
+      <th mat-header-cell *matHeaderCellDef> Protocol</th>
+      <td mat-cell *matCellDef="let element"> {{ element.protocol | uppercase }}</td>
+    </ng-container>
+    <ng-container matColumnDef="status">
+      <th mat-header-cell *matHeaderCellDef class="action-header"> Status</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          @if (element.connection) {
+            <fa-icon [icon]="['far', 'check-circle']" class="success-icon"></fa-icon>
+          } @else {
+            <fa-icon [icon]="['far', 'trash-can']" class="delete-icon"></fa-icon>
+          }
+        </div>
+      </td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef class="action-header w-10"> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          <fa-icon [icon]="['far', 'trash-can']" class="delete-icon"
+                   (click)="confirmDelete(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
+    <tr class="mat-row" *matNoDataRow>
+      <td class="mat-cell" colspan="4">No data matching the filter "{{ input.value }}"</td>
+    </tr>
+  </table>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.scss	(working copy)
@@ -0,0 +1,51 @@
+/* Structure */
+table {
+  width: 100%;
+}
+
+.mat-mdc-form-field {
+  font-size: 14px;
+  width: 100%;
+}
+
+mat-icon {
+  vertical-align: middle; /* Align icon with text baseline */
+}
+
+.page-card {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
+
+.action-header {
+  text-align: center;
+}
+
+.w-10 {
+  width: 10%;
+}
+
+.row-action {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-right: 12px;
+  gap: 8px;
+}
+
+.a-link {
+  cursor: pointer;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Devices } from './devices';
+
+describe('Devices', () => {
+  let component: Devices;
+  let fixture: ComponentFixture<Devices>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Devices]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Devices);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/devices/devices.ts	(working copy)
@@ -0,0 +1,355 @@
+import {Component, inject, OnInit} from '@angular/core';
+import {MatTableDataSource} from '@angular/material/table';
+import {NotificationService} from '../../../services/notification';
+import {DeviceService} from '../../../services/device-service';
+import {Confirmation} from '../../../services/confirmation';
+import {take} from 'rxjs/operators';
+import {SharedModule} from '../../../shared/shared-module';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {Storage} from '../../../services/storage';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {CustomValidators} from '../../../utils/custom-validators';
+
+@Component({
+  selector: 'app-devices', imports: [SharedModule], templateUrl: './devices.html', styleUrl: './devices.scss'
+})
+export class Devices {
+
+  devices: any[] = [];
+  groups: any[] = [];
+  displayedColumns: string[] = ['serial', 'deviceName', 'groupName', 'type', 'model', 'deviceIp', 'protocol', 'status', 'action'];
+  dataSource = new MatTableDataSource(this.devices);
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+  deviceType: any = null;
+
+  constructor(
+    private notification: NotificationService,
+    private deviceService: DeviceService,
+    private confirmationService: Confirmation,
+    private storage: Storage
+  ) {
+    this.deviceType = this.storage.getItem('deviceType');
+    this.getDeviceGroups();
+    if (this.deviceType === null) {
+      this.getDevicesType();
+    }
+  }
+
+  getDevicesType() {
+    this.deviceService.getDeviceTypeList().pipe(take(1)).subscribe({
+      next: result => {
+        this.storage.setItem('deviceType', JSON.stringify(result));
+      },
+      error: error => {
+        this.notification.showError(`Error: ${error?.message}`);
+      }
+    })
+  }
+
+  getDeviceGroups(): void {
+    this.devices = [];
+    // ToDo: Update with actual RoleId
+    let roleId = "0"
+    let rawPayload = new FormData();
+    rawPayload.set('action', 'FilterRoleDeviceGroups');
+    rawPayload.set('options', JSON.stringify({"role_id": roleId}));
+    this.deviceService.getDeviceGroups(rawPayload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[1] && 'result' in result[1]) {
+              let groups = result[1].result;
+              groups.forEach((group: any) => {
+                this.groups.push(group?.group_name);
+                group?.device_list.forEach((device: any) => {
+                  this.devices.push(device);
+                })
+              })
+              this.dataSource = new MatTableDataSource(this.devices);
+            }
+          }
+        }, error: (error: { message: string; }) => {
+          console.log(error);
+          this.notification.showError(error.message);
+        }
+      })
+  }
+
+  applyFilter(event: Event) {
+    const filterValue = (event.target as HTMLInputElement).value;
+    this.dataSource.filter = filterValue.trim().toLowerCase();
+  }
+
+  getDeviceBuildInfo() {
+    this.dialogConfig.position = {
+      bottom: '0px', right: '0px',
+    }
+    this.dialogConfig.width = '40%';
+    this.dialogConfig.height = '60%';
+    const dialogRef = this.dialog.open(DevicesBuildInfoDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(result => {
+    })
+  }
+
+  confirmDelete(device: any): void {
+    let deviceName = device?.name;
+    let confirmMsg = `Are you sure you want to permanently delete "${deviceName}"? This action cannot be undone.`
+    this.confirmationService.openConfirmDialog({
+      title: `Delete ${deviceName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        let rawPayload = new FormData();
+        rawPayload.set('pk', JSON.stringify({
+          "name": deviceName,
+          "id": device?.id,
+          "type": device?.type,
+        }));
+        this.deviceService.deleteDevice(rawPayload)
+          .pipe(take(1))
+          .subscribe({
+            next: (result: any) => {
+              // ToDo: Backend fix required.
+              if (result && result.length > 1) {
+                if (!result[0]) {
+                  this.notification.showError(`${result[1]}`);
+                } else {
+                  this.notification.showSuccess(`${deviceName} deleted successfully!`);
+                  this.getDeviceGroups();
+                }
+              }
+            },
+            error: (err) => {
+              if (err.status === 200) {
+                // ToDo: Backend fix required.
+                this.notification.showSuccess(`${deviceName} deleted successfully!`);
+                this.getDeviceGroups();
+              } else {
+                this.notification.showError('Deletion Failed.');
+              }
+            }
+          })
+      } else {
+        this.notification.showSuccess('Deletion cancelled.');
+      }
+    });
+  }
+
+  addDevice() {
+    this.dialogConfig.position = {
+      bottom: '0px', right: '0px',
+    }
+    this.dialogConfig.width = '65%';
+    this.dialogConfig.height = '80%';
+    this.dialogConfig.data = {
+      deviceType: JSON.parse(this.deviceType)?.DEVICE_STD_LIST,
+      groups: this.groups,
+    };
+    const dialogRef = this.dialog.open(AddDeviceDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getDeviceGroups();
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'devices-build-info', templateUrl: './devices-build-info.html', imports: [SharedModule],
+})
+export class DevicesBuildInfoDialog implements OnInit {
+  readonly dialogRef = inject(MatDialogRef<DevicesBuildInfoDialog>);
+
+  buildInfo: any[] = [];
+  displayedColumns: string[] = ['serial', 'deviceName', 'currentBuild', 'availableBuild'];
+  dataSource = new MatTableDataSource(this.buildInfo);
+
+  constructor(private deviceService: DeviceService, private notification: NotificationService) {
+  }
+
+  ngOnInit() {
+    this.getDeviceBuildInfo()
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+
+  getDeviceBuildInfo(): void {
+    this.deviceService.getDeviceBuildInfo()
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 0) {
+            this.buildInfo = result;
+            this.dataSource = new MatTableDataSource(this.buildInfo);
+          }
+        }, error: (error: { message: string; }) => {
+          this.notification.showError(error.message);
+        }
+      })
+  }
+}
+
+@Component({
+  selector: 'add-device',
+  templateUrl: './add-device.html',
+  imports: [SharedModule]
+})
+export class AddDeviceDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<AddDeviceDialog>);
+  deviceForm: FormGroup;
+
+  constructor(
+    private formBuilder: FormBuilder,
+    private deviceService: DeviceService,
+    private notification: NotificationService,
+  ) {
+    this.deviceForm = this.formBuilder.group({
+      deviceName: ['', Validators.required],
+      deviceType: ['', Validators.required],
+      ipAddressType: ['v4', Validators.required],
+      ipAddress: ['', Validators.required],
+      protocol: ['restapi', Validators.required],
+      portNumber: ['9997', [Validators.required, Validators.min(0), Validators.max(65535)]],
+      apiUsername: ['', Validators.required],
+      apiPassword: ['', Validators.required],
+      gatewayDomain: ['',],
+      location: ['',],
+      webuiUsername: ['', Validators.required],
+      webuiPassword: ['', Validators.required],
+      webuiPortNumber: ['8888', Validators.required],
+      deviceGroupSource: ['new', Validators.required],
+      groupName: ['', Validators.required],
+      enablePassword: [''],
+      enableLog: [true],
+      backupConfiguration: [false]
+    });
+
+    this.deviceForm.get('ipAddressType')?.valueChanges.subscribe(ipType => {
+      const ipAddressControl = this.deviceForm.get('ipAddress');
+      if (ipAddressControl) {
+        ipAddressControl.clearValidators();
+        const currentValidators = [Validators.required]; // ipAddress is always required
+
+        if (ipType === 'v4') {
+          currentValidators.push(CustomValidators.ipv4());
+          ipAddressControl.setValidators(currentValidators);
+        } else if (ipType === 'v6') {
+          currentValidators.push(CustomValidators.ipv6());
+          ipAddressControl.setValidators(currentValidators);
+        }
+        ipAddressControl.updateValueAndValidity();
+      }
+    });
+
+    this.deviceForm.get('deviceType')?.valueChanges.subscribe(deviceType => {
+      const webuiUsernameControl = this.deviceForm.get('webuiUsername');
+      const webuiPasswordControl = this.deviceForm.get('webuiPassword');
+
+      if (webuiUsernameControl && webuiPasswordControl) {
+        if (deviceType === 'AG' || deviceType === 'vxAG') {
+          // Make them optional
+          webuiUsernameControl.clearValidators();
+          webuiPasswordControl.clearValidators();
+        } else {
+          // Make them required for other device types
+          webuiUsernameControl.setValidators(Validators.required);
+          webuiPasswordControl.setValidators(Validators.required);
+        }
+        // Crucially, update validity after changing validators
+        webuiUsernameControl.updateValueAndValidity();
+        webuiPasswordControl.updateValueAndValidity();
+      }
+    });
+  }
+
+  ngOnInit(): void {
+    this.deviceForm.get('ipAddress')?.updateValueAndValidity();
+    const initialDeviceType = this.deviceForm.get('deviceType')?.value;
+    const webuiUsernameControl = this.deviceForm.get('webuiUsername');
+    const webuiPasswordControl = this.deviceForm.get('webuiPassword');
+
+    if (webuiUsernameControl && webuiPasswordControl) {
+      if (initialDeviceType === 'AG' || initialDeviceType === 'vAG') {
+        webuiUsernameControl.clearValidators();
+        webuiPasswordControl.clearValidators();
+      } else {
+        webuiUsernameControl.setValidators(Validators.required);
+        webuiPasswordControl.setValidators(Validators.required);
+      }
+      webuiUsernameControl.updateValueAndValidity();
+      webuiPasswordControl.updateValueAndValidity();
+    }
+  }
+
+  onSubmit() {
+    let payload: any = {
+      name: this.deviceForm.value.deviceName,
+      type: this.deviceForm.value.deviceType,
+      protocol: this.deviceForm.value.protocol,
+      restapi_port: this.deviceForm.value.portNumber,
+      restapi_account: {
+        restapi_username: this.deviceForm.value.apiUsername,
+        restapi_password: this.deviceForm.value.apiPassword,
+      },
+      firewall_ip: {},
+      intranet_ip: {},
+      console_account: {
+        console_username: this.deviceForm.value.webuiUsername,
+        console_password: this.deviceForm.value.webuiPassword,
+      },
+      group_name_from: this.deviceForm.value.deviceGroupSource,
+      device_group: [{
+        name: this.deviceForm.value.groupName
+      }],
+      webui_port: this.deviceForm.value.webuiPortNumber,
+      log_enable: this.deviceForm.value.enableLog,
+      backup_enable: this.deviceForm.value.backupConfiguration,
+    }
+    if (this.deviceForm.value.ipAddressType === 'v4') {
+      payload["ip"] = {
+        ipv4: this.deviceForm.value.ipAddress,
+      }
+    }
+
+    if (this.deviceForm.invalid) {
+      console.log(this.deviceForm.value);
+      this.deviceForm.markAllAsTouched();
+      return;
+    }
+
+    let rawPayload = new FormData();
+    rawPayload.set('post_data', JSON.stringify(payload));
+    this.deviceService.addDevice(rawPayload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          if (result && result.length > 1) {
+            if (result[0]) {
+              this.notification.showSuccess(`${payload?.name} added successfully!`);
+              this.dialogRef.close(true);
+            } else {
+              this.notification.showError(`Failed to add device: ${result[1]}`);
+            }
+          }
+        },
+        error: () => {
+          this.notification.showError('Creation Failed.');
+        }
+      })
+
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.html	(working copy)
@@ -0,0 +1 @@
+<p>event-alert works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EventAlert } from './event-alert';
+
+describe('EventAlert', () => {
+  let component: EventAlert;
+  let fixture: ComponentFixture<EventAlert>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [EventAlert]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(EventAlert);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-alert/event-alert.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-event-alert',
+  imports: [],
+  templateUrl: './event-alert.html',
+  styleUrl: './event-alert.scss'
+})
+export class EventAlert {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>event-monitoring-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EventMonitoringOverview } from './event-monitoring-overview';
+
+describe('EventMonitoringOverview', () => {
+  let component: EventMonitoringOverview;
+  let fixture: ComponentFixture<EventMonitoringOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [EventMonitoringOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(EventMonitoringOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/event-monitoring-overview/event-monitoring-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-event-monitoring-overview',
+  imports: [],
+  templateUrl: './event-monitoring-overview.html',
+  styleUrl: './event-monitoring-overview.scss'
+})
+export class EventMonitoringOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.html	(working copy)
@@ -0,0 +1 @@
+<p>host works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Host } from './host';
+
+describe('Host', () => {
+  let component: Host;
+  let fixture: ComponentFixture<Host>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Host]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Host);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/host/host.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-host',
+  imports: [],
+  templateUrl: './host.html',
+  styleUrl: './host.scss'
+})
+export class Host {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.html	(working copy)
@@ -0,0 +1 @@
+<p>initiative-alerts works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { InitiativeAlerts } from './initiative-alerts';
+
+describe('InitiativeAlerts', () => {
+  let component: InitiativeAlerts;
+  let fixture: ComponentFixture<InitiativeAlerts>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [InitiativeAlerts]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(InitiativeAlerts);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/initiative-alerts/initiative-alerts.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-initiative-alerts',
+  imports: [],
+  templateUrl: './initiative-alerts.html',
+  styleUrl: './initiative-alerts.scss'
+})
+export class InitiativeAlerts {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.html	(working copy)
@@ -0,0 +1 @@
+<p>license works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { License } from './license';
+
+describe('License', () => {
+  let component: License;
+  let fixture: ComponentFixture<License>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [License]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(License);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/license/license.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-license',
+  imports: [],
+  templateUrl: './license.html',
+  styleUrl: './license.scss'
+})
+export class License {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>log-analysis-slb-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LogAnalysisSlbOverview } from './log-analysis-slb-overview';
+
+describe('LogAnalysisSlbOverview', () => {
+  let component: LogAnalysisSlbOverview;
+  let fixture: ComponentFixture<LogAnalysisSlbOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [LogAnalysisSlbOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(LogAnalysisSlbOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-slb-overview/log-analysis-slb-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-log-analysis-slb-overview',
+  imports: [],
+  templateUrl: './log-analysis-slb-overview.html',
+  styleUrl: './log-analysis-slb-overview.scss'
+})
+export class LogAnalysisSlbOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>log-analysis-ssl-vpn-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LogAnalysisSslVpnOverview } from './log-analysis-ssl-vpn-overview';
+
+describe('LogAnalysisSslVpnOverview', () => {
+  let component: LogAnalysisSslVpnOverview;
+  let fixture: ComponentFixture<LogAnalysisSslVpnOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [LogAnalysisSslVpnOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(LogAnalysisSslVpnOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-analysis-ssl-vpn-overview/log-analysis-ssl-vpn-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-log-analysis-ssl-vpn-overview',
+  imports: [],
+  templateUrl: './log-analysis-ssl-vpn-overview.html',
+  styleUrl: './log-analysis-ssl-vpn-overview.scss'
+})
+export class LogAnalysisSslVpnOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.html	(working copy)
@@ -0,0 +1 @@
+<p>log-settings works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LogSettings } from './log-settings';
+
+describe('LogSettings', () => {
+  let component: LogSettings;
+  let fixture: ComponentFixture<LogSettings>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [LogSettings]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(LogSettings);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/log-settings/log-settings.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-log-settings',
+  imports: [],
+  templateUrl: './log-settings.html',
+  styleUrl: './log-settings.scss'
+})
+export class LogSettings {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.html	(working copy)
@@ -0,0 +1 @@
+<p>network works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Network } from './network';
+
+describe('Network', () => {
+  let component: Network;
+  let fixture: ComponentFixture<Network>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Network]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Network);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/network/network.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-network',
+  imports: [],
+  templateUrl: './network.html',
+  styleUrl: './network.scss'
+})
+export class Network {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.html	(working copy)
@@ -0,0 +1 @@
+<p>notification-channels works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NotificationChannels } from './notification-channels';
+
+describe('NotificationChannels', () => {
+  let component: NotificationChannels;
+  let fixture: ComponentFixture<NotificationChannels>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [NotificationChannels]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(NotificationChannels);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-channels/notification-channels.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-notification-channels',
+  imports: [],
+  templateUrl: './notification-channels.html',
+  styleUrl: './notification-channels.scss'
+})
+export class NotificationChannels {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.html	(working copy)
@@ -0,0 +1 @@
+<p>notification-settings works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NotificationSettings } from './notification-settings';
+
+describe('NotificationSettings', () => {
+  let component: NotificationSettings;
+  let fixture: ComponentFixture<NotificationSettings>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [NotificationSettings]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(NotificationSettings);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/notification-settings/notification-settings.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-notification-settings',
+  imports: [],
+  templateUrl: './notification-settings.html',
+  styleUrl: './notification-settings.scss'
+})
+export class NotificationSettings {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.html	(working copy)
@@ -0,0 +1 @@
+<p>operation-logs works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { OperationLogs } from './operation-logs';
+
+describe('OperationLogs', () => {
+  let component: OperationLogs;
+  let fixture: ComponentFixture<OperationLogs>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [OperationLogs]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(OperationLogs);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/operation-logs/operation-logs.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-operation-logs',
+  imports: [],
+  templateUrl: './operation-logs.html',
+  styleUrl: './operation-logs.scss'
+})
+export class OperationLogs {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html	(working copy)
@@ -0,0 +1 @@
+<p>report-tasks works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ReportTasks } from './report-tasks';
+
+describe('ReportTasks', () => {
+  let component: ReportTasks;
+  let fixture: ComponentFixture<ReportTasks>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ReportTasks]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ReportTasks);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-report-tasks',
+  imports: [],
+  templateUrl: './report-tasks.html',
+  styleUrl: './report-tasks.scss'
+})
+export class ReportTasks {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html	(working copy)
@@ -0,0 +1 @@
+<p>reports-customization works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ReportsCustomization } from './reports-customization';
+
+describe('ReportsCustomization', () => {
+  let component: ReportsCustomization;
+  let fixture: ComponentFixture<ReportsCustomization>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ReportsCustomization]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ReportsCustomization);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-reports-customization',
+  imports: [],
+  templateUrl: './reports-customization.html',
+  styleUrl: './reports-customization.scss'
+})
+export class ReportsCustomization {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>reports-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ReportsOverview } from './reports-overview';
+
+describe('ReportsOverview', () => {
+  let component: ReportsOverview;
+  let fixture: ComponentFixture<ReportsOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ReportsOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ReportsOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-reports-overview',
+  imports: [],
+  templateUrl: './reports-overview.html',
+  styleUrl: './reports-overview.scss'
+})
+export class ReportsOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.html	(working copy)
@@ -0,0 +1 @@
+<p>resource-monitoring-devices works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResourceMonitoringDevices } from './resource-monitoring-devices';
+
+describe('ResourceMonitoringDevices', () => {
+  let component: ResourceMonitoringDevices;
+  let fixture: ComponentFixture<ResourceMonitoringDevices>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ResourceMonitoringDevices]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ResourceMonitoringDevices);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-devices/resource-monitoring-devices.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-resource-monitoring-devices',
+  imports: [],
+  templateUrl: './resource-monitoring-devices.html',
+  styleUrl: './resource-monitoring-devices.scss'
+})
+export class ResourceMonitoringDevices {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.html	(working copy)
@@ -0,0 +1 @@
+<p>resource-monitoring-llb works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResourceMonitoringLlb } from './resource-monitoring-llb';
+
+describe('ResourceMonitoringLlb', () => {
+  let component: ResourceMonitoringLlb;
+  let fixture: ComponentFixture<ResourceMonitoringLlb>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ResourceMonitoringLlb]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ResourceMonitoringLlb);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-llb/resource-monitoring-llb.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-resource-monitoring-llb',
+  imports: [],
+  templateUrl: './resource-monitoring-llb.html',
+  styleUrl: './resource-monitoring-llb.scss'
+})
+export class ResourceMonitoringLlb {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.html	(working copy)
@@ -0,0 +1 @@
+<p>resource-monitoring-slb works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResourceMonitoringSlb } from './resource-monitoring-slb';
+
+describe('ResourceMonitoringSlb', () => {
+  let component: ResourceMonitoringSlb;
+  let fixture: ComponentFixture<ResourceMonitoringSlb>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ResourceMonitoringSlb]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ResourceMonitoringSlb);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-slb/resource-monitoring-slb.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-resource-monitoring-slb',
+  imports: [],
+  templateUrl: './resource-monitoring-slb.html',
+  styleUrl: './resource-monitoring-slb.scss'
+})
+export class ResourceMonitoringSlb {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.html	(working copy)
@@ -0,0 +1 @@
+<p>resource-monitoring-ssl-vpn works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResourceMonitoringSslVpn } from './resource-monitoring-ssl-vpn';
+
+describe('ResourceMonitoringSslVpn', () => {
+  let component: ResourceMonitoringSslVpn;
+  let fixture: ComponentFixture<ResourceMonitoringSslVpn>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ResourceMonitoringSslVpn]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ResourceMonitoringSslVpn);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/resource-monitoring-ssl-vpn/resource-monitoring-ssl-vpn.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-resource-monitoring-ssl-vpn',
+  imports: [],
+  templateUrl: './resource-monitoring-ssl-vpn.html',
+  styleUrl: './resource-monitoring-ssl-vpn.scss'
+})
+export class ResourceMonitoringSslVpn {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.html	(working copy)
@@ -0,0 +1 @@
+<p>role-management works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { RoleManagement } from './role-management';
+
+describe('RoleManagement', () => {
+  let component: RoleManagement;
+  let fixture: ComponentFixture<RoleManagement>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [RoleManagement]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(RoleManagement);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/role-management/role-management.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-role-management',
+  imports: [],
+  templateUrl: './role-management.html',
+  styleUrl: './role-management.scss'
+})
+export class RoleManagement {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>slb-real-service-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SlbRealServiceOverview } from './slb-real-service-overview';
+
+describe('SlbRealServiceOverview', () => {
+  let component: SlbRealServiceOverview;
+  let fixture: ComponentFixture<SlbRealServiceOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SlbRealServiceOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SlbRealServiceOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-real-service-overview/slb-real-service-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-slb-real-service-overview',
+  imports: [],
+  templateUrl: './slb-real-service-overview.html',
+  styleUrl: './slb-real-service-overview.scss'
+})
+export class SlbRealServiceOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.html	(working copy)
@@ -0,0 +1 @@
+<p>slb-topology works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SlbTopology } from './slb-topology';
+
+describe('SlbTopology', () => {
+  let component: SlbTopology;
+  let fixture: ComponentFixture<SlbTopology>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SlbTopology]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SlbTopology);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/slb-topology/slb-topology.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-slb-topology',
+  imports: [],
+  templateUrl: './slb-topology.html',
+  styleUrl: './slb-topology.scss'
+})
+export class SlbTopology {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>storage-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { StorageOverview } from './storage-overview';
+
+describe('StorageOverview', () => {
+  let component: StorageOverview;
+  let fixture: ComponentFixture<StorageOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [StorageOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(StorageOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-overview/storage-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-storage-overview',
+  imports: [],
+  templateUrl: './storage-overview.html',
+  styleUrl: './storage-overview.scss'
+})
+export class StorageOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.html	(working copy)
@@ -0,0 +1 @@
+<p>storage-primary works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { StoragePrimary } from './storage-primary';
+
+describe('StoragePrimary', () => {
+  let component: StoragePrimary;
+  let fixture: ComponentFixture<StoragePrimary>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [StoragePrimary]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(StoragePrimary);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-primary/storage-primary.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-storage-primary',
+  imports: [],
+  templateUrl: './storage-primary.html',
+  styleUrl: './storage-primary.scss'
+})
+export class StoragePrimary {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.html	(working copy)
@@ -0,0 +1 @@
+<p>storage-secondary works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { StorageSecondary } from './storage-secondary';
+
+describe('StorageSecondary', () => {
+  let component: StorageSecondary;
+  let fixture: ComponentFixture<StorageSecondary>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [StorageSecondary]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(StorageSecondary);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-storage-secondary',
+  imports: [],
+  templateUrl: './storage-secondary.html',
+  styleUrl: './storage-secondary.scss'
+})
+export class StorageSecondary {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.html	(working copy)
@@ -0,0 +1 @@
+<p>system-backup works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemBackup } from './system-backup';
+
+describe('SystemBackup', () => {
+  let component: SystemBackup;
+  let fixture: ComponentFixture<SystemBackup>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemBackup]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemBackup);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-backup/system-backup.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-backup',
+  imports: [],
+  templateUrl: './system-backup.html',
+  styleUrl: './system-backup.scss'
+})
+export class SystemBackup {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.html	(working copy)
@@ -0,0 +1 @@
+<p>system-control works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemControl } from './system-control';
+
+describe('SystemControl', () => {
+  let component: SystemControl;
+  let fixture: ComponentFixture<SystemControl>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemControl]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemControl);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-control/system-control.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-control',
+  imports: [],
+  templateUrl: './system-control.html',
+  styleUrl: './system-control.scss'
+})
+export class SystemControl {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.html	(working copy)
@@ -0,0 +1 @@
+<p>system-ha works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemHa } from './system-ha';
+
+describe('SystemHa', () => {
+  let component: SystemHa;
+  let fixture: ComponentFixture<SystemHa>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemHa]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemHa);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ha/system-ha.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-ha',
+  imports: [],
+  templateUrl: './system-ha.html',
+  styleUrl: './system-ha.scss'
+})
+export class SystemHa {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.html	(working copy)
@@ -0,0 +1 @@
+<p>system-ntp works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemNtp } from './system-ntp';
+
+describe('SystemNtp', () => {
+  let component: SystemNtp;
+  let fixture: ComponentFixture<SystemNtp>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemNtp]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemNtp);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-ntp/system-ntp.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-ntp',
+  imports: [],
+  templateUrl: './system-ntp.html',
+  styleUrl: './system-ntp.scss'
+})
+export class SystemNtp {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>system-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemOverview } from './system-overview';
+
+describe('SystemOverview', () => {
+  let component: SystemOverview;
+  let fixture: ComponentFixture<SystemOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-overview/system-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-overview',
+  imports: [],
+  templateUrl: './system-overview.html',
+  styleUrl: './system-overview.scss'
+})
+export class SystemOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.html	(working copy)
@@ -0,0 +1 @@
+<p>system-restore works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemRestore } from './system-restore';
+
+describe('SystemRestore', () => {
+  let component: SystemRestore;
+  let fixture: ComponentFixture<SystemRestore>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemRestore]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemRestore);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-restore/system-restore.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-restore',
+  imports: [],
+  templateUrl: './system-restore.html',
+  styleUrl: './system-restore.scss'
+})
+export class SystemRestore {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.html	(working copy)
@@ -0,0 +1 @@
+<p>system-time works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemTime } from './system-time';
+
+describe('SystemTime', () => {
+  let component: SystemTime;
+  let fixture: ComponentFixture<SystemTime>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemTime]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemTime);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-time/system-time.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-time',
+  imports: [],
+  templateUrl: './system-time.html',
+  styleUrl: './system-time.scss'
+})
+export class SystemTime {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.html	(working copy)
@@ -0,0 +1 @@
+<p>system-update works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { SystemUpdate } from './system-update';
+
+describe('SystemUpdate', () => {
+  let component: SystemUpdate;
+  let fixture: ComponentFixture<SystemUpdate>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [SystemUpdate]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(SystemUpdate);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/system-update/system-update.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-system-update',
+  imports: [],
+  templateUrl: './system-update.html',
+  styleUrl: './system-update.scss'
+})
+export class SystemUpdate {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.html	(working copy)
@@ -0,0 +1 @@
+<p>user-management works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { UserManagement } from './user-management';
+
+describe('UserManagement', () => {
+  let component: UserManagement;
+  let fixture: ComponentFixture<UserManagement>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [UserManagement]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(UserManagement);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/user-management/user-management.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-user-management',
+  imports: [],
+  templateUrl: './user-management.html',
+  styleUrl: './user-management.scss'
+})
+export class UserManagement {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>volume-license-devices-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { VolumeLicenseDevicesOverview } from './volume-license-devices-overview';
+
+describe('VolumeLicenseDevicesOverview', () => {
+  let component: VolumeLicenseDevicesOverview;
+  let fixture: ComponentFixture<VolumeLicenseDevicesOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [VolumeLicenseDevicesOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(VolumeLicenseDevicesOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-devices-overview/volume-license-devices-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-volume-license-devices-overview',
+  imports: [],
+  templateUrl: './volume-license-devices-overview.html',
+  styleUrl: './volume-license-devices-overview.scss'
+})
+export class VolumeLicenseDevicesOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.html	(working copy)
@@ -0,0 +1 @@
+<p>volume-license-overview works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { VolumeLicenseOverview } from './volume-license-overview';
+
+describe('VolumeLicenseOverview', () => {
+  let component: VolumeLicenseOverview;
+  let fixture: ComponentFixture<VolumeLicenseOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [VolumeLicenseOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(VolumeLicenseOverview);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/volume-license-overview/volume-license-overview.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-volume-license-overview',
+  imports: [],
+  templateUrl: './volume-license-overview.html',
+  styleUrl: './volume-license-overview.scss'
+})
+export class VolumeLicenseOverview {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.html	(working copy)
@@ -0,0 +1 @@
+<p>webui-ssl works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { WebuiSsl } from './webui-ssl';
+
+describe('WebuiSsl', () => {
+  let component: WebuiSsl;
+  let fixture: ComponentFixture<WebuiSsl>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [WebuiSsl]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(WebuiSsl);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui-ssl/webui-ssl.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-webui-ssl',
+  imports: [],
+  templateUrl: './webui-ssl.html',
+  styleUrl: './webui-ssl.scss'
+})
+export class WebuiSsl {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.html	(working copy)
@@ -0,0 +1 @@
+<p>webui works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Webui } from './webui';
+
+describe('Webui', () => {
+  let component: Webui;
+  let fixture: ComponentFixture<Webui>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Webui]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Webui);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/webui/webui.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-webui',
+  imports: [],
+  templateUrl: './webui.html',
+  styleUrl: './webui.scss'
+})
+export class Webui {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.html	(working copy)
@@ -0,0 +1 @@
+<p>tasks works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Tasks } from './tasks';
+
+describe('Tasks', () => {
+  let component: Tasks;
+  let fixture: ComponentFixture<Tasks>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Tasks]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Tasks);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/tasks/tasks.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-tasks',
+  imports: [],
+  templateUrl: './tasks.html',
+  styleUrl: './tasks.scss'
+})
+export class Tasks {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.html	(working copy)
@@ -0,0 +1 @@
+<p>topology works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Topology } from './topology';
+
+describe('Topology', () => {
+  let component: Topology;
+  let fixture: ComponentFixture<Topology>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Topology]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Topology);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/topology/topology.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-topology',
+  imports: [],
+  templateUrl: './topology.html',
+  styleUrl: './topology.scss'
+})
+export class Topology {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.html	(working copy)
@@ -0,0 +1 @@
+<p>upgrade-centre works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { UpgradeCentre } from './upgrade-centre';
+
+describe('UpgradeCentre', () => {
+  let component: UpgradeCentre;
+  let fixture: ComponentFixture<UpgradeCentre>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [UpgradeCentre]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(UpgradeCentre);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/upgrade-centre/upgrade-centre.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-upgrade-centre',
+  imports: [],
+  templateUrl: './upgrade-centre.html',
+  styleUrl: './upgrade-centre.scss'
+})
+export class UpgradeCentre {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.html	(working copy)
@@ -0,0 +1 @@
+<p>volume-license works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { VolumeLicense } from './volume-license';
+
+describe('VolumeLicense', () => {
+  let component: VolumeLicense;
+  let fixture: ComponentFixture<VolumeLicense>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [VolumeLicense]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(VolumeLicense);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/volume-license/volume-license.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-volume-license',
+  imports: [],
+  templateUrl: './volume-license.html',
+  styleUrl: './volume-license.scss'
+})
+export class VolumeLicense {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.html	(working copy)
@@ -0,0 +1 @@
+<p>vpn-management works!</p>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.scss	(added)
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.scss	(revision 0)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.scss	(revision 0)
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { VpnManagement } from './vpn-management';
+
+describe('VpnManagement', () => {
+  let component: VpnManagement;
+  let fixture: ComponentFixture<VpnManagement>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [VpnManagement]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(VpnManagement);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/vpn-management/vpn-management.ts	(working copy)
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-vpn-management',
+  imports: [],
+  templateUrl: './vpn-management.html',
+  styleUrl: './vpn-management.scss'
+})
+export class VpnManagement {
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(working copy)
@@ -0,0 +1,12 @@
+const PREFIX = '/api';
+
+export const URLS = {
+  LOGIN_URL: `${PREFIX}/login_app`,
+  GET_DEVICE_GROUPS_URL: `${PREFIX}/api/cm/device_mgmt/device_group/RoleDeviceGroup/_perform`,
+  ADD_DEVICE_GROUP_URL: `${PREFIX}/api/cm/device_mgmt/device_group/DeviceGroup/_add`,
+  DELETE_DEVICE_GROUPS_URL: `${PREFIX}/api/cm/device_mgmt/device_group/DeviceGroup/_delete`,
+  CHECK_DEVICE_BUILD_INFO_URL: `${PREFIX}/cm/check_build_info`,
+  GET_DEVICE_TYPE_URL: `${PREFIX}/cm/get_device_type`,
+  ADD_DEVICE_URL: `${PREFIX}/api/cm/device_mgmt/device/Device/_add`,
+  DELETE_DEVICE_URL: `${PREFIX}/api/cm/device_mgmt/device/Device/_delete`
+} as const; // Makes properties readonly
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-context.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-context.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-context.ts	(working copy)
@@ -0,0 +1,3 @@
+import { HttpContextToken } from '@angular/common/http';
+
+export const CSRF_REQUIRED = new HttpContextToken<boolean>(() => false);
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.spec.ts	(working copy)
@@ -0,0 +1,17 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpInterceptorFn } from '@angular/common/http';
+
+import { csrfInterceptor } from './csrf-interceptor';
+
+describe('csrfInterceptor', () => {
+  const interceptor: HttpInterceptorFn = (req, next) => 
+    TestBed.runInInjectionContext(() => csrfInterceptor(req, next));
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+  });
+
+  it('should be created', () => {
+    expect(interceptor).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/csrf-interceptor.ts	(working copy)
@@ -0,0 +1,53 @@
+import {
+  HttpContextToken,
+  HttpInterceptorFn,
+  HttpRequest
+} from '@angular/common/http';
+import { inject } from '@angular/core';
+import { NotificationService } from '../services/notification';
+
+export const ADD_CSRF_TO_PAYLOAD = new HttpContextToken<boolean>(() => false);
+export const ADD_CSRF_TO_FORMDATA = new HttpContextToken<boolean>(() => false);
+
+export const csrfInterceptorFn: HttpInterceptorFn = (req, next) => {
+  const notificationService = inject(NotificationService);
+  const csrfToken = document.cookie
+    .split('; ')
+    .find(row => row.startsWith('csrftoken='))?.split('=')[1] || null;
+
+  if (req.url.includes('/login_app')){
+    return next(req);
+  }
+
+  // ToDo: Fix it with CSRF support
+  if (!csrfToken) {
+    // notificationService.showError('CSRF token not found');
+    return next(req);
+  }
+
+  const shouldAddHeader = req.context.get(ADD_CSRF_TO_PAYLOAD);
+  const shouldInjectToFormData = req.context.get(ADD_CSRF_TO_FORMDATA);
+
+  let clonedRequest: HttpRequest<any> = req;
+
+  if (shouldInjectToFormData && req.body instanceof FormData) {
+    const newFormData = new URLSearchParams();
+    for (const pair of newFormData.entries()) {
+      newFormData.set(pair[0], pair[1]);
+    }
+    newFormData.append('csrfmiddlewaretoken', csrfToken);
+
+    clonedRequest = clonedRequest.clone({
+      body: newFormData,
+      setHeaders: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}
+    });
+  }
+
+  if (shouldAddHeader) {
+    clonedRequest = clonedRequest.clone({
+      setHeaders: { 'X-CSRFToken': csrfToken }
+    });
+  }
+
+  return next(clonedRequest);
+};
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.spec.ts	(working copy)
@@ -0,0 +1,17 @@
+import { TestBed } from '@angular/core/testing';
+import { HttpInterceptorFn } from '@angular/common/http';
+
+import { loadingInterceptorInterceptor } from './loading-interceptor-interceptor';
+
+describe('loadingInterceptorInterceptor', () => {
+  const interceptor: HttpInterceptorFn = (req, next) => 
+    TestBed.runInInjectionContext(() => loadingInterceptorInterceptor(req, next));
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+  });
+
+  it('should be created', () => {
+    expect(interceptor).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/loading-interceptor-interceptor.ts	(working copy)
@@ -0,0 +1,23 @@
+import {HttpInterceptorFn} from '@angular/common/http';
+import {inject} from '@angular/core';
+import {finalize} from 'rxjs';
+import {Loading} from '../services/loading';
+
+export const loadingInterceptorFn: HttpInterceptorFn = (req, next) => {
+  const loadingService = inject(Loading);
+  let activeRequests = 0;
+
+  if (activeRequests === 0) {
+    loadingService.show();
+  }
+  activeRequests++;
+
+  return next(req).pipe(
+    finalize(() => {
+      activeRequests--;
+      if (activeRequests === 0) {
+        loadingService.hide();
+      }
+    })
+  );
+};
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/models/user.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/models/user.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/models/user.ts	(working copy)
@@ -3,4 +3,10 @@
   username: string;
   roles: string[];
   permissions: string[];
+  error_code?: number;
 }
+
+export interface ErrorResponse {
+  msg: string;
+  error_code: number;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { AlertMsg } from './alert-msg';
+
+describe('AlertMsg', () => {
+  let service: AlertMsg;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(AlertMsg);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/alert-msg.ts	(working copy)
@@ -0,0 +1,28 @@
+import {Injectable} from '@angular/core';
+import {Observable} from 'rxjs';
+import {MatDialog} from '@angular/material/dialog';
+import {AlertMsgDialog, AlertMsgDialogData} from '../components/common/alert-msg-dialog/alert-msg-dialog';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AlertMsg {
+
+  constructor(private dialog: MatDialog) {
+  }
+
+  openAlertMsgDialog(data?: Partial<AlertMsgDialogData>): Observable<boolean> {
+    const dialogRef = this.dialog.open(AlertMsgDialog, {
+      width: '400px',
+      disableClose: true,
+      data: {
+        title: data?.title || 'Alert!',
+        message: data?.message || '',
+        cancelButtonText: data?.cancelButtonText || 'Cancel',
+        cancelButtonColor: data?.cancelButtonColor || 'basic'
+      }
+    });
+
+    return dialogRef.afterClosed();
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/auth.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/auth.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/auth.ts	(working copy)
@@ -1,28 +1,22 @@
 import {Injectable} from '@angular/core';
-import {BehaviorSubject, Observable} from 'rxjs';
+import {BehaviorSubject, catchError, Observable, throwError} from 'rxjs';
 import {Router} from '@angular/router';
 import {Storage} from './storage'
-import {User} from '../models/user';
+import {ErrorResponse, User} from '../models/user';
+import {HttpService} from './http';
+import {map} from 'rxjs/operators';
+import {URLS} from '../constants/api_urls';
 
 @Injectable({
   providedIn: 'root'
 })
 export class Auth {
 
-  private currentUserSubject: BehaviorSubject<User | null>;
   public currentUser: Observable<User | null>;
-
-  constructor(private router: Router, private storage: Storage) {
-    this.currentUserSubject = new BehaviorSubject<User | null>(JSON.parse(storage.getItem('currentUser') || 'null'));
-    this.currentUser = this.currentUserSubject.asObservable();
-  }
-
-  public get currentUserValue(): User | null {
-    return this.currentUserSubject.value;
-  }
-
+  private currentUserSubject: BehaviorSubject<User | null>;
   // ToDo: fetch from API
-  private permissions: string[] = [
+  private _roles: string[] = ['super_admin', 'device_admin', 'common_admin'];
+  private _permissions: string[] = [
     'Dashboard',
     'iDevices',
     'iDeviceGroups',
@@ -52,13 +46,48 @@
     'Observability',
   ]
 
-  login(username: string, password: string): Observable<User> {
-    const user: User = {id: '1', username: 'array', roles: ['device_admin', 'super_admin', 'common_admin'], permissions: this.permissions};
-    this.storage.setItem('currentUser', JSON.stringify(user));
-    this.currentUserSubject.next(user);
-    return new BehaviorSubject(user).asObservable();
+  constructor(
+    private router: Router,
+    private storage: Storage,
+    protected http: HttpService) {
+    this.currentUserSubject = new BehaviorSubject<User | null>(JSON.parse(storage.getItem('currentUser') || 'null'));
+    this.currentUser = this.currentUserSubject.asObservable();
   }
 
+  public get currentUserValue(): User | null {
+    return this.currentUserSubject.value;
+  }
+
+  login(username: string, password: string): Observable<User | ErrorResponse | any> {
+    const formData = new FormData();
+    formData.append('username', username);
+    formData.append('password', password);
+    return this.http
+      .post(URLS.LOGIN_URL, formData, {isFormData: true})
+      .pipe(
+        map((response: User | ErrorResponse | any) => {
+          if ('error_code' in response && response.error_code !== 0) {
+            throw new Error(response.msg);
+          }
+          // ToDo: Remove the hardcode with API update.
+          if (!('roles' in response)) {
+            response['roles'] = this._roles;
+          }
+          if (!('permissions' in response)) {
+            response['permissions'] = this._permissions;
+          }
+
+          this.storage.setItem('currentUser', JSON.stringify(response));
+          this.currentUserSubject.next(response);
+          return response;
+        }),
+        catchError((error: any) => {
+          console.error('Login error:', error);
+          return throwError(() => error);
+        })
+      );
+  }
+
   logout(): void {
     this.storage.removeItem('currentUser');
     this.currentUserSubject.next(null);
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { Confirmation } from './confirmation';
+
+describe('Confirmation', () => {
+  let service: Confirmation;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(Confirmation);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/confirmation.ts	(working copy)
@@ -0,0 +1,33 @@
+import {Injectable} from '@angular/core';
+import {MatDialog} from '@angular/material/dialog';
+import {
+  DeleteConfirmationDialog,
+  DeleteConfirmDialogData
+} from '../components/common/delete-confirmation-dialog/delete-confirmation-dialog';
+import {Observable} from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class Confirmation {
+
+  constructor(private dialog: MatDialog) {
+  }
+
+  openConfirmDialog(data?: Partial<DeleteConfirmDialogData>): Observable<boolean> {
+    const dialogRef = this.dialog.open(DeleteConfirmationDialog, {
+      width: '400px',
+      disableClose: true,
+      data: {
+        title: data?.title || 'Confirm Deletion',
+        message: data?.message || 'Are you sure you want to delete this item?',
+        confirmButtonText: data?.confirmButtonText || 'Delete',
+        cancelButtonText: data?.cancelButtonText || 'Cancel',
+        confirmButtonColor: data?.confirmButtonColor || 'warn',
+        cancelButtonColor: data?.cancelButtonColor || 'basic'
+      }
+    });
+
+    return dialogRef.afterClosed();
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { DeviceService } from './device-service';
+
+describe('DeviceService', () => {
+  let service: DeviceService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(DeviceService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.ts	(working copy)
@@ -0,0 +1,52 @@
+import {Injectable} from '@angular/core';
+import {URLS} from '../constants/api_urls';
+import {HttpService} from './http';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class DeviceService {
+
+  constructor(private http: HttpService) {
+  }
+
+  getDeviceGroups(rawPayload: any) {
+    return this.http.post(URLS.GET_DEVICE_GROUPS_URL, rawPayload, {csrf: true, isFormData: true, csrfInFormData: true});
+  }
+
+  addDeviceGroup(rawPayload: any) {
+    return this.http.post(URLS.ADD_DEVICE_GROUP_URL, rawPayload, {csrf: true, isFormData: true, csrfInFormData: true});
+  }
+
+  deleteDeviceGroup(rawPayload: any) {
+    return this.http.post(URLS.DELETE_DEVICE_GROUPS_URL, rawPayload, {
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    });
+  }
+
+  getDeviceBuildInfo() {
+    return this.http.get(URLS.CHECK_DEVICE_BUILD_INFO_URL);
+  }
+
+  getDeviceTypeList() {
+    return this.http.get(URLS.GET_DEVICE_TYPE_URL);
+  }
+
+  addDevice(rawPayload: any) {
+    return this.http.post(URLS.ADD_DEVICE_URL, rawPayload, {
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    });
+  }
+
+  deleteDevice(rawPayload: any) {
+    return this.http.post(URLS.DELETE_DEVICE_URL, rawPayload, {
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { Http } from './http';
+
+describe('Http', () => {
+  let service: Http;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(Http);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/http.ts	(working copy)
@@ -0,0 +1,98 @@
+import {
+  HttpClient,
+  HttpContext,
+  HttpHeaders,
+  HttpParams
+} from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+import {ADD_CSRF_TO_FORMDATA, ADD_CSRF_TO_PAYLOAD} from '../interceptors/csrf-interceptor';
+
+type HttpOptions = {
+  csrf?: boolean;
+  csrfInFormData?: boolean;
+  isForm?: boolean;
+  isFormData?: boolean;
+  headers?: { [key: string]: string };
+  params?: { [key: string]: string | number | boolean };
+};
+
+@Injectable({ providedIn: 'root' })
+export class HttpService {
+  constructor(private http: HttpClient) {}
+
+  private buildOptions(options?: HttpOptions): {
+    headers: HttpHeaders;
+    context: HttpContext;
+    params?: HttpParams;
+  } {
+    let context = new HttpContext()
+      .set(ADD_CSRF_TO_PAYLOAD, options?.csrf ?? false)
+      .set(ADD_CSRF_TO_FORMDATA, options?.csrfInFormData ?? false);
+
+    const headers: Record<string, string> = options?.headers || {};
+    const params = options?.params
+      ? new HttpParams({ fromObject: options.params as any })
+      : undefined;
+
+    return {
+      headers: new HttpHeaders(headers),
+      context,
+      ...(params ? { params } : {})
+    };
+  }
+
+  private prepareBody(data: any, options?: HttpOptions): any {
+    if (options?.isFormData) return data;
+
+    if (options?.isForm) {
+      return new HttpParams({ fromObject: data }).toString();
+    }
+
+    return data; // JSON by default
+  }
+
+  get<T>(url: string, options?: HttpOptions): Observable<T> {
+    return this.http.get<T>(url, this.buildOptions(options));
+  }
+
+  post<T>(url: string, data: any, options?: HttpOptions): Observable<T> {
+    const opts = this.buildOptions(options);
+
+    if (options?.isForm) {
+      opts.headers = opts.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    } else if (!options?.isFormData) {
+      opts.headers = opts.headers.set('Content-Type', 'application/json');
+    }
+
+    return this.http.post<T>(url, this.prepareBody(data, options), opts);
+  }
+
+  put<T>(url: string, data: any, options?: HttpOptions): Observable<T> {
+    const opts = this.buildOptions(options);
+
+    if (options?.isForm) {
+      opts.headers = opts.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    } else if (!options?.isFormData) {
+      opts.headers = opts.headers.set('Content-Type', 'application/json');
+    }
+
+    return this.http.put<T>(url, this.prepareBody(data, options), opts);
+  }
+
+  patch<T>(url: string, data: any, options?: HttpOptions): Observable<T> {
+    const opts = this.buildOptions(options);
+
+    if (options?.isForm) {
+      opts.headers = opts.headers.set('Content-Type', 'application/x-www-form-urlencoded');
+    } else if (!options?.isFormData) {
+      opts.headers = opts.headers.set('Content-Type', 'application/json');
+    }
+
+    return this.http.patch<T>(url, this.prepareBody(data, options), opts);
+  }
+
+  delete<T>(url: string, options?: HttpOptions): Observable<T> {
+    return this.http.delete<T>(url, this.buildOptions(options));
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { Layout } from './layout';
+
+describe('Layout', () => {
+  let service: Layout;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(Layout);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/layout.ts	(working copy)
@@ -0,0 +1,33 @@
+import {Injectable} from '@angular/core';
+import {BehaviorSubject} from 'rxjs';
+import {Storage} from './storage';
+
+const SIDEBAR_COLLAPSED_KEY = 'sidebarCollapsed';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class Layout {
+
+  private collapsedSubject;
+
+  constructor(
+    private storage: Storage,
+  ) {
+    this.collapsedSubject = new BehaviorSubject<boolean>(this.getInitialCollapsedState());
+  }
+
+  setSidebarCollapsed(state: boolean) {
+    this.storage.setItem(SIDEBAR_COLLAPSED_KEY, JSON.stringify(state));
+    this.collapsedSubject.next(state);
+  }
+
+  getSidebarCollapsed() {
+    return this.collapsedSubject.asObservable();
+  }
+
+  private getInitialCollapsedState(): boolean {
+    const stored = this.storage.getItem(SIDEBAR_COLLAPSED_KEY);
+    return stored ? JSON.parse(stored) : false;
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { Loading } from './loading';
+
+describe('Loading', () => {
+  let service: Loading;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(Loading);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/loading.ts	(working copy)
@@ -0,0 +1,23 @@
+import {Injectable} from '@angular/core';
+import {BehaviorSubject} from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class Loading {
+
+
+  private loadingSubject = new BehaviorSubject<boolean>(false);
+  loading$ = this.loadingSubject.asObservable();
+
+  constructor() {
+  }
+
+  show() {
+    this.loadingSubject.next(true);
+  }
+
+  hide() {
+    this.loadingSubject.next(false);
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.spec.ts	(working copy)
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { Notification } from './notification';
+
+describe('Notification', () => {
+  let service: Notification;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(Notification);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/notification.ts	(working copy)
@@ -0,0 +1,32 @@
+import {Injectable} from '@angular/core';
+import {MatSnackBar} from '@angular/material/snack-bar';
+import {AppNotification} from '../components/app-notification/app-notification';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class NotificationService {
+
+  constructor(
+    private snackBar: MatSnackBar,
+  ) {
+  }
+
+  showSuccess(message: string) {
+    this.snackBar.openFromComponent(AppNotification, {
+      data: {message, type: 'success'},
+      duration: 3000,
+      horizontalPosition: 'right',
+      verticalPosition: 'top'
+    });
+  }
+
+  showError(message: string) {
+    this.snackBar.openFromComponent(AppNotification, {
+      data: {message, type: 'error'},
+      duration: 5000,
+      horizontalPosition: 'right',
+      verticalPosition: 'top'
+    });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(working copy)
@@ -29,6 +29,9 @@
   faCircleDown,
   faWindowMaximize,
   faChartBar,
+  faCircleXmark,
+  faTrashCan,
+  faCheckCircle,
 } from '@fortawesome/free-regular-svg-icons';
 import {MatGridListModule} from '@angular/material/grid-list';
 import {MatFormFieldModule} from '@angular/material/form-field';
@@ -38,8 +41,14 @@
 import {MatListModule, MatNavList} from '@angular/material/list';
 import {MatExpansionModule} from '@angular/material/expansion';
 import {MatIconModule} from '@angular/material/icon';
+import {MatSnackBarModule} from '@angular/material/snack-bar';
+import {MatTableModule} from '@angular/material/table';
+import {MatTooltipModule} from '@angular/material/tooltip';
+import {MatDialogModule} from '@angular/material/dialog';
+import {MatSelectModule} from '@angular/material/select';
+import {MatRadioModule} from '@angular/material/radio';
+import {MatSlideToggleModule} from '@angular/material/slide-toggle';
 
-
 @NgModule({
   declarations: [],
   imports: [
@@ -57,6 +66,13 @@
     MatIconModule,
     MatExpansionModule,
     MatListModule,
+    MatSnackBarModule,
+    MatTableModule,
+    MatTooltipModule,
+    MatDialogModule,
+    MatSelectModule,
+    MatRadioModule,
+    MatSlideToggleModule,
   ],
   exports: [
     CommonModule,
@@ -73,7 +89,12 @@
     MatIconModule,
     MatExpansionModule,
     MatListModule,
-
+    MatTableModule,
+    MatTooltipModule,
+    MatDialogModule,
+    MatSelectModule,
+    MatRadioModule,
+    MatSlideToggleModule,
   ]
 })
 export class SharedModule {
@@ -103,6 +124,9 @@
       faCircleDown,
       faWindowMaximize,
       faChartBar,
+      faCircleXmark,
+      faTrashCan,
+      faCheckCircle,
     );
   }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/utils/custom-validators.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/utils/custom-validators.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/utils/custom-validators.ts	(working copy)
@@ -0,0 +1,45 @@
+import {AbstractControl, ValidationErrors, ValidatorFn} from '@angular/forms';
+
+export class CustomValidators {
+  static ipv4(): ValidatorFn {
+    const ipv4Regex =
+      /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
+
+    return (control: AbstractControl): ValidationErrors | null => {
+      const value = control.value;
+      if (!value) {
+        return null; // Don't validate empty values, use Validators.required instead
+      }
+      return ipv4Regex.test(value) ? null : {'ipv4': true};
+    };
+  }
+
+  static ipv6(): ValidatorFn {
+    const ipv6Regex = new RegExp(
+      '^((([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4}|:))|(([0-9a-fA-F]{1,4}:){6}(:[0-9a-fA-F]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-fA-F]{1,4}:){5}(((:[0-9a-fA-F]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-fA-F]{1,4}:){4}(((:[0-9a-fA-F]{1,4}){1,3})|((:[0-9a-fA-F]{1,4}){0,1}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-fA-F]{1,4}:){3}(((:[0-9a-fA-F]{1,4}){1,4})|((:[0-9a-fA-F]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-fA-F]{1,4}:){2}(((:[0-9a-fA-F]{1,4}){1,5})|((:[0-9a-fA-F]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-fA-F]{1,4}:){1}(((:[0-9a-fA-F]{1,4}){1,6})|((:[0-9a-fA-F]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9a-fA-F]{1,4}){1,7})|((:[0-9a-fA-F]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?$'
+    );
+
+    return (control: AbstractControl): ValidationErrors | null => {
+      const value = control.value;
+      if (!value) {
+        return null;
+      }
+      return ipv6Regex.test(value) ? null : {'ipv6': true};
+    };
+  }
+
+  // Combined IP address validator
+  static ipAddress(): ValidatorFn {
+    return (control: AbstractControl): ValidationErrors | null => {
+      const value = control.value;
+      if (!value) {
+        return null;
+      }
+      const isIpv4 = CustomValidators.ipv4()(control) === null;
+      const isIpv6 = CustomValidators.ipv6()(control) === null;
+
+      return (isIpv4 || isIpv6) ? null : {'ipAddress': true};
+    };
+  }
+
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Bold.ttf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Bold.ttf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Medium.ttf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Medium.ttf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Regular.ttf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: src/webui/webui/htdocs/new/src/gui/src/assets/fonts/Roboto-Regular.ttf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/assets/images/array_logo_color_white.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: src/webui/webui/htdocs/new/src/gui/src/assets/images/array_logo_color_white.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/assets/images/array_logo_color_white_v1.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: src/webui/webui/htdocs/new/src/gui/src/assets/images/array_logo_color_white_v1.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/index.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/index.html	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/index.html	(working copy)
@@ -7,7 +7,7 @@
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
 </head>
-<body>
+<body class="mat-typography">
   <app-root></app-root>
 </body>
 </html>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/main.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/main.ts	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/main.ts	(working copy)
@@ -3,4 +3,4 @@
 import { App } from './app/app';
 
 bootstrapApplication(App, appConfig)
-  .catch((err) => console.error(err));
+  .catch((err: any) => console.error(err));
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss	(revision 2657)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/styles.scss	(working copy)
@@ -1,14 +1,171 @@
 /* You can add global styles to this file, and also import other style files */
+@use '@angular/material' as mat;
 @import '@angular/material/prebuilt-themes/azure-blue.css';
 
+@font-face {
+  font-family: 'Roboto';
+  src: url('/assets/fonts/Roboto-Regular.ttf') format('truetype');
+  font-weight: 400;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: 'Roboto';
+  src: url('/assets/fonts/Roboto-Medium.ttf') format('truetype');
+  font-weight: 500;
+  font-style: normal;
+}
+
+@font-face {
+  font-family: 'Roboto';
+  src: url('/assets/fonts/Roboto-Bold.ttf') format('truetype');
+  font-weight: 700;
+  font-style: normal;
+}
+
+$custom-typography: (
+  plain-family: 'Roboto, sans-serif',
+  brand-family: 'Roboto, sans-serif',
+  bold-weight: 700,
+  regular-weight: 400,
+  medium-weight: 500
+);
+
+$theme: mat.define-theme((
+  typography: $custom-typography,
+  color: (
+    theme-type: light,
+    primary: mat.$azure-palette
+  ),
+  density: (
+    scale: 0
+  )
+));
+
 html, body {
+  @include mat.core-theme($theme);
+  @include mat.all-component-themes($theme);
+  @include mat.typography-hierarchy($theme);
+  font-size: 1rem;
+  font-family: 'Roboto', sans-serif !important;
+}
+
+body {
+  font-size: 12px
+}
+
+html, body {
   margin: 0;
   padding: 0;
   height: 100%; /* Ensure html and body explicitly take full height */
-  overflow: hidden; /* Prevent global scrollbar if app-wrapper is handling it */
+  overflow: auto; /* Prevent global scrollbar if app-wrapper is handling it */
 }
 
-body {
-  font-family: 'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;
-  font-size: 12px
+* {
+  font-family: inherit; // Ensure all elements inherit Roboto
 }
+
+.table-container {
+  padding: 3px;
+  position: relative;
+  z-index: 20;
+}
+
+/* Filter container with high specificity */
+:host ::ng-deep .filter-container {
+  width: 100%;
+  max-width: 300px;
+  margin: 15px 20px;
+  position: relative;
+  z-index: 25;
+
+  .mat-mdc-form-field {
+    background-color: #fff;
+    border: 1px solid #ccc;
+    border-radius: 20px;
+    transition: border-color 0.2s ease;
+
+    &.mat-focused {
+      border-color: #007bff;
+    }
+  }
+
+  .mdc-text-field {
+    padding: 0 12px;
+  }
+
+  .mat-mdc-form-field-infix {
+    padding: 8px 0;
+  }
+
+  .mat-mdc-input-element {
+    color: #333;
+    font-size: 1em;
+    position: relative;
+    z-index: 26;
+  }
+
+  .mat-mdc-form-field-label {
+    color: #555;
+  }
+
+  .mat-mdc-input-element:focus {
+    outline: 2px solid #007bff;
+  }
+}
+
+.success-icon {
+  color: darkgreen;
+}
+
+.delete-icon {
+  color: darkred;
+}
+
+
+.action-header {
+  text-align: center;
+}
+
+.w-10 {
+  width: 10%;
+}
+
+.row-action {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding-right: 12px;
+  gap: 8px;
+}
+
+.a-link {
+  cursor: pointer;
+}
+
+.mat-column-serial {
+  width: 32px;
+  border-right: 1px solid currentColor;
+  padding-right: 24px;
+  text-align: center;
+}
+
+.form-field-wrapper {
+  display: flex; /* Use flexbox to align items horizontally */
+  align-items: center; /* Vertically align items in the middle */
+  gap: 15px; /* Add some space between the label and the form field */
+  margin-bottom: 20px; /* Space between rows if you have multiple fields */
+}
+
+.form-label {
+  /* Optional: Style your label if needed */
+  font-weight: 500;
+  min-width: 150px; /* Give the label a minimum width for consistent alignment */
+  text-align: right; /* Align label text to the right */
+}
+
+/* Optional: Adjust the width of the mat-form-field if necessary */
+.form-field-wrapper mat-form-field {
+  flex-grow: 1; /* Allow the form field to take up available space */
+  max-width: 300px; /* Example: Limit the maximum width of the input */
+}
