Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/djproject/urls.py	(working copy)
@@ -75,6 +75,8 @@
     re_path(r'^ssl_vpn_stats(?:/(?P<path>.*))?$', handle_ssl_vpn_stats_req),
     re_path(r'^llb_stats(?:/(?P<path>.*))?$', handle_llb_stats_req),
     re_path(r"^report/(?P<path>log)/(?P<log_id>\d+)/?$", handle_report_generation),
+    re_path(r"^report/(?P<path>download)/(?P<filename>.*)$", handle_report_generation),
+    re_path(r"^report/(?P<path>generate)/(?P<report_id>\d+)/?$", handle_report_generation),
     re_path(r"^report/?$", handle_report_generation),
     re_path(r"^report/(?P<report_id>\d+)(?:/(?P<path>.*))?$", handle_report_generation),
     re_path(r"^report/(?P<path>.*)$", handle_report_generation),
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/time-filter/time-filter.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/time-filter/time-filter.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/common/time-filter/time-filter.ts	(working copy)
@@ -18,14 +18,32 @@
 
 import { MatButtonModule } from '@angular/material/button';
 import { MatIconModule } from '@angular/material/icon';
+import { DateAdapter, NativeDateAdapter } from '@angular/material/core';
+import { Injectable } from '@angular/core';
 
