diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
index 2e292110bd8987bc40ba900fa84f123374374a42..6339b4da8bb6a93ea9361c00a37f947b5410828b 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
@@ -134,7 +134,7 @@ def _get_observation_hours_per_category(cycle: models.Cycle, start: datetime, st
     """
     from lofar.sas.tmss.tmss.workflowapp.models.schedulingunitflow import SchedulingUnitProcess
 
-    result = {'total_duration_failed': 0, 'total_duration_idle': 0, 'DDT Com Rep': 0}
+    result = {'total_duration': 0, 'total_duration_successful': 0, 'total_duration_failed': 0, 'total_duration_idle': 0, 'DDT Com Rep': 0}
 
     # Filter System Unavailability
     # TODO: Maybe add some other case scenarios where the system is not up and running?
@@ -153,16 +153,29 @@ def _get_observation_hours_per_category(cycle: models.Cycle, start: datetime, st
                 project_categoy = sub.project.project_category
                 if project_categoy == 'ddt' or project_categoy == 'commissioning':  # TODO: Rep as repetition.
                     result['DDT Com Rep'] += sub.observed_duration.total_seconds()
-                # Distinguish successful and failed
+                # Aggregate total and idle
+                result['total_duration'] += sub.observed_duration.total_seconds()
                 result['total_duration_idle'] += sub.observed_duration.total_seconds()
+                # Distinguish successful and failed
                 sup = SchedulingUnitProcess.objects.filter(su=sub).first()
                 result[f'total_duration_successful_{prio.name}'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted else 0
                 result['total_duration_failed'] += sub.observed_duration.total_seconds() if sup and sup.results_accepted is False else 0
+        # Calculate prio percentages
+        result[f'successful_{prio.name}_perc'] = result[f'total_duration_successful_{prio.name}'] * 100.0 / result['total_duration'] if result['total_duration'] > 0 else None
+        # Aggregate prio durations to general successful
+        result['total_duration_successful'] += result[f'total_duration_successful_{prio.name}']
         # Subtract prio states from total to get partial idle
         result['total_duration_idle'] -= result[f'total_duration_successful_{prio.name}']
     # Subtract total failed to get total idle eventually
     result['total_duration_idle'] -= result['total_duration_failed']
 
+    # Calculate percentages
+    result['successful_perc'] = result['total_duration_successful'] * 100.0 / result['total_duration'] if result['total_duration'] > 0 else None
+    result['idle_perc'] = result['total_duration_idle'] * 100.0 / result['total_duration'] if result['total_duration'] > 0 else None
+    result['failed_perc'] = result['total_duration_failed'] * 100.0 / result['total_duration'] if result['total_duration'] > 0 else None
+    result['ddt_com_rep_perc'] = result['DDT Com Rep'] * 100.0 / result['total_duration'] if result['total_duration'] > 0 else None
+    result['system_unavailability_perc'] = result['System Unavailability'] * 100.0 / result['total_duration'] if result['System Unavailability'] and result['total_duration'] > 0 else None
+
     return result
 
 
@@ -397,6 +410,14 @@ def _get_subs_and_durations_from_project(project_pk: int, start: datetime, stop:
 
     subs = {'successful': subs_succeeded, 'failed': subs_failed}
 
+    # Calculate percentages
+    durations['not_cancelled_perc'] = durations['total_not_cancelled'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+    durations['succeeded_perc'] = durations['total_succeeded'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+    durations['failed_perc'] = durations['total_failed'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+    durations['observed_perc'] = durations['total_observed'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+    durations['observed_succeeded_perc'] = durations['total_observed_succeeded'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+    durations['observed_failed_perc'] = durations['total_observed_failed'] * 100.0 / durations['total'] if durations['total'] > 0 else None
+
     return subs, durations