Index: /branches/amp_4_0/platform/config/telegraf/asf.toml
===================================================================
--- /branches/amp_4_0/platform/config/telegraf/asf.toml	(revision 2724)
+++ /branches/amp_4_0/platform/config/telegraf/asf.toml	(working copy)
@@ -177,21 +177,6 @@
 oid = ".1.3.6.1.4.1.7564.22.8.1.8"
 
 [[inputs.snmp.table]]
-name = "asf_syslog_history"
-
-[[inputs.snmp.table.field]]
-name = "idx"
-oid = ".1.3.6.1.4.1.7564.24.2.2.1.1"
-
-[[inputs.snmp.table.field]]
-name = "severity"
-oid = ".1.3.6.1.4.1.7564.24.2.2.1.2"
-
-[[inputs.snmp.table.field]]
-name = "msg_text"
-oid = ".1.3.6.1.4.1.7564.24.2.2.1.3"
-
-[[inputs.snmp.table]]
 name = "asf_performance_statistics"
 
 [[inputs.snmp.table.field]]
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 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/app.routes.ts	(working copy)
@@ -24,8 +24,8 @@
 import {
   VpnResourceGroupOverview
 } from './components/sub-components/vpn-resource-group-overview/vpn-resource-group-overview';
-import {DeviceSsl} from './components/device-ssl/device-ssl';
-import {DeviceSslOverview} from './components/sub-components/device-ssl-overview/device-ssl-overview';
+import {ApvSslManagement} from './components/apv-ssl-management/apv-ssl-management';
+import {ApvSslOverview} from './components/sub-components/apv-ssl-overview/apv-ssl-overview';
 import {DeviceHaOverview} from './components/sub-components/device-ha-overview/device-ha-overview';
 import {DeviceHa} from './components/device-ha/device-ha';
 import {Topology} from './components/topology/topology';
