diff --git a/webgui/ajax.php b/webgui/ajax.php
index 0c626fd41e120947040017f4395bf0097b75616b..37a1dc5439e52a8d155498ba90cdbe043f61ccc3 100644
--- a/webgui/ajax.php
+++ b/webgui/ajax.php
@@ -370,6 +370,8 @@
 			$res->addField('uptimeUsage','int');
 			$res->addField('trafficTopups','int');
 			$res->addField('uptimeTopups','int');
+			$res->addField('AllTrafficTopups','array');
+			$res->addField('AllUptimeTopups','array');
 			$res->parseHash($rawData);
 			$res->setDatasetSize($numResults);
 
@@ -389,6 +391,8 @@
 			$res->addField('uptimeUsage','int');
 			$res->addField('trafficTopups','int');
 			$res->addField('uptimeTopups','int');
+			$res->addField('AllTrafficTopups','array');
+			$res->addField('AllUptimeTopups','array');
 			$res->parseHash($rawData);
 			$res->setDatasetSize($numResults);
 
diff --git a/webgui/include/ajax/functions/AdminUserLogs.php b/webgui/include/ajax/functions/AdminUserLogs.php
index 5f6587df6fca96d4f7f66eb76fc1e11013c03cce..dd3f6b9da52492b5d9b42e88d0ec840b10c43a89 100644
--- a/webgui/include/ajax/functions/AdminUserLogs.php
+++ b/webgui/include/ajax/functions/AdminUserLogs.php
@@ -82,8 +82,10 @@ function getAdminUserLogsSummary($params) {
 	$res = DBSelect("
 		SELECT
 			@TP@topups_summary.Balance,
+			@TP@topups.ID,
 			@TP@topups.Type,
-			@TP@topups.Value
+			@TP@topups.Value,
+			@TP@topups.ValidTo
 		FROM
 			@TP@topups_summary,
 			@TP@topups
@@ -107,6 +109,8 @@ function getAdminUserLogsSummary($params) {
 	$i = 0;
 	while ($row = $res->fetchObject()) {
 		$topups[$i] = array();
+		$topups[$i]['ID'] = $row->id;
+		$topups[$i]['ValidTo'] = $row->validto;
 		$topups[$i]['Type'] = $row->type;
 		$topups[$i]['CurrentLimit'] = $row->balance;
 		$topups[$i]['Limit'] = $row->value;
@@ -118,7 +122,7 @@ function getAdminUserLogsSummary($params) {
 	$periodKeyEnd->modify("+1 month");
 	$res = DBSelect("
 		SELECT
-			Value, Type
+			ID, Value, Type, ValidTo
 		FROM
 			@TP@topups
 		WHERE
@@ -139,6 +143,8 @@ function getAdminUserLogsSummary($params) {
 	# Store normal topups
 	while ($row = $res->fetchObject()) {
 		$topups[$i] = array();
+		$topups[$i]['ID'] = $row->id;
+		$topups[$i]['ValidTo'] = $row->validto;
 		$topups[$i]['Type'] = $row->type;
 		$topups[$i]['Limit'] = $row->value;
 		$i++;
@@ -194,34 +200,69 @@ function getAdminUserLogsSummary($params) {
 	# Loop through topups and add to return array
 	$resultArray['trafficTopups'] = 0;
 	$resultArray['uptimeTopups'] = 0;
+	# Traffic and uptime topups
+	$resultArray['AllTrafficTopups'] = array();
+	$resultArray['AllUptimeTopups'] = array();
+	$t = 0; $u = 0;
 	foreach ($topups as $topupItem) {
 		if ($topupItem['Type'] == 1) {
 			# Topup not currently in use
 			if ($excessTraffic <= 0) {
-				$resultArray['trafficUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
 
 				# Set total available topups
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+				$resultArray['trafficTopups'] += isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
 
 			# Topup currently in use
 			} elseif (!isset($topupItem['CurrentLimit']) && $excessTraffic < $topupItem['Limit']) {
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = $excessTraffic;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
+
 				# Set total available topups
 				$resultArray['trafficTopups'] += $topupItem['Limit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessTraffic = 0;
 			} elseif (isset($topupItem['CurrentLimit']) && $excessTraffic < $topupItem['CurrentLimit']) {
-				$resultArray['trafficUsage'] += ($topupItem['Limit'] - $topupItem['CurrentLimit']);
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = ($topupItem['Limit'] - $topupItem['CurrentLimit']) + $excessTraffic;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
 
 				# Set total available topups
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+				$resultArray['trafficTopups'] += $topupItem['CurrentLimit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessTraffic = 0;
 			# Topup has been used up
 			} else {
-				$resultArray['trafficUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
+
+				$resultArray['trafficTopups'] += isset($topupItem['CurrentLimit']) ? $topupITem['CurrentLimit'] : $topupItem['Limit'];
 
 				# Subtract this topup from excessTraffic usage
 				$excessTraffic -= isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
@@ -230,30 +271,61 @@ function getAdminUserLogsSummary($params) {
 		if ($topupItem['Type'] == 2) {
 			# Topup not currently in use
 			if ($excessUptime <= 0) {
-				$resultArray['uptimeUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
 
 				# Set total available topups
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+				$resultArray['uptimeTopups'] += isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
 
 			# Topup currently in use
 			} elseif (!isset($topupItem['CurrentLimit']) && $excessUptime < $topupItem['Limit']) {
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = $excessTraffic;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
+
 				# Set total available topups
 				$resultArray['uptimeTopups'] += $topupItem['Limit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessUptime = 0;
 			} elseif (isset($topupItem['CurrentLimit']) && $excessUptime < $topupItem['CurrentLimit']) {
-				$resultArray['uptimeUsage'] += ($topupItem['Limit'] - $topupItem['CurrentLimit']);
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = ($topupItem['Limit'] - $topupItem['CurrentLimit']) + $excessTraffic;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
 
 				# Set total available topups
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+				$resultArray['uptimeTopups'] += $topupItem['CurrentLimit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessUptime = 0;
 			# Topup has been used up
 			} else {
-				$resultArray['uptimeUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
+
+				$resultArray['uptimeTopups'] += isset($topupItem['CurrentLimit']) ? $topupITem['CurrentLimit'] : $topupItem['Limit'];
 
 				# Subtract this topup from excessUptime usage
 				$excessUptime -= isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
diff --git a/webgui/include/ajax/functions/WiSPUserLogs.php b/webgui/include/ajax/functions/WiSPUserLogs.php
index dfa292b1ffe57d46e013c8f6ff6f14e3fbe30fd3..1850baa0318b49c916551cd5209365f410cf6da4 100644
--- a/webgui/include/ajax/functions/WiSPUserLogs.php
+++ b/webgui/include/ajax/functions/WiSPUserLogs.php
@@ -82,8 +82,10 @@ function getWiSPUserLogsSummary($params) {
 	$res = DBSelect("
 		SELECT
 			@TP@topups_summary.Balance,
+			@TP@topups.ID,
 			@TP@topups.Type,
-			@TP@topups.Value
+			@TP@topups.Value,
+			@TP@topups.ValidTo
 		FROM
 			@TP@topups_summary,
 			@TP@topups
@@ -107,6 +109,8 @@ function getWiSPUserLogsSummary($params) {
 	$i = 0;
 	while ($row = $res->fetchObject()) {
 		$topups[$i] = array();
+		$topups[$i]['ID'] = $row->id;
+		$topups[$i]['ValidTo'] = $row->validto;
 		$topups[$i]['Type'] = $row->type;
 		$topups[$i]['CurrentLimit'] = $row->balance;
 		$topups[$i]['Limit'] = $row->value;
@@ -118,7 +122,7 @@ function getWiSPUserLogsSummary($params) {
 	$periodKeyEnd->modify("+1 month");
 	$res = DBSelect("
 		SELECT
-			Value, Type
+			ID, Value, Type, ValidTo
 		FROM
 			@TP@topups
 		WHERE
@@ -139,6 +143,8 @@ function getWiSPUserLogsSummary($params) {
 	# Store normal topups
 	while ($row = $res->fetchObject()) {
 		$topups[$i] = array();
+		$topups[$i]['ID'] = $row->id;
+		$topups[$i]['ValidTo'] = $row->validto;
 		$topups[$i]['Type'] = $row->type;
 		$topups[$i]['Limit'] = $row->value;
 		$i++;
@@ -194,34 +200,69 @@ function getWiSPUserLogsSummary($params) {
 	# Loop through topups and add to return array
 	$resultArray['trafficTopups'] = 0;
 	$resultArray['uptimeTopups'] = 0;
+	# Traffic and uptime topups
+	$resultArray['AllTrafficTopups'] = array();
+	$resultArray['AllUptimeTopups'] = array();
+	$t = 0; $u = 0;
 	foreach ($topups as $topupItem) {
 		if ($topupItem['Type'] == 1) {
 			# Topup not currently in use
 			if ($excessTraffic <= 0) {
-				$resultArray['trafficUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
 
 				# Set total available topups
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+				$resultArray['trafficTopups'] += isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
 
 			# Topup currently in use
 			} elseif (!isset($topupItem['CurrentLimit']) && $excessTraffic < $topupItem['Limit']) {
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = $excessTraffic;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
+
 				# Set total available topups
 				$resultArray['trafficTopups'] += $topupItem['Limit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessTraffic = 0;
 			} elseif (isset($topupItem['CurrentLimit']) && $excessTraffic < $topupItem['CurrentLimit']) {
-				$resultArray['trafficUsage'] += ($topupItem['Limit'] - $topupItem['CurrentLimit']);
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = ($topupItem['Limit'] - $topupItem['CurrentLimit']) + $excessTraffic;
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
 
 				# Set total available topups
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+				$resultArray['trafficTopups'] += $topupItem['CurrentLimit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessTraffic = 0;
 			# Topup has been used up
 			} else {
-				$resultArray['trafficUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
-				$resultArray['trafficTopups'] += $topupItem['Limit'];
+
+				# Add stats to topup array
+				$resultArray['AllTrafficTopups'][$t] = array();
+				$resultArray['AllTrafficTopups'][$t]['Used'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllTrafficTopups'][$t]['ID'] = $topupItem['ID'];
+				$resultArray['AllTrafficTopups'][$t]['ValidTo'] = $topupItem['ValidTo'];
+				$t++;
+
+				$resultArray['trafficTopups'] += isset($topupItem['CurrentLimit']) ? $topupITem['CurrentLimit'] : $topupItem['Limit'];
 
 				# Subtract this topup from excessTraffic usage
 				$excessTraffic -= isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
@@ -230,30 +271,61 @@ function getWiSPUserLogsSummary($params) {
 		if ($topupItem['Type'] == 2) {
 			# Topup not currently in use
 			if ($excessUptime <= 0) {
-				$resultArray['uptimeUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
 
 				# Set total available topups
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+				$resultArray['uptimeTopups'] += isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
 
 			# Topup currently in use
 			} elseif (!isset($topupItem['CurrentLimit']) && $excessUptime < $topupItem['Limit']) {
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = $excessTraffic;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
+
 				# Set total available topups
 				$resultArray['uptimeTopups'] += $topupItem['Limit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessUptime = 0;
 			} elseif (isset($topupItem['CurrentLimit']) && $excessUptime < $topupItem['CurrentLimit']) {
-				$resultArray['uptimeUsage'] += ($topupItem['Limit'] - $topupItem['CurrentLimit']);
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = ($topupItem['Limit'] - $topupItem['CurrentLimit']) + $excessTraffic;
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
 
 				# Set total available topups
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+				$resultArray['uptimeTopups'] += $topupItem['CurrentLimit'];
 
 				# If we hit this topup then all the rest of them are available
 				$excessUptime = 0;
 			# Topup has been used up
 			} else {
-				$resultArray['uptimeUsage'] += isset($topupItem['CurrentLimit']) ? ($topupItem['Limit'] - $topupItem['CurrentLimit']) : 0;
-				$resultArray['uptimeTopups'] += $topupItem['Limit'];
+
+				# Add stats to topup array
+				$resultArray['AllUptimeTopups'][$u] = array();
+				$resultArray['AllUptimeTopups'][$u]['Used'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['Cap'] = (int)$topupItem['Limit'];
+				$resultArray['AllUptimeTopups'][$u]['ID'] = $topupItem['ID'];
+				$resultArray['AllUptimeTopups'][$u]['ValidTo'] = $topupItem['ValidTo'];
+				$u++;
+
+				$resultArray['uptimeTopups'] += isset($topupItem['CurrentLimit']) ? $topupITem['CurrentLimit'] : $topupItem['Limit'];
 
 				# Subtract this topup from excessUptime usage
 				$excessUptime -= isset($topupItem['CurrentLimit']) ? $topupItem['CurrentLimit'] : $topupItem['Limit'];
diff --git a/webgui/js/app/windows/AdminUserLogs.js b/webgui/js/app/windows/AdminUserLogs.js
index abd675f8e5bdda633bba8b6901acf737a00ba46d..5bf650d78340b6f9637e0687c9db37f94bdebc26 100644
--- a/webgui/js/app/windows/AdminUserLogs.js
+++ b/webgui/js/app/windows/AdminUserLogs.js
@@ -112,20 +112,21 @@ function showAdminUserLogsWindow(id) {
 					id: summaryFormID,
 					region: 'center',
 					split: true,
-					border: true,
+					border: false,
 					autoScroll: true,
 					defaultType: 'textarea',
-					height: 180,
+					height: 300,
 					width: 400,
-					labelWidth: 80,
+					labelWidth: 0,
 					items: [
 						{
 							id: summaryTotalID,
 							name: 'summaryTotal',
 							readOnly: true,
-							height: 139,
-							width: 275,
+							height: 300,
+							width: 400,
 							fieldLabel: 'Summary',
+							hideLabel: true,
 							fieldClass: 'font-family: monospace; font-size: 10px;',
 							value: ''
 						}
@@ -297,19 +298,21 @@ function showAdminUserLogsWindow(id) {
 					// Prepaid traffic
 					if (trafficCap == -1) {
 						trafficCap = 'Prepaid';
-						trafficString += sprintf('               Traffic\nCap: %s MB Topup: %d MB\n'+
-								'Usage: %d/%d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: %s \nTopup: %d MB\nUsage: %d/%d MB\n',
 								trafficCap,trafficTopups,trafficUsage,trafficTopups);
+						trafficString += '---\n';
 					// Uncapped traffic
 					} else if (trafficCap == 0) {
-						trafficString += sprintf('               Traffic\nCap: Uncapped Used: %d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: Uncapped\nUsage: %d MB\n',
 								trafficUsage);
+						trafficString += '---\n';
 					// Capped traffic
 					} else {
 						var combinedTrafficCap = trafficCap + trafficTopups;
-						trafficString += sprintf('               Traffic\nCap: %d MB Topup: %d MB\n'+
-								'Usage: %d/%d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: %d MB\nTopup: %d MB\n'+
+								'Usage: %d/%d MB\n',
 								trafficCap,trafficTopups,trafficUsage,combinedTrafficCap);
+						trafficString += '---\n';
 					}
 
 					// Format string before printing
@@ -317,25 +320,55 @@ function showAdminUserLogsWindow(id) {
 					// Prepaid uptime
 					if (uptimeCap == -1) {
 						uptimeCap = 'Prepaid';
-						uptimeString += sprintf('               Uptime\nCap: %s Min Topup: %d Min\n'+
-								'Usage: %d/%d Min',
+						uptimeString += sprintf('Uptime:\nCap: %s \nTopup: %d Min\n'+
+								'Usage: %d/%d Min\n',
 								uptimeCap,uptimeTopups,uptimeUsage,uptimeTopups);
+						uptimeString += '---\n';
 					// Uncapped uptime
 					} else if (uptimeCap == 0) {
-						uptimeString += sprintf('               Uptime\nCap: Uncapped Used: %d Min',
+						uptimeString += sprintf('Uptime:\nCap: Uncapped\nUsage: %d Min\n',
 								uptimeUsage);
+						uptimeString += '---\n';
 					// Capped uptime
 					} else {
 						var combinedUptimeCap = uptimeCap + uptimeTopups;
-						uptimeString += sprintf('               Uptime\nCap: %d Min Topup: %d Min\n'+
-								'Usage: %d/%d Min',
+						uptimeString += sprintf('Uptime:\nCap: %d Min\nTopup: %d Min\n'+
+								'Usage: %d/%d Min\n',
 								uptimeCap,uptimeTopups,uptimeUsage,combinedUptimeCap);
+						uptimeString += '---\n';
+					}
+
+					// Topup breakdown
+					var tTopups = response.data.AllTrafficTopups;
+					var uTopups = response.data.AllUptimeTopups;
+
+					// Format topups string
+					var topupString = '';
+					if (tTopups.length > 0) {
+						topupString += 'Valid Traffic Topups:';
+					}
+					for (var i = 0; i < tTopups.length; i++) {
+						var id = tTopups[i].ID;
+						var used = tTopups[i].Used;
+						var cap = tTopups[i].Cap;
+						var validTo = tTopups[i].ValidTo;
+						topupString += sprintf('\nID: %s\nUsage: %d/%d MB\nValid Until: %s\n--',id,used,cap,validTo);
+					}
+					if (uTopups.length > 0) {
+						topupString += 'Valid Uptime Topups:';
+					}
+					for (var i = 0; i < uTopups.length; i++) {
+						var id = uTopups[i].ID;
+						var used = uTopups[i].Used;
+						var cap = uTopups[i].Cap;
+						var validTo = uTopups[i].ValidTo;
+						topupString += sprintf('\nID: %s\nUsage: %d/%d MB\nValid Until: %s\n--',id,used,cap,validTo);
 					}
 
 					// Get summary field
 					var form = Ext.getCmp(summaryFormID);
 					var summaryField = Ext.getCmp(summaryTotalID);
-					summaryField.setValue(trafficString+uptimeString);
+					summaryField.setValue(trafficString+uptimeString+topupString);
 				},
 				failure: function (result) {
 					Ext.MessageBox.alert('Failed', 'Couldn\'t fetch data: '+result.date);
diff --git a/webgui/js/app/windows/WiSPUserLogs.js b/webgui/js/app/windows/WiSPUserLogs.js
index 55758fd4b71887dadef0e4e8d316b5f1b95d6942..619b35a2cbe1a9dd05a55abd27452f46110468f4 100644
--- a/webgui/js/app/windows/WiSPUserLogs.js
+++ b/webgui/js/app/windows/WiSPUserLogs.js
@@ -112,20 +112,21 @@ function showWiSPUserLogsWindow(id) {
 					id: summaryFormID,
 					region: 'center',
 					split: true,
-					border: true,
+					border: false,
 					autoScroll: true,
 					defaultType: 'textarea',
-					height: 180,
+					height: 300,
 					width: 400,
-					labelWidth: 80,
+					labelWidth: 0,
 					items: [
 						{
 							id: summaryTotalID,
 							name: 'summaryTotal',
 							readOnly: true,
-							height: 139,
-							width: 275,
+							height: 300,
+							width: 400,
 							fieldLabel: 'Summary',
+							hideLabel: true,
 							fieldClass: 'font-family: monospace; font-size: 10px;',
 							value: ''
 						}
@@ -297,19 +298,21 @@ function showWiSPUserLogsWindow(id) {
 					// Prepaid traffic
 					if (trafficCap == -1) {
 						trafficCap = 'Prepaid';
-						trafficString += sprintf('               Traffic\nCap: %s MB Topup: %d MB\n'+
-								'Usage: %d/%d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: %s \nTopup: %d MB\nUsage: %d/%d MB\n',
 								trafficCap,trafficTopups,trafficUsage,trafficTopups);
+						trafficString += '---\n';
 					// Uncapped traffic
 					} else if (trafficCap == 0) {
-						trafficString += sprintf('               Traffic\nCap: Uncapped Used: %d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: Uncapped\nUsage: %d MB\n',
 								trafficUsage);
+						trafficString += '---\n';
 					// Capped traffic
 					} else {
 						var combinedTrafficCap = trafficCap + trafficTopups;
-						trafficString += sprintf('               Traffic\nCap: %d MB Topup: %d MB\n'+
-								'Usage: %d/%d MB\n=====================================\n',
+						trafficString += sprintf('Traffic:\nCap: %d MB\nTopup: %d MB\n'+
+								'Usage: %d/%d MB\n',
 								trafficCap,trafficTopups,trafficUsage,combinedTrafficCap);
+						trafficString += '---\n';
 					}
 
 					// Format string before printing
@@ -317,25 +320,55 @@ function showWiSPUserLogsWindow(id) {
 					// Prepaid uptime
 					if (uptimeCap == -1) {
 						uptimeCap = 'Prepaid';
-						uptimeString += sprintf('               Uptime\nCap: %s Min Topup: %d Min\n'+
-								'Usage: %d/%d Min',
+						uptimeString += sprintf('Uptime:\nCap: %s \nTopup: %d Min\n'+
+								'Usage: %d/%d Min\n',
 								uptimeCap,uptimeTopups,uptimeUsage,uptimeTopups);
+						uptimeString += '---\n';
 					// Uncapped uptime
 					} else if (uptimeCap == 0) {
-						uptimeString += sprintf('               Uptime\nCap: Uncapped Used: %d Min',
+						uptimeString += sprintf('Uptime:\nCap: Uncapped\nUsage: %d Min\n',
 								uptimeUsage);
+						uptimeString += '---\n';
 					// Capped uptime
 					} else {
 						var combinedUptimeCap = uptimeCap + uptimeTopups;
-						uptimeString += sprintf('               Uptime\nCap: %d Min Topup: %d Min\n'+
-								'Usage: %d/%d Min',
+						uptimeString += sprintf('Uptime:\nCap: %d Min\nTopup: %d Min\n'+
+								'Usage: %d/%d Min\n',
 								uptimeCap,uptimeTopups,uptimeUsage,combinedUptimeCap);
+						uptimeString += '---\n';
+					}
+
+					// Topup breakdown
+					var tTopups = response.data.AllTrafficTopups;
+					var uTopups = response.data.AllUptimeTopups;
+
+					// Format topups string
+					var topupString = '';
+					if (tTopups.length > 0) {
+						topupString += 'Valid Traffic Topups:';
+					}
+					for (var i = 0; i < tTopups.length; i++) {
+						var id = tTopups[i].ID;
+						var used = tTopups[i].Used;
+						var cap = tTopups[i].Cap;
+						var validTo = tTopups[i].ValidTo;
+						topupString += sprintf('\nID: %s\nUsage: %d/%d MB\nValid Until: %s\n--',id,used,cap,validTo);
+					}
+					if (uTopups.length > 0) {
+						topupString += 'Valid Uptime Topups:';
+					}
+					for (var i = 0; i < uTopups.length; i++) {
+						var id = uTopups[i].ID;
+						var used = uTopups[i].Used;
+						var cap = uTopups[i].Cap;
+						var validTo = uTopups[i].ValidTo;
+						topupString += sprintf('\nID: %s\nUsage: %d/%d MB\nValid Until: %s\n--',id,used,cap,validTo);
 					}
 
 					// Get summary field
 					var form = Ext.getCmp(summaryFormID);
 					var summaryField = Ext.getCmp(summaryTotalID);
-					summaryField.setValue(trafficString+uptimeString);
+					summaryField.setValue(trafficString+uptimeString+topupString);
 				},
 				failure: function (result) {
 					Ext.MessageBox.alert('Failed', 'Couldn\'t fetch data: '+result.date);