+@Injectable()
+export class CustomDateAdapter extends NativeDateAdapter {
+  override format(date: Date, displayFormat: Object): string {
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1).toString().padStart(2, '0');
+    const day = date.getDate().toString().padStart(2, '0');
+    const hours = date.getHours().toString().padStart(2, '0');
+    const minutes = date.getMinutes().toString().padStart(2, '0');
+    const seconds = date.getSeconds().toString().padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  }
+}
+
 @Component({
   selector: 'app-time-filter',
   standalone: true,
   imports: [SharedModule, NgxMatDatepickerToggle, MatButtonModule, MatIconModule],
   templateUrl: './time-filter.html',
   styleUrl: './time-filter.scss',
-  encapsulation: ViewEncapsulation.None // Enable global style overrides for dialog container
+  encapsulation: ViewEncapsulation.None, // Enable global style overrides for dialog container
+  providers: [
+    { provide: DateAdapter, useClass: CustomDateAdapter }
+  ]
 })
 export class TimeFilter implements OnInit {
 
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/edit-report-tasks.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/edit-report-tasks.html	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/edit-report-tasks.html	(working copy)
@@ -1,26 +1,16 @@
 <h2 mat-dialog-title>{{ isNew ? 'New' : 'Edit' }} Report Task</h2>
 <mat-dialog-content>
-  <form
-    (ngSubmit)="onSubmit()"
-    [formGroup]="configForm"
-    class="common-form"
-  >
+  <form (ngSubmit)="onSubmit()" [formGroup]="configForm" class="common-form">
     <div class="form-field-wrapper">
       <label for="taskName" class="form-label">Task name *</label>
       <mat-form-field appearance="outline" subscriptSizing="dynamic">
-        <input
-          id="taskName"
-          formControlName="taskName"
-          matInput
-          placeholder="Task name"
-          type="text"
-        />
+        <input id="taskName" formControlName="taskName" matInput placeholder="Task name" type="text" />
         @if (configForm.get('taskName')?.invalid && configForm.get('taskName')?.touched) {
-          <mat-error>
-            @if (configForm.get('taskName')?.errors?.['required']) {
-              Task name is required.
-            }
-          </mat-error>
+        <mat-error>
+          @if (configForm.get('taskName')?.errors?.['required']) {
+          Task name is required.
+          }
+        </mat-error>
         }
       </mat-form-field>
     </div>
@@ -29,54 +19,55 @@
       <mat-form-field appearance="outline" subscriptSizing="dynamic">
         <mat-select formControlName="stype" (selectionChange)="onSubjectTypeChange()">
           @for (_type of subjectTypes; track _type) {
-            <mat-option [value]="_type?.value">{{ _type?.label }}</mat-option>
+          <mat-option [value]="_type?.value">{{ _type?.label }}</mat-option>
           }
         </mat-select>
         @if (configForm.get('stype')?.invalid && configForm.get('stype')?.touched) {
-          <mat-error>
-            @if (configForm.get('stype')?.errors?.['required']) {
-              Subject type is required.
-            }
-          </mat-error>
+        <mat-error>
+          @if (configForm.get('stype')?.errors?.['required']) {
+          Subject type is required.
+          }
+        </mat-error>
         }
       </mat-form-field>
     </div>
-    @if (configForm.value.stype === 'service_status') {
-      <div class="form-field-wrapper">
-        <label for="deviceName" class="form-label">Device Name *</label>
-        <mat-form-field appearance="outline" subscriptSizing="dynamic">
-          <mat-select formControlName="deviceName" (selectionChange)="onDeviceChange()">
-            @for (_device of deviceNames; track _device) {
-              <mat-option [value]="_device">{{ _device.label }}</mat-option>
-            }
-          </mat-select>
-          @if (configForm.get('deviceName')?.invalid && configForm.get('deviceName')?.touched) {
-            <mat-error>
-              @if (configForm.get('deviceName')?.errors?.['required']) {
-                Device name is required.
-              }
-            </mat-error>
+
+    <div class="form-field-wrapper">
+      <label for="deviceIp" class="form-label">Device Name *</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic">
+        <mat-select formControlName="deviceIp" (selectionChange)="onDeviceChange()">
+          @for (_device of deviceNames; track _device) {
+          <mat-option [value]="_device?.ip">{{ _device.label }}</mat-option>
           }
-        </mat-form-field>
-      </div>
-    }
+        </mat-select>
+        @if (configForm.get('deviceIp')?.invalid && configForm.get('deviceIp')?.touched) {
+        <mat-error>
+          @if (configForm.get('deviceIp')?.errors?.['required']) {
+          Device name is required.
+          }
+        </mat-error>
+        }
+      </mat-form-field>
+    </div>
+    @if (configForm.value.stype === 'service_status') {
     <div class="form-field-wrapper">
       <label for="sname" class="form-label">Subject Name *</label>
       <mat-form-field appearance="outline" subscriptSizing="dynamic">
         <mat-select formControlName="sname">
-          @for (_name of subjectNames; track _name) {
-            <mat-option [value]="_name">{{ _name?.label }}</mat-option>
+          @for (_name of deviceServices; track _name) {
+          <mat-option [value]="_name">{{ _name }}</mat-option>
           }
         </mat-select>
         @if (configForm.get('sname')?.invalid && configForm.get('sname')?.touched) {
-          <mat-error>
-            @if (configForm.get('sname')?.errors?.['required']) {
-              Subject name is required.
-            }
-          </mat-error>
+        <mat-error>
+          @if (configForm.get('sname')?.errors?.['required']) {
+          Subject name is required.
+          }
+        </mat-error>
         }
       </mat-form-field>
     </div>
+    }
     <div class="form-field-wrapper">
       <label for="schedule" class="form-label">Onetime *</label>
       <mat-radio-group formControlName="schedule" aria-label="Schedule">
@@ -84,137 +75,85 @@
         <mat-radio-button value="2">Schedule</mat-radio-button>
       </mat-radio-group>
     </div>
-    @if (configForm.value.schedule == "1" && (configForm.value.stype == 'device_status' || configForm.value.stype == 'service_status')) {
-      <div class="form-field-wrapper">
-        <label for="start" class="form-label">Start Time</label>
+    @if (configForm.value.schedule == "1" && (configForm.value.stype == 'device_status' || configForm.value.stype ==
+    'service_status')) {
+    <div class="form-field-wrapper">
+      <label class="form-label">Time Range</label>
+      <mat-form-field appearance="outline" subscriptSizing="dynamic" (click)="openTimeFilter()"
+        style="cursor: pointer;">
+        <input matInput placeholder="Select time range" readonly
+          [value]="configForm.value.startTime ? (configForm.value.startTime + ' - ' + configForm.value.endTime) : ''">
+        <fa-icon matSuffix [icon]="['far', 'calendar']" style="margin-right: 12px;"></fa-icon>
+      </mat-form-field>
+    </div>
+    }
+    @if (configForm.value.schedule == "2") {
+    <div class="form-field-wrapper">
+      <label for="selectedHour" class="form-label">Execution Time</label>
+      <div class="time-select-container">
         <mat-form-field appearance="outline" subscriptSizing="dynamic">
-          <input
-            matInput
-            [ngxMatDatetimePicker]="startDatePicker"
-            placeholder="2025-01-01 00:00:00"
-            formControlName="startTime"
-          />
-          <ngx-mat-datepicker-toggle
-            matSuffix
-            [for]="startDatePicker"
-          ></ngx-mat-datepicker-toggle>
-          <ngx-mat-datetime-picker
-            #startDatePicker
-            [showSpinners]="true"
-            [showSeconds]="true"
-            [touchUi]="false"
-            [stepHour]="1"
-            [stepMinute]="1"
-            [stepSecond]="1"
-            [disableMinute]="false"
-          >
-            <mat-icon
-              ngxMatDatetimePickerToday
-              (click)="startDatePicker.close()"
-            >today
-            </mat-icon>
-          </ngx-mat-datetime-picker>
+          <mat-select formControlName="selectedHour" placeholder="HH">
+            @for (_value of hours; track _value) {
+            <mat-option [value]="_value">{{ _value | number: '2.0' }}</mat-option>
+            }
+          </mat-select>
         </mat-form-field>
+
+        <span class="time-separator">:</span>
+
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select formControlName="selectedMinute" placeholder="MM">
+            @for (_value of minutes; track _value) {
+            <mat-option [value]="_value">{{ _value | number: '2.0' }}</mat-option>
+            }
+          </mat-select>
+        </mat-form-field>
       </div>
-      <div class="form-field-wrapper">
-        <label for="end" class="form-label">End Time</label>
+    </div>
+    <div class="form-field-wrapper">
+      <label for="selectedFrequency" class="form-label">Execution Frequency</label>
+      <div class="time-select-container">
         <mat-form-field appearance="outline" subscriptSizing="dynamic">
-          <input
-            matInput
-            [ngxMatDatetimePicker]="endDatePicker"
-            placeholder="2025-01-01 00:00:00"
-            formControlName="endTime"
-          />
-          <ngx-mat-datepicker-toggle
-            matSuffix
-            [for]="endDatePicker"
-          ></ngx-mat-datepicker-toggle>
-          <ngx-mat-datetime-picker
-            #endDatePicker
-            [showSpinners]="true"
-            [showSeconds]="true"
-            [touchUi]="false"
-            [stepHour]="1"
-            [stepMinute]="1"
-            [stepSecond]="1"
-            [disableMinute]="false"
-          >
-            <mat-icon
-              ngxMatDatetimePickerToday
-              (click)="endDatePicker.close()"
-            >today
-            </mat-icon>
-          </ngx-mat-datetime-picker>
+          <mat-select formControlName="selectedFrequency" placeholder="Frequency">
+            @for (_value of frequency; track _value) {
+            <mat-option [value]="_value.value">{{ _value.label }}</mat-option>
+            }
+          </mat-select>
         </mat-form-field>
+        @if (configForm.value.selectedFrequency === 'weekly') {
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select formControlName="selectedFrequencyModule" placeholder="Days">
+            @for (_value of fullDaysOfWeek; track _value) {
+            <mat-option [value]="_value">{{ _value }}</mat-option>
+            }
+          </mat-select>
+        </mat-form-field>
+        } @else if (configForm.value.selectedFrequency === 'monthly') {
+        <mat-form-field appearance="outline" subscriptSizing="dynamic">
+          <mat-select formControlName="selectedFrequencyModule" placeholder="Days">
+            @for (_value of days; track _value) {
+            <mat-option [value]="_value">{{ _value }}</mat-option>
+            }
+          </mat-select>
+        </mat-form-field>
+        }
       </div>
+    </div>
     }
-    @if (configForm.value.schedule == "2") {
-      <div class="form-field-wrapper">
-        <label for="selectedHour" class="form-label">Execution Time</label>
-        <div class="time-select-container">
-          <mat-form-field appearance="outline" subscriptSizing="dynamic">
-            <mat-select formControlName="selectedHour" placeholder="HH">
-              @for (_value of hours; track _value) {
-                <mat-option [value]="_value">{{ _value | number: '2.0' }}</mat-option>
-              }
-            </mat-select>
-          </mat-form-field>
-
-          <span class="time-separator">:</span>
-
-          <mat-form-field appearance="outline" subscriptSizing="dynamic">
-            <mat-select formControlName="selectedMinute" placeholder="MM">
-              @for (_value of minutes; track _value) {
-                <mat-option [value]="_value">{{ _value | number: '2.0' }}</mat-option>
-              }
-            </mat-select>
-          </mat-form-field>
-        </div>
-      </div>
-      <div class="form-field-wrapper">
-        <label for="selectedFrequency" class="form-label">Execution Frequency</label>
-        <div class="time-select-container">
-          <mat-form-field appearance="outline" subscriptSizing="dynamic">
-            <mat-select formControlName="selectedFrequency" placeholder="Frequency">
-              @for (_value of frequency; track _value) {
-                <mat-option [value]="_value.value">{{ _value.label }}</mat-option>
-              }
-            </mat-select>
-          </mat-form-field>
-          @if (configForm.value.selectedFrequency === 'weekly') {
-            <mat-form-field appearance="outline" subscriptSizing="dynamic">
-              <mat-select formControlName="selectedFrequencyModule" placeholder="Days">
-                @for (_value of fullDaysOfWeek; track _value) {
-                  <mat-option [value]="_value">{{ _value }}</mat-option>
-                }
-              </mat-select>
-            </mat-form-field>
-          } @else if (configForm.value.selectedFrequency === 'monthly') {
-            <mat-form-field appearance="outline" subscriptSizing="dynamic">
-              <mat-select formControlName="selectedFrequencyModule" placeholder="Days">
-                @for (_value of days; track _value) {
-                  <mat-option [value]="_value">{{ _value }}</mat-option>
-                }
-              </mat-select>
-            </mat-form-field>
-          }
-        </div>
-      </div>
-    }
     <div class="form-field-wrapper">
       <label for="notificationChannel" class="form-label">Notification Channel</label>
       <mat-form-field appearance="outline" subscriptSizing="dynamic">
         <mat-select formControlName="notificationChannel">
           @for (_name of notificationChannels; track _name) {
-            <mat-option [value]="_name?.value">{{ _name?.label }}</mat-option>
+          <mat-option [value]="_name?.value">{{ _name?.label }}</mat-option>
           }
         </mat-select>
         @if (configForm.get('notificationChannel')?.invalid && configForm.get('notificationChannel')?.touched) {
-          <mat-error>
-            @if (configForm.get('notificationChannel')?.errors?.['required']) {
-              Recipient is required.
-            }
-          </mat-error>
+        <mat-error>
+          @if (configForm.get('notificationChannel')?.errors?.['required']) {
+          Recipient is required.
+          }
+        </mat-error>
         }
       </mat-form-field>
     </div>
@@ -226,16 +165,10 @@
   </form>
 </mat-dialog-content>
 <mat-dialog-actions>
-  <button
-    mat-button
-    color="basic"
-    (click)="onCancel()">
+  <button mat-button color="basic" (click)="onCancel()">
     Close
   </button>
-  <button
-    mat-button
-    color="basic"
-    (click)="onSubmit()">
+  <button mat-button color="basic" (click)="onSubmit()">
     Submit
   </button>
-</mat-dialog-actions>
+</mat-dialog-actions>
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.html	(working copy)
@@ -1,51 +1,83 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="createTask()">New Task</button> &nbsp;&nbsp;
-      <button mat-raised-button (click)="clearTasks()" class="warning">Clear All Reports</button> &nbsp;&nbsp;
-    </div>
-  </mat-card-header>
-</mat-card>
-<div class="table-container">
-  <div class="mat-elevation-z0">
-    <table mat-table [dataSource]="tasksDataSource">
-      <ng-container matColumnDef="serial">
-        <th mat-header-cell *matHeaderCellDef>SNo.</th>
-        <td mat-cell *matCellDef="let element">{{ element?.name }}</td>
-      </ng-container>
-      <ng-container matColumnDef="taskName">
-        <th mat-header-cell *matHeaderCellDef>Task Name</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="subject">
-        <th mat-header-cell *matHeaderCellDef>Subject</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="spec">
-        <th mat-header-cell *matHeaderCellDef>Created Time</th>
-        <td mat-cell *matCellDef="let element">{{ element?.path }}</td>
-      </ng-container>
-      <ng-container matColumnDef="status">
-        <th mat-header-cell *matHeaderCellDef>Status</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="nextRun">
-        <th mat-header-cell *matHeaderCellDef>Status</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="notification">
-        <th mat-header-cell *matHeaderCellDef>Action</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="action">
-        <th mat-header-cell *matHeaderCellDef>Status</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <tr mat-header-row *matHeaderRowDef="tasksColumns"></tr>
-      <tr mat-row *matRowDef="let row; columns: tasksColumns;"></tr>
-      <tr class="mat-row table-no-data" *matNoDataRow>
-        <td class="mat-cell" colspan="9">No results found.</td>
-      </tr>
-    </table>
-  </div>
-</div>
+<div class="avx-tab-content-container">
+  <mat-card class="page-card-1" appearance="outlined">
+    <mat-card-header>
+      <mat-card-title>Report Tasks</mat-card-title>
+    </mat-card-header>
+    <mat-card-content>
+      <div class="logs-toolbar">
+        <div class="filter-group">
+          <button mat-flat-button color="primary" (click)="createTask()">
+            <fa-icon [icon]="['fas', 'plus']"></fa-icon> &nbsp; New Task
+          </button>
+        </div>
+        <!-- <div>
+          <button mat-raised-button (click)="clearTasks()" class="warning">Clear All Tasks</button>
+        </div> -->
+      </div>
+
+      <div class="table-container">
+        <div class="mat-elevation-z0">
+          <table mat-table [dataSource]="tasksDataSource" class="modern-table">
+            <ng-container matColumnDef="serial">
+              <th mat-header-cell *matHeaderCellDef>SNo.</th>
+              <td mat-cell *matCellDef="let element; let i = index">{{ i + 1 }}</td>
+            </ng-container>
+            <ng-container matColumnDef="taskName">
+              <th mat-header-cell *matHeaderCellDef>Task Name</th>
+              <td mat-cell *matCellDef="let element">{{ element?.name }}</td>
+            </ng-container>
+            <ng-container matColumnDef="subject">
+              <th mat-header-cell *matHeaderCellDef>Subject</th>
+              <td mat-cell *matCellDef="let element">{{ element?.subject_name }}</td>
+            </ng-container>
+            <ng-container matColumnDef="spec">
+              <th mat-header-cell *matHeaderCellDef>Specification</th>
+              <td mat-cell *matCellDef="let element">{{ element?.schedule_spec }}</td>
+            </ng-container>
+            <ng-container matColumnDef="status">
+              <th mat-header-cell *matHeaderCellDef>Status</th>
+              <td mat-cell *matCellDef="let element">
+                <span class="log-badge" [ngClass]="element.status ? 'info' : 'warning'">
+                  {{ element.status ? 'Active' : 'Inactive' }}
+                </span>
+              </td>
+            </ng-container>
+            <ng-container matColumnDef="nextRun">
+              <th mat-header-cell *matHeaderCellDef>Next Run Time</th>
+              <td mat-cell *matCellDef="let element" class="timestamp-cell">{{ element?.next_run_time }}</td>
+            </ng-container>
+            <ng-container matColumnDef="notification">
+              <th mat-header-cell *matHeaderCellDef>Notification</th>
+              <td mat-cell *matCellDef="let element">{{ element?.email_list }}</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', 'play']" size="lg" matTooltip="Generate Report"
+                    (click)="generateReport(element)"></fa-icon>
+                  &nbsp;&nbsp;
+                  <fa-icon [icon]="['far', 'edit']" size="lg" matTooltip="Edit Task"
+                    (click)="editTask(element)"></fa-icon>
+                  &nbsp;&nbsp;
+                  <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete Task"
+                    (click)="deleteTask(element)"></fa-icon>
+                </div>
+              </td>
+            </ng-container>
+            <tr mat-header-row *matHeaderRowDef="tasksColumns"></tr>
+            <tr mat-row *matRowDef="let row; columns: tasksColumns;"></tr>
+            <tr class="mat-row" *matNoDataRow>
+              <td class="mat-cell no-data-cell" colspan="9">
+                <div class="no-data-content">
+                  <fa-icon [icon]="['far', 'calendar-check']"></fa-icon>
+                  <span>No tasks found</span>
+                </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </mat-card-content>
+  </mat-card>
+</div>
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.scss	(working copy)
@@ -0,0 +1,136 @@
+.avx-tab-content-container {
+    padding: 16px;
+    background-color: transparent;
+}
+
+.page-card-1 {
+    width: 100%;
+    border-radius: 8px;
+    background-color: white;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+
+    mat-card-header {
+        background-color: rgba(0, 0, 0, 0.01);
+        border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+        padding: 16px;
+
+        mat-card-title {
+            font-size: 16px;
+            font-weight: 600;
+            color: #1170cf;
+        }
+    }
+
+    mat-card-content {
+        padding: 0;
+    }
+}
+
+.logs-toolbar {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.filter-group {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+}
+
+.modern-table {
+    width: 100%;
+
+    th.mat-header-cell {
+        font-size: 13px;
+        font-weight: 600;
+        color: #444;
+        background-color: #fafafa;
+        border-bottom: 1px solid #eee;
+        padding: 16px;
+    }
+
+    td.mat-cell {
+        font-size: 13px;
+        color: #333;
+        padding: 12px 16px;
+        border-bottom: 1px solid #f0f0f0;
+    }
+
+    tr.mat-row:hover {
+        background-color: #f9f9f9;
+
+        @media (prefers-color-scheme: dark) {
+            background-color: rgba(255, 255, 255, 0.05);
+        }
+    }
+
+    .timestamp-cell {
+        white-space: nowrap;
+        color: #666;
+    }
+
+    .row-action {
+        cursor: pointer;
+        color: #5f6368;
+
+        fa-icon {
+            &:hover {
+                color: #1976d2; // Primary blue for edit/details
+            }
+
+            &.delete-icon:hover {
+                color: #d93025; // Red for delete
+            }
+        }
+    }
+}
+
+.log-badge {
+    padding: 2px 8px;
+    border-radius: 4px;
+    font-size: 11px;
+    font-weight: 600;
+    text-transform: uppercase;
+
+    &.info {
+        background-color: #e3f2fd;
+        color: #1976d2;
+    }
+
+    &.warning {
+        background-color: #fff3e0;
+        color: #ef6c00;
+    }
+
+    &.error {
+        background-color: #ffebee;
+        color: #d32f2f;
+    }
+}
+
+.no-data-cell {
+    padding: 40px !important;
+    text-align: center;
+    background-color: #f9f9f9;
+
+    .no-data-content {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        gap: 12px;
+        color: #9e9e9e;
+
+        fa-icon {
+            font-size: 32px;
+            opacity: 0.5;
+        }
+
+        span {
+            font-size: 14px;
+            font-weight: 500;
+        }
+    }
+}
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/report-tasks/report-tasks.ts	(working copy)
@@ -1,12 +1,14 @@
-import {Component, inject, OnInit} from '@angular/core';
-import {SharedModule} from '../../../shared/shared-module';
-import {MatTableDataSource} from '@angular/material/table';
-import {MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef} from '@angular/material/dialog';
-import {FormBuilder, FormGroup, Validators} from '@angular/forms';
-import {NgxMatDatepickerToggle} from '@ngxmc/datetime-picker';
-import {take} from 'rxjs/operators';
-import {DeviceService} from '../../../services/device-service';
-import {NotificationService} from '../../../services/notification';
+import { Component, inject, Injectable, OnInit } from '@angular/core';
+import { SharedModule } from '../../../shared/shared-module';
+import { MatTableDataSource } from '@angular/material/table';
+import { MAT_DIALOG_DATA, MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { take } from 'rxjs/operators';
+import { DeviceService } from '../../../services/device-service';
+import { NotificationService } from '../../../services/notification';
+import { DateAdapter, NativeDateAdapter } from '@angular/material/core';
+import { TimeFilter } from '../../common/time-filter/time-filter';
+import { Confirmation } from '../../../services/confirmation';
 
 @Component({
   selector: 'app-report-tasks',
@@ -20,27 +22,136 @@
   dialog = inject(MatDialog);
   dialogConfig = new MatDialogConfig();
 
-  constructor() {
+  constructor(
+    private _device: DeviceService,
+    private _notification: NotificationService,
+    private _confirmation: Confirmation,
+  ) {
   }
 
+  ngOnInit() {
+    setTimeout(() => {
+      this.getReportTasks();
+    })
+  }
+
+  reports: any = [];
+  getReportTasks() {
+    this.reports = []
+    this._device.getReportTasks()
+      .pipe(take(1))
+      .subscribe({
+        next: (data: any) => {
+          if (data && data.reports && data.reports.length > 0) {
+            this.reports = data.reports;
+            this.tasksDataSource.data = this.reports;
+          }
+        },
+        error: error => {
+          console.log(error);
+          this._notification.showError(error.message);
+        }
+      });
+  }
+
   createTask(): void {
     this.dialogConfig.data = {};
     this.dialogConfig.disableClose = true;
     const dialogRef = this.dialog.open(EditReportTasksDialog, this.dialogConfig);
     dialogRef.afterClosed().subscribe((isUpdated: boolean) => {
       if (isUpdated) {
+        this.getReportTasks();
       }
     })
   }
 
   clearTasks(): void {
   }
+
+  editTask(task: any): void {
+    this.dialogConfig.data = task;
+    this.dialogConfig.disableClose = true;
+    const dialogRef = this.dialog.open(EditReportTasksDialog, this.dialogConfig);
+    dialogRef.afterClosed().subscribe((isUpdated: boolean) => {
+      if (isUpdated) {
+        this.getReportTasks();
+      }
+    })
+  }
+
+  deleteTask(task: any): void {
+    let confirmMsg = `Are you sure you want to permanently delete "${task.name}"? This action cannot be undone.`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${task.name}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Delete',
+      cancelButtonText: 'Cancel',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        this._device.deleteReportTask(task.id)
+          .pipe(take(1))
+          .subscribe({
+            next: (data: any) => {
+              this._notification.showSuccess('Report task deleted successfully');
+              this.getReportTasks();
+            },
+            error: error => {
+              console.log(error);
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    })
+  }
+
+  generateReport(task: any): void {
+    this._device.createReport(task.id, {})
+      .pipe(take(1))
+      .subscribe({
+        next: (data: any) => {
+          this._notification.showSuccess('Report generated successfully');
+        },
+        error: error => {
+          console.log(error);
+          this._notification.showError(error.message);
+        }
+      });
+  }
 }
 
 @Component({
   selector: 'edit-report-tasks',
-  imports: [SharedModule, NgxMatDatepickerToggle],
+  imports: [SharedModule],
   templateUrl: './edit-report-tasks.html',
+  styles: [`
+    .form-field-wrapper {
+        margin-bottom: 12px;
+    }
+    .form-label {
+        display: block;
+        margin-bottom: 6px;
+        font-weight: 500;
+        font-size: 14px;
+    }
+    /* Centre the suffix icon vertically */
+    ::ng-deep .mat-mdc-form-field-icon-suffix {
+        display: flex !important;
+        align-items: center !important;
+        justify-content: center !important;
+    }
+    
+    fa-icon {
+        display: flex;
+        align-items: center;
+    }
+
+    mat-form-field {
+        width: 100%;
+    }
+  `],
+  providers: []
 })
 export class EditReportTasksDialog implements OnInit {
 
@@ -50,29 +161,30 @@
   readonly dialogRef = inject(MatDialogRef<EditReportTasksDialog>);
 
   subjectTypes: any = [
-    {label: 'Device Patrol', value: 'device_patrol'},
-    {label: 'Automatic Diagnose', value: 'automatic_diagnose'},
-    {label: 'Device Status', value: 'device_status'},
-    {label: 'Service Status', value: 'service_status'},
+    // { label: 'Device Patrol', value: 'device_patrol' },
+    // { label: 'Automatic Diagnose', value: 'automatic_diagnose' },
+    { label: 'Device Status', value: 'device_status' },
+    { label: 'Service Status', value: 'service_status' },
   ]
 
   subjectNamesRepo: any = {
     'device_patrol': [
-      {label: 'Server Load Balance', value: 'slb'},
-      {label: 'SSL VPN', value: 'ssl_vpn'},
+      { label: 'Server Load Balance', value: 'slb' },
+      { label: 'SSL VPN', value: 'ssl_vpn' },
     ],
     'automatic_diagnose': [
-      {label: 'Server Load Balance', value: 'slb'},
+      { label: 'Server Load Balance', value: 'slb' },
     ],
     'device_status': [],
     'service_status': []
   };
 
   subjectNames: any = [
-    {label: 'Server Load Balance', value: 'slb'},
-    {label: 'SSL VPN', value: 'ssl_vpn'},
+    { label: 'Server Load Balance', value: 'slb' },
+    { label: 'SSL VPN', value: 'ssl_vpn' },
   ]
 
+
   deviceNames: any = [];
 
   devices: any = [];
@@ -92,9 +204,9 @@
     'Saturday'
   ];
   public frequency: any = [
-    {label: 'Daily', value: 'daily'},
-    {label: 'Weekly', value: 'weekly'},
-    {label: 'Monthly', value: 'monthly'},
+    { label: 'Daily', value: 'daily' },
+    { label: 'Weekly', value: 'weekly' },
+    { label: 'Monthly', value: 'monthly' },
   ];
   deviceServices: any[] = [];
 
@@ -102,15 +214,16 @@
     private _fB: FormBuilder,
     private _device: DeviceService,
     private _notification: NotificationService,
+    private _dialog: MatDialog,
   ) {
     this.configForm = this._fB.group({
       taskName: ['', Validators.required],
       stype: ['device_patrol', Validators.required],
-      deviceName: [''],
+      deviceIp: [''],
       sname: ['slb', Validators.required],
       schedule: ['1', Validators.required],
-      startTime: [''],
-      endTime: [''],
+      startTime: ['now-15m'],
+      endTime: ['now'],
       notificationChannel: [''],
       selectedHour: [0],
       selectedMinute: [0],
@@ -129,6 +242,23 @@
     for (let i = 1; i <= 31; i++) {
       this.days.push(i);
     }
+
+    if (this.data && this.data.id) {
+      this.isNew = false;
+      this.configForm.patchValue({
+        taskName: this.data.name,
+        stype: this.data.subject_type,
+        sname: this.data.subject_name,
+        deviceIp: this.data.device_ip,
+        startTime: this.data.from_time,
+        endTime: this.data.to_time,
+      });
+
+      this.onSubjectTypeChange();
+      if (this.data.device_ip) {
+        this.onDeviceChange();
+      }
+    }
   }
 
   getConnectedDevices(): void {
@@ -137,8 +267,15 @@
       .pipe(take(1))
       .subscribe({
         next: (data: any) => {
-          this.devices = data.devices;
+          this.devices = data.devices.filter((device: any) => device.type === 'APV' || device.type === 'vAPV');
           if (this.configForm.value.stype === 'device_status') {
+            this.deviceNames = this.devices.map((device: any) => {
+              return {
+                ...device,
+                label: device.name,
+                value: device.name,
+              }
+            });
             this.subjectNames = this.devices.map((device: any) => {
               return {
                 ...device,
@@ -164,23 +301,26 @@
   }
 
   onDeviceChange() {
-    this.deviceServices = [];
-    let _device: any = this.configForm.value.deviceName;
-    let payload: any = {
-      "serviceType": "virtualService",
-      "device_ip": _device?.ip,
+    if (this.configForm.value.stype === 'service_status') {
+      console.log(this.configForm.value.deviceIp);
+      this.deviceServices = [];
+      let _device_ip: any = this.configForm.value.deviceIp;
+      let payload: any = {
+        "serviceType": "virtualService",
+        "device_ip": _device_ip,
+      }
+      this.getAPVServices(payload);
+      payload = {
+        "serviceType": "realService",
+        "device_ip": _device_ip,
+      }
+      this.getAPVServices(payload);
+      payload = {
+        "serviceType": "LLB",
+        "device_ip": _device_ip,
+      }
+      this.getAPVServices(payload);
     }
-    this.getAPVServices(payload);
-    payload = {
-      "serviceType": "realService",
-      "device_ip": _device?.ip,
-    }
-    this.getAPVServices(payload);
-    payload = {
-      "serviceType": "LLB",
-      "device_ip": _device?.ip,
-    }
-    this.getAPVServices(payload);
   }
 
   getAPVServices(payload: any) {
@@ -189,7 +329,7 @@
       .subscribe({
         next: (result: any) => {
           let services = result.services;
-          this.deviceServices = [...services]
+          this.deviceServices = [...this.deviceServices, ...services]
         },
         error: (error: any) => {
           this._notification.showError(error.message);
@@ -235,7 +375,7 @@
   }
 
   getAPVLLBServices(_device: any) {
-    let payload = {agent_host: _device?.ip, stat_name: 'summary_data'}
+    let payload = { agent_host: _device?.ip, stat_name: 'summary_data' }
     this._device.getLLBMonitoringMetrics(payload)
       .pipe(take(1))
       .subscribe({
@@ -267,9 +407,88 @@
   }
 
   onSubmit(): void {
+    if (this.configForm.invalid) {
+      console.log(this.configForm.value);
+      this.configForm.markAllAsTouched();
+      return;
+    }
+    let payload = {
+      name: this.configForm.value.taskName,
+      subject_type: this.configForm.value.stype,
+      subject_name: this.configForm.value.sname,
+      device_ip: this.configForm.value.deviceIp,
+      from_time: this.configForm.value.startTime,
+      to_time: this.configForm.value.endTime,
+    };
+    if (this.isNew) {
+      this._device.createReportTask(payload)
+        .pipe(take(1))
+        .subscribe({
+          next: (result: any) => {
+            this._notification.showSuccess('Report task created successfully');
+            this.dialogRef.close(true);
+          },
+          error: (error: any) => {
+            this._notification.showError(error.message);
+          }
+        })
+    } else {
+      this._device.updateReportTask(this.data.id, payload)
+        .pipe(take(1))
+        .subscribe({
+          next: (result: any) => {
+            this._notification.showSuccess('Report task updated successfully');
+            this.dialogRef.close(true);
+          },
+          error: (error: any) => {
+            this._notification.showError(error.message);
+          }
+        })
+    }
   }
 
   onCancel(): void {
     this.dialogRef.close(false);
   }
+
+  openTimeFilter(): void {
+    const dialogRef = this._dialog.open(TimeFilter, {
+      width: 'auto',
+      maxWidth: '95vw',
+      panelClass: 'custom-dialog-container',
+      data: {
+        initialFrom: this.configForm.value.startTime || 'now-15m',
+        initialTo: this.configForm.value.endTime || 'now',
+        initialInterval: 0
+      }
+    });
+
+    dialogRef.componentInstance.applyRange.subscribe((result: any) => {
+      if (result) {
+        // Update form controls
+        this.configForm.patchValue({
+          startTime: result.from,
+          endTime: result.to
+        });
+
+        // If we want to force formatting to string for display:
+        if (result.from instanceof Date) {
+          this.configForm.patchValue({ startTime: this.formatDate(result.from) });
+        }
+        if (result.to instanceof Date) {
+          this.configForm.patchValue({ endTime: this.formatDate(result.to) });
+        }
+      }
+    });
+  }
+
+  formatDate(date: Date): string {
+    const year = date.getFullYear();
+    const month = (date.getMonth() + 1).toString().padStart(2, '0');
+    const day = date.getDate().toString().padStart(2, '0');
+    const hours = date.getHours().toString().padStart(2, '0');
+    const minutes = date.getMinutes().toString().padStart(2, '0');
+    const seconds = date.getSeconds().toString().padStart(2, '0');
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.html	(working copy)
@@ -1 +1,61 @@
-<p>reports-customization works!</p>
+<div class="avx-tab-content-container">
+    <mat-card class="page-card-1" appearance="outlined">
+        <mat-card-header>
+            <mat-card-title>Report Settings</mat-card-title>
+        </mat-card-header>
+        <mat-card-content>
+            <form [formGroup]="configForm" class="config-form" (ngSubmit)="saveSettings()">
+                <!-- Logo Upload Section -->
+                <div class="form-section">
+                    <label class="section-label">Report Logo</label>
+                    <div class="logo-upload-container">
+                        <div class="current-logo">
+                            @if (logoPreview) {
+                            <img [src]="logoPreview" alt="Report Logo">
+                            } @else {
+                            <div class="logo-placeholder">
+                                <fa-icon [icon]="['fas', 'image']"></fa-icon>
+                                <span>No Logo Uploaded</span>
+                            </div>
+                            }
+                        </div>
+                        <div class="upload-actions">
+                            <input type="file" id="logoInput" (change)="onFileSelected($event)" accept="image/*" hidden>
+                            <button mat-stroked-button color="primary" type="button" (click)="triggerFileInput()">
+                                <fa-icon [icon]="['fas', 'upload']"></fa-icon> &nbsp; Upload New Logo
+                            </button>
+                            <span class="helper-text">Recommended size: 200x50px. Max size: 2MB.</span>
+                        </div>
+                    </div>
+                </div>
+
+                <mat-divider></mat-divider>
+
+                <!-- General Settings -->
+                <div class="form-section">
+                    <label class="section-label">General Configuration</label>
+                    <div class="form-row">
+                        <mat-form-field appearance="outline" class="full-width" subscriptSizing="dynamic">
+                            <mat-label>Report Title</mat-label>
+                            <input matInput formControlName="reportTitle" placeholder="e.g. Monthly System Status">
+                        </mat-form-field>
+                    </div>
+
+                    <div class="form-row">
+                        <mat-form-field appearance="outline" class="full-width" subscriptSizing="dynamic">
+                            <mat-label>Footer Text</mat-label>
+                            <textarea matInput formControlName="footerText" rows="3"
+                                placeholder="e.g. Confidential - Internal Use Only"></textarea>
+                        </mat-form-field>
+                    </div>
+                </div>
+
+                <!-- Action Buttons -->
+                <div class="form-actions">
+                    <button mat-raised-button color="primary" type="submit">Save Changes</button> &nbsp;
+                    <button mat-button type="button" (click)="resetSettings()">Reset Defaults</button>
+                </div>
+            </form>
+        </mat-card-content>
+    </mat-card>
+</div>
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.scss	(working copy)
@@ -0,0 +1,113 @@
+.avx-tab-content-container {
+    padding: 16px;
+    background-color: transparent;
+}
+
+.page-card-1 {
+    width: 100%;
+    border-radius: 8px;
+    background-color: white;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+
+    mat-card-header {
+        background-color: rgba(0, 0, 0, 0.01);
+        border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+        padding: 16px;
+
+        mat-card-title {
+            font-size: 16px;
+            font-weight: 600;
+            color: #1170cf;
+        }
+    }
+
+    mat-card-content {
+        padding: 24px;
+    }
+}
+
+.config-form {
+    display: flex;
+    flex-direction: column;
+    gap: 32px;
+    max-width: 800px; // Limit line length for readability
+}
+
+.form-section {
+    display: flex;
+    flex-direction: column;
+    gap: 16px;
+}
+
+.section-label {
+    font-size: 14px;
+    font-weight: 600;
+    color: #444;
+    margin-bottom: 8px;
+    display: block;
+}
+
+.logo-upload-container {
+    display: flex;
+    align-items: center;
+    gap: 24px;
+    padding: 24px;
+    border: 1px dashed #d0d0d0;
+    border-radius: 8px;
+    background-color: #fafafa;
+
+    .current-logo {
+        width: 200px;
+        height: 60px;
+        background-color: white;
+        border: 1px solid #ddd;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border-radius: 4px;
+
+        .logo-placeholder {
+            display: flex;
+            flex-direction: column;
+            align-items: center;
+            gap: 4px;
+            color: #bbb;
+            font-size: 11px;
+
+            fa-icon {
+                font-size: 16px;
+            }
+        }
+
+        img {
+            max-width: 100%;
+            max-height: 100%;
+            object-fit: contain;
+        }
+    }
+
+    .upload-actions {
+        display: flex;
+        flex-direction: column;
+        gap: 8px;
+
+        .helper-text {
+            font-size: 11px;
+            color: #777;
+        }
+    }
+}
+
+.form-row {
+    width: 100%;
+}
+
+.full-width {
+    width: 100%;
+}
+
+.form-actions {
+    margin-top: 16px;
+    display: flex;
+    align-items: center;
+}
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-customization/reports-customization.ts	(working copy)
@@ -1,11 +1,81 @@
-import { Component } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
+import { SharedModule } from '../../../shared/shared-module';
+import { FormBuilder, FormGroup } from '@angular/forms';
+import { NotificationService } from '../../../services/notification';
 
 @Component({
   selector: 'app-reports-customization',
-  imports: [],
+  imports: [SharedModule],
   templateUrl: './reports-customization.html',
   styleUrl: './reports-customization.scss'
 })
-export class ReportsCustomization {
+export class ReportsCustomization implements OnInit {
 
+  configForm: FormGroup;
+  logoPreview: string | ArrayBuffer | null = null;
+  selectedFile: File | null = null;
+
+  constructor(
+    private _fb: FormBuilder,
+    private _notification: NotificationService
+  ) {
+    this.configForm = this._fb.group({
+      reportTitle: [''],
+      footerText: ['']
+    });
+  }
+
+  ngOnInit(): void {
+    // TODO: Load existing settings from backend
+  }
+
+  onFileSelected(event: any): void {
+    const file = event.target.files[0];
+    if (file) {
+      if (file.size > 2 * 1024 * 1024) { // 2MB limit
+        this._notification.showError('File size exceeds 2MB limit.');
+        return;
+      }
+      this.selectedFile = file;
+
+      const reader = new FileReader();
+      reader.onload = () => {
+        this.logoPreview = reader.result;
+      };
+      reader.readAsDataURL(file);
+    }
+  }
+
+  triggerFileInput(): void {
+    const fileInput = document.getElementById('logoInput') as HTMLElement;
+    fileInput.click();
+  }
+
+  saveSettings(): void {
+    if (this.configForm.invalid) {
+      return;
+    }
+    const formData = new FormData();
+    formData.append('title', this.configForm.get('reportTitle')?.value);
+    formData.append('footer', this.configForm.get('footerText')?.value);
+    if (this.selectedFile) {
+      formData.append('logo', this.selectedFile);
+    }
+
+    console.log('Saving settings:', {
+      title: this.configForm.get('reportTitle')?.value,
+      footer: this.configForm.get('footerText')?.value,
+      file: this.selectedFile?.name
+    });
+
+    // TODO: content-type mulitpart/form-data call to backend
+    this._notification.showSuccess('Settings saved successfully (Simulation)');
+  }
+
+  resetSettings(): void {
+    this.configForm.reset();
+    this.logoPreview = null;
+    this.selectedFile = null;
+    this._notification.showSuccess('Settings reset to defaults');
+  }
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.html	(working copy)
@@ -1,47 +1,69 @@
-<mat-card class="page-card-1" appearance="filled">
-  <mat-card-header>
-    <div>
-      <button mat-raised-button (click)="clearReports()" class="warning">Clear All Reports</button> &nbsp;&nbsp;
-    </div>
-  </mat-card-header>
-</mat-card>
-<div class="table-container">
-  <div class="mat-elevation-z0">
-    <table mat-table [dataSource]="reportsDataSource">
-      <ng-container matColumnDef="serial">
-        <th mat-header-cell *matHeaderCellDef>SNo.</th>
-        <td mat-cell *matCellDef="let element">{{ element?.name }}</td>
-      </ng-container>
-      <ng-container matColumnDef="ctime">
-        <th mat-header-cell *matHeaderCellDef>Created Time</th>
-        <td mat-cell *matCellDef="let element">{{ element?.path }}</td>
-      </ng-container>
-      <ng-container matColumnDef="taskName">
-        <th mat-header-cell *matHeaderCellDef>Task Name</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="subject">
-        <th mat-header-cell *matHeaderCellDef>Subject</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="status">
-        <th mat-header-cell *matHeaderCellDef>Status</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <ng-container matColumnDef="action">
-        <th mat-header-cell *matHeaderCellDef>Action</th>
-        <td mat-cell *matCellDef="let element">{{ element?.size }}</td>
-      </ng-container>
-      <tr mat-header-row *matHeaderRowDef="reportsColumns"></tr>
-      <tr mat-row *matRowDef="let row; columns: reportsColumns;"></tr>
-      <tr class="mat-row" *matNoDataRow>
-        <td class="mat-cell no-data-cell" colspan="6">
-          <div class="no-data-content">
-            <fa-icon [icon]="['far', 'chart-bar']"></fa-icon>
-            <span>No data available</span>
-          </div>
-        </td>
-      </tr>
-    </table>
-  </div>
+<div class="avx-tab-content-container">
+  <mat-card class="page-card-1" appearance="outlined">
+    <mat-card-header>
+      <mat-card-title>Reports Log</mat-card-title>
+    </mat-card-header>
+    <mat-card-content>
+      <!-- <div class="logs-toolbar">
+        <div class="filter-group">
+        </div>
+        <div>
+          <button mat-raised-button (click)="clearReports()" class="warning">Clear All Reports</button>
+        </div>
+      </div> -->
+
+      <div class="table-container">
+        <div class="mat-elevation-z0">
+          <table mat-table [dataSource]="reportsDataSource" class="modern-table">
+            <ng-container matColumnDef="serial">
+              <th mat-header-cell *matHeaderCellDef>SNo.</th>
+              <td mat-cell *matCellDef="let element; let i = index">{{ i + 1 }}</td>
+            </ng-container>
+            <ng-container matColumnDef="ctime">
+              <th mat-header-cell *matHeaderCellDef>Created Time</th>
+              <td mat-cell *matCellDef="let element" class="timestamp-cell">{{ element?.start_time }}</td>
+            </ng-container>
+            <ng-container matColumnDef="taskName">
+              <th mat-header-cell *matHeaderCellDef>Type</th>
+              <td mat-cell *matCellDef="let element">{{ element?.subject_type | uppercase }}</td>
+            </ng-container>
+            <ng-container matColumnDef="subject">
+              <th mat-header-cell *matHeaderCellDef>Subject</th>
+              <td mat-cell *matCellDef="let element" class="message-cell">{{ element?.subject_name | uppercase }}</td>
+            </ng-container>
+            <ng-container matColumnDef="status">
+              <th mat-header-cell *matHeaderCellDef>Status</th>
+              <td mat-cell *matCellDef="let element">
+                <span class="log-badge" [ngClass]="element.status ? 'info' : 'error'">
+                  {{ element.status ? 'Success' : 'Failed' }}
+                </span>
+              </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', 'download']" size="lg" matTooltip="Download Report"
+                    (click)="element.status ? downloadReport(element) : null"
+                    [style.visibility]="element.status ? 'visible' : 'hidden'"></fa-icon> &nbsp;&nbsp;
+                  <fa-icon [icon]="['far', 'trash-can']" size="lg" class="delete-icon" matTooltip="Delete Report"
+                    (click)="deleteReport(element)"></fa-icon>
+                </div>
+              </td>
+            </ng-container>
+            <tr mat-header-row *matHeaderRowDef="reportsColumns"></tr>
+            <tr mat-row *matRowDef="let row; columns: reportsColumns;"></tr>
+            <tr class="mat-row" *matNoDataRow>
+              <td class="mat-cell no-data-cell" colspan="6">
+                <div class="no-data-content">
+                  <fa-icon [icon]="['far', 'chart-bar']"></fa-icon>
+                  <span>No reports found</span>
+                </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+    </mat-card-content>
+  </mat-card>
 </div>
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.scss	(working copy)
@@ -0,0 +1,151 @@
+.avx-tab-content-container {
+    padding: 16px;
+    background-color: transparent;
+}
+
+.page-card-1 {
+    width: 100%;
+    border-radius: 8px;
+    background-color: white;
+    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+
+    mat-card-header {
+        background-color: rgba(0, 0, 0, 0.01);
+        border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+        padding: 16px;
+
+        mat-card-title {
+            font-size: 16px;
+            font-weight: 600;
+            color: #1170cf;
+        }
+    }
+
+    mat-card-content {
+        padding: 0;
+    }
+}
+
+.logs-toolbar {
+    padding: 16px;
+    border-bottom: 1px solid #f0f0f0;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+
+.filter-group {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+}
+
+.filter-label {
+    font-size: 13px;
+    font-weight: 500;
+    color: #555;
+}
+
+.modern-table {
+    width: 100%;
+
+    th.mat-header-cell {
+        font-size: 13px;
+        font-weight: 600;
+        color: #444;
+        background-color: #fafafa;
+        border-bottom: 1px solid #eee;
+        padding: 16px;
+    }
+
+    td.mat-cell {
+        font-size: 13px;
+        color: #333;
+        padding: 12px 16px;
+        border-bottom: 1px solid #f0f0f0;
+    }
+
+    tr.mat-row:hover {
+        background-color: #f9f9f9;
+
+        @media (prefers-color-scheme: dark) {
+            background-color: rgba(255, 255, 255, 0.05);
+        }
+    }
+
+    .message-cell {
+        white-space: pre-wrap;
+        max-width: 500px;
+    }
+
+    .timestamp-cell {
+        white-space: nowrap;
+        color: #666;
+    }
+
+    .row-action {
+        cursor: pointer;
+        color: #5f6368;
+        display: flex;
+        gap: 12px;
+        align-items: center;
+
+        fa-icon {
+            &:hover {
+                color: #1976d2; // Primary blue for edit/details
+            }
+
+            &.delete-icon:hover {
+                color: #d93025; // Red for delete
+            }
+        }
+    }
+}
+
+.log-badge {
+    padding: 2px 8px;
+    border-radius: 4px;
+    font-size: 11px;
+    font-weight: 600;
+    text-transform: uppercase;
+
+    &.info {
+        background-color: #e3f2fd;
+        color: #1976d2;
+    }
+
+    &.error {
+        background-color: #ffebee;
+        color: #d32f2f;
+    }
+}
+
+.table-no-data {
+    text-align: center;
+    font-style: italic;
+    color: #999;
+}
+
+.no-data-cell {
+    padding: 40px !important;
+    text-align: center;
+    background-color: #f9f9f9;
+
+    .no-data-content {
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        gap: 12px;
+        color: #9e9e9e;
+
+        fa-icon {
+            font-size: 32px;
+            opacity: 0.5;
+        }
+
+        span {
+            font-size: 14px;
+            font-weight: 500;
+        }
+    }
+}
\ No newline at end of file
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/components/sub-components/reports-overview/reports-overview.ts	(working copy)
@@ -1,9 +1,11 @@
-import {Component, OnInit} from '@angular/core';
-import {SharedModule} from '../../../shared/shared-module';
-import {MatTableDataSource} from '@angular/material/table';
-import {DeviceService} from '../../../services/device-service';
-import {take} from 'rxjs/operators';
-import {NotificationService} from '../../../services/notification';
+import { Component, OnInit } from '@angular/core';
+import { SharedModule } from '../../../shared/shared-module';
+import { MatTableDataSource } from '@angular/material/table';
+import { DeviceService } from '../../../services/device-service';
+import { take } from 'rxjs/operators';
+import { NotificationService } from '../../../services/notification';
+import { Confirmation } from '../../../services/confirmation';
+import { URLS } from '../../../constants/api_urls';
 
 @Component({
   selector: 'app-reports-overview',
@@ -19,24 +21,26 @@
   constructor(
     private _device: DeviceService,
     private _notification: NotificationService,
+    private _confirmation: Confirmation,
   ) {
   }
 
   ngOnInit() {
-    setTimeout(()=>{
+    setTimeout(() => {
       this.getReports();
     })
   }
 
-  reports:any = [];
+  reports: any = [];
   getReports() {
     this.reports = []
     this._device.getReports()
       .pipe(take(1))
       .subscribe({
         next: (data: any) => {
-          if (data && data.reports && data.reports.length > 0) {
-            this.reports = data.reports;
+          if (data && data.report_logs && data.report_logs.length > 0) {
+            this.reports = data.report_logs;
+            this.reportsDataSource.data = this.reports;
           }
         },
         error: error => {
@@ -46,5 +50,53 @@
       });
   }
 
-  clearReports(): void {}
+  clearReports(): void { }
+
+  downloadReport(report: any): void {
+    this._device.downloadReport(report?.result?.file_name)
+      .pipe(take(1))
+      .subscribe({
+        next: (data: any) => {
+          console.log(data);
+          const blob = new Blob([data], { type: 'application/pdf' });
+          const url = window.URL.createObjectURL(blob);
+          const link = document.createElement('a');
+          link.href = url;
+          link.download = report?.result?.file_name;
+          link.click();
+          window.URL.revokeObjectURL(url);
+        },
+        error: error => {
+          console.log(error);
+          this._notification.showError('Failed to download report');
+        }
+      });
+  }
+
+  deleteReport(report: any): void {
+    let confirmMsg = `Are you sure you want to permanently delete "${report.subject_name.toUpperCase()} - ${report.id}"? This action cannot be undone.`
+    this._confirmation.openConfirmDialog({
+      title: `Delete ${report.subject_name.toUpperCase()} - ${report.id}?`,
+      message: confirmMsg,
+      confirmButtonText: 'Delete',
+      cancelButtonText: 'Cancel',
+      confirmButtonColor: 'warn',
+      cancelButtonColor: 'primary'
+    }).subscribe(result => {
+      if (result) {
+        this._device.deleteReport(report.id)
+          .pipe(take(1))
+          .subscribe({
+            next: (data: any) => {
+              this._notification.showSuccess('Report deleted successfully');
+              this.getReports();
+            },
+            error: error => {
+              console.log(error);
+              this._notification.showError(error.message);
+            }
+          });
+      }
+    })
+  }
 }
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 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/constants/api_urls.ts	(working copy)
@@ -218,9 +218,15 @@
   CREATE_VAPV_LICENSE_REQUEST_FILE_URL: `${PREFIX}/proxy_req_dev/lic_requset_file/generate`,
   DELETE_AVX_VA_INSTANCE_URL: `${PREFIX}/proxy_req_dev/api/avx/va/instance/VAInstance/_delete`,
   // Report
-  GET_LIST_OF_REPORTS_URL: `${PREFIX}/report`,
+  GET_REPORTS_LOG_URL: `${PREFIX}/report/log`,
+  DOWNLOAD_REPORT_URL: `${PREFIX}/report/download`,
+  DELETE_REPORT_URL: `${PREFIX}/report/log`,
+  GET_REPORT_TASKS_URL: `${PREFIX}/report`,
   GET_DEVICE_SERVICES_URL: `${PREFIX}/cm/services`,
-  POST_CREATE_REPORT_URL: `${PREFIX}/report/save`,
+  CREATE_REPORT_TASK_URL: `${PREFIX}/report/save`,
+  UPDATE_REPORT_TASK_URL: `${PREFIX}/report`,
+  DELETE_REPORT_TASK_URL: `${PREFIX}/report`,
+  CREATE_REPORT_URL: `${PREFIX}/report/generate`,
   // OpenSearch
   GET_LOGS_FROM_OPENSEARCH_URL: `${PREFIX}/log-analysis/search`,
 } as const; // Makes properties readonly
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/interceptors/auth-interceptor-interceptor.ts	(working copy)
@@ -1,7 +1,8 @@
 import { HttpInterceptorFn } from '@angular/common/http';
 import { inject } from '@angular/core';
 import { Auth } from '../services/auth';
-import { catchError, throwError } from 'rxjs';
+import { Action } from 'rxjs/internal/scheduler/Action';
+import { BehaviorSubject, catchError, EMPTY, Observable, throwError } from 'rxjs';
 
 export const authInterceptorFn: HttpInterceptorFn = (req, next) => {
   const auth = inject(Auth);
@@ -10,8 +11,18 @@
     catchError(error => {
       if (error.status === 401 || error.status === 403) {
         auth.logout(true, 'expired');
+        return EMPTY;
       }
-      return throwError(() => error);
+
+      // Preserve immediate 200 errors (often parsing errors where we want the component to see it raw)
+      if (error.status === 200) {
+        return throwError(() => error);
+      }
+
+      const friendlyMessage = error.error?.message || 'Failed to process request. Please try again later.';
+      const customError = new Error(friendlyMessage);
+      (customError as any).status = error.status;
+      return throwError(() => customError);
     })
   );
 };
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 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/services/device-service.ts	(working copy)
@@ -1,9 +1,9 @@
-import {Injectable} from '@angular/core';
-import {URLS} from '../constants/api_urls';
-import {HttpService} from './http';
-import {map} from 'rxjs/operators';
-import {catchError, throwError} from 'rxjs';
-import {Storage} from './storage';
+import { Injectable } from '@angular/core';
+import { URLS } from '../constants/api_urls';
+import { HttpService } from './http';
+import { map } from 'rxjs/operators';
+import { catchError, throwError } from 'rxjs';
+import { Storage } from './storage';
 
 @Injectable({
   providedIn: 'root'
@@ -13,15 +13,15 @@
   constructor(
     private http: HttpService,
     private _storage: Storage
-    ) {
+  ) {
   }
 
   getDeviceGroups() {
     let roleId = this._storage.getItem('roleId') || "-1";
     let rawPayload = new FormData();
     rawPayload.set('action', 'FilterRoleDeviceGroups');
-    rawPayload.set('options', JSON.stringify({"role_id": roleId}));
-    return this.http.post(URLS.GET_DEVICE_GROUPS_URL, rawPayload, {csrf: true, isFormData: true, csrfInFormData: true})
+    rawPayload.set('options', JSON.stringify({ "role_id": roleId }));
+    return this.http.post(URLS.GET_DEVICE_GROUPS_URL, rawPayload, { csrf: true, isFormData: true, csrfInFormData: true })
       .pipe(
         map((result: any): any => {
           const processedData: any = {
@@ -54,7 +54,7 @@
   }
 
   addDeviceGroup(rawPayload: any) {
-    return this.http.post(URLS.ADD_DEVICE_GROUP_URL, rawPayload, {csrf: true, isFormData: true, csrfInFormData: true});
+    return this.http.post(URLS.ADD_DEVICE_GROUP_URL, rawPayload, { csrf: true, isFormData: true, csrfInFormData: true });
   }
 
   deleteDeviceGroup(rawPayload: any) {
@@ -160,12 +160,12 @@
 
   getAPVSLBVirtualServices(deviceId: string) {
     return this.http.get(`${URLS.GET_APV_VIRTUAL_SERVICES_URL}`, {},
-      [{name: 'Cm-Data', value: deviceId}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: deviceId }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   getAPVSLBRealServices(deviceId: string) {
     return this.http.get(`${URLS.GET_APV_REAL_SERVICES_URL}`, {},
-      [{name: 'Cm-Data', value: deviceId}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: deviceId }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   getScheduleDeviceBackup() {
@@ -332,164 +332,164 @@
 
   executeCLICommand(aGName: string, rawPayload: any) {
     return this.http.post(URLS.DEVICE_CLI_EXTEND_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: aGName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: aGName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   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
-      }, [
-        {name: 'Cm-Data', value: aGName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: aGName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   getSSLCertificates(aGName: string | null, vhost: string | null) {
     return this.http.get(`${URLS.GET_SSL_VHOST_CERTIFICATES_URL}/${vhost}/certs`, {},
-      [{name: 'Cm-Data', value: aGName}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: aGName }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   getSSLBackupCertificates(aGName: string | null, vhost: string | null) {
     return this.http.get(`${URLS.GET_SSL_VHOST_BACKUP_CERTIFICATES_URL}/${vhost}/backup_certs`, {},
-      [{name: 'Cm-Data', value: aGName}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: aGName }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   getSSLInterCACertificates(aGName: string | null, vhost: string | null) {
     return this.http.get(`${URLS.GET_SSL_VHOST_INTERMEDIATE_CA_CERTIFICATES_URL}/${vhost}/interca_certs`, {},
-      [{name: 'Cm-Data', value: aGName}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: aGName }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   getSSLVHostSNI(aGName: string | null, vhost: string | null) {
     return this.http.get(`${URLS.GET_SSL_VHOST_SNI_URL}/${vhost}/ssl_sni`, {},
-      [{name: 'Cm-Data', value: aGName}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: aGName }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   backupSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.BACKUP_SSL_VHOST_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   restoreSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.RESTORE_SSL_VHOST_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   deleteSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.DELETE_SSL_VHOST_BACKUP_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   importSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.IMPORT_SSL_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
   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'}
-      ]
+      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, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   deactivateSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.DEACTIVATE_SSL_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   deleteVHostSSLCertificate(deviceName: string | null, rawPayload: any) {
     return this.http.post(URLS.DELETE_SSL_CERTIFICATE_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   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'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   downloadSSLCertInfo(aGName: string | null, rawPayload: any) {
     return this.http.post(URLS.DOWNLOAD_SSL_VHOST_BACKUP_CERTIFICATE_INFO_URL, rawPayload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: aGName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: aGName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
@@ -515,96 +515,96 @@
 
   getDeviceHAConfigByName(deviceName: any, payload: any) {
     return this.http.post(URLS.GET_DEVICE_HA_CONFIG_BY_NAME_URL, payload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   getDeviceHAUnitsByName(deviceName: any, payload: any) {
     return this.http.post(URLS.GET_DEVICE_HA_UNITS_BY_NAME_URL, payload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   getDeviceHAGroupsByName(deviceName: any, payload: any) {
     return this.http.post(URLS.GET_DEVICE_HA_GROUPS_BY_NAME_URL, payload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }, [
-        {name: 'Cm-Data', value: deviceName},
-        {name: 'Cm-Type', value: 'device'}
-      ]
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }, [
+      { name: 'Cm-Data', value: deviceName },
+      { name: 'Cm-Type', value: 'device' }
+    ]
     );
   }
 
   switchHAGroup(payload: any) {
     return this.http.post(URLS.SWITCH_DEVICE_HA_GROUP_URL, payload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }
     );
   }
 
   getSLBServices(deviceId: string | null) {
     return this.http.get(`${URLS.GET_SLB_SERVICES_URL}`, {},
-      [{name: 'Cm-Data', value: deviceId}, {name: 'Cm-Type', value: 'device'}]);
+      [{ name: 'Cm-Data', value: deviceId }, { name: 'Cm-Type', value: 'device' }]);
   }
 
   updateRealService(payload: any) {
     return this.http.post(URLS.UPDATE_SLB_REAL_SERVICE_URL, payload, {
-        csrf: true,
-        isFormData: true,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: true,
+      csrfInFormData: true
+    }
     );
   }
 
   getDeviceMonitoringMetrics(payload: any) {
     return this.http.post(URLS.GET_DEVICE_MONITORING_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
   getAPVVSMonitoringMetrics(payload: any) {
     return this.http.post(URLS.GET_APV_VS_MONITORING_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
   getAPVRSMonitoringMetrics(payload: any) {
     return this.http.post(URLS.GET_APV_RS_MONITORING_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
   getSSLVPNMonitoringMetrics(payload: any) {
     return this.http.post(URLS.GET_SSL_VPN_MONITORING_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
@@ -625,77 +625,115 @@
 
   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'}
-      ]
+      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'}
-      ]
+      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'}
-      ]
+    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' }
+    ]
     );
   }
 
   getLLBMonitoringMetrics(payload: any) {
     return this.http.post(URLS.GET_LLB_MONITORING_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
   getDevicesNetworkMetrics(payload: any) {
     return this.http.post(URLS.GET_DEVICES_NETWORK_METRICS_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: true
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: true
+    }
     );
   }
 
   getReports() {
-    return this.http.get(URLS.GET_LIST_OF_REPORTS_URL);
+    return this.http.get(URLS.GET_REPORTS_LOG_URL);
   }
 
+  getReportTasks() {
+    return this.http.get(URLS.GET_REPORT_TASKS_URL);
+  }
+
   getDeviceServices(payload: any) {
     return this.http.post(URLS.GET_DEVICE_SERVICES_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: false
-      }
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: false
+    }
     );
   }
 
-  createReport(payload: any) {
-    return this.http.post(URLS.POST_CREATE_REPORT_URL, payload, {
-        csrf: true,
-        isFormData: false,
-        csrfInFormData: false
-      }
+  createReportTask(payload: any) {
+    return this.http.post(URLS.CREATE_REPORT_TASK_URL, payload, {
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: false
+    }
     );
   }
+
+  updateReportTask(taskId: any, payload: any) {
+    return this.http.put(`${URLS.UPDATE_REPORT_TASK_URL}/${taskId}`, payload, {
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: false
+    }
+    );
+  }
+
+  deleteReportTask(reportId: any) {
+    return this.http.delete(`${URLS.DELETE_REPORT_TASK_URL}/${reportId}`);
+  }
+
+  createReport(reportId: any, payload: any) {
+    return this.http.post(`${URLS.CREATE_REPORT_URL}/${reportId}`, payload, {
+      csrf: true,
+      isFormData: false,
+      csrfInFormData: false
+    }
+    );
+  }
+
+  downloadReport(fileName: any) {
+    const options: any = {
+      responseType: 'blob',
+    };
+    return this.http.get(`${URLS.DOWNLOAD_REPORT_URL}/${fileName}`, options);
+  }
+
+  deleteReport(reportId: any) {
+    return this.http.delete(`${URLS.DELETE_REPORT_URL}/${reportId}`);
+  }
+
 }
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/gui/src/app/shared/shared-module.ts	(working copy)
@@ -70,7 +70,8 @@
   solidIcons.faCheckCircle, solidIcons.faExclamationCircle, solidIcons.faExclamationTriangle, solidIcons.faQuestion,
   solidIcons.faDownload, solidIcons.faFolderTree, solidIcons.faRotateRight, solidIcons.faExchangeAlt, solidIcons.faTimes,
   solidIcons.faLink, solidIcons.faMoon, solidIcons.faSun, solidIcons.faCircleHalfStroke,
-  solidIcons.faCheck, solidIcons.faPowerOff,
+  solidIcons.faCheck, solidIcons.faPowerOff, solidIcons.faUpload, solidIcons.faImage,
+  solidIcons.faEdit, solidIcons.faTrash,
 ];
 
 
@@ -81,7 +82,7 @@
   regularIcons.faCircleLeft, regularIcons.faSave, regularIcons.faCalendar, regularIcons.faEdit,
   regularIcons.faXmarkCircle, regularIcons.faBuilding, regularIcons.faPlayCircle,
   regularIcons.faCircleStop, regularIcons.faCopy, regularIcons.faClone, regularIcons.faClock,
-  regularIcons.faWindowRestore, regularIcons.faCircleUp, regularIcons.faFolderOpen
+  regularIcons.faWindowRestore, regularIcons.faCircleUp, regularIcons.faFolderOpen, regularIcons.faCalendarCheck, regularIcons.faImage
 ];
 
 const allCustomIcons = [...customSolidIcons, ...customRegularIcons];
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py	(working copy)
@@ -49,24 +49,68 @@
                 REPORT_FILE_PATH + filename,
                 pagesize=letter,
                 leftMargin=50,
-                rightMargin=50
+                rightMargin=50,
+                topMargin=72
             )
 
             elements = []
             styles = getSampleStyleSheet()
-            styles.add(ParagraphStyle(name="AMPReportHeading3", parent=styles["Heading3"], leftPadding=0, alignment=0))
-            styles.add(ParagraphStyle(name="CenteredTitle", parent=styles["Title"], alignment=1))
-            # For all other text blocks:
-            styles.add(ParagraphStyle('LeftText', parent=styles["Normal"], alignment=0))
-            styles.add(ParagraphStyle('Heading3Left', parent=styles["Heading3"], alignment=0))
-            styles.add(ParagraphStyle('Heading4Left', parent=styles["Heading4"], alignment=0))
+            
+            # Custom Styles - Array Branding & No Italics
+            # Leading = Line Height. SpaceAfter = Margin Bottom.
+            
+            # Main Title (Center)
+            styles.add(ParagraphStyle(
+                name="AMPTitle",
+                parent=styles["Title"],
+                fontName="Helvetica-Bold",
+                fontSize=24,
+                leading=28,
+                alignment=1, # Center
+                textColor=colors.black,
+                spaceAfter=20
+            ))
 
-            # Header
-            im = Image(LOGO_PATH, 2 * inch, 0.8 * inch)
-            im.hAlign = 'CENTER'
-            elements += [im, Spacer(1, 20)]
+            # Metadata (Key-Value pairs)
+            styles.add(ParagraphStyle(
+                name="AMPMeta",
+                parent=styles["Normal"],
+                fontName="Helvetica",
+                fontSize=12,
+                leading=16,
+                spaceAfter=2
+            ))
 
-            # Title
+            # Section Headers (Blue, Bold, Larger)
+            styles.add(ParagraphStyle(
+                name="AMPSectionHeader", 
+                parent=styles["Heading2"], 
+                fontName="Helvetica-Bold", 
+                fontSize=16, 
+                leading=20,
+                textColor=colors.Color(0.067, 0.439, 0.812), # Array Blue
+                spaceBefore=20, 
+                spaceAfter=10
+            ))
+
+            # Subsection Headers (Black, Bold)
+            styles.add(ParagraphStyle(
+                name="AMPSubSection", 
+                parent=styles["Heading3"], 
+                fontName="Helvetica-Bold", 
+                fontSize=14, 
+                leading=16,
+                textColor=colors.black,
+                spaceBefore=12, 
+                spaceAfter=8
+            ))
+
+            # Header Logo moved to page header callback
+            # im = Image(LOGO_PATH, 2 * inch, 0.8 * inch)
+            # im.hAlign = 'CENTER'
+            # elements += [im, Spacer(1, 10)]
+
+            # Title Logic
             if "vs" in category:
                 category_name = "SLB Virtual Service"
             elif "rs" in category:
@@ -77,33 +121,35 @@
                 category_name = str(category).upper()
 
             title = f"{category_name} Report"
-            elements.append(Paragraph(f"<b>{title}</b>", styles["CenteredTitle"]))
-            elements += [Spacer(1, 20)]
+            elements.append(Paragraph(title, styles["AMPTitle"]))
+            elements += [Spacer(1, 10)]
+
+            # Metadata Section (Styled nicely)
             if device_name is not None:
-                elements.append(Paragraph(f"Device Name : {device_name}", styles["Heading4Left"]))
+                elements.append(Paragraph(f"<b>Device Name:</b> {device_name}", styles["AMPMeta"]))
             if device_type is not None:
-                elements.append(Paragraph(f"Device Type : {device_type}", styles["Heading4Left"]))
-            elements.append(Paragraph(f"Statistics From : {start_time}", styles["Heading4Left"]))
-            elements.append(Paragraph(f"Statistics To   : {end_time}", styles["Heading4Left"]))
-            elements.append(Spacer(1, 10))
+                elements.append(Paragraph(f"<b>Device Type:</b> {device_type}", styles["AMPMeta"]))
+            elements.append(Paragraph(f"<b>Statistics From:</b> {start_time}", styles["AMPMeta"]))
+            elements.append(Paragraph(f"<b>Statistics To:</b> {end_time}", styles["AMPMeta"]))
+            elements.append(Spacer(1, 20))
 
             # --- Summary Section ---
             if data_summary_dict:
-                elements.append(Paragraph("Summary Report (Average values):", styles["AMPReportHeading3"]))
+                elements.append(Paragraph("Summary Report (Average values)", styles["AMPSectionHeader"]))
                 summary_headers, summary_fields = self.get_summary_headers_and_fields(category, device_type)
                 for entity_name, summary_data in data_summary_dict.items():
                     row_values = [summary_data.get(field, entity_name if field == "entity_name" else 0)
                                   for field in summary_fields]
                     table = self.get_table_data(summary_headers, [row_values])
-                    elements += [Spacer(1, 15), table, Spacer(1, 25)]
+                    elements += [Spacer(1, 5), table, Spacer(1, 15)]
 
             # --- Detailed Section ---
             if data_dict:
-                elements.append(Paragraph("Detailed Report:", styles["AMPReportHeading3"]))
+                elements.append(Paragraph("Detailed Report", styles["AMPSectionHeader"]))
                 section_config = self.get_detailed_sections(category, device_type)
 
                 for entity_name, metrics in data_dict.items():
-                    # Title
+                    # Entity Title
                     if "vs" in category:
                         label = "Virtual Service Name"
                     elif "rs" in category:
@@ -112,8 +158,10 @@
                         label = f"Device"
                     else:
                         label = str(entity_name)
-                    elements.append(Paragraph(f"{label}: {entity_name}", styles["Heading3Left"]))
-                    elements.append(Spacer(1, 15))
+                    
+                    # Sub-header for the entity
+                    elements.append(Paragraph(f"{label}: {entity_name}", styles["AMPSubSection"]))
+                    elements.append(Spacer(1, 10))
 
                     # Render each subsection (e.g., throughput, usage, hits)
                     for section in section_config:
@@ -121,10 +169,11 @@
                         headers = section["headers"]
                         fields = section["fields"]
 
-                        if title == 'Hits Distribution':
-                            elements.append(Paragraph("Hits Distribution", styles["Heading4Left"]))
-                            elements.append(Spacer(1, 10))
+                        # Use a smaller/styled header for individual charts/tables
+                        elements.append(Paragraph(title, styles["AMPMeta"])) 
+                        elements.append(Spacer(1, 5))
 
+                        if title == 'Hits Distribution':
                             # Prepare data as [(hit_type, total), ...]
                             hits_distribution = []
                             for db_field, display_name in HIT_FIELD_MAP.items():
@@ -134,11 +183,8 @@
 
                             table_data = [(hit_name, total) for hit_name, total in hits_distribution]
                             table = self.get_table_data(["Hit Type", "Number"], table_data)
-                            elements += [table, Spacer(1, 25)]
+                            elements += [table, Spacer(1, 20)]
                         else:
-                            elements.append(Paragraph(title, styles["Heading4Left"]))
-                            elements.append(Spacer(1, 10))
-
                             # Clean time format
                             formatted_time = [
                                 str(t).split('+')[0] if isinstance(t, str) else t.strftime("%Y-%m-%d %H:%M:%S")
@@ -147,10 +193,27 @@
 
                             table_data = list(zip(formatted_time, *[metrics.get(field, []) for field in fields]))
                             table = self.get_table_data(headers, table_data)
-                            elements += [table, Spacer(1, 25)]
+                            elements += [table, Spacer(1, 20)]
 
-            pdf.build(elements)
+            def add_header(canvas, doc):
+                canvas.saveState()
+                page_width, page_height = letter
+                
+                # Logo dimensions (smaller for header)
+                logo_width = 1.5 * inch
+                logo_height = 0.6 * inch
+                
+                # Position: Top Left
+                x = doc.leftMargin
+                y = page_height - 60 
+                
+                canvas.drawImage(LOGO_PATH, x, y, width=logo_width, height=logo_height, 
+                               preserveAspectRatio=True, mask='auto', anchor='sw')
+                               
+                canvas.restoreState()
 
+            pdf.build(elements, onFirstPage=add_header, onLaterPages=add_header)
+
         except Exception as e:
             oper_log('error', 'system', str(e))
             raise e
@@ -158,15 +221,32 @@
     def get_table_data(self, headers, data):
         styles = getSampleStyleSheet()
 
+        # Define Header Style with White Text
+        header_style = ParagraphStyle(
+            'HeaderStyle',
+            parent=styles['Normal'],
+            textColor=colors.white,
+            fontName='Helvetica-Bold',
+            fontSize=10,
+            leading=12,
+            alignment=1 # Center alignment for headers
+        )
+
+        # Helper to format numbers
+        def format_cell(cell):
+            if isinstance(cell, float):
+                return "{:.2f}".format(cell)
+            return str(cell)
+
         # Wrap headers & data so text can break into multiple lines
         wrapped_headers = [
-            Paragraph(f"<b>{h}</b>", styles["Normal"]) for h in headers
+            Paragraph(str(h), header_style) for h in headers
         ]
 
         wrapped_data = []
         for row in data:
             wrapped_data.append([
-                Paragraph(str(cell), styles["Normal"]) for cell in row
+                Paragraph(format_cell(cell), styles["Normal"]) for cell in row
             ])
 
         table_data = [wrapped_headers] + wrapped_data
@@ -182,15 +262,34 @@
             splitByRow=True  # Allows clean page breaks
         )
 
-        data_len = len(data)
-        for each in range(data_len):
-            if each == 0:
-                bg_color = colors.lightgrey
+        # Branding Blue: #1170cf -> (0.067, 0.439, 0.812)
+        header_bg = colors.Color(0.067, 0.439, 0.812)
+        grid_color = colors.Color(0.8, 0.8, 0.8)
+
+        style_cmds = [
+            # Header
+            ('BACKGROUND', (0, 0), (-1, 0), header_bg),
+            ('ALIGN', (0, 0), (-1, -1), 'LEFT'), # Default left align
+            ('ALIGN', (0, 0), (-1, 0), 'CENTER'), # Center align headers
+            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
+            ('GRID', (0, 0), (-1, -1), 0.5, grid_color),
+            ('BOTTOMPADDING', (0, 0), (-1, 0), 10),
+            ('TOPPADDING', (0, 0), (-1, 0), 10),
+            # Data padding
+            ('BOTTOMPADDING', (0, 1), (-1, -1), 6),
+            ('TOPPADDING', (0, 1), (-1, -1), 6),
+        ]
+
+        # Alternating Row Colors
+        for i in range(len(data)):
+            row_idx = i + 1
+            if i % 2 == 0:
+                bg_color = colors.Color(0.96, 0.96, 0.96) # Unix whitesmoke equivalent
             else:
                 bg_color = colors.white
+            style_cmds.append(('BACKGROUND', (0, row_idx), (-1, row_idx), bg_color))
 
-            table.setStyle(TableStyle([('BACKGROUND', (0, each), (-1, each), bg_color),
-                                       ('FONT', (0, 0), (-1, -1), 'Helvetica'), ]))
+        table.setStyle(TableStyle(style_cmds))
         return table
 
     def get_summary_headers_and_fields(self, category, device_type=None):
@@ -281,7 +380,7 @@
                     {"title": "Memory Usage (%)", "headers": ["Time", "Network Memory"],
                      "fields": ["avg_net_mem"]},
                     {"title": "Disk Usage", "headers": ["Time", "Disk"], "fields": ["avg_disk_usage"]},
-                    {"title": "Network Throughput (bps)", "headers": ["Time", "sent", "received"],
+                    {"title": "Network Throughput (bps)", "headers": ["Time", "Sent", "Received"],
                      "fields": ["avg_out_bps", "avg_in_bps"]},
                     {"title": "Connections Number", "headers": ["Time", "Connection"],
                      "fields": ["avg_connections"]},
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(working copy)
@@ -15,7 +15,7 @@
 REPORT_FILE_PATH = "/ca/webui/htdocs/new/src/hive/media/docs/"
 
 
-def handle_report_generation(request, path=None, report_id=None, log_id=None):
+def handle_report_generation(request, path=None, report_id=None, log_id=None, filename=None):
     try:
         if request.method == 'POST':
             if path == 'save':
@@ -28,7 +28,7 @@
 
         elif request.method == 'GET':
             if path == 'download':
-                return download_report(request.GET.get('filename'))
+                return download_report(filename or request.GET.get('filename'))
             elif path == 'log':
                 if log_id:
                     return get_report_log_by_id(log_id)
@@ -95,7 +95,7 @@
 
         report_logs = ReportDB.get_all_report_log()
 
-        return JsonResponse({"report logs": report_logs}, status=200, safe=False)
+        return JsonResponse({"report_logs": report_logs}, status=200, safe=False)
     except Exception as e:
         oper_log("error", "system", f"Unexpected error in get_all_report_log: {str(e)}")
         return JsonResponse({"error": f"Fetching the report logs failed"}, status=500)
@@ -169,7 +169,7 @@
             data.get("to_time"),
             data.get("device_ip"),
             data.get("device_type", None),
-            data.get("send_to"),
+            data.get("send_to", None),
         )
 
         if not report_id:
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_queries.py	(working copy)
@@ -1,9 +1,29 @@
 from hive.db.db_client import DBClient
 from hive.utils import andebug
 from cm.lib.libbasic_operation import oper_log
+import json
+import ast
 
 
 class ReportDB:
+
+    @staticmethod
+    def _parse_results(data):
+        if not data:
+            return []
+        for row in data:
+            if 'result' in row and row['result']:
+                try:
+                    if isinstance(row['result'], dict):
+                        continue
+                    row['result'] = json.loads(row['result'])
+                except (json.JSONDecodeError, TypeError):
+                    try:
+                        # Fallback for Python string representation (single quotes)
+                        row['result'] = ast.literal_eval(row['result'])
+                    except (ValueError, SyntaxError):
+                        pass # Keep as string if parsing fails
+        return data
 
     @staticmethod
     def get_all_reports():
@@ -166,7 +186,7 @@
         response = DBClient.execute_query(req, "postgres")
 
         if response.get("status") == 200:
-            return response.get("data", [])
+            return ReportDB._parse_results(response.get("data", []))
         else:
             oper_log('error', 'system',
                      f"Failed to fetch report_log: {response.get('message')} - {response.get('data')}")
@@ -212,7 +232,7 @@
         response = DBClient.execute_query(req, "postgres")
 
         if response.get("status") == 200:
-            return response.get("data", [])
+            return ReportDB._parse_results(response.get("data", []))
         else:
             oper_log('error', 'system',
                      f"Failed to fetch report_log: {response.get('message')} - {response.get('data')}")
@@ -239,7 +259,7 @@
         response = DBClient.execute_query(req, "postgres")
 
         if response.get("status") == 200:
-            return response.get("data", [])
+            return ReportDB._parse_results(response.get("data", []))
         else:
             oper_log('error', 'system',
                      f"Failed to fetch report_log: {response.get('message')} - {response.get('data')}")
@@ -291,7 +311,7 @@
                 LIMIT 1
             );
         """
-        params = (status, str(result), report_id)
+        params = (status, json.dumps(result), report_id)
         req = {"query": query, "params": params}
         response = DBClient.execute_modify_query(req, "postgres")
 
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/services/generic_service.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/services/generic_service.py	(revision 2837)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/services/generic_service.py	(working copy)
@@ -1,5 +1,3 @@
-
-
 from hive.db.generic_db_queries import DBManager
 
 
@@ -24,9 +22,9 @@
 
         db_response = DBManager.get_services_query(service_type, device_ip)
 
-        if not db_response:
+        if not db_response or "data" not in db_response:
             return {"services": []}
 
-        services = [row.get("service_name") for row in db_response if "service_name" in row]
+        services = [row.get("service_name") for row in db_response["data"] if "service_name" in row]
 
         return {"services": services}