@@ -141,12 +141,12 @@
           },
           {
             path: 'apv/ssl',
-            component: DeviceSsl,
+            component: ApvSslManagement,
             data: {roles: ['super_admin', 'device_admin', 'common_admin']}
           },
           {
-            path: 'apv/ssl/details/:deviceName/:serviceName/:hostName',
-            component: DeviceSslOverview,
+            path: 'apv/ssl/details/:deviceName/:deviceId/:serviceName/:hostName',
+            component: ApvSslOverview,
             data: {roles: ['super_admin', 'device_admin', 'common_admin']}
           },
           {
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/apv-ssl-management.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/apv-ssl-management/apv-ssl-management.html	(working copy)
@@ -0,0 +1,65 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <div>
+      <button mat-raised-button (click)="checkCertificateExpiry()">Check Certificate Expiry</button>
+    </div>
+  </mat-card-header>
+  <mat-card-content>
+    <span>
+      SSL certificate display depends on APV version. For APV 10.3 version, the required version is 10.3.0.2 and later. For APV 10.3.1 version, the required version is 10.3.1.2 and later. For APV 8.6.1 version, the required version is 8.6.1.89 and later. Therefore, if you want to use the related functions of the SSL certificate, please update the corresponding APV version.
+    </span>
+  </mat-card-content>
+</mat-card>
+<div class="table-container">
+  <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 | globalSerial:paginator }}</td>
+    </ng-container>
+    <ng-container matColumnDef="serviceName">
+      <th mat-header-cell *matHeaderCellDef> Service Name</th>
+      <td mat-cell *matCellDef="let element">
+        <a class="details-page-link" (click)="goToDetails(element)">{{ element?.service_name }}</a>
+      </td>
+    </ng-container>
+    <ng-container matColumnDef="deviceName">
+      <th mat-header-cell *matHeaderCellDef> Device Name</th>
+      <td mat-cell *matCellDef="let element">{{ element?.device }}</td>
+    </ng-container>
+    <ng-container matColumnDef="deviceGroup">
+      <th mat-header-cell *matHeaderCellDef> Device Group</th>
+      <td mat-cell *matCellDef="let element">{{ element?.device_group }}</td>
+    </ng-container>
+    <ng-container matColumnDef="serviceType">
+      <th mat-header-cell *matHeaderCellDef> Service Type</th>
+      <td mat-cell *matCellDef="let element"> {{ element?.protocol }}</td>
+    </ng-container>
+    <ng-container matColumnDef="sslHostName">
+      <th mat-header-cell *matHeaderCellDef> SSL Hostname</th>
+      <td mat-cell *matCellDef="let element">{{ element?.host_name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="status">
+      <th mat-header-cell *matHeaderCellDef> SSL Host Status</th>
+      <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          <fa-icon [icon]="['far', 'edit']" size="lg" matTooltip="Edit"
+                   (click)="editSSL(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
+    <tr class="mat-row table-no-data" *matNoDataRow>
+      <td class="mat-cell" colspan="10">No results found.</td>
+    </tr>
+  </table>
+  <mat-paginator
+    [pageSizeOptions]="[10, 15, 20, 25]"
+    [length]="totalRecords"
+    showFirstLastButtons
+  ></mat-paginator>
+</div>
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.html	(nonexistent)
@@ -1,65 +0,0 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="checkCertificateExpiry()">Check Certificate Expiry</button>
-    </div>
-  </mat-card-header>
-  <mat-card-content>
-    <span>
-      SSL certificate display depends on APV version. For APV 10.3 version, the required version is 10.3.0.2 and later. For APV 10.3.1 version, the required version is 10.3.1.2 and later. For APV 8.6.1 version, the required version is 8.6.1.89 and later. Therefore, if you want to use the related functions of the SSL certificate, please update the corresponding APV version.
-    </span>
-  </mat-card-content>
-</mat-card>
-<div class="table-container">
-  <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 | globalSerial:paginator }}</td>
-    </ng-container>
-    <ng-container matColumnDef="serviceName">
-      <th mat-header-cell *matHeaderCellDef> Service Name</th>
-      <td mat-cell *matCellDef="let element">
-        <a class="details-page-link" (click)="goToDetails(element)">{{ element?.service_name }}</a>
-      </td>
-    </ng-container>
-    <ng-container matColumnDef="deviceName">
-      <th mat-header-cell *matHeaderCellDef> Device Name</th>
-      <td mat-cell *matCellDef="let element">{{ element?.device }}</td>
-    </ng-container>
-    <ng-container matColumnDef="deviceGroup">
-      <th mat-header-cell *matHeaderCellDef> Device Group</th>
-      <td mat-cell *matCellDef="let element">{{ element?.device_group }}</td>
-    </ng-container>
-    <ng-container matColumnDef="serviceType">
-      <th mat-header-cell *matHeaderCellDef> Service Type</th>
-      <td mat-cell *matCellDef="let element"> {{ element?.protocol }}</td>
-    </ng-container>
-    <ng-container matColumnDef="sslHostName">
-      <th mat-header-cell *matHeaderCellDef> SSL Hostname</th>
-      <td mat-cell *matCellDef="let element">{{ element?.host_name }}</td>
-    </ng-container>
-    <ng-container matColumnDef="status">
-      <th mat-header-cell *matHeaderCellDef> SSL Host Status</th>
-      <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
-    </ng-container>
-    <ng-container matColumnDef="action">
-      <th mat-header-cell *matHeaderCellDef> Action</th>
-      <td mat-cell *matCellDef="let element">
-        <div class="row-action a-link">
-          <fa-icon [icon]="['far', 'edit']" size="lg" matTooltip="Edit"
-                   (click)="editSSL(element)"></fa-icon>
-        </div>
-      </td>
-    </ng-container>
-    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
-    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
-    <tr class="mat-row table-no-data" *matNoDataRow>
-      <td class="mat-cell" colspan="10">No results found.</td>
-    </tr>
-  </table>
-  <mat-paginator
-    [pageSizeOptions]="[10, 15, 20, 25]"
-    [length]="totalRecords"
-    showFirstLastButtons
-  ></mat-paginator>
-</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/apv-ssl-management.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/apv-ssl-management.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.scss	(nonexistent)
@@ -1,21 +0,0 @@
-.page-card-1 {
-  width: 100%;
-  border-radius: 0;
-  background-color: inherit;
-  font-size: 14px !important;
-
-  mat-card-header {
-    color: #1170cf;
-  }
-}
-
-mat-card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 4px 10px;
-}
-
-mat-card-title {
-  font-size: medium;
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/apv-ssl-management.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/apv-ssl-management/apv-ssl-management.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslManagement } from './apv-ssl-management';
+
+describe('DeviceSsl', () => {
+  let component: ApvSslManagement;
+  let fixture: ComponentFixture<ApvSslManagement>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslManagement]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslManagement);
+    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.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.spec.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.spec.ts	(nonexistent)
@@ -1,23 +0,0 @@
-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/apv-ssl-management/apv-ssl-management.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/apv-ssl-management/apv-ssl-management.ts	(working copy)
@@ -0,0 +1,267 @@
+import {ChangeDetectorRef, Component, inject, OnDestroy, OnInit, ViewChild} from '@angular/core';
+import {MatTableDataSource} from "@angular/material/table";
+import {SharedModule} from '../../shared/shared-module';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {ActivatedRoute, Router} from '@angular/router';
+import {NotificationService} from '../../services/notification';
+import {Confirmation} from '../../services/confirmation';
+import {DeviceService} from '../../services/device-service';
+import {GlobalSerialPipe} from '../../pipes/global-serial-pipe';
+import {take} from 'rxjs/operators';
+import {Storage} from '../../services/storage';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {VpnService} from '../../services/vpn-service';
+import {SyncACLResourceGroupDialog} from '../sub-components/vpn-acl-resource-groups/vpn-acl-resource-groups';
+
+@Component({
+  selector: 'app-apv-ssl-management',
+  imports: [SharedModule, GlobalSerialPipe],
+  templateUrl: './apv-ssl-management.html',
+  styleUrl: './apv-ssl-management.scss'
+})
+export class ApvSslManagement implements OnInit {
+
+  deviceName: string = '';
+  serviceName: string = '';
+  totalRecords: number = 0;
+  tableColumns: string[] = ['serial', 'serviceName', 'deviceName', 'deviceGroup', 'serviceType', 'sslHostName', 'status', 'action'];
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+  devices: any = [];
+  device_type_info: any = {};
+
+  constructor(
+    private _device: DeviceService,
+    private _route: ActivatedRoute,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+    private _confirmation: Confirmation,
+    private _router: Router,
+    private _storage: Storage
+  ) {
+
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getDeviceGroups();
+      this.device_type_info = JSON.parse(<string>this._storage.getItem('deviceType'))
+      this.dataSource.paginator = this.paginator;
+    })
+  }
+
+  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}));
+
+    let type_dict: any = {
+      "slb virtual tcps ": "TCPS",
+      "slb virtual https ": "HTTPS",
+      "slb virtual ftps ": "FTPS"
+    }
+    let ssl_result: any = [];
+    this.dataSource.data = [];
+
+    this._device.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) => {
+                group?.device_list.forEach((device: any) => {
+                  this.devices.push(device);
+                })
+              })
+              this.devices.forEach((_device: any) => {
+                  if (this.device_type_info?.ADC_TYPE_LIST.includes(_device.type.toLowerCase())) {
+                    this._device.executeCLICommand(_device?.id, {cmd: "show slb virtual all"})
+                      .pipe(take(1))
+                      .subscribe({
+                        next: (result: any) => {
+                          if (result && result?.contents) {
+                            let conf_list = result?.contents.split('\n');
+                            conf_list.forEach((item: any) => {
+                              let _tmp = item.split("\"");
+                              if (_tmp[0] in type_dict) {
+                                ssl_result.push({
+                                  service_name: _tmp[1],
+                                  protocol: type_dict[_tmp[0]],
+                                  device: _device?.name,
+                                  id: _device?.id,
+                                  device_group: _device?.device_group,
+                                  host_name: "",
+                                  status: "",
+                                })
+                              }
+                            })
+                          }
+                          let status_result: any = {}
+                          if (this.device_type_info?.ADC_TYPE_LIST.includes(_device.type.toLowerCase())) {
+                            this._device.executeCLICommand(_device?.id, {cmd: "show ssl host"})
+                              .pipe(take(1))
+                              .subscribe({
+                                next: (resp: any) => {
+                                  if (resp && resp?.contents) {
+                                    let conf_list = resp.contents.split("\n");
+                                    conf_list.forEach((item: any) => {
+                                      let _tmp = item.split("\"");
+                                      if (_tmp[0] == "ssl host virtual ") {
+                                        ssl_result.forEach((_item: any) => {
+                                          if (_item.device === _device.name && _item.service_name === _tmp[3]) {
+                                            _item.status = status_result[_tmp[1]] || '';
+                                            _item.host_name = _tmp[1]
+                                          }
+                                        })
+                                      }
+                                    })
+                                    this._device.executeCLICommand(_device?.id, {cmd: "show ssl status host"})
+                                      .pipe(take(1))
+                                      .subscribe({
+                                        next: (res: any) => {
+                                          if (res && res?.contents) {
+                                            let conf_list1 = res.contents.split("\n");
+                                            conf_list1.forEach((item1: any) => {
+                                              let tmp1: any = item1.split("\"");
+                                              let status_str = "";
+                                              if (tmp1[0] == "virtual host ") {
+                                                if (tmp1[2] == " is inactive") {
+                                                  status_str = "Inactive";
+                                                } else {
+                                                  status_str = "Active";
+                                                }
+                                                ssl_result.forEach((_item: any) => {
+                                                  if (_item?.device === _device?.name && _item?.host_name === tmp1[1]) {
+                                                    _item.status = status_str;
+                                                  }
+                                                });
+                                              }
+                                            })
+                                          }
+                                        },
+                                        error: (error: any) => {
+                                          this._notification.showError(error?.message);
+                                        }
+                                      });
+                                  }
+                                  this.dataSource.data = ssl_result
+                                  this.dataSource.paginator = this.paginator;
+                                  this.totalRecords = this.dataSource.data.length;
+                                },
+                                error: (error: any) => {
+                                  this._notification.showError(error?.message);
+                                }
+                              });
+                          }
+                        },
+                        error: (error: any) => {
+                          this._notification.showError(error?.message);
+                        }
+                      });
+                    console.log(ssl_result)
+                  }
+                }
+              )
+            }
+          }
+        }
+        ,
+        error: (error: { message: string; }) => {
+          this._notification.showError(error.message);
+        }
+      })
+  }
+
+  editSSL(_vs: any) {
+    this.dialogConfig.data = {
+      service: _vs
+    };
+    this.dialogConfig.disableClose = true;
+    const dialogRef = this.dialog.open(EditAPVSSLDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe((isAdded: boolean) => {
+      if (isAdded) {
+        this.getDeviceGroups();
+      }
+    })
+  }
+
+  checkCertificateExpiry() {
+  }
+
+  goToDetails(_ssl: any) {
+    this._router.navigate(['/device/apv/ssl/details', _ssl.device, _ssl.id, _ssl.service_name, _ssl.host_name], {
+      state: {}
+    });
+  }
+}
+
+@Component({
+  selector: 'edit-apv-ssl',
+  templateUrl: './edit-apv-ssl.html',
+  imports: [SharedModule]
+})
+export class EditAPVSSLDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<EditAPVSSLDialog>);
+
+  configForm!: FormGroup;
+
+  constructor(
+    private _vpn: VpnService,
+    private _device: DeviceService,
+    private _notification: NotificationService,
+    private _fB: FormBuilder,
+    private _cdRef: ChangeDetectorRef,
+  ) {
+  }
+
+  ngOnInit(): void {
+    this.configForm = this._fB.group({
+      deviceName: [{value: '', disabled: true}, Validators.required],
+      serviceName: [{value: '', disabled: true}, Validators.required],
+      type: [{value: '', disabled: true}, Validators.required],
+      hostName: [{value: '', disabled: true}, Validators.required],
+      enableSSL: [false, Validators.required],
+    });
+    this.configForm.patchValue({
+      deviceName: this.data?.service?.device,
+      serviceName: this.data?.service?.service_name,
+      type: this.data?.service?.protocol,
+      hostName: this.data?.service?.host_name,
+      enableSSL: this.data?.service?.status === 'Active',
+    })
+  }
+
+  onSubmit(): void {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let _payload: any = {
+      host_status: this.configForm.value.enableSSL,
+    }
+    this._device.updateSSLVHost(this.data?.service?.device, this.data?.service?.host_name, _payload)
+      .pipe(take(1)).subscribe({
+      next: (resp: any) => {
+        this.dialogRef.close(true);
+      },
+      error: (error: any) => {
+      this._notification.showError(error?.message);
+      }
+    })
+  }
+
+  onCancel(): void {
+    this.dialogRef.close(false);
+  }
+}
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/device-ssl.ts	(nonexistent)
@@ -1,266 +0,0 @@
-import {ChangeDetectorRef, Component, inject, OnDestroy, OnInit, ViewChild} from '@angular/core';
-import {MatTableDataSource} from "@angular/material/table";
-import {SharedModule} from '../../shared/shared-module';
-import {MatPaginator} from '@angular/material/paginator';
-import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
-import {ActivatedRoute, Router} from '@angular/router';
-import {NotificationService} from '../../services/notification';
-import {Confirmation} from '../../services/confirmation';
-import {DeviceService} from '../../services/device-service';
-import {GlobalSerialPipe} from '../../pipes/global-serial-pipe';
-import {take} from 'rxjs/operators';
-import {Storage} from '../../services/storage';
-import {FormBuilder, FormGroup, Validators} from '@angular/forms';
-import {VpnService} from '../../services/vpn-service';
-import {SyncACLResourceGroupDialog} from '../sub-components/vpn-acl-resource-groups/vpn-acl-resource-groups';
-
-@Component({
-  selector: 'app-device-ssl',
-  imports: [SharedModule, GlobalSerialPipe],
-  templateUrl: './device-ssl.html',
-  styleUrl: './device-ssl.scss'
-})
-export class DeviceSsl implements OnInit {
-
-  deviceName: string = '';
-  serviceName: string = '';
-  totalRecords: number = 0;
-  tableColumns: string[] = ['serial', 'serviceName', 'deviceName', 'deviceGroup', 'serviceType', 'sslHostName', 'status', 'action'];
-  dataSource: MatTableDataSource<any> = new MatTableDataSource();
-  @ViewChild(MatPaginator) paginator!: MatPaginator;
-  dialog = inject(MatDialog);
-  dialogConfig = new MatDialogConfig();
-  devices: any = [];
-  device_type_info: any = {};
-
-  constructor(
-    private _device: DeviceService,
-    private _route: ActivatedRoute,
-    private _cdRef: ChangeDetectorRef,
-    private _notification: NotificationService,
-    private _confirmation: Confirmation,
-    private _router: Router,
-    private _storage: Storage
-  ) {
-
-  }
-
-  ngOnInit() {
-    setTimeout(() => {
-      this.getDeviceGroups();
-      this.device_type_info = JSON.parse(<string>this._storage.getItem('deviceType'))
-      this.dataSource.paginator = this.paginator;
-    })
-  }
-
-  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}));
-
-    let type_dict: any = {
-      "slb virtual tcps ": "TCPS",
-      "slb virtual https ": "HTTPS",
-      "slb virtual ftps ": "FTPS"
-    }
-    let ssl_result: any = [];
-    this.dataSource.data = [];
-
-    this._device.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) => {
-                group?.device_list.forEach((device: any) => {
-                  this.devices.push(device);
-                })
-              })
-              this.devices.forEach((_device: any) => {
-                  if (this.device_type_info?.ADC_TYPE_LIST.includes(_device.type.toLowerCase())) {
-                    this._device.executeCLICommand(_device?.id, {cmd: "show slb virtual all"})
-                      .pipe(take(1))
-                      .subscribe({
-                        next: (result: any) => {
-                          if (result && result?.contents) {
-                            let conf_list = result?.contents.split('\n');
-                            conf_list.forEach((item: any) => {
-                              let _tmp = item.split("\"");
-                              if (_tmp[0] in type_dict) {
-                                ssl_result.push({
-                                  service_name: _tmp[1],
-                                  protocol: type_dict[_tmp[0]],
-                                  device: _device?.name,
-                                  device_group: _device?.device_group,
-                                  host_name: "",
-                                  status: "",
-                                })
-                              }
-                            })
-                          }
-                          let status_result: any = {}
-                          if (this.device_type_info?.ADC_TYPE_LIST.includes(_device.type.toLowerCase())) {
-                            this._device.executeCLICommand(_device?.id, {cmd: "show ssl host"})
-                              .pipe(take(1))
-                              .subscribe({
-                                next: (resp: any) => {
-                                  if (resp && resp?.contents) {
-                                    let conf_list = resp.contents.split("\n");
-                                    conf_list.forEach((item: any) => {
-                                      let _tmp = item.split("\"");
-                                      if (_tmp[0] == "ssl host virtual ") {
-                                        ssl_result.forEach((_item: any) => {
-                                          if (_item.device === _device.name && _item.service_name === _tmp[3]) {
-                                            _item.status = status_result[_tmp[1]] || '';
-                                            _item.host_name = _tmp[1]
-                                          }
-                                        })
-                                      }
-                                    })
-                                    this._device.executeCLICommand(_device?.id, {cmd: "show ssl status host"})
-                                      .pipe(take(1))
-                                      .subscribe({
-                                        next: (res: any) => {
-                                          if (res && res?.contents) {
-                                            let conf_list1 = res.contents.split("\n");
-                                            conf_list1.forEach((item1: any) => {
-                                              let tmp1: any = item1.split("\"");
-                                              let status_str = "";
-                                              if (tmp1[0] == "virtual host ") {
-                                                if (tmp1[2] == " is inactive") {
-                                                  status_str = "Inactive";
-                                                } else {
-                                                  status_str = "Active";
-                                                }
-                                                ssl_result.forEach((_item: any) => {
-                                                  if (_item?.device === _device?.name && _item?.host_name === tmp1[1]) {
-                                                    _item.status = status_str;
-                                                  }
-                                                });
-                                              }
-                                            })
-                                          }
-                                        },
-                                        error: (error: any) => {
-                                          this._notification.showError(error?.message);
-                                        }
-                                      });
-                                  }
-                                  this.dataSource.data = ssl_result
-                                  this.dataSource.paginator = this.paginator;
-                                  this.totalRecords = this.dataSource.data.length;
-                                },
-                                error: (error: any) => {
-                                  this._notification.showError(error?.message);
-                                }
-                              });
-                          }
-                        },
-                        error: (error: any) => {
-                          this._notification.showError(error?.message);
-                        }
-                      });
-                    console.log(ssl_result)
-                  }
-                }
-              )
-            }
-          }
-        }
-        ,
-        error: (error: { message: string; }) => {
-          this._notification.showError(error.message);
-        }
-      })
-  }
-
-  editSSL(_vs: any) {
-    this.dialogConfig.data = {
-      service: _vs
-    };
-    this.dialogConfig.disableClose = true;
-    const dialogRef = this.dialog.open(EditDeviceSSLDialog, this.dialogConfig);
-    dialogRef.afterClosed().subscribe((isAdded: boolean) => {
-      if (isAdded) {
-        this.getDeviceGroups();
-      }
-    })
-  }
-
-  checkCertificateExpiry() {
-  }
-
-  goToDetails(_ssl: any) {
-    this._router.navigate(['/device/apv/ssl/details', _ssl.device, _ssl.service_name, _ssl.host_name], {
-      state: {}
-    });
-  }
-}
-
-@Component({
-  selector: 'edit-device-ssl',
-  templateUrl: './edit-device-ssl.html',
-  imports: [SharedModule]
-})
-export class EditDeviceSSLDialog implements OnInit {
-
-  readonly data = inject(MAT_DIALOG_DATA);
-  readonly dialogRef = inject(MatDialogRef<EditDeviceSSLDialog>);
-
-  configForm!: FormGroup;
-
-  constructor(
-    private _vpn: VpnService,
-    private _device: DeviceService,
-    private _notification: NotificationService,
-    private _fB: FormBuilder,
-    private _cdRef: ChangeDetectorRef,
-  ) {
-  }
-
-  ngOnInit(): void {
-    this.configForm = this._fB.group({
-      deviceName: [{value: '', disabled: true}, Validators.required],
-      serviceName: [{value: '', disabled: true}, Validators.required],
-      type: [{value: '', disabled: true}, Validators.required],
-      hostName: [{value: '', disabled: true}, Validators.required],
-      enableSSL: [false, Validators.required],
-    });
-    this.configForm.patchValue({
-      deviceName: this.data?.service?.device,
-      serviceName: this.data?.service?.service_name,
-      type: this.data?.service?.protocol,
-      hostName: this.data?.service?.host_name,
-      enableSSL: this.data?.service?.status === 'Active',
-    })
-  }
-
-  onSubmit(): void {
-    if (this.configForm.invalid) {
-      console.log(this.configForm.value);
-      this.configForm.markAllAsTouched();
-      return;
-    }
-    let _payload: any = {
-      host_status: this.configForm.value.enableSSL,
-    }
-    this._device.updateSSLVHost(this.data?.service?.device, _payload)
-      .pipe(take(1)).subscribe({
-      next: (resp: any) => {
-        this.dialogRef.close(true);
-      },
-      error: (error: any) => {
-      this._notification.showError(error?.message);
-      }
-    })
-  }
-
-  onCancel(): void {
-    this.dialogRef.close(false);
-  }
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/edit-apv-ssl.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/edit-device-ssl.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/apv-ssl-management/edit-apv-ssl.html	(working copy)
@@ -0,0 +1,74 @@
+<h2 mat-dialog-title>Edit Device SSL Service</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    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"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="serviceName" class="form-label">Service name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="serviceName"
+          formControlName="serviceName"
+          matInput
+          placeholder="Service name"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="type" class="form-label">Type</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="type"
+          formControlName="type"
+          matInput
+          placeholder="Type"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="hostName" class="form-label">Hostname</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="hostName"
+          formControlName="hostName"
+          matInput
+          placeholder="Hostname"
+          type="text"
+        />
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="enableSSL" class="form-label">Enable</label>
+      <mat-slide-toggle formControlName="enableSSL"></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/device-ssl/edit-device-ssl.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/edit-device-ssl.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/device-ssl/edit-device-ssl.html	(nonexistent)
@@ -1,74 +0,0 @@
-<h2 mat-dialog-title>Edit Device SSL Service</h2>
-<mat-dialog-content>
-  <form
-    (ngSubmit)="onSubmit()"
-    [formGroup]="configForm"
-    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"
-        />
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="serviceName" class="form-label">Service name</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="serviceName"
-          formControlName="serviceName"
-          matInput
-          placeholder="Service name"
-          type="text"
-        />
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="type" class="form-label">Type</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="type"
-          formControlName="type"
-          matInput
-          placeholder="Type"
-          type="text"
-        />
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="hostName" class="form-label">Hostname</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="hostName"
-          formControlName="hostName"
-          matInput
-          placeholder="Hostname"
-          type="text"
-        />
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="enableSSL" class="form-label">Enable</label>
-      <mat-slide-toggle formControlName="enableSSL"></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/storage/storage.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/storage/storage.ts	(working copy)
@@ -16,6 +16,6 @@
   tabDefinitions: TabDefinition[] = [
     {label: 'Log Location', component: StorageLogLocation, paramName: 'log-location'},
     {label: 'Primary Storage', component: StoragePrimary, paramName: 'primary'},
-    // {label: 'Secondary Storage', component: StorageSecondary, paramName: 'secondary'},
+    {label: 'Secondary Storage', component: StorageSecondary, paramName: 'secondary'},
   ]
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.html	(working copy)
@@ -0,0 +1,112 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>Client Verification</mat-card-title>
+  </mat-card-header>
+  <mat-card-content>
+    <form
+      (ngSubmit)="updateClientVerificationSettings()"
+      [formGroup]="configForm"
+      class="common-form"
+    >
+      <div class="form-field-wrapper">
+        <label for="client_auth" class="form-label">Enable Client Verification</label>
+        <mat-slide-toggle id="client_auth" formControlName="client_auth"></mat-slide-toggle>
+      </div>
+      <div class="form-field-wrapper">
+        <label for="host_status" class="form-label">Virtual Host Status ({{ hostName }})</label>
+        <mat-slide-toggle id="host_status" formControlName="host_status"></mat-slide-toggle>
+      </div>
+      <div class="button-container-center">
+        <button mat-raised-button color="primary" type="submit">Submit</button>
+      </div>
+    </form>
+  </mat-card-content>
+</mat-card>
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>Client Certificate</mat-card-title>
+    <div>
+      <button mat-raised-button (click)="importClientCertificate()">Import</button>
+    </div>
+  </mat-card-header>
+  <mat-card-content>
+    <div class="table-container">
+      <table mat-table [dataSource]="clientCertDataSource" class="mat-elevation-z1">
+        <ng-container matColumnDef="index">
+          <th mat-header-cell *matHeaderCellDef> No.</th>
+          <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial:paginator }}</td>
+        </ng-container>
+        <ng-container matColumnDef="status">
+          <th mat-header-cell *matHeaderCellDef> Status</th>
+          <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
+        </ng-container>
+        <ng-container matColumnDef="subject">
+          <th mat-header-cell *matHeaderCellDef> Subject</th>
+          <td mat-cell *matCellDef="let element">{{ element?.subject }}</td>
+        </ng-container>
+        <ng-container matColumnDef="etime">
+          <th mat-header-cell *matHeaderCellDef> Expiry Time</th>
+          <td mat-cell *matCellDef="let element">{{ element?.validity_not_after }}</td>
+        </ng-container>
+        <ng-container matColumnDef="action">
+          <th mat-header-cell *matHeaderCellDef> Action</th>
+          <td mat-cell *matCellDef="let element">
+            <div class="row-action a-link">
+              <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete"
+                       (click)="deleteCertificate('clientcert')"></fa-icon>
+            </div>
+          </td>
+        </ng-container>
+        <tr mat-header-row *matHeaderRowDef="clientCertColumns"></tr>
+        <tr mat-row *matRowDef="let row; columns: clientCertColumns;"></tr>
+        <tr class="mat-row table-no-data" *matNoDataRow>
+          <td class="mat-cell" colspan="5">No results found.</td>
+        </tr>
+      </table>
+    </div>
+  </mat-card-content>
+</mat-card>
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>RootCA Certificate</mat-card-title>
+    <div>
+      <button mat-raised-button (click)="importRootCACertificate()">Import</button>
+    </div>
+  </mat-card-header>
+  <mat-card-content>
+    <div class="table-container">
+      <table mat-table [dataSource]="rootCACertDataSource" class="mat-elevation-z1">
+        <ng-container matColumnDef="index">
+          <th mat-header-cell *matHeaderCellDef> No.</th>
+          <td mat-cell *matCellDef="let element; let i = index;"> {{ i | globalSerial:paginator }}</td>
+        </ng-container>
+        <ng-container matColumnDef="status">
+          <th mat-header-cell *matHeaderCellDef> Status</th>
+          <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
+        </ng-container>
+        <ng-container matColumnDef="subject">
+          <th mat-header-cell *matHeaderCellDef> Subject</th>
+          <td mat-cell *matCellDef="let element">{{ element?.subject }}</td>
+        </ng-container>
+        <ng-container matColumnDef="etime">
+          <th mat-header-cell *matHeaderCellDef> Expiry Time</th>
+          <td mat-cell *matCellDef="let element">{{ element?.validity_not_after }}</td>
+        </ng-container>
+        <ng-container matColumnDef="action">
+          <th mat-header-cell *matHeaderCellDef> Action</th>
+          <td mat-cell *matCellDef="let element">
+            <div class="row-action a-link">
+              <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete"
+                       (click)="deleteCertificate('rootca')"></fa-icon>
+            </div>
+          </td>
+        </ng-container>
+        <tr mat-header-row *matHeaderRowDef="rootCACertColumns"></tr>
+        <tr mat-row *matRowDef="let row; columns: rootCACertColumns;"></tr>
+        <tr class="mat-row table-no-data" *matNoDataRow>
+          <td class="mat-cell" colspan="5">No results found.</td>
+        </tr>
+      </table>
+    </div>
+  </mat-card-content>
+</mat-card>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslClientVerification } from './apv-ssl-client-verification';
+
+describe('ApvSslClientVerification', () => {
+  let component: ApvSslClientVerification;
+  let fixture: ComponentFixture<ApvSslClientVerification>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslClientVerification]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslClientVerification);
+    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/apv-ssl-client-verification/apv-ssl-client-verification.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/apv-ssl-client-verification.ts	(working copy)
@@ -0,0 +1,356 @@
+import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {DeviceService} from '../../../services/device-service';
+import {ActivatedRoute} from '@angular/router';
+import {NotificationService} from '../../../services/notification';
+import {Confirmation} from '../../../services/confirmation';
+import {SharedModule} from '../../../shared/shared-module';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {take} from 'rxjs/operators';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+
+
+@Component({
+  selector: 'app-apv-ssl-client-verification',
+  imports: [SharedModule, GlobalSerialPipe],
+  templateUrl: './apv-ssl-client-verification.html',
+  styleUrl: './apv-ssl-client-verification.scss'
+})
+export class ApvSslClientVerification implements OnInit {
+
+  deviceName: string = '';
+  deviceId: string = '';
+  serviceName: string = '';
+  hostName: string = '';
+
+  clientCertColumns: string[] = ['index', 'status', 'subject', 'etime', 'action'];
+  clientCertDataSource: MatTableDataSource<any> = new MatTableDataSource();
+
+  rootCACertColumns: string[] = ['index', 'status', 'subject', 'etime', 'action'];
+  rootCACertDataSource: MatTableDataSource<any> = new MatTableDataSource();
+
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+
+  configForm: FormGroup;
+  sslVHostSNI: any = [];
+
+  constructor(
+    private _device: DeviceService,
+    private _route: ActivatedRoute,
+    private _notification: NotificationService,
+    private _cdRef: ChangeDetectorRef,
+    private _confirmation: Confirmation,
+    private _fB: FormBuilder
+  ) {
+    this.configForm = this._fB.group({
+      client_auth: [false, Validators.required],
+      host_status: [false, Validators.required],
+    })
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName') || '';
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId') || '';
+    this.serviceName = this._route.snapshot.paramMap.get('serviceName') || '';
+    this.hostName = this._route.snapshot.paramMap.get('hostName') || '';
+    setTimeout(() => {
+      this.getClientVerificationSettings();
+      this.getSSLVHostSNI();
+    })
+  }
+
+  getSSLVHostSNI() {
+    this.sslVHostSNI = [];
+    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
+            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  getClientVerificationSettings(): void {
+    this.clientCertDataSource.data = [];
+    this.rootCACertDataSource.data = [];
+    this._device.getClientVerificationSettings(this.deviceId, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLClientVerificationSettings) {
+            let settings = resp.SSLClientVerificationSettings;
+            if (settings?.certs && settings?.certs.length > 0) {
+              this.clientCertDataSource.data = settings?.certs[0]?.client_certs;
+              this.rootCACertDataSource.data = settings?.certs[0]?.rootca_certs;
+            }
+            this.configForm.patchValue({
+              client_auth: settings?.client_auth,
+              host_status: settings?.vhost[0]?.host_status,
+            });
+          }
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  updateClientVerificationSettings(): void {
+    let options = JSON.stringify({
+      client_auth: this.configForm.value?.client_auth,
+    });
+    let updateVHostStatus;
+    if (this.configForm.value?.host_status) {
+      updateVHostStatus = `ssl start "${this.hostName}"`;
+    } else {
+      updateVHostStatus = `ssl stop "${this.hostName}"`;
+    }
+    this._device.updateClientVerificationSettings(this.deviceId, this.hostName, options)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLClientVerificationSettings) {
+            this._device.executeAPVCLICommand(this.deviceName, updateVHostStatus)
+              .pipe(take(1))
+              .subscribe({
+                next: (res: any) => {
+                  const responseContent = res.contents;
+                  if (responseContent && typeof responseContent === 'string' && responseContent.includes('Failed')) {
+                    this._notification.showError(responseContent);
+                    this.getClientVerificationSettings();
+                  } else {
+                    this._notification.showSuccess(`The client verification has been updated successfully.`);
+                  }
+                },
+                error: (error: any) => {
+                  this._notification.showError(error.message);
+                }
+              });
+          } else if (resp && resp.msg) {
+            this.getClientVerificationSettings();
+            this._notification.showError(resp.msg);
+          }
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  importClientCertificate() {
+    this.dialogConfig.data = {
+      domains: this.sslVHostSNI,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(ImportAPVSSLClientCertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getClientVerificationSettings();
+      }
+    })
+  }
+
+  deleteCertificate(type: any) {
+    let confirmMsg = `Are you sure you want to delete "${type === 'clientcert' ? 'Client Certificate' : 'RootCA Certificate'}"?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete "${type === 'clientcert' ? 'Client Certificate' : 'RootCA Certificate'}"?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe((result: any) => {
+      if (result) {
+        let cmd = `no ssl ${type} "${this.hostName}" \nYes\n`;
+        this._device.executeAPVCLICommand(this.deviceName, cmd)
+          .pipe(take(1))
+          .subscribe({
+            next: (res: any) => {
+              const responseContent = res.contents;
+              if (responseContent && typeof responseContent === 'string' && responseContent.includes('Failed')) {
+                this._notification.showError(responseContent);
+                this.getClientVerificationSettings();
+              } else {
+                this._notification.showSuccess(`The client certificates has been updated successfully.`);
+              }
+            },
+            error: (error: any) => {
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    });
+  }
+
+  importRootCACertificate() {
+    this.dialogConfig.data = {
+      domains: this.sslVHostSNI,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(ImportAPVSSLRootCACertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getClientVerificationSettings();
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'import-ssl-client-cert',
+  templateUrl: './import-ssl-client-cert.html',
+  imports: [SharedModule]
+})
+export class ImportAPVSSLClientCertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<ImportAPVSSLClientCertificateDialog>);
+  configForm!: FormGroup;
+
+  domains: any = [];
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      content: ['', Validators.required],
+      private_key: ['', [Validators.required]],
+      password: [''],
+    },)
+    this.domains = this.data?.domains;
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let importClientKey = `ssl import clientkey "${this.data.hostName}" \nYES\n${this.configForm?.value?.private_key}\n...\n${this.configForm?.value?.password || ""}\n`;
+    let importClientCert = `ssl import clientcert "${this.data.hostName}" \nYES\n${this.configForm?.value?.content}\n...\n${this.configForm?.value?.password || ""}\n`;
+    this._device.executeAPVCLICommand(this.data?.deviceName, importClientKey)
+      .pipe(take(1))
+      .subscribe({
+        next: (res: any) => {
+          const responseContent = res.contents;
+          if (responseContent && typeof responseContent === 'string' && responseContent.includes('Failed')) {
+            this._notification.showError(responseContent);
+          } else {
+            this._device.executeAPVCLICommand(this.data?.deviceName, importClientCert)
+              .pipe(take(1))
+              .subscribe({
+                next: (res: any) => {
+                  const responseContent = res.contents;
+                  if (responseContent && typeof responseContent === 'string' && responseContent.includes('Failed')) {
+                    this._notification.showError(responseContent);
+                  } else {
+                    this.dialogRef.close(true);
+                    this._notification.showSuccess(`The SSL client certificate has been imported successfully.`);
+                  }
+                },
+                error: (error: any) => {
+                  this._notification.showError(error.message);
+                  this._cdRef.detectChanges();
+                }
+              });
+          }
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
+
+@Component({
+  selector: 'import-ssl-rootca-cert',
+  templateUrl: './import-ssl-rootca-cert.html',
+  imports: [SharedModule]
+})
+export class ImportAPVSSLRootCACertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<ImportAPVSSLRootCACertificateDialog>);
+  configForm!: FormGroup;
+
+  domains: any = [];
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      content: ['', Validators.required],
+      domain_name: [''],
+    },)
+    this.domains = this.data?.domains;
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let importRootCA;
+    if (this.configForm?.value?.domain_name && this.configForm?.value?.domain_name !== '') {
+      importRootCA = `ssl import rootca "${this.data.hostName}" "${this.configForm?.value?.domain_name}" \n${this.configForm?.value?.content}\n...\n`;
+    } else {
+      importRootCA = `ssl import rootca "${this.data.hostName}" \n${this.configForm?.value?.content}\n...\n`;
+    }
+    this._device.executeAPVCLICommand(this.data?.deviceName, importRootCA)
+      .pipe(take(1))
+      .subscribe({
+        next: (res: any) => {
+          const responseContent = res.contents;
+          if (responseContent && typeof responseContent === 'string' && responseContent.includes('Failed')) {
+            this._notification.showError(responseContent);
+          } else {
+            this.dialogRef.close(true);
+            this._notification.showSuccess(`The SSL RootCA certificate has been imported successfully.`);
+          }
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/import-ssl-client-cert.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/import-ssl-client-cert.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/import-ssl-client-cert.html	(working copy)
@@ -0,0 +1,65 @@
+<h2 mat-dialog-title>Import SSL Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="content" class="form-label">Cert Content *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="content"></textarea>
+        @if (configForm.get('content')?.invalid && configForm.get('content')?.touched) {
+          <mat-error>
+            @if (configForm.get('content')?.errors?.['required']) {
+              Certificate content is required.
+            } @else {
+              Invalid certificate content format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="private_key" class="form-label">Private Key *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="private_key"></textarea>
+        @if (configForm.get('private_key')?.invalid && configForm.get('private_key')?.touched) {
+          <mat-error>
+            @if (configForm.get('private_key')?.errors?.['required']) {
+              Private key is required.
+            } @else {
+              Invalid private key format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="password" class="form-label">Key Passphrase</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="password"
+          formControlName="password"
+          matInput
+          placeholder="Passphrase"
+          type="password"
+        />
+      </mat-form-field>
+    </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/apv-ssl-client-verification/import-ssl-rootca-cert.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/import-ssl-rootca-cert.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-client-verification/import-ssl-rootca-cert.html	(working copy)
@@ -0,0 +1,58 @@
+<h2 mat-dialog-title>Import SSL Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="content" class="form-label">Cert Content *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="content"></textarea>
+        @if (configForm.get('content')?.invalid && configForm.get('content')?.touched) {
+          <mat-error>
+            @if (configForm.get('content')?.errors?.['required']) {
+              Certificate content is required.
+            } @else {
+              Invalid certificate content format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain_name" class="form-label">Domain Name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain_name">
+          <mat-option value=""></mat-option>
+          @for (_domain of domains; track _domain) {
+            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain_name')?.errors?.['required']) {
+              Domain name is required.
+            } @else {
+              Invalid domain name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </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/apv-ssl-inter-ca-certificates/import-apv-ssl-interca-cert.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/import-apv-ssl-interca-cert.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/import-apv-ssl-interca-cert.html	(working copy)
@@ -0,0 +1,58 @@
+<h2 mat-dialog-title>Import SSL Intermediate CA Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="content" class="form-label">Cert Content *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="content"></textarea>
+        @if (configForm.get('content')?.invalid && configForm.get('content')?.touched) {
+          <mat-error>
+            @if (configForm.get('content')?.errors?.['required']) {
+              Certificate content is required.
+            } @else {
+              Invalid certificate content format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain_name" class="form-label">Domain Name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain_name">
+          <mat-option value=""></mat-option>
+          @for (_domain of domains; track _domain) {
+            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain_name')?.errors?.['required']) {
+              Domain name is required.
+            } @else {
+              Invalid domain name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </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/device-ha-group/device-ha-group.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-group/device-ha-group.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ha-group/device-ha-group.ts	(working copy)
@@ -9,7 +9,7 @@
 import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
 import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
 import {FormBuilder, FormGroup, Validators} from '@angular/forms';
-import {ImportDeviceSSLCertificateDialog} from '../device-ssl-certificates/device-ssl-certificates';
+import {ImportDeviceSSLCertificateDialog} from '../apv-ssl-certificates/apv-ssl-certificates';
 
 @Component({
   selector: 'app-device-ha-group',
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/backup-apv-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/backup-ssl-certificate.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/backup-apv-ssl-certificate.html	(working copy)
@@ -0,0 +1,110 @@
+<h2 mat-dialog-title>Backup SSL Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="filename" class="form-label">Filename *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="filename"
+          formControlName="filename"
+          matInput
+          placeholder="Filename"
+          type="text"
+        />
+        @if (configForm.get('filename')?.invalid && configForm.get('filename')?.touched) {
+          <mat-error>
+            @if (configForm.get('filename')?.errors?.['required']) {
+              File name is required.
+            } @else {
+              Invalid file name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain_name" class="form-label">Domain Name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain_name">
+          @for (_domain of domains; track _domain) {
+            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain_name')?.errors?.['required']) {
+              Domain name is required.
+            } @else {
+              Invalid domain name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="password" class="form-label">Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="password"
+          formControlName="password"
+          matInput
+          placeholder="Password"
+          type="password"
+        />
+        @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
+          <mat-error>
+            @if (configForm.get('password')?.errors?.['required']) {
+              Password is required.
+            } @else if (configForm.get('password')?.errors) {
+              Invalid password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="confirm_password" class="form-label">Confirm Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="confirm_password"
+          formControlName="confirm_password"
+          matInput
+          placeholder="Password"
+          type="password"
+        />
+        @if (configForm.get('confirm_password')?.invalid && configForm.get('confirm_password')?.touched) {
+          <mat-error>
+            @if (configForm.get('confirm_password')?.errors?.['required']) {
+              Confirm password is required.
+            } @else if (configForm.get('confirm_password')?.errors) {
+              Invalid confirm password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    @if (configForm.hasError('passwordMismatch')) {
+      <mat-error>
+        The password and confirm password fields do not match.
+      </mat-error>
+    }
+  </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/device-ssl-certificate-backup-restore/backup-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/backup-ssl-certificate.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/backup-ssl-certificate.html	(nonexistent)
@@ -1,110 +0,0 @@
-<h2 mat-dialog-title>Backup SSL Certificate</h2>
-<mat-dialog-content>
-  <form
-    (ngSubmit)="onSubmit()"
-    [formGroup]="configForm"
-    class="login-form"
-  >
-    <div class="form-field-wrapper">
-      <label for="filename" class="form-label">Filename *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="filename"
-          formControlName="filename"
-          matInput
-          placeholder="Filename"
-          type="text"
-        />
-        @if (configForm.get('filename')?.invalid && configForm.get('filename')?.touched) {
-          <mat-error>
-            @if (configForm.get('filename')?.errors?.['required']) {
-              File name is required.
-            } @else {
-              Invalid file name format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="domain_name" class="form-label">Domain Name</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <mat-select formControlName="domain_name">
-          @for (_domain of domains; track _domain) {
-            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
-          }
-        </mat-select>
-        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
-          <mat-error>
-            @if (configForm.get('domain_name')?.errors?.['required']) {
-              Domain name is required.
-            } @else {
-              Invalid domain name format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="password" class="form-label">Password *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="password"
-          formControlName="password"
-          matInput
-          placeholder="Password"
-          type="password"
-        />
-        @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
-          <mat-error>
-            @if (configForm.get('password')?.errors?.['required']) {
-              Password is required.
-            } @else if (configForm.get('password')?.errors) {
-              Invalid password format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="confirm_password" class="form-label">Confirm Password *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="confirm_password"
-          formControlName="confirm_password"
-          matInput
-          placeholder="Password"
-          type="password"
-        />
-        @if (configForm.get('confirm_password')?.invalid && configForm.get('confirm_password')?.touched) {
-          <mat-error>
-            @if (configForm.get('confirm_password')?.errors?.['required']) {
-              Confirm password is required.
-            } @else if (configForm.get('confirm_password')?.errors) {
-              Invalid confirm password format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    @if (configForm.hasError('passwordMismatch')) {
-      <mat-error>
-        The password and confirm password fields do not match.
-      </mat-error>
-    }
-  </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/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.html	(working copy)
@@ -0,0 +1,46 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <div>
+      <button mat-raised-button (click)="addBackupSSLCertificate()">Add</button>
+    </div>
+  </mat-card-header>
+</mat-card>
+<div class="table-container">
+  <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 | globalSerial:paginator }}</td>
+    </ng-container>
+    <ng-container matColumnDef="domain">
+      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
+      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="filename">
+      <th mat-header-cell *matHeaderCellDef> Filename</th>
+      <td mat-cell *matCellDef="let element">{{ element?.filename }}</td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          <fa-icon [icon]="['fas', 'gears']" size="lg" matTooltip="Restore Certificate"
+                   (click)="restoreBackupSSLCertificate(element)"></fa-icon>
+<!--          <fa-icon [icon]="['far', 'circle-down']" size="lg" matTooltip="Download Certificate"-->
+<!--                   (click)="downloadBackupSSLCertificate(element)"></fa-icon>-->
+          <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete Certificate"
+                   (click)="deleteBackupSSLCertificate(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
+    <tr class="mat-row table-no-data" *matNoDataRow>
+      <td class="mat-cell" colspan="10">No results found.</td>
+    </tr>
+  </table>
+  <mat-paginator
+    [pageSizeOptions]="[10, 15, 20, 25]"
+    [length]="totalRecords"
+    showFirstLastButtons
+  ></mat-paginator>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.html	(nonexistent)
@@ -1,46 +0,0 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="addBackupSSLCertificate()">Add</button>
-    </div>
-  </mat-card-header>
-</mat-card>
-<div class="table-container">
-  <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 | globalSerial:paginator }}</td>
-    </ng-container>
-    <ng-container matColumnDef="domain">
-      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
-      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
-    </ng-container>
-    <ng-container matColumnDef="filename">
-      <th mat-header-cell *matHeaderCellDef> Filename</th>
-      <td mat-cell *matCellDef="let element">{{ element?.filename }}</td>
-    </ng-container>
-    <ng-container matColumnDef="action">
-      <th mat-header-cell *matHeaderCellDef> Action</th>
-      <td mat-cell *matCellDef="let element">
-        <div class="row-action a-link">
-          <fa-icon [icon]="['fas', 'gears']" size="lg" matTooltip="Restore Certificate"
-                   (click)="restoreBackupSSLCertificate(element)"></fa-icon>
-<!--          <fa-icon [icon]="['far', 'circle-down']" size="lg" matTooltip="Download Certificate"-->
-<!--                   (click)="downloadBackupSSLCertificate(element)"></fa-icon>-->
-          <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete Certificate"
-                   (click)="deleteBackupSSLCertificate(element)"></fa-icon>
-        </div>
-      </td>
-    </ng-container>
-    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
-    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
-    <tr class="mat-row table-no-data" *matNoDataRow>
-      <td class="mat-cell" colspan="10">No results found.</td>
-    </tr>
-  </table>
-  <mat-paginator
-    [pageSizeOptions]="[10, 15, 20, 25]"
-    [length]="totalRecords"
-    showFirstLastButtons
-  ></mat-paginator>
-</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.scss	(nonexistent)
@@ -1,21 +0,0 @@
-.page-card-1 {
-  width: 100%;
-  border-radius: 0;
-  background-color: inherit;
-  font-size: 14px !important;
-
-  mat-card-header {
-    color: #1170cf;
-  }
-}
-
-mat-card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 4px 10px;
-}
-
-mat-card-title {
-  font-size: medium;
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslCertificateBackupRestore } from './apv-ssl-certificate-backup-restore';
+
+describe('DeviceSslCertificateBackupRestore', () => {
+  let component: ApvSslCertificateBackupRestore;
+  let fixture: ComponentFixture<ApvSslCertificateBackupRestore>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslCertificateBackupRestore]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslCertificateBackupRestore);
+    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-certificate-backup-restore/device-ssl-certificate-backup-restore.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.spec.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.spec.ts	(nonexistent)
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { DeviceSslCertificateBackupRestore } from './device-ssl-certificate-backup-restore';
-
-describe('DeviceSslCertificateBackupRestore', () => {
-  let component: DeviceSslCertificateBackupRestore;
-  let fixture: ComponentFixture<DeviceSslCertificateBackupRestore>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [DeviceSslCertificateBackupRestore]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(DeviceSslCertificateBackupRestore);
-    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/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore.ts	(working copy)
@@ -0,0 +1,310 @@
+import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {DeviceService} from '../../../services/device-service';
+import {ActivatedRoute} from '@angular/router';
+import {NotificationService} from '../../../services/notification';
+import {take} from 'rxjs/operators';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {SharedModule} from '../../../shared/shared-module';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {CustomValidators} from '../../../utils/custom-validators';
+import {Confirmation} from '../../../services/confirmation';
+
+@Component({
+  selector: 'app-apv-ssl-certificate-backup-restore',
+  imports: [
+    SharedModule,
+    GlobalSerialPipe
+  ],
+  templateUrl: './apv-ssl-certificate-backup-restore.html',
+  styleUrl: './apv-ssl-certificate-backup-restore.scss'
+})
+export class ApvSslCertificateBackupRestore implements OnInit {
+
+  deviceName: string | null = '';
+  serviceName: string | null = '';
+  hostName: string | null = '';
+  totalRecords: number = 0;
+  tableColumns: string[] = ['serial', 'domain', 'filename', 'action'];
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+
+  constructor(
+    private _device: DeviceService,
+    private _route: ActivatedRoute,
+    private _notification: NotificationService,
+    private _cdRef: ChangeDetectorRef,
+    private _confirmation: Confirmation,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
+    this.hostName = this._route.snapshot.paramMap.get('hostName');
+    this.dataSource.paginator = this.paginator;
+    setTimeout(() => {
+      this.getSSLBackupCertificates();
+      this.getSSLVHostSNI();
+    })
+  }
+
+  getSSLBackupCertificates() {
+    this.dataSource.data = [];
+    this._device.getSSLBackupCertificates(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.backup_certs) {
+            this.dataSource.data = resp.SSLVirtualHost.backup_certs;
+            this.totalRecords = this.dataSource.data.length;
+            this.dataSource.paginator = this.paginator;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  sslVHostSNI: any = [];
+
+  getSSLVHostSNI() {
+    this.sslVHostSNI = [];
+    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
+            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  addBackupSSLCertificate() {
+    this.dialogConfig.data = {
+      domains: this.sslVHostSNI,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(BackupSSLCertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getSSLBackupCertificates();
+      }
+    })
+  }
+
+  restoreBackupSSLCertificate(_cert: any) {
+    this.dialogConfig.data = {
+      cert: _cert,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(RestoreSSLCertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getSSLBackupCertificates();
+      }
+    })
+  }
+
+  downloadBackupSSLCertificate(_cert: any) {
+    let payload: any = {
+      asso_targets: this.hostName + '-' + _cert?.filename + '-',
+      targets: this.hostName,
+    };
+    // ToDo: Fix the SSL download certificate - https://arraynetworks.atlassian.net/browse/AE-2098
+    // this._device.downloadSSLCertificate(this.deviceName, payload)
+    //   .pipe(take(1))
+    //   .subscribe({
+    //     next: (resp: any) => {
+    //       if (resp) {
+    //         console.log(resp);
+    //         let blob = new Blob([resp], {type: "application/octet-stream"});
+    //         let link = document.createElement("a");
+    //         link.href = window.URL.createObjectURL(blob);
+    //         link.download = _cert?.filename;
+    //         document.body.appendChild(link);
+    //         link.click();
+    //         document.body.removeChild(link);
+    //       }
+    //       this._cdRef.detectChanges();
+    //     },
+    //     error: (error: any) => {
+    //       this._notification.showError(error.message);
+    //       this._cdRef.detectChanges();
+    //     }
+    //   });
+  }
+
+  deleteBackupSSLCertificate(_cert: any) {
+    let deviceName = _cert?.filename;
+    let confirmMsg = `Are you sure you want to delete "${_cert?.filename}"?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${deviceName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        let payload: any = {
+          asso_targets: this.hostName + '-' + _cert?.filename + '-',
+          targets: this.hostName,
+        }
+        this._device.deleteSSLCertificate(this.deviceName, payload)
+          .pipe(take(1))
+          .subscribe({
+            next: (resp: any) => {
+              if (resp && resp?.config_change) {
+                this.getSSLBackupCertificates();
+                this._notification.showSuccess(`The SSL Backup certificate was successfully deleted.`);
+              }
+            },
+            error: (error: any) => {
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'backup-apv-ssl-certificate',
+  templateUrl: './backup-apv-ssl-certificate.html',
+  imports: [SharedModule]
+})
+export class BackupSSLCertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<BackupSSLCertificateDialog>);
+  configForm!: FormGroup;
+
+  domains: any = [];
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      filename: ['', Validators.required],
+      domain_name: [''],
+      password: ['', Validators.required],
+      confirm_password: ['', [Validators.required]],
+    }, {validators: [CustomValidators.passwordMatchValidator()]})
+    this.domains = this.data?.domains;
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      domain_name: this.configForm.value.domain_name,
+      filename: this.configForm.value.filename,
+      pwd_key: this.configForm.value.password,
+      targets: this.data?.hostName
+    };
+    this._device.backupSSLCertificate(this.data?.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.config_change) {
+            this.dialogRef.close(true);
+            this._notification.showSuccess(`The SSL certificate backup has been created successfully.`);
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
+
+@Component({
+  selector: 'restore-apv-ssl-certificate',
+  templateUrl: './restore-apv-ssl-certificate.html',
+  imports: [SharedModule]
+})
+export class RestoreSSLCertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<RestoreSSLCertificateDialog>);
+  configForm!: FormGroup;
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      password: ['', Validators.required],
+    })
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      asso_targets: this.data?.hostName + '-' + this.data?.cert?.filename + '-',
+      pwd_key: this.configForm.value.password,
+      targets: this.data?.hostName
+    };
+    this._device.restoreSSLCertificate(this.data?.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.config_change) {
+            this.dialogRef.close(true);
+            this._notification.showSuccess(`The SSL certificate has been restored.`);
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore.ts	(nonexistent)
@@ -1,310 +0,0 @@
-import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
-import {MatTableDataSource} from '@angular/material/table';
-import {MatPaginator} from '@angular/material/paginator';
-import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
-import {DeviceService} from '../../../services/device-service';
-import {ActivatedRoute} from '@angular/router';
-import {NotificationService} from '../../../services/notification';
-import {take} from 'rxjs/operators';
-import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
-import {SharedModule} from '../../../shared/shared-module';
-import {FormBuilder, FormGroup, Validators} from '@angular/forms';
-import {CustomValidators} from '../../../utils/custom-validators';
-import {Confirmation} from '../../../services/confirmation';
-
-@Component({
-  selector: 'app-device-ssl-certificate-backup-restore',
-  imports: [
-    SharedModule,
-    GlobalSerialPipe
-  ],
-  templateUrl: './device-ssl-certificate-backup-restore.html',
-  styleUrl: './device-ssl-certificate-backup-restore.scss'
-})
-export class DeviceSslCertificateBackupRestore implements OnInit {
-
-  deviceName: string | null = '';
-  serviceName: string | null = '';
-  hostName: string | null = '';
-  totalRecords: number = 0;
-  tableColumns: string[] = ['serial', 'domain', 'filename', 'action'];
-  dataSource: MatTableDataSource<any> = new MatTableDataSource();
-  @ViewChild(MatPaginator) paginator!: MatPaginator;
-  dialog = inject(MatDialog);
-  dialogConfig = new MatDialogConfig();
-
-  constructor(
-    private _device: DeviceService,
-    private _route: ActivatedRoute,
-    private _notification: NotificationService,
-    private _cdRef: ChangeDetectorRef,
-    private _confirmation: Confirmation,
-  ) {
-  }
-
-  ngOnInit() {
-    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
-    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
-    this.hostName = this._route.snapshot.paramMap.get('hostName');
-    this.dataSource.paginator = this.paginator;
-    setTimeout(() => {
-      this.getSSLBackupCertificates();
-      this.getSSLVHostSNI();
-    })
-  }
-
-  getSSLBackupCertificates() {
-    this.dataSource.data = [];
-    this._device.getSSLBackupCertificates(this.deviceName, this.hostName)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.backup_certs) {
-            this.dataSource.data = resp.SSLVirtualHost.backup_certs;
-            this.totalRecords = this.dataSource.data.length;
-            this.dataSource.paginator = this.paginator;
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  sslVHostSNI: any = [];
-
-  getSSLVHostSNI() {
-    this.sslVHostSNI = [];
-    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
-            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  addBackupSSLCertificate() {
-    this.dialogConfig.data = {
-      domains: this.sslVHostSNI,
-      deviceName: this.deviceName,
-      hostName: this.hostName,
-    };
-    const dialogRef = this.dialog.open(BackupSSLCertificateDialog, this.dialogConfig);
-    dialogRef.afterClosed().subscribe(isAdded => {
-      if (isAdded) {
-        this.getSSLBackupCertificates();
-      }
-    })
-  }
-
-  restoreBackupSSLCertificate(_cert: any) {
-    this.dialogConfig.data = {
-      cert: _cert,
-      deviceName: this.deviceName,
-      hostName: this.hostName,
-    };
-    const dialogRef = this.dialog.open(RestoreSSLCertificateDialog, this.dialogConfig);
-    dialogRef.afterClosed().subscribe(isAdded => {
-      if (isAdded) {
-        this.getSSLBackupCertificates();
-      }
-    })
-  }
-
-  downloadBackupSSLCertificate(_cert: any) {
-    let payload: any = {
-      asso_targets: this.hostName + '-' + _cert?.filename + '-',
-      targets: this.hostName,
-    };
-    // ToDo: Fix the SSL download certificate - https://arraynetworks.atlassian.net/browse/AE-2098
-    // this._device.downloadSSLCertificate(this.deviceName, payload)
-    //   .pipe(take(1))
-    //   .subscribe({
-    //     next: (resp: any) => {
-    //       if (resp) {
-    //         console.log(resp);
-    //         let blob = new Blob([resp], {type: "application/octet-stream"});
-    //         let link = document.createElement("a");
-    //         link.href = window.URL.createObjectURL(blob);
-    //         link.download = _cert?.filename;
-    //         document.body.appendChild(link);
-    //         link.click();
-    //         document.body.removeChild(link);
-    //       }
-    //       this._cdRef.detectChanges();
-    //     },
-    //     error: (error: any) => {
-    //       this._notification.showError(error.message);
-    //       this._cdRef.detectChanges();
-    //     }
-    //   });
-  }
-
-  deleteBackupSSLCertificate(_cert: any) {
-    let deviceName = _cert?.filename;
-    let confirmMsg = `Are you sure you want to delete "${_cert?.filename}"?`
-    this._confirmation.openConfirmDialog({
-      title: `Delete ${deviceName}?`,
-      message: confirmMsg,
-      confirmButtonText: 'Yes, Delete It',
-      cancelButtonText: 'No, Keep It',
-      confirmButtonColor: 'warn',
-      cancelButtonColor: 'primary'
-    }).subscribe(result => {
-      if (result) {
-        let payload: any = {
-          asso_targets: this.hostName + '-' + _cert?.filename + '-',
-          targets: this.hostName,
-        }
-        this._device.deleteSSLCertificate(this.deviceName, payload)
-          .pipe(take(1))
-          .subscribe({
-            next: (resp: any) => {
-              if (resp && resp?.config_change) {
-                this.getSSLBackupCertificates();
-                this._notification.showSuccess(`The SSL Backup certificate was successfully deleted.`);
-              }
-            },
-            error: (error: any) => {
-              this._notification.showError(error.message);
-            }
-          });
-      }
-    })
-  }
-}
-
-@Component({
-  selector: 'backup-ssl-certificate',
-  templateUrl: './backup-ssl-certificate.html',
-  imports: [SharedModule]
-})
-export class BackupSSLCertificateDialog implements OnInit {
-
-  readonly data = inject(MAT_DIALOG_DATA);
-  readonly dialogRef = inject(MatDialogRef<BackupSSLCertificateDialog>);
-  configForm!: FormGroup;
-
-  domains: any = [];
-
-  constructor(
-    private _fB: FormBuilder,
-    private _device: DeviceService,
-    private _cdRef: ChangeDetectorRef,
-    private _notification: NotificationService,
-  ) {
-
-  }
-
-  ngOnInit() {
-    this.configForm = this._fB.group({
-      filename: ['', Validators.required],
-      domain_name: [''],
-      password: ['', Validators.required],
-      confirm_password: ['', [Validators.required]],
-    }, {validators: [CustomValidators.passwordMatchValidator()]})
-    this.domains = this.data?.domains;
-  }
-
-  onCancel() {
-    this.dialogRef.close(false);
-  }
-
-  onSubmit() {
-    if (this.configForm.invalid) {
-      console.log(this.configForm.value);
-      this.configForm.markAllAsTouched();
-      return;
-    }
-    let payload: any = {
-      domain_name: this.configForm.value.domain_name,
-      filename: this.configForm.value.filename,
-      pwd_key: this.configForm.value.password,
-      targets: this.data?.hostName
-    };
-    this._device.backupSSLCertificate(this.data?.deviceName, payload)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.config_change) {
-            this.dialogRef.close(true);
-            this._notification.showSuccess(`The SSL certificate backup has been created successfully.`);
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-}
-
-@Component({
-  selector: 'restore-ssl-certificate',
-  templateUrl: './restore-ssl-certificate.html',
-  imports: [SharedModule]
-})
-export class RestoreSSLCertificateDialog implements OnInit {
-
-  readonly data = inject(MAT_DIALOG_DATA);
-  readonly dialogRef = inject(MatDialogRef<RestoreSSLCertificateDialog>);
-  configForm!: FormGroup;
-
-  constructor(
-    private _fB: FormBuilder,
-    private _device: DeviceService,
-    private _cdRef: ChangeDetectorRef,
-    private _notification: NotificationService,
-  ) {
-
-  }
-
-  ngOnInit() {
-    this.configForm = this._fB.group({
-      password: ['', Validators.required],
-    })
-  }
-
-  onCancel() {
-    this.dialogRef.close(false);
-  }
-
-  onSubmit() {
-    if (this.configForm.invalid) {
-      console.log(this.configForm.value);
-      this.configForm.markAllAsTouched();
-      return;
-    }
-    let payload: any = {
-      asso_targets: this.data?.hostName + '-' + this.data?.cert?.filename + '-',
-      pwd_key: this.configForm.value.password,
-      targets: this.data?.hostName
-    };
-    this._device.restoreSSLCertificate(this.data?.deviceName, payload)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.config_change) {
-            this.dialogRef.close(true);
-            this._notification.showSuccess(`The SSL certificate has been restored.`);
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/restore-apv-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/restore-ssl-certificate.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificate-backup-restore/restore-apv-ssl-certificate.html	(working copy)
@@ -0,0 +1,44 @@
+<h2 mat-dialog-title>Restore SSL Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="password" class="form-label">Password *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="password"
+          formControlName="password"
+          matInput
+          placeholder="Password"
+          type="password"
+        />
+        @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
+          <mat-error>
+            @if (configForm.get('password')?.errors?.['required']) {
+              Password is required.
+            } @else if (configForm.get('password')?.errors) {
+              Invalid password format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </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/device-ssl-certificate-backup-restore/restore-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/restore-ssl-certificate.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificate-backup-restore/restore-ssl-certificate.html	(nonexistent)
@@ -1,44 +0,0 @@
-<h2 mat-dialog-title>Restore SSL Certificate</h2>
-<mat-dialog-content>
-  <form
-    (ngSubmit)="onSubmit()"
-    [formGroup]="configForm"
-    class="login-form"
-  >
-    <div class="form-field-wrapper">
-      <label for="password" class="form-label">Password *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="password"
-          formControlName="password"
-          matInput
-          placeholder="Password"
-          type="password"
-        />
-        @if (configForm.get('password')?.invalid && configForm.get('password')?.touched) {
-          <mat-error>
-            @if (configForm.get('password')?.errors?.['required']) {
-              Password is required.
-            } @else if (configForm.get('password')?.errors) {
-              Invalid password format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </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/apv-ssl-certificates/apv-ssl-certificates.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.html	(working copy)
@@ -0,0 +1,75 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <div>
+      <button mat-raised-button (click)="addSSLCertificate()">Add</button>
+    </div>
+  </mat-card-header>
+</mat-card>
+<div class="table-container">
+  <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 | globalSerial:paginator }}</td>
+    </ng-container>
+    <ng-container matColumnDef="domain">
+      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
+      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="index">
+      <th mat-header-cell *matHeaderCellDef> Index</th>
+      <td mat-cell *matCellDef="let element">{{ element?.index }}</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="status">
+      <th mat-header-cell *matHeaderCellDef> Status</th>
+      <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
+    </ng-container>
+    <ng-container matColumnDef="astate">
+      <th mat-header-cell *matHeaderCellDef> Activated State</th>
+      <td mat-cell *matCellDef="let element">
+        @if (element?.activated_state) {
+          <fa-icon [icon]="['far', 'check-circle']" class="success-icon"></fa-icon>
+        } @else {
+          <fa-icon [icon]="['far', 'xmark-circle']" class="delete-icon"></fa-icon>
+        }
+      </td>
+    </ng-container>
+    <ng-container matColumnDef="subject">
+      <th mat-header-cell *matHeaderCellDef> Subject</th>
+      <td mat-cell *matCellDef="let element">{{ element?.subject }}</td>
+    </ng-container>
+    <ng-container matColumnDef="etime">
+      <th mat-header-cell *matHeaderCellDef> Expiry Time</th>
+      <td mat-cell *matCellDef="let element">{{ element?.validity_not_after }}</td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          @if (element?.activated_state) {
+            <fa-icon [icon]="['far', 'stop-circle']" size="lg" matTooltip="Deactivate Certificate"
+                     (click)="deactivateSSLCertificate(element)"></fa-icon>
+          } @else {
+            <fa-icon [icon]="['far', 'play-circle']" size="lg" matTooltip="Activate Certificate"
+                     (click)="activateSSLCertificate(element)"></fa-icon>
+          }
+          <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete"
+                   (click)="deleteSSLCertificate(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
+    <tr class="mat-row table-no-data" *matNoDataRow>
+      <td class="mat-cell" colspan="10">No results found.</td>
+    </tr>
+  </table>
+  <mat-paginator
+    [pageSizeOptions]="[10, 15, 20, 25]"
+    [length]="totalRecords"
+    showFirstLastButtons
+  ></mat-paginator>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.html	(nonexistent)
@@ -1,75 +0,0 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="addSSLCertificate()">Add</button>
-    </div>
-  </mat-card-header>
-</mat-card>
-<div class="table-container">
-  <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 | globalSerial:paginator }}</td>
-    </ng-container>
-    <ng-container matColumnDef="domain">
-      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
-      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
-    </ng-container>
-    <ng-container matColumnDef="index">
-      <th mat-header-cell *matHeaderCellDef> Index</th>
-      <td mat-cell *matCellDef="let element">{{ element?.index }}</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="status">
-      <th mat-header-cell *matHeaderCellDef> Status</th>
-      <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
-    </ng-container>
-    <ng-container matColumnDef="astate">
-      <th mat-header-cell *matHeaderCellDef> Activated State</th>
-      <td mat-cell *matCellDef="let element">
-        @if (element?.activated_state) {
-          <fa-icon [icon]="['far', 'check-circle']" class="success-icon"></fa-icon>
-        } @else {
-          <fa-icon [icon]="['far', 'xmark-circle']" class="delete-icon"></fa-icon>
-        }
-      </td>
-    </ng-container>
-    <ng-container matColumnDef="subject">
-      <th mat-header-cell *matHeaderCellDef> Subject</th>
-      <td mat-cell *matCellDef="let element">{{ element?.subject }}</td>
-    </ng-container>
-    <ng-container matColumnDef="etime">
-      <th mat-header-cell *matHeaderCellDef> Expiry Time</th>
-      <td mat-cell *matCellDef="let element">{{ element?.validity_not_after }}</td>
-    </ng-container>
-    <ng-container matColumnDef="action">
-      <th mat-header-cell *matHeaderCellDef> Action</th>
-      <td mat-cell *matCellDef="let element">
-        <div class="row-action a-link">
-          @if (element?.activated_state) {
-            <fa-icon [icon]="['far', 'stop-circle']" size="lg" matTooltip="Deactivate Certificate"
-                     (click)="deactivateSSLCertificate(element)"></fa-icon>
-          } @else {
-            <fa-icon [icon]="['far', 'play-circle']" size="lg" matTooltip="Activate Certificate"
-                     (click)="activateSSLCertificate(element)"></fa-icon>
-          }
-          <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete"
-                   (click)="deleteSSLCertificate(element)"></fa-icon>
-        </div>
-      </td>
-    </ng-container>
-    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
-    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
-    <tr class="mat-row table-no-data" *matNoDataRow>
-      <td class="mat-cell" colspan="10">No results found.</td>
-    </tr>
-  </table>
-  <mat-paginator
-    [pageSizeOptions]="[10, 15, 20, 25]"
-    [length]="totalRecords"
-    showFirstLastButtons
-  ></mat-paginator>
-</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.scss	(nonexistent)
@@ -1,21 +0,0 @@
-.page-card-1 {
-  width: 100%;
-  border-radius: 0;
-  background-color: inherit;
-  font-size: 14px !important;
-
-  mat-card-header {
-    color: #1170cf;
-  }
-}
-
-mat-card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 4px 10px;
-}
-
-mat-card-title {
-  font-size: medium;
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslCertificates } from './apv-ssl-certificates';
+
+describe('DeviceSslCertificates', () => {
+  let component: ApvSslCertificates;
+  let fixture: ComponentFixture<ApvSslCertificates>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslCertificates]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslCertificates);
+    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-certificates/device-ssl-certificates.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.spec.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.spec.ts	(nonexistent)
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { DeviceSslCertificates } from './device-ssl-certificates';
-
-describe('DeviceSslCertificates', () => {
-  let component: DeviceSslCertificates;
-  let fixture: ComponentFixture<DeviceSslCertificates>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [DeviceSslCertificates]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(DeviceSslCertificates);
-    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/apv-ssl-certificates/apv-ssl-certificates.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/apv-ssl-certificates.ts	(working copy)
@@ -0,0 +1,263 @@
+import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
+import {DeviceService} from '../../../services/device-service';
+import {NotificationService} from '../../../services/notification';
+import {take} from 'rxjs/operators';
+import {ActivatedRoute} from '@angular/router';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {SharedModule} from '../../../shared/shared-module';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+import {Confirmation} from '../../../services/confirmation';
+
+@Component({
+  selector: 'app-apv-ssl-certificates',
+  imports: [SharedModule, GlobalSerialPipe,],
+  templateUrl: './apv-ssl-certificates.html',
+  styleUrl: './apv-ssl-certificates.scss'
+})
+export class ApvSslCertificates implements OnInit {
+
+  deviceName: string | null = '';
+  serviceName: string | null = '';
+  hostName: string | null = '';
+  totalRecords: number = 0;
+  tableColumns: string[] = ['serial', 'domain', 'index', 'type', 'status', 'astate', 'subject', 'etime', 'action'];
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+  sslVHostSNI: any = [];
+
+  constructor(
+    private _device: DeviceService,
+    private _route: ActivatedRoute,
+    private _notification: NotificationService,
+    private _cdRef: ChangeDetectorRef,
+    private _confirmation: Confirmation,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
+    this.hostName = this._route.snapshot.paramMap.get('hostName');
+    this.dataSource.paginator = this.paginator;
+    setTimeout(() => {
+      this.getSSLCertificates();
+      this.getSSLVHostSNI();
+    })
+  }
+
+  getSSLCertificates() {
+    this.dataSource.data = [];
+    this._device.getSSLCertificates(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.certs) {
+            this.dataSource.data = resp.SSLVirtualHost.certs;
+            this.totalRecords = this.dataSource.data.length;
+            this.dataSource.paginator = this.paginator;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  getSSLVHostSNI() {
+    this.sslVHostSNI = [];
+    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
+            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  addSSLCertificate() {
+    this.dialogConfig.data = {
+      domains: this.sslVHostSNI,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(ImportDeviceSSLCertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getSSLCertificates();
+      }
+    })
+  }
+
+  activateSSLCertificate(_cert: any) {
+    let payload: any = {
+      asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
+      targets: this.hostName
+    }
+    this._device.activateSSLCertificate(this.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp) {
+            if (resp && resp?.msg) {
+              this._notification.showSuccess(resp?.msg);
+            } else {
+              this._notification.showSuccess(`The SSL certificate has been activated successfully.`);
+            }
+          }
+          this.getSSLCertificates();
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  deactivateSSLCertificate(_cert: any) {
+    let payload: any = {
+      asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
+      targets: this.hostName
+    }
+    this._device.deactivateSSLCertificate(this.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp) {
+            if (resp && resp?.msg) {
+              this._notification.showSuccess(resp?.msg);
+            } else {
+              this._notification.showSuccess(`The SSL certificate has been deactivated successfully.`);
+            }
+          }
+          this.getSSLCertificates();
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  deleteSSLCertificate(_cert: any) {
+    let deviceName = _cert?.filename;
+    let confirmMsg = `Are you sure you want to delete "${_cert?.filename}"?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${deviceName}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe((result: any) => {
+      if (result) {
+        let payload: any = {
+          asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
+          targets: this.hostName
+        }
+        this._device.deleteVHostSSLCertificate(this.deviceName, payload)
+          .pipe(take(1))
+          .subscribe({
+            next: (resp: any) => {
+              if (resp && resp?.config_change) {
+                this.getSSLCertificates();
+                this._notification.showSuccess(`The SSL certificate was successfully deleted.`);
+              }
+            },
+            error: (error: any) => {
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'import-apv-ssl-certificate',
+  templateUrl: './import-apv-ssl-certificate.html',
+  imports: [SharedModule]
+})
+export class ImportDeviceSSLCertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<ImportDeviceSSLCertificateDialog>);
+  configForm!: FormGroup;
+
+  domains: any = [];
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      index: ['1', [Validators.required]],
+      domain_name: [''],
+      content: ['', Validators.required],
+      private_key: ['', [Validators.required]],
+      password: [''],
+    },)
+    this.domains = this.data?.domains;
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      targets: this.data?.hostName,
+      using: {
+        manual_input: {
+          cert_content: this.configForm.value.content,
+          domain_name: this.configForm.value.domain_name,
+          index: this.configForm.value.index,
+          key: this.configForm.value.private_key,
+          key_passphrase: this.configForm.value.password,
+        }
+      }
+    };
+    this._device.importSSLCertificate(this.data?.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.config_change) {
+            this.dialogRef.close(true);
+            this._notification.showSuccess(`The SSL certificate has been imported successfully.`);
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
+
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/device-ssl-certificates.ts	(nonexistent)
@@ -1,263 +0,0 @@
-import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
-import {DeviceService} from '../../../services/device-service';
-import {NotificationService} from '../../../services/notification';
-import {take} from 'rxjs/operators';
-import {ActivatedRoute} from '@angular/router';
-import {MatTableDataSource} from '@angular/material/table';
-import {MatPaginator} from '@angular/material/paginator';
-import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
-import {SharedModule} from '../../../shared/shared-module';
-import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
-import {FormBuilder, FormGroup, Validators} from '@angular/forms';
-import {Confirmation} from '../../../services/confirmation';
-
-@Component({
-  selector: 'app-device-ssl-certificates',
-  imports: [SharedModule, GlobalSerialPipe,],
-  templateUrl: './device-ssl-certificates.html',
-  styleUrl: './device-ssl-certificates.scss'
-})
-export class DeviceSslCertificates implements OnInit {
-
-  deviceName: string | null = '';
-  serviceName: string | null = '';
-  hostName: string | null = '';
-  totalRecords: number = 0;
-  tableColumns: string[] = ['serial', 'domain', 'index', 'type', 'status', 'astate', 'subject', 'etime', 'action'];
-  dataSource: MatTableDataSource<any> = new MatTableDataSource();
-  @ViewChild(MatPaginator) paginator!: MatPaginator;
-  dialog = inject(MatDialog);
-  dialogConfig = new MatDialogConfig();
-  sslVHostSNI: any = [];
-
-  constructor(
-    private _device: DeviceService,
-    private _route: ActivatedRoute,
-    private _notification: NotificationService,
-    private _cdRef: ChangeDetectorRef,
-    private _confirmation: Confirmation,
-  ) {
-  }
-
-  ngOnInit() {
-    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
-    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
-    this.hostName = this._route.snapshot.paramMap.get('hostName');
-    this.dataSource.paginator = this.paginator;
-    setTimeout(() => {
-      this.getSSLCertificates();
-      this.getSSLVHostSNI()
-    })
-  }
-
-  getSSLCertificates() {
-    this.dataSource.data = [];
-    this._device.getSSLCertificates(this.deviceName, this.hostName)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.certs) {
-            this.dataSource.data = resp.SSLVirtualHost.certs;
-            this.totalRecords = this.dataSource.data.length;
-            this.dataSource.paginator = this.paginator;
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  getSSLVHostSNI() {
-    this.sslVHostSNI = [];
-    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
-            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  addSSLCertificate() {
-    this.dialogConfig.data = {
-      domains: this.sslVHostSNI,
-      deviceName: this.deviceName,
-      hostName: this.hostName,
-    };
-    const dialogRef = this.dialog.open(ImportDeviceSSLCertificateDialog, this.dialogConfig);
-    dialogRef.afterClosed().subscribe(isAdded => {
-      if (isAdded) {
-        this.getSSLCertificates();
-      }
-    })
-  }
-
-  activateSSLCertificate(_cert: any) {
-    let payload: any = {
-      asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
-      targets: this.hostName
-    }
-    this._device.activateSSLCertificate(this.deviceName, payload)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp) {
-            if (resp && resp?.msg) {
-              this._notification.showSuccess(resp?.msg);
-            } else {
-              this._notification.showSuccess(`The SSL certificate has been activated successfully.`);
-            }
-          }
-          this.getSSLCertificates();
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  deactivateSSLCertificate(_cert: any) {
-    let payload: any = {
-      asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
-      targets: this.hostName
-    }
-    this._device.deactivateSSLCertificate(this.deviceName, payload)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp) {
-            if (resp && resp?.msg) {
-              this._notification.showSuccess(resp?.msg);
-            } else {
-              this._notification.showSuccess(`The SSL certificate has been deactivated successfully.`);
-            }
-          }
-          this.getSSLCertificates();
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  deleteSSLCertificate(_cert: any) {
-    let deviceName = _cert?.filename;
-    let confirmMsg = `Are you sure you want to delete "${_cert?.filename}"?`
-    this._confirmation.openConfirmDialog({
-      title: `Delete ${deviceName}?`,
-      message: confirmMsg,
-      confirmButtonText: 'Yes, Delete It',
-      cancelButtonText: 'No, Keep It',
-      confirmButtonColor: 'warn',
-      cancelButtonColor: 'primary'
-    }).subscribe((result: any) => {
-      if (result) {
-        let payload: any = {
-          asso_targets: _cert?.index + '-' + _cert?.type + '-' + this.hostName + '-',
-          targets: this.hostName
-        }
-        this._device.deleteVHostSSLCertificate(this.deviceName, payload)
-          .pipe(take(1))
-          .subscribe({
-            next: (resp: any) => {
-              if (resp && resp?.config_change) {
-                this.getSSLCertificates();
-                this._notification.showSuccess(`The SSL certificate was successfully deleted.`);
-              }
-            },
-            error: (error: any) => {
-              this._notification.showError(error.message);
-            }
-          });
-      }
-    })
-  }
-}
-
-@Component({
-  selector: 'import-device-ssl-certificate',
-  templateUrl: './import-device-ssl-certificate.html',
-  imports: [SharedModule]
-})
-export class ImportDeviceSSLCertificateDialog implements OnInit {
-
-  readonly data = inject(MAT_DIALOG_DATA);
-  readonly dialogRef = inject(MatDialogRef<ImportDeviceSSLCertificateDialog>);
-  configForm!: FormGroup;
-
-  domains: any = [];
-
-  constructor(
-    private _fB: FormBuilder,
-    private _device: DeviceService,
-    private _cdRef: ChangeDetectorRef,
-    private _notification: NotificationService,
-  ) {
-
-  }
-
-  ngOnInit() {
-    this.configForm = this._fB.group({
-      index: ['1', [Validators.required]],
-      domain_name: [''],
-      content: ['', Validators.required],
-      private_key: ['', [Validators.required]],
-      password: [''],
-    },)
-    this.domains = this.data?.domains;
-  }
-
-  onCancel() {
-    this.dialogRef.close(false);
-  }
-
-  onSubmit() {
-    if (this.configForm.invalid) {
-      console.log(this.configForm.value);
-      this.configForm.markAllAsTouched();
-      return;
-    }
-    let payload: any = {
-      targets: this.data?.hostName,
-      using: {
-        manual_input: {
-          cert_content: this.configForm.value.content,
-          domain_name: this.configForm.value.domain_name,
-          index: this.configForm.value.index,
-          key: this.configForm.value.private_key,
-          key_passphrase: this.configForm.value.password,
-        }
-      }
-    };
-    this._device.importSSLCertificate(this.data?.deviceName, payload)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.config_change) {
-            this.dialogRef.close(true);
-            this._notification.showSuccess(`The SSL certificate has been imported successfully.`);
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-}
-
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/import-apv-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/import-device-ssl-certificate.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-certificates/import-apv-ssl-certificate.html	(working copy)
@@ -0,0 +1,95 @@
+<h2 mat-dialog-title>Import SSL Certificate</h2>
+<mat-dialog-content>
+  <form
+    (ngSubmit)="onSubmit()"
+    [formGroup]="configForm"
+    class="login-form"
+  >
+    <div class="form-field-wrapper">
+      <label for="index" class="form-label">Index *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="index">
+          <mat-option value='1'>1</mat-option>
+          <mat-option value='2'>2</mat-option>
+          <mat-option value='3'>3</mat-option>
+        </mat-select>
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="domain_name" class="form-label">Domain Name</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="domain_name">
+          <mat-option value=""></mat-option>
+          @for (_domain of domains; track _domain) {
+            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
+          }
+        </mat-select>
+        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
+          <mat-error>
+            @if (configForm.get('domain_name')?.errors?.['required']) {
+              Domain name is required.
+            } @else {
+              Invalid domain name format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="content" class="form-label">Cert Content *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="content"></textarea>
+        @if (configForm.get('content')?.invalid && configForm.get('content')?.touched) {
+          <mat-error>
+            @if (configForm.get('content')?.errors?.['required']) {
+              Certificate content is required.
+            } @else {
+              Invalid certificate content format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="private_key" class="form-label">Private Key *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <textarea matInput formControlName="private_key"></textarea>
+        @if (configForm.get('private_key')?.invalid && configForm.get('private_key')?.touched) {
+          <mat-error>
+            @if (configForm.get('private_key')?.errors?.['required']) {
+              Private key is required.
+            } @else {
+              Invalid private key format.
+            }
+          </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="password" class="form-label">Key Passphrase</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <input
+          id="password"
+          formControlName="password"
+          matInput
+          placeholder="Passphrase"
+          type="password"
+        />
+      </mat-form-field>
+    </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/device-ssl-certificates/import-device-ssl-certificate.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/import-device-ssl-certificate.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-certificates/import-device-ssl-certificate.html	(nonexistent)
@@ -1,95 +0,0 @@
-<h2 mat-dialog-title>Import SSL Certificate</h2>
-<mat-dialog-content>
-  <form
-    (ngSubmit)="onSubmit()"
-    [formGroup]="configForm"
-    class="login-form"
-  >
-    <div class="form-field-wrapper">
-      <label for="index" class="form-label">Index *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <mat-select formControlName="index">
-          <mat-option value='1'>1</mat-option>
-          <mat-option value='2'>2</mat-option>
-          <mat-option value='3'>3</mat-option>
-        </mat-select>
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="domain_name" class="form-label">Domain Name</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <mat-select formControlName="domain_name">
-          <mat-option value=""></mat-option>
-          @for (_domain of domains; track _domain) {
-            <mat-option [value]="_domain?.domain_name">{{ _domain?.domain_name }}</mat-option>
-          }
-        </mat-select>
-        @if (configForm.get('domain_name')?.invalid && configForm.get('domain_name')?.touched) {
-          <mat-error>
-            @if (configForm.get('domain_name')?.errors?.['required']) {
-              Domain name is required.
-            } @else {
-              Invalid domain name format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="content" class="form-label">Cert Content *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <textarea matInput formControlName="content"></textarea>
-        @if (configForm.get('content')?.invalid && configForm.get('content')?.touched) {
-          <mat-error>
-            @if (configForm.get('content')?.errors?.['required']) {
-              Certificate content is required.
-            } @else {
-              Invalid certificate content format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="private_key" class="form-label">Private Key *</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <textarea matInput formControlName="private_key"></textarea>
-        @if (configForm.get('private_key')?.invalid && configForm.get('private_key')?.touched) {
-          <mat-error>
-            @if (configForm.get('private_key')?.errors?.['required']) {
-              Private key is required.
-            } @else {
-              Invalid private key format.
-            }
-          </mat-error>
-        }
-      </mat-form-field>
-    </div>
-    <div class="form-field-wrapper">
-      <label for="password" class="form-label">Key Passphrase</label>
-      <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="password"
-          formControlName="password"
-          matInput
-          placeholder="Passphrase"
-          type="password"
-        />
-      </mat-form-field>
-    </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/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.html	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.html	(working copy)
@@ -0,0 +1,46 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <div>
+      <button mat-raised-button (click)="importIntermediateCA()">Import</button>
+    </div>
+  </mat-card-header>
+</mat-card>
+<div class="table-container">
+  <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 | globalSerial:paginator }}</td>
+    </ng-container>
+    <ng-container matColumnDef="domain">
+      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
+      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
+    </ng-container>
+    <ng-container matColumnDef="status">
+      <th mat-header-cell *matHeaderCellDef> Status</th>
+      <td mat-cell *matCellDef="let element">{{ element?.status }}</td>
+    </ng-container>
+    <ng-container matColumnDef="issuer">
+      <th mat-header-cell *matHeaderCellDef> Issuer</th>
+      <td mat-cell *matCellDef="let element">{{ element?.subject }}</td>
+    </ng-container>
+    <ng-container matColumnDef="action">
+      <th mat-header-cell *matHeaderCellDef> Action</th>
+      <td mat-cell *matCellDef="let element">
+        <div class="row-action a-link">
+          <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete"
+                   (click)="deleteIntermediateCACertificate(element)"></fa-icon>
+        </div>
+      </td>
+    </ng-container>
+    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
+    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
+    <tr class="mat-row table-no-data" *matNoDataRow>
+      <td class="mat-cell" colspan="10">No results found.</td>
+    </tr>
+  </table>
+  <mat-paginator
+    [pageSizeOptions]="[10, 15, 20, 25]"
+    [length]="totalRecords"
+    showFirstLastButtons
+  ></mat-paginator>
+</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.html	(nonexistent)
@@ -1,40 +0,0 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="addIntermediateCA()">Add</button>
-    </div>
-  </mat-card-header>
-</mat-card>
-<div class="table-container">
-  <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 | globalSerial:paginator }}</td>
-    </ng-container>
-    <ng-container matColumnDef="domain">
-      <th mat-header-cell *matHeaderCellDef> Domain Name</th>
-      <td mat-cell *matCellDef="let element">{{ element?.domain_name }}</td>
-    </ng-container>
-    <ng-container matColumnDef="filename">
-      <th mat-header-cell *matHeaderCellDef> Filename</th>
-      <td mat-cell *matCellDef="let element">{{ element?.filename }}</td>
-    </ng-container>
-    <ng-container matColumnDef="action">
-      <th mat-header-cell *matHeaderCellDef> Action</th>
-      <td mat-cell *matCellDef="let element">
-        <div class="row-action a-link">
-        </div>
-      </td>
-    </ng-container>
-    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
-    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
-    <tr class="mat-row table-no-data" *matNoDataRow>
-      <td class="mat-cell" colspan="10">No results found.</td>
-    </tr>
-  </table>
-  <mat-paginator
-    [pageSizeOptions]="[10, 15, 20, 25]"
-    [length]="totalRecords"
-    showFirstLastButtons
-  ></mat-paginator>
-</div>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.scss	(nonexistent)
@@ -1,21 +0,0 @@
-.page-card-1 {
-  width: 100%;
-  border-radius: 0;
-  background-color: inherit;
-  font-size: 14px !important;
-
-  mat-card-header {
-    color: #1170cf;
-  }
-}
-
-mat-card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 4px 10px;
-}
-
-mat-card-title {
-  font-size: medium;
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.spec.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslInterCaCertificates } from './apv-ssl-inter-ca-certificates';
+
+describe('DeviceSslInterCaCertificates', () => {
+  let component: ApvSslInterCaCertificates;
+  let fixture: ComponentFixture<ApvSslInterCaCertificates>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslInterCaCertificates]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslInterCaCertificates);
+    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-inter-ca-certificates/device-ssl-inter-ca-certificates.spec.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.spec.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.spec.ts	(nonexistent)
@@ -1,23 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { DeviceSslInterCaCertificates } from './device-ssl-inter-ca-certificates';
-
-describe('DeviceSslInterCaCertificates', () => {
-  let component: DeviceSslInterCaCertificates;
-  let fixture: ComponentFixture<DeviceSslInterCaCertificates>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [DeviceSslInterCaCertificates]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(DeviceSslInterCaCertificates);
-    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/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.ts	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates.ts	(working copy)
@@ -0,0 +1,213 @@
+import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
+import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {SharedModule} from '../../../shared/shared-module';
+import {MatTableDataSource} from '@angular/material/table';
+import {MatPaginator} from '@angular/material/paginator';
+import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {DeviceService} from '../../../services/device-service';
+import {ActivatedRoute} from '@angular/router';
+import {NotificationService} from '../../../services/notification';
+import {Confirmation} from '../../../services/confirmation';
+import {take} from 'rxjs/operators';
+import {FormBuilder, FormGroup, Validators} from '@angular/forms';
+
+
+@Component({
+  selector: 'app-apv-ssl-inter-ca-certificates',
+  imports: [
+    SharedModule,
+    GlobalSerialPipe,
+  ],
+  templateUrl: './apv-ssl-inter-ca-certificates.html',
+  styleUrl: './apv-ssl-inter-ca-certificates.scss'
+})
+export class ApvSslInterCaCertificates implements OnInit {
+
+  deviceName: string | null = '';
+  serviceName: string | null = '';
+  hostName: string | null = '';
+  totalRecords: number = 0;
+  tableColumns: string[] = ['serial', 'domain', 'status', 'issuer', 'action'];
+  dataSource: MatTableDataSource<any> = new MatTableDataSource();
+  @ViewChild(MatPaginator) paginator!: MatPaginator;
+  dialog = inject(MatDialog);
+  dialogConfig = new MatDialogConfig();
+  sslVHostSNI: any = [];
+
+  constructor(
+    private _device: DeviceService,
+    private _route: ActivatedRoute,
+    private _notification: NotificationService,
+    private _cdRef: ChangeDetectorRef,
+    private _confirmation: Confirmation,
+  ) {
+  }
+
+  ngOnInit() {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
+    this.hostName = this._route.snapshot.paramMap.get('hostName');
+    this.dataSource.paginator = this.paginator;
+    setTimeout(() => {
+      this.getIntermediateCACertificates();
+      this.getSSLVHostSNI();
+    })
+  }
+
+  getIntermediateCACertificates() {
+    this.dataSource.data = [];
+    this._device.getSSLInterCACertificates(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.interca_certs) {
+            this.dataSource.data = resp.SSLVirtualHost.interca_certs;
+            this.totalRecords = this.dataSource.data.length;
+            this.dataSource.paginator = this.paginator;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  getSSLVHostSNI() {
+    this.sslVHostSNI = [];
+    this._device.getSSLVHostSNI(this.deviceName, this.hostName)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost?.ssl_sni) {
+            this.sslVHostSNI = resp.SSLVirtualHost.ssl_sni;
+          }
+          this._cdRef.detectChanges();
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+
+  importIntermediateCA() {
+    this.dialogConfig.data = {
+      domains: this.sslVHostSNI,
+      deviceName: this.deviceName,
+      hostName: this.hostName,
+    };
+    const dialogRef = this.dialog.open(ImportAPVSSLInterCACertificateDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe(isAdded => {
+      if (isAdded) {
+        this.getIntermediateCACertificates();
+      }
+    })
+  }
+
+  deleteIntermediateCACertificate(_cert: any) {
+    let deviceName = _cert?.filename;
+    let confirmMsg = `Are you sure you want to delete this certificate?`
+    this._confirmation.openConfirmDialog({
+      title: `Delete Intermediate CA Certificate?`,
+      message: confirmMsg,
+      confirmButtonText: 'Yes, Delete It',
+      cancelButtonText: 'No, Keep It',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe((result: any) => {
+      if (result) {
+        let _target = _cert?.index + '-' + _cert?.domain_name + '-' + this.hostName + '-'
+        if (_cert?.domain_name === "") {
+          _target = _cert?.index + '-' + this.hostName + '-'
+        }
+        let payload: any = {
+          asso_targets: _target,
+          targets: this.hostName
+        }
+        this._device.deleteAPVSSLInterCACertificate(this.deviceName, payload)
+          .pipe(take(1))
+          .subscribe({
+            next: (resp: any) => {
+              if (resp && resp?.config_change) {
+                this.getIntermediateCACertificates();
+                this._notification.showSuccess(`The SSL InterCA certificate was successfully deleted.`);
+              }
+            },
+            error: (error: any) => {
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    })
+  }
+}
+
+@Component({
+  selector: 'import-apv-ssl-interca-cert',
+  templateUrl: './import-apv-ssl-interca-cert.html',
+  imports: [SharedModule]
+})
+export class ImportAPVSSLInterCACertificateDialog implements OnInit {
+
+  readonly data = inject(MAT_DIALOG_DATA);
+  readonly dialogRef = inject(MatDialogRef<ImportAPVSSLInterCACertificateDialog>);
+  configForm!: FormGroup;
+
+  domains: any = [];
+
+  constructor(
+    private _fB: FormBuilder,
+    private _device: DeviceService,
+    private _cdRef: ChangeDetectorRef,
+    private _notification: NotificationService,
+  ) {
+
+  }
+
+  ngOnInit() {
+    this.configForm = this._fB.group({
+      content: ['', Validators.required],
+      domain_name: [''],
+    },)
+    this.domains = this.data?.domains;
+  }
+
+  onCancel() {
+    this.dialogRef.close(false);
+  }
+
+  onSubmit() {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload: any = {
+      targets: this.data?.hostName,
+      using: {
+        manual_input: {
+          cert_content: this.configForm.value.content,
+          domain_name: this.configForm.value.domain_name
+        }
+      }
+    };
+    this._device.importInterCACertificate(this.data?.deviceName, payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (resp: any) => {
+          if (resp && resp?.config_change) {
+            this.dialogRef.close(true);
+            this._notification.showSuccess(`The SSL Intermediate CA certificate has been imported successfully.`);
+          } else if (resp && resp?.msg) {
+            this._notification.showError(resp.msg);
+          }
+        },
+        error: (error: any) => {
+          this._notification.showError(error.message);
+          this._cdRef.detectChanges();
+        }
+      });
+  }
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates.ts	(nonexistent)
@@ -1,75 +0,0 @@
-import {ChangeDetectorRef, Component, inject, OnInit, ViewChild} from '@angular/core';
-import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
-import {SharedModule} from '../../../shared/shared-module';
-import {MatTableDataSource} from '@angular/material/table';
-import {MatPaginator} from '@angular/material/paginator';
-import {MatDialog, MatDialogConfig} from '@angular/material/dialog';
-import {DeviceService} from '../../../services/device-service';
-import {ActivatedRoute} from '@angular/router';
-import {NotificationService} from '../../../services/notification';
-import {Confirmation} from '../../../services/confirmation';
-import {take} from 'rxjs/operators';
-
-
-@Component({
-  selector: 'app-device-ssl-inter-ca-certificates',
-  imports: [
-    SharedModule,
-    GlobalSerialPipe,
-  ],
-  templateUrl: './device-ssl-inter-ca-certificates.html',
-  styleUrl: './device-ssl-inter-ca-certificates.scss'
-})
-export class DeviceSslInterCaCertificates implements OnInit {
-
-  deviceName: string | null = '';
-  serviceName: string | null = '';
-  hostName: string | null = '';
-  totalRecords: number = 0;
-  tableColumns: string[] = ['serial', 'domain', 'filename', 'action'];
-  dataSource: MatTableDataSource<any> = new MatTableDataSource();
-  @ViewChild(MatPaginator) paginator!: MatPaginator;
-  dialog = inject(MatDialog);
-  dialogConfig = new MatDialogConfig();
-
-  constructor(
-    private _device: DeviceService,
-    private _route: ActivatedRoute,
-    private _notification: NotificationService,
-    private _cdRef: ChangeDetectorRef,
-    private _confirmation: Confirmation,
-  ) {
-  }
-
-  ngOnInit() {
-    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
-    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
-    this.hostName = this._route.snapshot.paramMap.get('hostName');
-    this.dataSource.paginator = this.paginator;
-    setTimeout(() => {
-      this.getIntermediateCACertificates();
-    })
-  }
-
-  getIntermediateCACertificates() {
-    this.dataSource.data = [];
-    this._device.getSSLInterCACertificates(this.deviceName, this.hostName)
-      .pipe(take(1))
-      .subscribe({
-        next: (resp: any) => {
-          if (resp && resp?.SSLVirtualHost && resp.SSLVirtualHost.interca_certs) {
-            this.dataSource.data = resp.SSLVirtualHost.interca_certs;
-            this.totalRecords = this.dataSource.data.length;
-            this.dataSource.paginator = this.paginator;
-          }
-          this._cdRef.detectChanges();
-        },
-        error: (error: any) => {
-          this._notification.showError(error.message);
-          this._cdRef.detectChanges();
-        }
-      });
-  }
-
-  addIntermediateCA() {}
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-overview/apv-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/apv-ssl-overview/apv-ssl-overview.html	(working copy)
@@ -0,0 +1,11 @@
+<mat-card class="page-card-1" appearance="filled">
+  <mat-card-header>
+    <mat-card-title>
+      <a class="back-to-main-page" (click)="backToSSLCertificateManagement()">
+        <fa-icon [icon]="['far', 'circle-left']"></fa-icon>
+        Virtual Site - {{ serviceName }}
+      </a>
+    </mat-card-title>
+  </mat-card-header>
+</mat-card>
+<app-tab-container [tabDefinitions]="tabDefinitions" paramKey="tab"/>
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.html	(nonexistent)
@@ -1,11 +0,0 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <mat-card-title>
-      <a class="back-to-main-page" (click)="backToSSLCertificateManagement()">
-        <fa-icon [icon]="['far', 'circle-left']"></fa-icon>
-        Virtual Site - {{ serviceName }}
-      </a>
-    </mat-card-title>
-  </mat-card-header>
-</mat-card>
-<app-tab-container [tabDefinitions]="tabDefinitions" paramKey="tab"/>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-overview/apv-ssl-overview.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(nonexistent)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-overview/apv-ssl-overview.scss	(working copy)
@@ -0,0 +1,21 @@
+.page-card-1 {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.scss	(nonexistent)
@@ -1,21 +0,0 @@
-.page-card-1 {
-  width: 100%;
-  border-radius: 0;
-  background-color: inherit;
-  font-size: 14px !important;
-
-  mat-card-header {
-    color: #1170cf;
-  }
-}
-
-mat-card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  padding: 4px 10px;
-}
-
-mat-card-title {
-  font-size: medium;
-}
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/apv-ssl-overview/apv-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/apv-ssl-overview/apv-ssl-overview.spec.ts	(working copy)
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ApvSslOverview } from './apv-ssl-overview';
+
+describe('DeviceSslOverview', () => {
+  let component: ApvSslOverview;
+  let fixture: ComponentFixture<ApvSslOverview>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ApvSslOverview]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ApvSslOverview);
+    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.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	(revision 2724)
+++ /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)
@@ -1,23 +0,0 @@
-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/apv-ssl-overview/apv-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/apv-ssl-overview/apv-ssl-overview.ts	(working copy)
@@ -0,0 +1,48 @@
+import {Component, OnInit} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {ActivatedRoute, Router} from '@angular/router';
+import {ApvSslCertificates} from '../apv-ssl-certificates/apv-ssl-certificates';
+import {ApvSslInterCaCertificates} from '../apv-ssl-inter-ca-certificates/apv-ssl-inter-ca-certificates';
+import {
+  ApvSslCertificateBackupRestore
+} from '../apv-ssl-certificate-backup-restore/apv-ssl-certificate-backup-restore';
+import {TabContainer, TabDefinition} from '../../tab-container/tab-container';
+import {ApvSslClientVerification} from '../apv-ssl-client-verification/apv-ssl-client-verification';
+
+@Component({
+  selector: 'app-apv-ssl-overview',
+  imports: [SharedModule, TabContainer],
+  templateUrl: './apv-ssl-overview.html',
+  styleUrl: './apv-ssl-overview.scss'
+})
+export class ApvSslOverview implements OnInit {
+
+  deviceName: string | null = '';
+  deviceId: string | null = '';
+  serviceName: string | null = '';
+  hostName: string | null = '';
+  tabDefinitions: TabDefinition[] = [
+    {label: 'Certificate List', component: ApvSslCertificates, paramName: 'certificates'},
+    {label: 'Client Verification', component: ApvSslClientVerification, paramName: 'client-verification'},
+    {label: 'Intermediate CA Certificate List', component: ApvSslInterCaCertificates, paramName: 'intermediate-ca'},
+    {
+      label: 'Certificate Backup/Restore',
+      component: ApvSslCertificateBackupRestore,
+      paramName: 'certificate-backup-restore'
+    },
+  ];
+
+  constructor(private _route: ActivatedRoute, private _router: Router) {
+  }
+
+  ngOnInit(): void {
+    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
+    this.deviceId = this._route.snapshot.paramMap.get('deviceId');
+    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
+    this.hostName = this._route.snapshot.paramMap.get('hostName');
+  }
+
+  backToSSLCertificateManagement(): void {
+    this._router.navigate(['/device/apv/ssl']);
+  }
+}
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/device-ssl-overview/device-ssl-overview.ts	(nonexistent)
@@ -1,44 +0,0 @@
-import {Component, OnInit} from '@angular/core';
-import {SharedModule} from '../../../shared/shared-module';
-import {ActivatedRoute, Router} from '@angular/router';
-import {DeviceSslCertificates} from '../device-ssl-certificates/device-ssl-certificates';
-import {DeviceSslInterCaCertificates} from '../device-ssl-inter-ca-certificates/device-ssl-inter-ca-certificates';
-import {
-  DeviceSslCertificateBackupRestore
-} from '../device-ssl-certificate-backup-restore/device-ssl-certificate-backup-restore';
-import {TabContainer, TabDefinition} from '../../tab-container/tab-container';
-
-@Component({
-  selector: 'app-device-ssl-overview',
-  imports: [SharedModule, TabContainer],
-  templateUrl: './device-ssl-overview.html',
-  styleUrl: './device-ssl-overview.scss'
-})
-export class DeviceSslOverview implements OnInit {
-
-  deviceName: string | null = '';
-  serviceName: string | null = '';
-  hostName: string | null = '';
-  tabDefinitions: TabDefinition[] = [
-    {label: 'Certificate List', component: DeviceSslCertificates, paramName: 'certificates'},
-    {label: 'Intermediate CA Certificate List', component: DeviceSslInterCaCertificates, paramName: 'intermediate-ca'},
-    {
-      label: 'Certificate Backup/Restore',
-      component: DeviceSslCertificateBackupRestore,
-      paramName: 'certificate-backup-restore'
-    },
-  ];
-
-  constructor(private _route: ActivatedRoute, private _router: Router) {
-  }
-
-  ngOnInit(): void {
-    this.deviceName = this._route.snapshot.paramMap.get('deviceName');
-    this.serviceName = this._route.snapshot.paramMap.get('serviceName');
-    this.hostName = this._route.snapshot.paramMap.get('hostName');
-  }
-
-  backToSSLCertificateManagement(): void {
-    this._router.navigate(['/device/apv/ssl']);
-  }
-}
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	(revision 2724)
+++ /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)
@@ -147,6 +147,7 @@
         'Model': _device?.model,
         'Build Version': _device?.build_version,
         'System Boot Time': _device?.system_boot_time,
+        'System Up Time': _device?.system_up_time,
         'Serial Number': _device.serial_number,
         'LicenseKey': _device?.license_key,
         'Expiration Date': _device?.license_date,
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	(revision 2724)
+++ /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)
@@ -6,6 +6,7 @@
 import {NotificationService} from '../../../services/notification';
 import {take} from 'rxjs/operators';
 import {GlobalSerialPipe} from '../../../pipes/global-serial-pipe';
+import {SystemService} from '../../../services/system-service';
 
 @Component({
   selector: 'app-resource-monitoring-llb',
@@ -24,6 +25,7 @@
 
   constructor(
     private _device: DeviceService,
+    private _system: SystemService,
     private _notification: NotificationService,
   ) {
   }
@@ -53,6 +55,9 @@
                 this.groups.push(group?.group_name);
                 group?.device_list.forEach((device: any) => {
                   this.devices.push(device);
+                  if ((device?.type.toLowerCase() === 'apv' || device?.type.toLowerCase() === 'vapv') && device?.connection) {
+                    this.getTopAPVLLBMetrics(device)
+                  }
                 })
               })
             }
@@ -64,6 +69,23 @@
       })
   }
 
+  getTopAPVLLBMetrics(device: any) {
+    let payload = {agent_host: device?.ip}
+    this._system.getTopAPVLLBMetrics(payload)
+      .pipe(take(1))
+      .subscribe({
+        next: (result: any) => {
+          // console.log(result);
+          let llbMetrics = this._device.mapDeviceDetails([device], result);
+          console.log(llbMetrics);
+        },
+        error: (error: { message: string; }) => {
+          console.log(error);
+          this._notification.showError(error.message);
+        }
+      });
+  }
+
   goToDetails(_service: any) {
   }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.html	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.html	(working copy)
@@ -53,19 +53,19 @@
             <table mat-table [dataSource]="storageDataSource">
               <ng-container matColumnDef="storage">
                 <th mat-header-cell *matHeaderCellDef>Storage</th>
-                <td mat-cell *matCellDef="let element">{{ element?.name }}</td>
+                <td mat-cell *matCellDef="let element">{{ element?.name | titlecase }}</td>
               </ng-container>
               <ng-container matColumnDef="total">
                 <th mat-header-cell *matHeaderCellDef>Total</th>
-                <td mat-cell *matCellDef="let element">{{ element?.model }}</td>
+                <td mat-cell *matCellDef="let element">{{ element?.total | bytes }}</td>
               </ng-container>
               <ng-container matColumnDef="used">
                 <th mat-header-cell *matHeaderCellDef>Used</th>
-                <td mat-cell *matCellDef="let element">{{ element?.ip }}</td>
+                <td mat-cell *matCellDef="let element">{{ element?.used | bytes }}</td>
               </ng-container>
               <ng-container matColumnDef="free">
                 <th mat-header-cell *matHeaderCellDef>Free</th>
-                <td mat-cell *matCellDef="let element">{{ element?.ip }}</td>
+                <td mat-cell *matCellDef="let element">{{ element?.free | bytes }}</td>
               </ng-container>
               <tr mat-header-row *matHeaderRowDef="storageColumns"></tr>
               <tr mat-row *matRowDef="let row; columns: storageColumns;"></tr>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-log-location/storage-log-location.ts	(working copy)
@@ -6,11 +6,12 @@
 import {FormBuilder, FormGroup} from '@angular/forms';
 import {MatTableDataSource} from '@angular/material/table';
 import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
+import {BytesPipe} from '../../../pipes/bytes-pipe';
 
 
 @Component({
   selector: 'app-storage-log-location',
-  imports: [SharedModule],
+  imports: [SharedModule, BytesPipe],
   templateUrl: './storage-log-location.html',
   styleUrl: './storage-log-location.scss'
 })
@@ -42,6 +43,7 @@
 
   ngOnInit() {
     setTimeout(() => {
+      this.storageDataSource.data = [];
       this.getSecondaryStorage();
       this.getStorageArchives('primary');
     })
@@ -49,11 +51,17 @@
 
   getSecondaryStorage() {
     this.storageLocations = [{label: 'Primary', value: 'primary'}]
-    this._system.getSecondaryStorage()
+    this._system.getStorage('secondary')
       .pipe(take(1)).subscribe({
       next: (result: any) => {
         if (result?.is_disk_available) {
-          console.log(result);
+          let data: any = {
+            name: 'secondary',
+            total: result.total,
+            used: result.used,
+            free: result.free,
+          }
+          this.storageDataSource.data = [...this.storageDataSource.data, data];
           this.storageLocations.push({label: 'Secondary', value: 'secondary'});
           this.getStorageArchives('secondary');
         }
@@ -95,6 +103,15 @@
   }
 
   updateLogsStorage() {
+    this._system.updateLogLocation({"location": this.configForm?.value?.storage})
+    .pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this._notification.showSuccess(`Successfully updated storage storage.`);
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message || 'Failed to update the log location.'}`);
+      }
+    })
   }
 }
 
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.html	(working copy)
@@ -1 +1,86 @@
-<p>storage-secondary works!</p>
+<mat-grid-list cols="3" rowHeight="100px">
+  <mat-grid-tile colspan="2" rowspan="4">
+    <mat-card class="storage-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Storage Cleanup</span>
+          </mat-card-title>
+        </div>
+        <div>
+          <form
+            (ngSubmit)="updateStorageCleanupConfig()"
+            [formGroup]="configForm"
+            class="common-form"
+          >
+            <div class="form-field-wrapper">
+              <label for="schedule" class="form-label">Scheduled Cleaning</label>
+              <mat-slide-toggle formControlName="schedule"></mat-slide-toggle>
+            </div>
+            <div class="form-field-wrapper">
+              <label for="duration" class="form-label">Retention duration of Data (Days)</label>
+              <mat-form-field appearance="outline" subscriptSizing="dynamic">
+                <input id="duration" formControlName="duration" matInput placeholder="Duration" type="number"/>
+                @if (configForm.get('duration')?.invalid && configForm.get('duration')?.touched) {
+                  <mat-error>
+                    @if (configForm.get('duration')?.errors?.['required']) {
+                      Duration (Days) is required.
+                    } @else {
+                      Invalid duration format.
+                    }
+                  </mat-error>
+                }
+                <mat-hint>Data exceeding the set period will be deleted.</mat-hint>
+              </mat-form-field>
+            </div>
+            <div class="form-field-wrapper">
+              <label for="percent" class="form-label">Maximum disk usage (%)</label>
+              <mat-form-field appearance="outline" subscriptSizing="dynamic">
+                <input id="percent" formControlName="percent" matInput placeholder="Disk Usage" type="number"/>
+                @if (configForm.get('percent')?.invalid && configForm.get('percent')?.touched) {
+                  <mat-error>
+                    @if (configForm.get('percent')?.errors?.['required']) {
+                      Disk usage (percentage) is required.
+                    } @else {
+                      Invalid disk usage format.
+                    }
+                  </mat-error>
+                }
+                <mat-hint>Historical data is deleted when the disk limit is exceeded.</mat-hint>
+              </mat-form-field>
+            </div>
+          </form>
+          <div class="align-center">
+            <button
+              mat-raised-button
+              color="primary"
+              (click)="updateStorageCleanupConfig()">
+              Save Changes
+            </button> &nbsp;
+            <button
+              type="button"
+              mat-raised-button
+              color="accent"
+              (click)="initiateStorageCleanup()">
+              Cleanup Immediately
+            </button>
+          </div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+  <mat-grid-tile colspan="1" rowspan="4">
+    <mat-card class="storage-card" appearance="outlined">
+      <mat-card-content class="card-content-wrapper">
+        <div class="card-header-row">
+          <mat-card-title class="card-title">
+            <span class="card-title-text">Disk Usage</span>
+          </mat-card-title>
+        </div>
+        <div class="chart-flex-container">
+          <div echarts [options]="storageDistributionChartOptions" class="chart-container"></div>
+        </div>
+      </mat-card-content>
+    </mat-card>
+  </mat-grid-tile>
+</mat-grid-list>
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.scss	(working copy)
@@ -0,0 +1,63 @@
+.storage-card {
+  width: 100%;
+  height: 100%;
+  border-radius: 8px;
+  background-color: inherit;
+}
+
+.card-content-wrapper {
+  margin-top: 2px;
+  padding: 0 !important;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  width: 100%;
+}
+
+.card-header-row {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 8px;
+  padding: 0 8px;
+}
+
+.card-title {
+  font-size: 18px;
+  font-weight: 500;
+  color: #555;
+  margin: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+}
+
+.help-block {
+  padding-left: 8px;
+  padding-right: 8px;
+  font-size: 12px;
+  font-weight: normal;
+}
+
+.storage-card {
+  width: 100%;
+  border-radius: 0;
+  background-color: inherit;
+  font-size: 14px !important;
+
+  mat-card-header {
+    color: #1170cf;
+  }
+}
+
+mat-card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 4px 10px;
+}
+
+mat-card-title {
+  font-size: medium;
+}
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/storage-secondary/storage-secondary.ts	(working copy)
@@ -1,11 +1,101 @@
-import { Component } from '@angular/core';
+import {Component, OnInit} from '@angular/core';
+import {SharedModule} from '../../../shared/shared-module';
+import {take} from 'rxjs/operators';
+import {FormBuilder, FormGroup} from '@angular/forms';
+import {SystemService} from '../../../services/system-service';
+import {NotificationService} from '../../../services/notification';
+import {EChartsOption} from 'echarts';
+import {ChartOptions} from '../../../services/chart-options';
+import {UtilsService} from '../../../services/utils-service';
 
 @Component({
   selector: 'app-storage-secondary',
-  imports: [],
+  imports: [SharedModule],
   templateUrl: './storage-secondary.html',
   styleUrl: './storage-secondary.scss'
 })
-export class StorageSecondary {
+export class StorageSecondary implements OnInit {
+  configForm: FormGroup;
+  storageDistributionChartOptions: EChartsOption = {};
 
+  constructor(
+    private _system: SystemService,
+    private _fB: FormBuilder,
+    private _notification: NotificationService,
+    private _utils: UtilsService,
+    private _chartOptions: ChartOptions,
+  ) {
+    this.configForm = this._fB.group({
+      duration: [],
+      storage: ["secondary"],
+      percent: [],
+      schedule: []
+    })
+  }
+
+  ngOnInit() {
+    setTimeout(() => {
+      this.getSecondaryStorage()
+      this.getStorageCleanupConfig();
+    })
+  }
+
+  getStorageCleanupConfig() {
+    this._system.getStorageCleanupConfig('secondary')
+      .pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this.configForm.patchValue(result);
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message || 'Failed to fetch storage cleanup config.'}`);
+      }
+    })
+  }
+
+  getSecondaryStorage() {
+    this._system.getStorage('secondary')
+      .pipe(take(1)).subscribe({
+      next: (result: any) => {
+        if (result?.is_disk_available) {
+          let data: any = [
+            {name: 'Total', value: result.total},
+            {name: 'Used', value: result.used},
+            {name: 'Free', value: result.free},
+          ];
+          data = this._utils.convertBytesForChart(data);
+          this.storageDistributionChartOptions = this._chartOptions.pieChartOptions('Storage', data);
+        }
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message || 'Failed to fetch secondary storage.'}`);
+      }
+    })
+  }
+
+  updateStorageCleanupConfig() {
+    this._system.updateStorageCleanupConfig(this.configForm.value)
+      .pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this._notification.showSuccess(`Successfully updated storage cleanup config.`);
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message || 'Failed to update storage cleanup config.'}`);
+      }
+    })
+  }
+
+  initiateStorageCleanup() {
+    this._system.initiateStorageCleanup({
+      duration: this.configForm.value?.duration,
+      percent: this.configForm.value?.percent,
+    })
+      .pipe(take(1)).subscribe({
+      next: (result: any) => {
+        this._notification.showSuccess(`Successfully initialized storage cleanup activity.`);
+      },
+      error: error => {
+        this._notification.showError(`Error: ${error?.message || 'Failed to initialize storage cleanup activity.'}`);
+      }
+    })
+  }
 }
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(working copy)
@@ -136,19 +136,21 @@
   UPLOAD_DEVICE_BUILD_URL: `${PREFIX}/api/cm/configuration/update/Update/_perform`,
   UPDATE_DEVICE_BUILD_URL: `${PREFIX}/api/cm/configuration/update/Update/_perform`,
   DEVICE_CLI_EXTEND_URL: `${PREFIX}/proxy_req_dev/rest/ag/global/cli_extend`,
-  UPDATE_DEVICE_VHOST_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/vh1/host_status`,
+  UPDATE_DEVICE_VHOST_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost`,
   GET_SSL_VHOST_CERTIFICATES_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost`,
   GET_SSL_VHOST_BACKUP_CERTIFICATES_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost`,
-  GET_SSL_VHOST_INTERMEDIATE_CA_CERTIFICATES_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/vh1/interca_certs`,
+  GET_SSL_VHOST_INTERMEDIATE_CA_CERTIFICATES_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost`,
   GET_SSL_VHOST_SNI_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost`,
   BACKUP_SSL_VHOST_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Backup`,
   RESTORE_SSL_VHOST_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Restore`,
   DELETE_SSL_VHOST_BACKUP_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Delete_BackupCert`,
   DOWNLOAD_SSL_VHOST_BACKUP_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_DownloadSavedFile`,
   IMPORT_SSL_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Import_Cert`,
+  IMPORT_SSL_INTER_CA_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_ImportIntercaCert`,
   ACTIVATE_SSL_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Activate`,
   DEACTIVATE_SSL_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Deactivate`,
   DELETE_SSL_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Delete_Cert`,
+  DELETE_SSL_INTER_CA_CERTIFICATE_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLVirtualHost/_DeleteIntercaCert`,
   GET_DEVICE_HA_LIST_URL: `${PREFIX}/cm/get_device_ha_list`,
   GET_DEVICE_HA_CONFIG_BY_NAME_URL: `${PREFIX}/cm/get_device_ha_list`,
   GET_DEVICE_HA_UNITS_BY_NAME_URL: `${PREFIX}/cm/get_device_ha_units`,
@@ -168,7 +170,7 @@
   GET_APV_VS_MONITORING_METRICS_URL: `${PREFIX}/apv/slb/virtual_stats`,
   GET_APV_RS_MONITORING_METRICS_URL: `${PREFIX}/apv/slb/real_stats`,
   GET_SSL_VPN_MONITORING_METRICS_URL: `${PREFIX}/ssl_vpn_stats`,
-  GET_SECONDARY_STORAGE_URL: `${PREFIX}/log/storage?type=secondary`,
+  GET_STORAGE_URL: `${PREFIX}/log/storage`,
   GET_STORAGE_CLEANUP_CONFIG_URL: `${PREFIX}/storage/crontab`,
   UPDATE_STORAGE_CLEANUP_CONFIG_URL: `${PREFIX}/storage/crontab`,
   GET_STORAGE_ALLOCATION_URL: `${PREFIX}/storage/allocation`,
@@ -176,6 +178,9 @@
   GET_LOGS_ARCHIVES_URL: `${PREFIX}/log/archives`,
   CREATE_LOGS_ARCHIVE_URL: `${PREFIX}/log/archive`,
   PERFORM_STORAGE_CLEANUP_URL: `${PREFIX}/storage/clean`,
+  UPDATE_LOG_LOCATION_URL: `${PREFIX}/log/location`,
+  GET_CLIENT_VERIFICATION_SETTINGS_URL: `${PREFIX}/proxy_req_dev/rest/loadbalancing/slb/ssl/SSLClientVerificationSettings`,
+  APV_CLI_EXTEND_URL: `${PREFIX}/proxy_req_dev/rest/apv/cli_extend`,
   // AVX
   GET_AVX_DEVICES_URL: `${PREFIX}/api/cm/virtualization/Host/_get_list_data`,
   ADD_AVX_DEVICE_URL: `${PREFIX}/api/cm/virtualization/Host/_add`,
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/chart-options.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/chart-options.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/chart-options.ts	(working copy)
@@ -77,6 +77,27 @@
     }
   }
 
+  pieChartOptions(label: any, values: any): EChartsOption {
+    return {
+      tooltip: {
+        trigger: 'item',
+        formatter: '{a} <br/>{b}: {c}'
+      },
+      series: [
+        {
+          name: label,
+          type: 'pie',
+          radius: ['30%', '50%'],
+          center: ['50%', '50%'],
+          itemStyle: {
+            borderRadius: 8
+          },
+          data: values
+        }
+      ]
+    }
+  }
+
   lineChartOptions(label: any, metrics: any): EChartsOption {
     return {
       tooltip: {
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	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.ts	(working copy)
@@ -298,8 +298,8 @@
     );
   }
 
-  updateSSLVHost(aGName: string, rawPayload: any) {
-    return this.http.put(URLS.UPDATE_DEVICE_VHOST_URL, rawPayload, {
+  updateSSLVHost(aGName: string, hostName: any, rawPayload: any) {
+    return this.http.put(`${URLS.UPDATE_DEVICE_VHOST_URL}/${hostName}/host_status`, rawPayload, {
         csrf: true,
         isFormData: true,
         csrfInFormData: true
@@ -377,6 +377,17 @@
       ]
     );
   }
+  importInterCACertificate(deviceName: string | null, rawPayload: any) {
+    return this.http.post(URLS.IMPORT_SSL_INTER_CA_CERTIFICATE_URL, rawPayload, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceName},
+        {name: 'Cm-Type', value: 'device'}
+      ]
+    );
+  }
 
   activateSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.ACTIVATE_SSL_CERTIFICATE_URL, rawPayload, {
@@ -414,6 +425,18 @@
     );
   }
 
+  deleteAPVSSLInterCACertificate(deviceName: string | null, rawPayload: any) {
+    return this.http.post(URLS.DELETE_SSL_INTER_CA_CERTIFICATE_URL, rawPayload, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceName},
+        {name: 'Cm-Type', value: 'device'}
+      ]
+    );
+  }
+
   downloadSSLCertificate(aGName: string | null, rawPayload: any) {
     return this.http.post(URLS.DOWNLOAD_SSL_VHOST_BACKUP_CERTIFICATE_URL, rawPayload, {
         csrf: true,
@@ -543,4 +566,40 @@
     });
     return metrics;
   }
+
+  getClientVerificationSettings(deviceId: any, hostName: any) {
+    return this.http.get(`${URLS.GET_CLIENT_VERIFICATION_SETTINGS_URL}/${hostName}`, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'device'}
+      ]
+    );
+  }
+
+  updateClientVerificationSettings(deviceId: any, hostName: any, options: any) {
+    return this.http.put(`${URLS.GET_CLIENT_VERIFICATION_SETTINGS_URL}/${hostName}`, options, {
+        csrf: true,
+        isFormData: false,
+        csrfInFormData: false
+      }, [
+        {name: 'Cm-Data', value: deviceId},
+        {name: 'Cm-Type', value: 'device'}
+      ]
+    );
+  }
+
+  executeAPVCLICommand(aGName: string, cmd: any) {
+    return this.http.post(URLS.APV_CLI_EXTEND_URL, {cmd: cmd}, {
+        csrf: true,
+        isFormData: true,
+        csrfInFormData: true
+      }, [
+        {name: 'Cm-Data', value: aGName},
+        {name: 'Cm-Type', value: 'device'}
+      ]
+    );
+  }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/system-service.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/system-service.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/system-service.ts	(working copy)
@@ -499,8 +499,8 @@
     });
   }
 
-  getSecondaryStorage() {
-    return this.http.get(URLS.GET_SECONDARY_STORAGE_URL);
+  getStorage(type: string) {
+    return this.http.get(`${URLS.GET_STORAGE_URL}?type=${type}`);
   }
 
   getStorageCleanupConfig(storage: string = 'primary') {
@@ -509,6 +509,14 @@
 
   getStorageAllocation() {
     return this.http.get(URLS.GET_STORAGE_ALLOCATION_URL);
+  }
+
+  updateLogLocation(payload: any) {
+    return this.http.post(URLS.UPDATE_LOG_LOCATION_URL, payload, {
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    });
   }
 
   getStorageQuery(payload: any) {
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts	(revision 2724)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/utils-service.ts	(working copy)
@@ -1,5 +1,6 @@
 import {Injectable} from '@angular/core';
 import {MatTableDataSource} from '@angular/material/table';
+import {BytesPipe} from '../pipes/bytes-pipe';
 
 export interface DeviceTypeStatus {
   connected: number;
@@ -255,4 +256,18 @@
     });
     return {total: totalStatus, types: typesStatus};
   }
+
+  convertBytesForChart(data: any[], precision: number = 2): any[] {
+    const bytesPipe = new BytesPipe();
+
+    return data.map(item => {
+      const formattedValue = bytesPipe.transform(item.value, precision);
+
+      return {
+        name: `${item.name} (${formattedValue})`,
+        value: item.value
+      };
+    });
+  }
+
 }
