Index: /branches/HiveStatistics/sources/.nuget/NuGet.targets
===================================================================
--- /branches/HiveStatistics/sources/.nuget/NuGet.targets	(revision 12551)
+++ /branches/HiveStatistics/sources/.nuget/NuGet.targets	(revision 12551)
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup>
+        <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
+
+        <!-- Enable the restore command to run before builds -->
+        <RestorePackages Condition="  '$(RestorePackages)' == '' ">true</RestorePackages>
+
+        <!-- Property that enables building a package from a project -->
+        <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
+
+        <!-- Determines if package restore consent is required to restore packages -->
+        <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
+
+        <!-- Download NuGet.exe if it does not already exist -->
+        <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
+    </PropertyGroup>
+
+    <ItemGroup Condition=" '$(PackageSources)' == '' ">
+        <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
+        <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
+        <!--
+            <PackageSource Include="https://www.nuget.org/api/v2/" />
+            <PackageSource Include="https://my-nuget-source/nuget/" />
+        -->
+    </ItemGroup>
+
+    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
+        <!-- Windows specific commands -->
+        <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
+    </PropertyGroup>
+
+    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
+        <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
+        <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <PackagesProjectConfig Condition=" '$(OS)' == 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config</PackagesProjectConfig>
+        <PackagesProjectConfig Condition=" '$(OS)' != 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config</PackagesProjectConfig>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <PackagesConfig Condition="Exists('$(MSBuildProjectDirectory)\packages.config')">$(MSBuildProjectDirectory)\packages.config</PackagesConfig>
+      <PackagesConfig Condition="Exists('$(PackagesProjectConfig)')">$(PackagesProjectConfig)</PackagesConfig>
+    </PropertyGroup>
+    
+    <PropertyGroup>
+        <!-- NuGet command -->
+        <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
+        <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
+
+        <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
+        <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 "$(NuGetExePath)"</NuGetCommand>
+
+        <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
+
+        <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
+        <NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
+
+        <PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
+        <PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
+
+        <!-- Commands -->
+        <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
+        <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
+
+        <!-- We need to ensure packages are restored prior to assembly resolve -->
+        <BuildDependsOn Condition="$(RestorePackages) == 'true'">
+            RestorePackages;
+            $(BuildDependsOn);
+        </BuildDependsOn>
+
+        <!-- Make the build depend on restore packages -->
+        <BuildDependsOn Condition="$(BuildPackage) == 'true'">
+            $(BuildDependsOn);
+            BuildPackage;
+        </BuildDependsOn>
+    </PropertyGroup>
+
+    <Target Name="CheckPrerequisites">
+        <!-- Raise an error if we're unable to locate nuget.exe  -->
+        <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
+        <!--
+        Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
+        This effectively acts as a lock that makes sure that the download operation will only happen once and all
+        parallel builds will have to wait for it to complete.
+        -->
+        <MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
+    </Target>
+
+    <Target Name="_DownloadNuGet">
+        <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
+    </Target>
+
+    <Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">        
+        <Exec Command="$(RestoreCommand)"
+              Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
+
+        <Exec Command="$(RestoreCommand)"
+              LogStandardErrorAsError="true"
+              Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
+    </Target>
+
+    <Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
+        <Exec Command="$(BuildCommand)"
+              Condition=" '$(OS)' != 'Windows_NT' " />
+
+        <Exec Command="$(BuildCommand)"
+              LogStandardErrorAsError="true"
+              Condition=" '$(OS)' == 'Windows_NT' " />
+    </Target>
+
+    <UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+        <ParameterGroup>
+            <OutputFilename ParameterType="System.String" Required="true" />
+        </ParameterGroup>
+        <Task>
+            <Reference Include="System.Core" />
+            <Using Namespace="System" />
+            <Using Namespace="System.IO" />
+            <Using Namespace="System.Net" />
+            <Using Namespace="Microsoft.Build.Framework" />
+            <Using Namespace="Microsoft.Build.Utilities" />
+            <Code Type="Fragment" Language="cs">
+                <![CDATA[
+                try {
+                    OutputFilename = Path.GetFullPath(OutputFilename);
+
+                    Log.LogMessage("Downloading latest version of NuGet.exe...");
+                    WebClient webClient = new WebClient();
+                    webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
+
+                    return true;
+                }
+                catch (Exception ex) {
+                    Log.LogErrorFromException(ex);
+                    return false;
+                }
+            ]]>
+            </Code>
+        </Task>
+    </UsingTask>
+</Project>
Index: /branches/HiveStatistics/sources/HeuristicLab 3.3 Services.sln
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab 3.3 Services.sln	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab 3.3 Services.sln	(revision 12551)
@@ -64,5 +64,4 @@
 	ProjectSection(SolutionItems) = preProject
 		.nuget\NuGet.Config = .nuget\NuGet.Config
-		.nuget\NuGet.exe = .nuget\NuGet.exe
 		.nuget\NuGet.targets = .nuget\NuGet.targets
 	EndProjectSection
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/HiveStatistics/FactTaskDao.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/HiveStatistics/FactTaskDao.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/HiveStatistics/FactTaskDao.cs	(revision 12551)
@@ -27,4 +27,14 @@
 namespace HeuristicLab.Services.Hive.DataAccess.Daos.HiveStatistics {
   public class FactTaskDao : GenericDao<Guid, FactTask> {
+
+    private static readonly TaskState[] CompletedStates = { TaskState.Finished, TaskState.Aborted, TaskState.Failed };
+
+    private Table<DimClient> DimClientTable {
+      get { return DataContext.GetTable<DimClient>(); }
+    }
+    private Table<DimJob> DimJobTable {
+      get { return DataContext.GetTable<DimJob>(); }
+    }
+
     private const string BatchDeleteQuery =
       @"DELETE FROM [statistics].[FactTask]
@@ -52,4 +62,26 @@
     }
 
+    public IQueryable<FactTask> GetTasksWithException() {
+      return Table.Where(x => x.Exception.Trim() != string.Empty);
+    }
+
+    public IQueryable<FactTask> GetByGroupId(Guid id) {
+      return from factTask in Table
+             join client in DimClientTable on factTask.LastClientId equals client.Id
+             where client.ResourceGroupId == id
+             select factTask;
+    }
+
+    public IQueryable<FactTask> GetByUserId(Guid id) {
+      return from factTask in Table
+             join job in DimJobTable on factTask.JobId equals job.JobId
+             where job.UserId == id
+             select factTask;
+    }
+
+    public IQueryable<FactTask> GetCompletedTasks() {
+      return Table.Where(x => CompletedStates.Contains(x.TaskState));
+    }
+
     public override void Delete(IEnumerable<Guid> ids) {
       string paramIds = string.Join(",", ids.Select(x => string.Format("'{0}'", x)));
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveDao.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveDao.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveDao.cs	(revision 12551)
@@ -55,4 +55,8 @@
     public IQueryable<Slave> GetAll() {
       return Entities;
+    }
+
+    public IQueryable<Slave> GetOnlineSlaves() {
+      return Entities.Where(x => x.SlaveState != SlaveState.Offline);
     }
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 12551)
@@ -227,7 +227,7 @@
     <Type Name="FactTask">
       <Column Name="TaskId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
-      <Column Name="CalculatingTime" Storage="_TotalRuntime" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="WaitingTime" Storage="_TotalWaitingTime" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TransferTime" Storage="_TotalTransferTime" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
+      <Column Name="CalculatingTime" Storage="_TotalRuntime" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
+      <Column Name="WaitingTime" Storage="_TotalWaitingTime" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
+      <Column Name="TransferTime" Storage="_TotalTransferTime" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
       <Column Name="NumCalculationRuns" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
       <Column Name="NumRetries" Storage="_NumFails" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
@@ -240,5 +240,5 @@
       <Column Name="TaskState" Type="global::HeuristicLab.Services.Hive.DataAccess.TaskState" DbType="varchar(30)" CanBeNull="false" />
       <Column Name="Exception" Type="System.String" DbType="varchar(MAX)" CanBeNull="true" />
-      <Column Name="InitialWaitingTime" Storage="_InitialWaitingTimeMs" Type="System.Double" CanBeNull="false" />
+      <Column Name="InitialWaitingTime" Storage="_InitialWaitingTimeMs" Type="System.Int64" DbType="INT" CanBeNull="false" />
       <Column Name="StartTime" Type="System.DateTime" CanBeNull="true" />
       <Association Name="DimClient_FactTask" Member="DimClient" ThisKey="LastClientId" OtherKey="Id" Type="DimClient" IsForeignKey="true" />
@@ -287,8 +287,9 @@
       <Column Name="TotalMemory" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
       <Column Name="CpuUtilization" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TotalTimeIdle" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TotalTimeOffline" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TotalTimeUnavailable" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
+      <Column Name="IdleTime" Storage="_TotalTimeIdle" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
+      <Column Name="OfflineTime" Storage="_TotalTimeOffline" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
+      <Column Name="UnavailableTime" Storage="_TotalTimeUnavailable" Type="System.Int64" DbType="INT NOT NULL" CanBeNull="false" />
       <Column Name="SlaveState" Type="global::HeuristicLab.Services.Hive.DataAccess.SlaveState" DbType="VarChar(15)" CanBeNull="false" />
+      <Column Name="IsAllowedToCalculate" Type="System.Boolean" DbType="BIT" CanBeNull="false" />
       <Association Name="DimClient_FactClientInfo" Member="DimClient" ThisKey="ClientId" OtherKey="Id" Type="DimClient" IsForeignKey="true" />
       <Association Name="DimTime_FactClientInfo" Member="DimTime" ThisKey="Time" OtherKey="Time" Type="DimTime" IsForeignKey="true" />
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout	(revision 12551)
@@ -277,8 +277,8 @@
       </nestedChildShapes>
     </classShape>
-    <classShape Id="053a5cff-b18a-4ee5-8d43-48ed5c5dcfad" absoluteBounds="2.625, 11, 2, 3.1170068359375005">
+    <classShape Id="053a5cff-b18a-4ee5-8d43-48ed5c5dcfad" absoluteBounds="2.625, 11, 2, 3.3093082682291666">
       <DataClassMoniker Name="/HiveDataContext/FactClientInfo" />
       <nestedChildShapes>
-        <elementListCompartment Id="0a1cc913-6636-455c-95b3-302f533527db" absoluteBounds="2.6399999999999997, 11.46, 1.9700000000000002, 2.5570068359375" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="0a1cc913-6636-455c-95b3-302f533527db" absoluteBounds="2.6399999999999997, 11.46, 1.9700000000000002, 2.7493082682291665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -297,5 +297,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(5.6249975 : 15.25); (5.6249975 : 12.5585034179688); (4.625 : 12.5585034179688)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(5.6249975 : 15.25); (5.6249975 : 12.6546541341146); (4.625 : 12.6546541341146)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/HiveDataContext/DimClient/DimClient_FactClientInfo" />
       <nodes>
@@ -311,5 +311,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(1.59375 : 10.0689925130208); (1.59375 : 12.5585034179688); (2.625 : 12.5585034179688)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(1.59375 : 10.0689925130208); (1.59375 : 12.6546541341146); (2.625 : 12.6546541341146)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/HiveDataContext/DimUser/DimUser_FactClientInfo" />
       <nodes>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs	(revision 12551)
@@ -4895,9 +4895,9 @@
 		private System.Guid _TaskId;
 		
-		private double _TotalRuntime;
-		
-		private double _TotalWaitingTime;
-		
-		private double _TotalTransferTime;
+		private long _TotalRuntime;
+		
+		private long _TotalWaitingTime;
+		
+		private long _TotalTransferTime;
 		
 		private int _NumCalculationRuns;
@@ -4921,5 +4921,5 @@
 		private string _Exception;
 		
-		private double _InitialWaitingTimeMs;
+		private long _InitialWaitingTimeMs;
 		
 		private System.Nullable<System.DateTime> _StartTime;
@@ -4935,9 +4935,9 @@
     partial void OnTaskIdChanging(System.Guid value);
     partial void OnTaskIdChanged();
-    partial void OnCalculatingTimeChanging(double value);
+    partial void OnCalculatingTimeChanging(long value);
     partial void OnCalculatingTimeChanged();
-    partial void OnWaitingTimeChanging(double value);
+    partial void OnWaitingTimeChanging(long value);
     partial void OnWaitingTimeChanged();
-    partial void OnTransferTimeChanging(double value);
+    partial void OnTransferTimeChanging(long value);
     partial void OnTransferTimeChanged();
     partial void OnNumCalculationRunsChanging(int value);
@@ -4961,5 +4961,5 @@
     partial void OnExceptionChanging(string value);
     partial void OnExceptionChanged();
-    partial void OnInitialWaitingTimeChanging(double value);
+    partial void OnInitialWaitingTimeChanging(long value);
     partial void OnInitialWaitingTimeChanged();
     partial void OnStartTimeChanging(System.Nullable<System.DateTime> value);
@@ -4994,6 +4994,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalRuntime", DbType="Float NOT NULL")]
-		public double CalculatingTime
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalRuntime", DbType="INT NOT NULL")]
+		public long CalculatingTime
 		{
 			get
@@ -5014,6 +5014,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalWaitingTime", DbType="Float NOT NULL")]
-		public double WaitingTime
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalWaitingTime", DbType="INT NOT NULL")]
+		public long WaitingTime
 		{
 			get
@@ -5034,6 +5034,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTransferTime", DbType="Float NOT NULL")]
-		public double TransferTime
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTransferTime", DbType="INT NOT NULL")]
+		public long TransferTime
 		{
 			get
@@ -5262,6 +5262,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InitialWaitingTimeMs")]
-		public double InitialWaitingTime
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InitialWaitingTimeMs", DbType="INT")]
+		public long InitialWaitingTime
 		{
 			get
@@ -5995,11 +5995,13 @@
 		private double _CpuUtilization;
 		
-		private double _TotalTimeIdle;
-		
-		private double _TotalTimeOffline;
-		
-		private double _TotalTimeUnavailable;
+		private long _TotalTimeIdle;
+		
+		private long _TotalTimeOffline;
+		
+		private long _TotalTimeUnavailable;
 		
 		private global::HeuristicLab.Services.Hive.DataAccess.SlaveState _SlaveState;
+		
+		private bool _IsAllowedToCalculate;
 		
 		private EntityRef<DimClient> _DimClient;
@@ -6029,12 +6031,14 @@
     partial void OnCpuUtilizationChanging(double value);
     partial void OnCpuUtilizationChanged();
-    partial void OnTotalTimeIdleChanging(double value);
-    partial void OnTotalTimeIdleChanged();
-    partial void OnTotalTimeOfflineChanging(double value);
-    partial void OnTotalTimeOfflineChanged();
-    partial void OnTotalTimeUnavailableChanging(double value);
-    partial void OnTotalTimeUnavailableChanged();
+    partial void OnIdleTimeChanging(long value);
+    partial void OnIdleTimeChanged();
+    partial void OnOfflineTimeChanging(long value);
+    partial void OnOfflineTimeChanged();
+    partial void OnUnavailableTimeChanging(long value);
+    partial void OnUnavailableTimeChanged();
     partial void OnSlaveStateChanging(global::HeuristicLab.Services.Hive.DataAccess.SlaveState value);
     partial void OnSlaveStateChanged();
+    partial void OnIsAllowedToCalculateChanging(bool value);
+    partial void OnIsAllowedToCalculateChanged();
     #endregion
 		
@@ -6219,6 +6223,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeIdle", DbType="Float NOT NULL")]
-		public double TotalTimeIdle
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeIdle", DbType="INT NOT NULL")]
+		public long IdleTime
 		{
 			get
@@ -6230,15 +6234,15 @@
 				if ((this._TotalTimeIdle != value))
 				{
-					this.OnTotalTimeIdleChanging(value);
+					this.OnIdleTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalTimeIdle = value;
-					this.SendPropertyChanged("TotalTimeIdle");
-					this.OnTotalTimeIdleChanged();
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeOffline", DbType="Float NOT NULL")]
-		public double TotalTimeOffline
+					this.SendPropertyChanged("IdleTime");
+					this.OnIdleTimeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeOffline", DbType="INT NOT NULL")]
+		public long OfflineTime
 		{
 			get
@@ -6250,15 +6254,15 @@
 				if ((this._TotalTimeOffline != value))
 				{
-					this.OnTotalTimeOfflineChanging(value);
+					this.OnOfflineTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalTimeOffline = value;
-					this.SendPropertyChanged("TotalTimeOffline");
-					this.OnTotalTimeOfflineChanged();
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeUnavailable", DbType="Float NOT NULL")]
-		public double TotalTimeUnavailable
+					this.SendPropertyChanged("OfflineTime");
+					this.OnOfflineTimeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTimeUnavailable", DbType="INT NOT NULL")]
+		public long UnavailableTime
 		{
 			get
@@ -6270,9 +6274,9 @@
 				if ((this._TotalTimeUnavailable != value))
 				{
-					this.OnTotalTimeUnavailableChanging(value);
+					this.OnUnavailableTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalTimeUnavailable = value;
-					this.SendPropertyChanged("TotalTimeUnavailable");
-					this.OnTotalTimeUnavailableChanged();
+					this.SendPropertyChanged("UnavailableTime");
+					this.OnUnavailableTimeChanged();
 				}
 			}
@@ -6299,4 +6303,24 @@
 		}
 		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_IsAllowedToCalculate", DbType="BIT")]
+		public bool IsAllowedToCalculate
+		{
+			get
+			{
+				return this._IsAllowedToCalculate;
+			}
+			set
+			{
+				if ((this._IsAllowedToCalculate != value))
+				{
+					this.OnIsAllowedToCalculateChanging(value);
+					this.SendPropertyChanging();
+					this._IsAllowedToCalculate = value;
+					this.SendPropertyChanged("IsAllowedToCalculate");
+					this.OnIsAllowedToCalculateChanged();
+				}
+			}
+		}
+		
 		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimClient_FactClientInfo", Storage="_DimClient", ThisKey="ClientId", OtherKey="Id", IsForeignKey=true)]
 		public DimClient DimClient
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql	(revision 12551)
@@ -217,6 +217,6 @@
     [ResourceGroupId]  UNIQUEIDENTIFIER NULL,
     [ResourceGroup2Id] UNIQUEIDENTIFIER NULL,
-	[GroupName]        VARCHAR (MAX)    NULL,
-	[GroupName2]       VARCHAR (MAX)    NULL,
+    [GroupName]        VARCHAR (MAX)    NULL,
+    [GroupName2]       VARCHAR (MAX)    NULL,
     CONSTRAINT [PK_DimClient] PRIMARY KEY CLUSTERED ([Id] ASC)
 );
@@ -238,16 +238,17 @@
 );
 CREATE TABLE [statistics].[FactClientInfo] (
-    [ClientId]              UNIQUEIDENTIFIER NOT NULL,
-    [Time]                  DATETIME         NOT NULL,
-    [UserId]                UNIQUEIDENTIFIER NOT NULL,
-    [NumUsedCores]          INT              NOT NULL,
-    [NumTotalCores]         INT              NOT NULL,
-    [UsedMemory]            INT              NOT NULL,
-    [TotalMemory]           INT              NOT NULL,
-    [CpuUtilization]        FLOAT (53)       NOT NULL,
-    [SlaveState]			VarChar(15) 	 NOT NULL,
-    [TotalTimeIdle]         FLOAT (53)       NOT NULL,
-    [TotalTimeOffline]      FLOAT (53)       NOT NULL,
-    [TotalTimeUnavailable]  FLOAT (53)       NOT NULL,
+    [ClientId]             UNIQUEIDENTIFIER NOT NULL,
+    [Time]                 DATETIME         NOT NULL,
+    [UserId]               UNIQUEIDENTIFIER NOT NULL,
+    [NumUsedCores]         INT              NOT NULL,
+    [NumTotalCores]        INT              NOT NULL,
+    [UsedMemory]           INT              NOT NULL,
+    [TotalMemory]          INT              NOT NULL,
+    [CpuUtilization]       FLOAT (53)       NOT NULL,
+    [SlaveState]           VarChar(15)      NOT NULL,
+    [IdleTime]             INT              NOT NULL,
+    [OfflineTime]          INT              NOT NULL,
+    [UnavailableTime]      INT              NOT NULL,
+    [IsAllowedToCalculate] BIT              NOT NULL,
     CONSTRAINT [PK_FactClientInfo] PRIMARY KEY CLUSTERED ([ClientId] ASC, [Time] ASC, [UserId] ASC),
     CONSTRAINT [FK_FactClientInfo_DimTime] FOREIGN KEY ([Time]) REFERENCES [statistics].[DimTime] ([Time]),
@@ -255,24 +256,25 @@
     CONSTRAINT [FK_FactClientInfo_DimUser] FOREIGN KEY ([UserId]) REFERENCES [statistics].[DimUser] ([UserId])
 );
+
 CREATE TABLE [statistics].[FactTask] (
-    [TaskId]			   UNIQUEIDENTIFIER NOT NULL,
-    [CalculatingTime]	   FLOAT (53)       NOT NULL,
-    [WaitingTime]		   FLOAT (53)       NOT NULL,
-    [TransferTime]         FLOAT (53)       NOT NULL,
-    [NumCalculationRuns]   INT              NOT NULL,
-    [NumRetries]		   INT              NOT NULL,
-    [CoresRequired]		   INT              NOT NULL,
-    [MemoryRequired]	   INT              NOT NULL,
-    [Priority]			   INT              NOT NULL,
-    [LastClientId]		   UNIQUEIDENTIFIER NULL,
-    [JobId]				   UNIQUEIDENTIFIER NOT NULL,
-    [StartTime]            DATETIME         NULL,
-    [EndTime]			   DATETIME         NULL,
-    [TaskState]			   VARCHAR (30)     NOT NULL,
-    [Exception]			   VARCHAR (MAX)	NULL,
-    [InitialWaitingTime]   FLOAT (53)       NULL,
-    CONSTRAINT [PK_FactTask] PRIMARY KEY CLUSTERED ([TaskId] ASC),
-    CONSTRAINT [FK_FactTask_DimClient] FOREIGN KEY ([LastClientId]) REFERENCES [statistics].[DimClient] ([Id]),
-    CONSTRAINT [FK_FactTask_DimJob] FOREIGN KEY ([JobId]) REFERENCES [statistics].[DimJob] ([JobId])
+  [TaskId]             UNIQUEIDENTIFIER NOT NULL,
+  [CalculatingTime]    INT              NOT NULL,
+  [WaitingTime]        INT              NOT NULL,
+  [TransferTime]       INT              NOT NULL,
+  [NumCalculationRuns] INT              NOT NULL,
+  [NumRetries]         INT              NOT NULL,
+  [CoresRequired]      INT              NOT NULL,
+  [MemoryRequired]     INT              NOT NULL,
+  [Priority]           INT              NOT NULL,
+  [LastClientId]       UNIQUEIDENTIFIER NULL,
+  [JobId]		       UNIQUEIDENTIFIER NOT NULL,
+  [StartTime]          DATETIME         NULL,
+  [EndTime]            DATETIME         NULL,
+  [TaskState]          VARCHAR (30)     NOT NULL,
+  [Exception]          VARCHAR (MAX)    NULL,
+  [InitialWaitingTime] INT              NULL,
+  CONSTRAINT [PK_FactTask] PRIMARY KEY CLUSTERED ([TaskId] ASC),
+  CONSTRAINT [FK_FactTask_DimClient] FOREIGN KEY ([LastClientId]) REFERENCES [statistics].[DimClient] ([Id]),
+  CONSTRAINT [FK_FactTask_DimJob] FOREIGN KEY ([JobId]) REFERENCES [statistics].[DimJob] ([JobId])
 );
 
Index: anches/HiveStatistics/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx	(revision 12550)
+++ 	(revision )
@@ -1,160 +1,0 @@
-﻿<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Status.aspx.cs" Inherits="Status" %>
-
-<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
-  Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head runat="server">
-  <title>HeuristicLab Hive Status Monitor</title> 
-  <link rel="icon" type="image/ico" href="HeuristicLab.ico" /> 
-    <style type="text/css">
-        .auto-style1 {
-            color: #F6921B;
-        }
-        .auto-style2 {
-            color: #000000;
-        }
-    </style>
-</head>
-<body>
-  <center>
-    <h1 class="auto-style1">HeuristicLab <span class="auto-style2">Hive Status Monitor</span></h1>
-  </center>
-  <form id="form1" runat="server">
-  <div>
-      <strong>Overall Available Cores:</strong>
-    <asp:Label ID="overallAvailableCoresLabel" runat="server" />
-      <br />
-      <strong>Available Cores (real):</strong>
-    <asp:Label ID="availableCoresLabel" runat="server" />
-      <br />
-      <strong>System-Wide Waiting Tasks:</strong>
-    <asp:Label ID="waitingJobsLabel" runat="server" />
-      <br />
-      <strong>Used Cores / Calculating Tasks:</strong>
-    <asp:Label ID="usedCoresLabel" runat="server" />
-    <br />
-      <strong>Overall
-    Avg. CPU Utilization:</strong>
-    <asp:Label ID="overallCpuUtilizationLabel" runat="server" />
-      <br />
-      <strong>Real Avg. CPU Utilization:</strong>
-    <asp:Label ID="cpuUtilizationLabel" runat="server" />
-      &nbsp;<br />
-      <strong>Slaves (CPU Utilization):</strong>
-    <asp:Label ID="slavesLabel" runat="server" />
-      <br />
-      <strong>Groups:</strong>
-    <asp:Label ID="groupsLabel" runat="server" />
-      <br />
-      <br />
-      <strong>Number of Calculating Tasks by User:</strong><asp:Table ID="calculatingTasksByUserTable" runat="server" GridLines="Both">
-          <asp:TableRow runat="server" BackColor="#CCCCCC">
-              <asp:TableCell runat="server" Font-Bold="False">User</asp:TableCell>
-              <asp:TableCell runat="server" Font-Bold="False">Nr. of Tasks</asp:TableCell>
-          </asp:TableRow>
-      </asp:Table>
-      <br />
-      <strong>Number of Waiting Tasks by User:</strong><asp:Table ID="waitingTasksByUserTable" runat="server" GridLines="Both">
-          <asp:TableRow runat="server" BackColor="#CCCCCC">
-              <asp:TableCell runat="server" Font-Bold="False">User</asp:TableCell>
-              <asp:TableCell runat="server" Font-Bold="False">Nr. of Tasks</asp:TableCell>
-          </asp:TableRow>
-      </asp:Table>
-      <br />
-    <br />
-      <strong>Days:</strong>
-    <asp:DropDownList ID="daysDropDownList" runat="server" AutoPostBack="True">
-      <asp:ListItem Value="1"></asp:ListItem>
-      <asp:ListItem Value="2"></asp:ListItem>
-      <asp:ListItem Value="3"></asp:ListItem>
-      <asp:ListItem Value="4"></asp:ListItem>
-      <asp:ListItem Value="5"></asp:ListItem>
-      <asp:ListItem Value="6"></asp:ListItem>
-      <asp:ListItem Value="7"></asp:ListItem>
-      <asp:ListItem Value="8"></asp:ListItem>
-      <asp:ListItem Value="9"></asp:ListItem>
-      <asp:ListItem Value="10"></asp:ListItem>
-      <asp:ListItem Value="11"></asp:ListItem>
-      <asp:ListItem Value="12"></asp:ListItem>
-      <asp:ListItem Value="13"></asp:ListItem>
-      <asp:ListItem Value="14"></asp:ListItem>
-      <asp:ListItem Value="All"></asp:ListItem>
-    </asp:DropDownList>
-    <br />
-    <br />
-      <strong>Avg. CPU Utilization History of all Slaves</strong><br />
-    <asp:Chart ID="cpuUtilizationChart" runat="server" Height="270px" Width="1280px">
-      <Series>
-        <asp:Series BorderWidth="2" ChartType="Line" Color="0, 176, 80" Name="Series1" XValueType="DateTime"
-          YValueType="Double">
-        </asp:Series>
-      </Series>
-      <ChartAreas>
-        <asp:ChartArea BackColor="Black" BackHatchStyle="DottedGrid" BackSecondaryColor="0, 96, 43"
-          BorderColor="DarkGreen" BorderDashStyle="Dot" Name="ChartArea1">
-          <AxisY>
-            <MajorGrid Enabled="False" />
-          </AxisY>
-          <AxisX IntervalAutoMode="VariableCount" IntervalOffset="1" IntervalOffsetType="Hours"
-            IntervalType="Hours" IsLabelAutoFit="False" >
-            <MajorGrid Enabled="False" />
-            <LabelStyle Format="d/M/yyyy HH:mm" IsStaggered="True" />
-          </AxisX>
-        </asp:ChartArea>
-      </ChartAreas>
-    </asp:Chart>
-    <br />
-      <strong>Cores/Used Cores History</strong><br />
-    <asp:Chart ID="coresChart" runat="server" Palette="None" Width="1280px" PaletteCustomColors="137, 165, 78; 185, 205, 150">
-      <Series>
-        <asp:Series ChartType="Area" Name="Cores" XValueType="DateTime" YValueType="Double">
-        </asp:Series>
-        <asp:Series ChartArea="ChartArea1" ChartType="Area" Name="FreeCores" XValueType="DateTime"
-          YValueType="Double">
-        </asp:Series>
-      </Series>
-      <ChartAreas>
-        <asp:ChartArea BackColor="Black" BackHatchStyle="DottedGrid" BackSecondaryColor="0, 96, 43"
-          BorderColor="DarkGreen" BorderDashStyle="Dot" Name="ChartArea1">
-          <AxisY>
-            <MajorGrid Enabled="False" />
-          </AxisY>
-          <AxisX IntervalAutoMode="VariableCount" IntervalOffset="1" IntervalOffsetType="Hours"
-            IntervalType="Hours" IsLabelAutoFit="False" >
-            <MajorGrid Enabled="False" />
-            <LabelStyle Format="d/M/yyyy HH:mm" IsStaggered="True" />
-          </AxisX>
-        </asp:ChartArea>
-      </ChartAreas>
-    </asp:Chart>
-    <br />
-      <strong>Memory/Used Memory History (GB)</strong><br />
-    <asp:Chart ID="memoryChart" runat="server" Palette="None" PaletteCustomColors="170, 70, 67; 209, 147, 146"
-      Width="1280px">
-      <Series>
-        <asp:Series ChartType="Area" Name="Cores" XValueType="DateTime" YValueType="Double">
-        </asp:Series>
-        <asp:Series ChartArea="ChartArea1" ChartType="Area" Name="FreeCores" XValueType="DateTime"
-          YValueType="Double">
-        </asp:Series>
-      </Series>
-      <ChartAreas>
-        <asp:ChartArea BackColor="Black" BackHatchStyle="DottedGrid" BackSecondaryColor="0, 96, 43"
-          BorderColor="DarkGreen" BorderDashStyle="Dot" Name="ChartArea1">
-          <AxisY>
-            <MajorGrid Enabled="False" />
-          </AxisY>
-          <AxisX IntervalAutoMode="VariableCount" IntervalOffset="1" IntervalOffsetType="Hours"
-            IntervalType="Hours" IsLabelAutoFit="False" >
-            <MajorGrid Enabled="False" />
-            <LabelStyle Format="d/M/yyyy HH:mm" IsStaggered="True" />
-          </AxisX>
-        </asp:ChartArea>
-      </ChartAreas>
-    </asp:Chart>
-      <br />
-  </div>
-  </form>
-</body>
-</html>
Index: anches/HiveStatistics/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Web/Hive-3.3/Status.aspx.cs	(revision 12550)
+++ 	(revision )
@@ -1,142 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web.UI.WebControls;
-using HeuristicLab.Services.Hive;
-using System.Web.UI.DataVisualization.Charting;
-using DA = HeuristicLab.Services.Hive.DataAccess;
-using DT = HeuristicLab.Services.Hive.DataTransfer;
-
-public partial class Status : System.Web.UI.Page {
-  protected void Page_Load(object sender, EventArgs e) {
-    var dao = ServiceLocator.Instance.HiveDao;
-    var optDao = ServiceLocator.Instance.OptimizedHiveDao;
-    var transactionManager = ServiceLocator.Instance.TransactionManager;
-    var resourceName = Request.QueryString["resource"];
-    List<Guid> resourceIds = new List<Guid>();
-    List<DT.Slave> onlineSlaves = new List<DT.Slave>();
-    int currentlyJobsWaiting = 0;
-    Dictionary<Guid, int> calculatingTasksByUser = new Dictionary<Guid, int>();
-    Dictionary<Guid, int> waitingTasksByUser = new Dictionary<Guid, int>();
-    List<DT.Resource> groups = new List<DT.Resource>();
-
-    transactionManager.UseTransaction(() => {
-      groups = dao.GetResources(x => x.ResourceType == "GROUP").ToList();
-    }, false, false);
-
-    if (!string.IsNullOrEmpty(resourceName)) {
-      transactionManager.UseTransaction(() => {
-        var resId = dao.GetResources(x => x.Name == resourceName).Single().Id;
-        resourceIds = dao.GetChildResources(resId).Select(x => x.Id).Union(new List<Guid> { resId }).ToList();
-        calculatingTasksByUser = dao.GetCalculatingTasksByUserForResources(resourceIds);
-        waitingTasksByUser = dao.GetWaitingTasksByUserForResources(resourceIds);
-      }, false, false);
-    } else {
-      transactionManager.UseTransaction(() => {
-        resourceIds = optDao.GetAllResourceIds().ToList();
-        calculatingTasksByUser = optDao.GetCalculatingTasksByUser();
-        waitingTasksByUser = optDao.GetWaitingTasksByUser();
-      }, false, false);
-    }
-
-    transactionManager.UseTransaction(() => {
-      if (string.IsNullOrEmpty(resourceName)) {
-        onlineSlaves = dao.GetSlaves(x => x.SlaveState == DA.SlaveState.Calculating || x.SlaveState == DA.SlaveState.Idle).ToList();
-      } else {
-        onlineSlaves = dao.GetSlaves(x => (x.SlaveState == DA.SlaveState.Calculating || x.SlaveState == DA.SlaveState.Idle) && resourceIds.Contains(x.ResourceId)).ToList();
-      }
-      currentlyJobsWaiting = optDao.GetNumberOfWaitingTasks();
-    }, false, false);
-
-    int overallCurrentlyAvailableCores = onlineSlaves.Where(s => s.Cores.HasValue).Sum(s => s.Cores.Value);
-    int currentlyAvailableCores = onlineSlaves.Where(s => s.Cores.HasValue && s.IsAllowedToCalculate).Sum(s => s.Cores.Value);
-    int currentlyUsedCores = overallCurrentlyAvailableCores - onlineSlaves.Where(s => s.FreeCores.HasValue).Sum(s => s.FreeCores.Value);
-
-    this.overallAvailableCoresLabel.Text = overallCurrentlyAvailableCores.ToString();
-    this.availableCoresLabel.Text = currentlyAvailableCores.ToString();
-    this.usedCoresLabel.Text = currentlyUsedCores.ToString();
-    this.waitingJobsLabel.Text = currentlyJobsWaiting.ToString();
-
-    slavesLabel.Text = string.Join(", ", onlineSlaves.Select(x => string.Format("<a href=\"?resource={0}\">{0}</a> ({1} %)", x.Name, Math.Round(x.CpuUtilization, 2))));
-    groupsLabel.Text = "<a href=\"Status.aspx\">All</a>, ";
-    groupsLabel.Text += string.Join(", ", groups.Select(x => string.Format("<a href=\"?resource={0}\">{0}</a>", x.Name)));
-
-    overallCpuUtilizationLabel.Text = (onlineSlaves.Any() ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
-    cpuUtilizationLabel.Text = (onlineSlaves.Any(x => x.IsAllowedToCalculate) ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2).ToString() : "0.0") + " %";
-
-    DT.Statistics[] stats = new DT.Statistics[0];
-    transactionManager.UseTransaction(() => {
-      if (daysDropDownList.SelectedValue == "All") {
-        stats = dao.GetStatistics(x => true).OrderBy(x => x.TimeStamp).ToArray();
-      } else {
-        stats = dao.GetStatistics(x => x.Timestamp >= DateTime.Now.Subtract(TimeSpan.FromDays(int.Parse(daysDropDownList.SelectedValue)))).OrderBy(x => x.TimeStamp).ToArray();
-      }
-    }, false, false);
-
-    for (int i = 0; i < stats.Length; i++) {
-      var s = stats[i];
-      var slaveStats = s.SlaveStatistics.Where(x => resourceIds.Contains(x.SlaveId)).ToArray();
-
-      var averageCpuUtilization = slaveStats.Any() ? slaveStats.Average(x => x.CpuUtilization) : 0.0;
-      cpuUtilizationChart.Series[0].Points.Add(new DataPoint(s.TimeStamp.ToOADate(), averageCpuUtilization));
-
-      var cores = slaveStats.Sum(x => x.Cores);
-
-      var usedCores = cores - slaveStats.Sum(x => x.FreeCores);
-      coresChart.Series[0].Points.AddXY(s.TimeStamp.ToOADate(), cores);
-      coresChart.Series[1].Points.AddXY(s.TimeStamp.ToOADate(), usedCores);
-
-      var memory = slaveStats.Sum(x => x.Memory);
-      var usedMemory = memory - slaveStats.Sum(x => x.FreeMemory);
-      memoryChart.Series[0].Points.AddXY(s.TimeStamp.ToOADate(), memory / 1024.0);
-      memoryChart.Series[1].Points.AddXY(s.TimeStamp.ToOADate(), usedMemory / 1024.0);
-    }
-
-    GenerateTasksByUserTable(waitingTasksByUser, waitingTasksByUserTable);
-    GenerateTasksByUserTable(calculatingTasksByUser, calculatingTasksByUserTable);
-  }
-
-  private void GenerateTasksByUserTable(Dictionary<Guid, int> tasksByUser, Table table) {
-    foreach (var kvp in tasksByUser) {
-      TableRow curRow = new TableRow();
-      TableCell cellUser = new TableCell();
-      cellUser.Text = ServiceLocator.Instance.UserManager.GetUserById(kvp.Key).UserName;
-      TableCell cellCnt = new TableCell();
-      cellCnt.Text = kvp.Value.ToString();
-
-      curRow.Cells.Add(cellUser);
-      curRow.Cells.Add(cellCnt);
-      table.Rows.Add(curRow);
-    }
-    if (tasksByUser.Any()) {
-      TableRow sumRow = new TableRow();
-      TableCell sumCell = new TableCell();
-      sumCell.BorderWidth = Unit.Pixel(3);
-      sumCell.Text = tasksByUser.Sum(x => x.Value).ToString();
-      sumRow.Cells.Add(new TableCell());
-      sumRow.Cells.Add(sumCell);
-      table.Rows.Add(sumRow);
-    }
-  }
-}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs	(revision 12551)
@@ -241,9 +241,10 @@
           UsedMemory = x.TotalMemory - x.FreeMemory,
           TotalMemory = x.TotalMemory,
-          CpuUtilization = x.CpuUtilization,
+          CpuUtilization = Math.Round(x.CpuUtilization, 2),
           SlaveState = x.SlaveState,
-          TotalTimeIdle = x.SlaveState == SlaveState.Idle && x.IsAllowedToCalculate ? duration : 0.0,
-          TotalTimeUnavailable = x.SlaveState == SlaveState.Idle && !x.IsAllowedToCalculate ? duration : 0.0,
-          TotalTimeOffline = x.SlaveState == SlaveState.Offline ? duration : 0.0
+          IdleTime = x.SlaveState == SlaveState.Idle && x.IsAllowedToCalculate ? duration : 0,
+          UnavailableTime = x.SlaveState == SlaveState.Idle && !x.IsAllowedToCalculate ? duration : 0,
+          OfflineTime = x.SlaveState == SlaveState.Offline ? duration : 0,
+          IsAllowedToCalculate = x.IsAllowedToCalculate
         }
       );
@@ -322,8 +323,8 @@
       public int CalculationRuns { get; set; }
       public int Retries { get; set; }
-      public double CalculatingTime { get; set; }
-      public double WaitingTime { get; set; }
-      public double TransferTime { get; set; }
-      public double InitialWaitingTime { get; set; }
+      public long CalculatingTime { get; set; }
+      public long WaitingTime { get; set; }
+      public long TransferTime { get; set; }
+      public long InitialWaitingTime { get; set; }
       public string Exception { get; set; }
       public DateTime? StartTime { get; set; }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj	(revision 12551)
@@ -79,8 +79,7 @@
       <HintPath>..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
     </Reference>
-    <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
-      <Private>False</Private>
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="System" />
@@ -146,4 +145,5 @@
     <Compile Include="WebApi\DataTransfer\ClientPage.cs" />
     <Compile Include="WebApi\DataTransfer\ClientStatus.cs" />
+    <Compile Include="WebApi\DataTransfer\ExceptionPage.cs" />
     <Compile Include="WebApi\DataTransfer\Group.cs" />
     <Compile Include="WebApi\DataTransfer\GroupDetails.cs" />
@@ -154,7 +154,10 @@
     <Compile Include="WebApi\DataTransfer\JobPage.cs" />
     <Compile Include="WebApi\DataTransfer\Task.cs" />
+    <Compile Include="WebApi\DataTransfer\Exception.cs" />
     <Compile Include="WebApi\DataTransfer\TaskPage.cs" />
     <Compile Include="WebApi\DataTransfer\TaskStateCount.cs" />
     <Compile Include="WebApi\DataTransfer\User.cs" />
+    <Compile Include="WebApi\DataTransfer\UserDetails.cs" />
+    <Compile Include="WebApi\ExceptionController.cs" />
     <Compile Include="WebApi\GroupController.cs" />
     <Compile Include="WebApi\JavascriptUtils.cs" />
@@ -176,4 +179,10 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="WebApp\exceptions\exceptionsCtrl.js">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="WebApp\exceptions\exceptionDetailsDialogCtrl.js">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
     <Content Include="WebApp\groups\details\groupDetailsCtrl.js">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
@@ -192,4 +201,7 @@
     </Content>
     <Content Include="WebApp\services\clientService.js">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="WebApp\services\exceptionService.js">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
@@ -242,4 +254,10 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <None Include="WebApp\exceptions\exceptions.cshtml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="WebApp\exceptions\exceptionDetailsDialog.cshtml">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Include="WebApp\groups\details\groupDetails.cshtml">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/ClientController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/ClientController.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/ClientController.cs	(revision 12551)
@@ -47,13 +47,13 @@
             .GroupBy(x => x.ClientId)
             .Select(x => new {
-              TotalIdleTime = (long)x.Sum(y => y.TotalTimeIdle),
-              TotalOfflineTime = (long)x.Sum(y => y.TotalTimeOffline),
-              TotalUnavailableTime = (long)x.Sum(y => y.TotalTimeUnavailable)
+              TotalIdleTime = x.Sum(y => y.IdleTime),
+              TotalOfflineTime = x.Sum(y => y.OfflineTime),
+              TotalUnavailableTime = x.Sum(y => y.UnavailableTime)
             }).FirstOrDefault();
           var taskTimeData = factTaskDao.GetByClientId(id)
             .GroupBy(x => x.LastClientId)
             .Select(x => new {
-              TotalCalculatingTime = (long)x.Sum(y => y.CalculatingTime),
-              TotalTransferringTime = (long)x.Sum(y => y.TransferTime)
+              TotalCalculatingTime = x.Sum(y => y.CalculatingTime),
+              TotalTransferringTime = x.Sum(y => y.TransferTime)
             }).FirstOrDefault();
           var startDate = factClientInfoDao.GetByClientId(id)
@@ -99,5 +99,12 @@
                                       State = x.Key.ToString(),
                                       Count = x.Count()
-                                    }).ToList()
+                                    }).ToList(),
+                    Users = factTaskDao.GetAll()
+                              .Where(x => x.LastClientId == id)
+                              .Select(x => new DT.User {
+                                Id = x.DimJob.UserId,
+                                Name = x.DimJob.UserName
+                              })
+                              .Distinct().ToList()
                   })
                   .FirstOrDefault();
@@ -127,5 +134,6 @@
                          State = clientInfo.SlaveState.ToString(),
                          GroupId = client.ResourceGroupId,
-                         GroupName = client.GroupName
+                         GroupName = client.GroupName,
+                         IsAllowedToCalculate = clientInfo.IsAllowedToCalculate
                        });
           return new DT.ClientPage {
@@ -212,5 +220,6 @@
                          State = clientInfo.SlaveState.ToString(),
                          GroupId = client.ResourceGroupId,
-                         GroupName = client.GroupName
+                         GroupName = client.GroupName,
+                         IsAllowedToCalculate = clientInfo.IsAllowedToCalculate
                        });
           return new DT.ClientPage {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Client.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Client.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Client.cs	(revision 12551)
@@ -35,4 +35,5 @@
     public Guid? GroupId { get; set; }
     public string GroupName { get; set; }
+    public bool IsAllowedToCalculate { get; set; }
   }
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/ClientDetails.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/ClientDetails.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/ClientDetails.cs	(revision 12551)
@@ -43,4 +43,5 @@
     public long TotalTransferringTime { get; set; }
     public IEnumerable<TaskStateCount> TasksStates { get; set; }
+    public IEnumerable<User> Users { get; set; }
   }
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Group.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Group.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Group.cs	(revision 12551)
@@ -31,5 +31,6 @@
     public int UsedMemory { get; set; }
     public double CpuUtilization { get; set; }
-    public int Clients { get; set; }
+    public int TotalClients { get; set; }
+    public int OnlineClients { get; set; }
   }
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/GroupDetails.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/GroupDetails.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/GroupDetails.cs	(revision 12551)
@@ -21,4 +21,5 @@
 
 using System;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Services.WebApp.Statistics.WebApi.DataTransfer {
@@ -30,6 +31,14 @@
     public int TotalMemory { get; set; }
     public int UsedMemory { get; set; }
-    public double CpuUtilization { get; set; }
-    public int Clients { get; set; }
+    public double TotalCpuUtilization { get; set; }
+    public double ActiveCpuUtilization { get; set; }
+    public int TotalClients { get; set; }
+    public int OnlineClients { get; set; }
+    public long TotalUnavailableTime { get; set; }
+    public long TotalCalculatingTime { get; set; }
+    public long TotalIdleTime { get; set; }
+    public long TotalOfflineTime { get; set; }
+    public long TotalTransferringTime { get; set; }
+    public IEnumerable<TaskStateCount> TasksStates { get; set; }
   }
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/GroupController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/GroupController.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/GroupController.cs	(revision 12551)
@@ -38,5 +38,34 @@
         var dimClientDao = pm.DimClientDao;
         var factClientInfoDao = pm.FactClientInfoDao;
+        var factTaskDao = pm.FactTaskDao;
         return pm.UseTransaction(() => {
+          var clientTimeData = factClientInfoDao.GetAll()
+            .Join(dimClientDao.GetAll(), x => x.ClientId, y => y.Id, (x, y) => new {
+              y.ResourceGroupId,
+              x.IdleTime,
+              x.OfflineTime,
+              x.UnavailableTime
+            })
+            .Where(x => x.ResourceGroupId == id)
+            .GroupBy(x => x.ResourceGroupId)
+            .Select(x => new {
+              TotalIdleTime = x.Sum(y => y.IdleTime),
+              TotalOfflineTime = x.Sum(y => y.OfflineTime),
+              TotalUnavailableTime = x.Sum(y => y.UnavailableTime)
+            })
+            .FirstOrDefault();
+
+          var taskTimeData = factTaskDao.GetByGroupId(id)
+            .Select(x => new {
+              id,
+              x.CalculatingTime,
+              x.TransferTime
+            })
+            .GroupBy(x => x.id)
+            .Select(x => new {
+              CalculatingTime = x.Sum(y => y.CalculatingTime),
+              TransferTime = x.Sum(y => y.TransferTime)
+            })
+            .FirstOrDefault();
           return (from client in dimClientDao.GetActiveClients().Where(x => x.ResourceGroupId == id)
                   join info in factClientInfoDao.GetAll()
@@ -51,16 +80,30 @@
                     TotalMemory = clientInfo.TotalMemory,
                     UsedMemory = offline ? 0 : clientInfo.UsedMemory,
-                    CpuUtilization = offline ? 0 : clientInfo.CpuUtilization
+                    CpuUtilization = offline ? 0 : clientInfo.CpuUtilization,
+                    SlaveState = clientInfo.SlaveState
                   })
             .GroupBy(x => new { x.ResourceGroupId, x.GroupName })
             .Select(x => new DT.GroupDetails {
-              Id = x.Key.ResourceGroupId ?? default(Guid),
+              Id = id,
               Name = x.Key.GroupName,
-              Clients = x.Count(),
+              TotalClients = x.Count(),
+              OnlineClients = x.Count(y => y.SlaveState != DA.SlaveState.Offline),
               TotalCores = x.Sum(y => y.TotalCores),
               UsedCores = x.Sum(y => y.UsedCores),
               TotalMemory = x.Sum(y => y.TotalMemory),
               UsedMemory = x.Sum(y => y.UsedMemory),
-              CpuUtilization = x.Average(y => y.CpuUtilization)
+              TotalCpuUtilization = x.Average(y => (double?)y.CpuUtilization) ?? 0.0,
+              ActiveCpuUtilization = x.Where(y => y.SlaveState != DA.SlaveState.Offline).Average(y => (double?)y.CpuUtilization) ?? 0.0,
+              TotalUnavailableTime = clientTimeData != null ? clientTimeData.TotalUnavailableTime : 0,
+              TotalCalculatingTime = taskTimeData != null ? taskTimeData.CalculatingTime : 0,
+              TotalIdleTime = clientTimeData != null ? clientTimeData.TotalIdleTime : 0,
+              TotalOfflineTime = clientTimeData != null ? clientTimeData.TotalOfflineTime : 0,
+              TotalTransferringTime = taskTimeData != null ? taskTimeData.TransferTime : 0,
+              TasksStates = factTaskDao.GetByGroupId(id)
+                                    .GroupBy(y => y.TaskState)
+                                    .Select(y => new DT.TaskStateCount {
+                                      State = y.Key.ToString(),
+                                      Count = y.Count()
+                                    }).ToList()
             }).FirstOrDefault();
         });
@@ -83,13 +126,15 @@
                       TotalMemory = clientInfo.TotalMemory,
                       UsedMemory = offline ? 0 : clientInfo.UsedMemory,
-                      CpuUtilization = offline ? 0 : clientInfo.CpuUtilization
+                      CpuUtilization = offline ? 0 : clientInfo.CpuUtilization,
+                      SlaveState = clientInfo.SlaveState
                     }).GroupBy(x => x.ResourceGroupId).Select(x => new {
                       GroupId = x.Key,
-                      Count = x.Count(),
+                      TotalClients = x.Count(),
+                      OnlineClients = x.Count(y => y.SlaveState != DA.SlaveState.Offline),
                       TotalCores = x.Sum(y => y.TotalCores),
                       UsedCores = x.Sum(y => y.UsedCores),
                       TotalMemory = x.Sum(y => y.TotalMemory),
                       UsedMemory = x.Sum(y => y.UsedMemory),
-                      CpuUtilization = x.Average(y => y.CpuUtilization)
+                      CpuUtilization = x.Where(y => y.SlaveState != DA.SlaveState.Offline).Average(y => (double?)y.CpuUtilization) ?? 0.0
                     });
         var query = dimClientDao.GetAll()
@@ -108,5 +153,6 @@
               Id = group.Id,
               Name = group.Name,
-              Clients = info.Count,
+              TotalClients = info.TotalClients,
+              OnlineClients = info.OnlineClients,
               TotalCores = info.TotalCores,
               UsedCores = info.UsedCores,
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/TaskController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/TaskController.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/TaskController.cs	(revision 12551)
@@ -102,5 +102,5 @@
 
     [HttpPost]
-    public DT.TaskPage GetTasksByClientId(Guid id, int page, int size, IEnumerable<string> states) {
+    public DT.TaskPage GetTasksByClientId(Guid id, int page, int size, IEnumerable<string> states, Guid userId = default(Guid)) {
       bool isAdministrator = User.IsInRole(HiveRoles.Administrator);
       using (var pm = PersistenceManager) {
@@ -108,7 +108,9 @@
         var dimClientDao = pm.DimClientDao;
         var factTaskDao = pm.FactTaskDao;
-
         return pm.UseTransaction(() => {
           var tasks = factTaskDao.GetByClientId(id).Where(x => states.Contains(x.TaskState.ToString()));
+          if (userId != Guid.Empty) {
+            tasks = tasks.Where(x => x.DimJob.UserId == userId);
+          }
           return new DT.TaskPage {
             TotalTasks = tasks.Count(),
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/UserController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/UserController.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/UserController.cs	(revision 12551)
@@ -48,13 +48,20 @@
     }
 
-    public DT.User GetUser(Guid id) {
+    public DT.UserDetails GetUser(Guid id) {
       using (var pm = PersistenceManager) {
         var dimUserDao = pm.DimUserDao;
+        var factTaskDao = pm.FactTaskDao;
         return pm.UseTransaction(() => {
           var user = dimUserDao.GetById(id);
           if (user != null) {
-            return new DT.User {
+            return new DT.UserDetails {
               Id = user.UserId,
-              Name = user.Name
+              Name = user.Name,
+              TasksStates = factTaskDao.GetByUserId(id)
+                            .GroupBy(x => x.TaskState)
+                            .Select(x => new DT.TaskStateCount {
+                              State = x.Key.ToString(),
+                              Count = x.Count()
+                            }).ToList()
             };
           }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/clients.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/clients.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/clients.cshtml	(revision 12551)
@@ -3,19 +3,24 @@
 <header class="view-header">
     <ul class="nav nav-list nav-list-topbar pull-left">
-    <li>
-        <a ng-href="#/statistics/jobs">Jobs</a>
-    </li>
-    @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator))
-    {
         <li>
-            <a ng-href="#/statistics/users">Users</a>
+            <a ng-href="#/statistics/jobs">Jobs</a>
         </li>
-    }
-    <li class="active">
-        <a ng-href="#/statistics/clients">Clients</a>
-    </li>
-    <li>
-        <a ng-href="#/statistics/groups">Groups</a>
-    </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator))
+        {
+            <li>
+                <a ng-href="#/statistics/users">Users</a>
+            </li>
+        }
+        <li class="active">
+            <a ng-href="#/statistics/clients">Clients</a>
+        </li>
+        <li>
+            <a ng-href="#/statistics/groups">Groups</a>
+        </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -37,4 +42,5 @@
                             <th>Cores</th>
                             <th>Cpu Utilization</th>
+                            <th>Memory</th>
                             <th>State</th>
                             <th></th>
@@ -50,4 +56,5 @@
                             <td>{{client.UsedCores}} / {{client.TotalCores}}</td>
                             <td>{{client.CpuUtilization | number: 2}} %</td>
+                            <td>{{client.UsedMemory | kbToGB}} / {{client.TotalMemory | kbToGB}} GB</td>
                             <td>{{client.State}}</td>
                             <td>
@@ -56,5 +63,5 @@
                         </tr>
                         <tr ng-hide="clientPage.Clients.length">
-                            <td colspan="6" class="text-center">No clients found!</td>
+                            <td colspan="7" class="text-center">No clients found!</td>
                         </tr>
                     </table>
@@ -82,4 +89,5 @@
                                 <th>Cores</th>
                                 <th>Cpu Utilization</th>
+                                <th>Memory</th>
                                 <th>State</th>
                                 <th></th>
@@ -91,4 +99,5 @@
                             <td>{{client.UsedCores}} / {{client.TotalCores}}</td>
                             <td>{{client.CpuUtilization | number: 2}} %</td>
+                            <td>{{client.UsedMemory | kbToGB}} / {{client.TotalMemory | kbToGB}} GB</td>
                             <td>{{client.State}}</td>
                             <td>
@@ -97,5 +106,5 @@
                         </tr>
                         <tr ng-hide="expiredClientPage.Clients.length">
-                            <td colspan="6" class="text-center">No expired clients found!</td>
+                            <td colspan="7" class="text-center">No expired clients found!</td>
                         </tr>
                     </table>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetails.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetails.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetails.cshtml	(revision 12551)
@@ -17,4 +17,9 @@
             <a ng-href="#/statistics/groups">Groups</a>
         </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -46,9 +51,9 @@
                                 <tr>
                                     <td class="text-left">Up Time:</td>
-                                    <td>{{client.UpTime}}</td>
+                                    <td>{{client.UpTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Last Update:</td>
-                                    <td>{{client.LastUpdate}}</td>
+                                    <td>{{client.LastUpdate | toDate}}</td>
                                 </tr>
                             </table>
@@ -58,21 +63,21 @@
                                 <tr>
                                     <td class="text-left">Total Unavailable Time:</td>
-                                    <td class="text-right">{{client.TotalUnavailableTime}}</td>
+                                    <td class="text-right">{{client.TotalUnavailableTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Calculating Time:</td>
-                                    <td class="text-right">{{client.TotalCalculatingTime}}</td>
+                                    <td class="text-right">{{client.TotalCalculatingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Idle Time:</td>
-                                    <td class="text-right">{{client.TotalIdleTime}}</td>
+                                    <td class="text-right">{{client.TotalIdleTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Transferring Time:</td>
-                                    <td class="text-right">{{client.TotalTransferringTime}}</td>
+                                    <td class="text-right">{{client.TotalTransferringTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Offline Time:</td>
-                                    <td class="text-right">{{client.TotalOfflineTime}}</td>
+                                    <td class="text-right">{{client.TotalOfflineTime | toTimespan}}</td>
                                 </tr>
                             </table>
@@ -137,4 +142,14 @@
                         <knob knob-data="knobData.cpu" knob-options="knobOptions"></knob>
                     </div>
+                    <table class="table table-no-border table-condensed table-auto-width table-content">
+                        <tr>
+                            <td class="text-left">&nbsp;</td>
+                            <td class="text-right">&nbsp;</td>
+                        </tr>
+                        <tr>
+                            <td class="text-left">&nbsp;</td>
+                            <td class="text-right">&nbsp;</td>
+                        </tr>
+                    </table>
                 </div>
             </div>
@@ -153,9 +168,9 @@
                         <tr>
                             <td class="text-left">Total:</td>
-                            <td class="text-right">{{client.TotalMemory | number}} GB</td>
+                            <td class="text-right">{{client.TotalMemory | kbToGB}} GB</td>
                         </tr>
                         <tr>
                             <td class="text-left">Used:</td>
-                            <td class="text-right">{{client.UsedMemory | number}} GB</td>
+                            <td class="text-right">{{client.UsedMemory | kbToGB}} GB</td>
                         </tr>
                     </table>
@@ -163,5 +178,4 @@
             </div>
         </div>
-
     </div>
 </div>
@@ -169,5 +183,5 @@
 <div id="tasks-filter" class="default-filter-header text-center">
     <form class="form-inline">
-        <div class="form-group">
+        <div class="form-group" style="margin-left: 5px; margin-right: 5px;">
             <div class="btn-group" data-toggle="buttons">
                 <label class="btn btn-default" ng-class="{active: state.Selected}" ng-repeat="state in states"
@@ -175,4 +189,22 @@
                     <input type="checkbox" autocomplete="off" checked> {{state.State}}
                 </label>
+            </div>
+        </div>
+        <div class="form-group" style="margin-left: 5px; margin-right: 5px;">
+            <div class="btn-group" dropdown dropdown-append-to-body>
+                <button type="button" class="btn btn-default dropdown-toggle" dropdown-toggle>
+                    {{curUserName}} <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu" role="menu">
+                    <li>
+                        <a ng-href="#/statistics/clients/{{client.Id}}"
+                           ng-click="userChanged('00000000-0000-0000-0000-000000000000', 'All Users')">All Users</a>
+                    </li>
+                    <li class="divider"></li>
+                    <li ng-repeat="user in client.Users">
+                        <a ng-href="#/statistics/clients/{{client.Id}}"
+                           ng-click="userChanged(user.Id, user.Name)">{{user.Name}}</a>
+                    </li>
+                </ul>
             </div>
         </div>
@@ -210,15 +242,17 @@
                              </tr>
                          }
-                         <tr>
-                             <td>Start Time:</td>
-                             <td class="text-right">{{task.StartTime}}</td>
-                         </tr>
-                         <tr>
-                             <td>End Time:</td>
-                             <td class="text-right">{{task.EndTime}}</td>
-                         </tr>
+                        <tr>
+                            <td>Start Time:</td>
+                            <td ng-show="task.StartTime" class="text-right">{{task.StartTime | toDate}}</td>
+                            <td ng-hide="task.StartTime" class="text-right">Not started</td>
+                        </tr>
+                        <tr>
+                            <td>End Time:</td>
+                            <td ng-show="task.EndTime" class="text-right">{{task.EndTime | toDate}}</td>
+                            <td ng-hide="task.EndTime" class="text-right">Not finished</td>
+                        </tr>
                          <tr>
                              <td>Calculating Time:</td>
-                             <td class="text-right">{{task.CalculatingTime}}</td>
+                             <td class="text-right">{{task.CalculatingTime | toTimespan}}</td>
                          </tr>
                          @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator))
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetailsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetailsCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientDetailsCtrl.js	(revision 12551)
@@ -4,4 +4,6 @@
         ['$scope', '$stateParams', '$interval', 'app.statistics.clientService', 'app.statistics.taskService', '$modal',
         function ($scope, $stateParams, $interval, clientService, taskService, $modal) {
+            $scope.curUserId = '00000000-0000-0000-0000-000000000000';
+            $scope.curUserName = 'All Users';
             $scope.interval = defaultPageUpdateInterval;
             $scope.curTaskPage = 1;
@@ -33,16 +35,7 @@
                 clientService.getClientDetails({ id: $stateParams.id }, function (client) {
                     $scope.client = client;
-                    $scope.client.TotalMemory = Math.round($scope.client.TotalMemory / 1024);
-                    $scope.client.UsedMemory = Math.round($scope.client.UsedMemory / 1024);
                     $scope.knobData.cores = (client.UsedCores / client.TotalCores) * 100;
                     $scope.knobData.cpu = client.CpuUtilization;
                     $scope.knobData.memory = (client.UsedMemory / client.TotalMemory) * 100;
-                    $scope.client.LastUpdate = CSharpDateToString($scope.client.LastUpdate);
-                    $scope.client.UpTime = $scope.client.UpTime.toHHMMSS();
-                    $scope.client.TotalUnavailableTime = $scope.client.TotalUnavailableTime.toHHMMSS();
-                    $scope.client.TotalCalculatingTime = $scope.client.TotalCalculatingTime.toHHMMSS();
-                    $scope.client.TotalIdleTime = $scope.client.TotalIdleTime.toHHMMSS();
-                    $scope.client.TotalOfflineTime = $scope.client.TotalOfflineTime.toHHMMSS();
-                    $scope.client.TotalTransferringTime = $scope.client.TotalTransferringTime.toHHMMSS();
 
                     var length = client.TasksStates.length;
@@ -84,27 +77,7 @@
                 }
 
-                taskService.getTasksByClientId({ id: $stateParams.id, page: $scope.curTaskPage, size: $scope.taskPageSize }, states,
+                taskService.getTasksByClientId({ id: $stateParams.id, page: $scope.curTaskPage, size: $scope.taskPageSize, userId: $scope.curUserId }, states,
                     function (taskPage) {
                         $scope.taskPage = taskPage;
-                        var length = $scope.taskPage.Tasks.length;
-                        for (var i = 0; i < length; ++i) {
-                            $scope.taskPage.Tasks[i].TotalTime = $scope.taskPage.Tasks[i].TotalTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].InitialWaitingTime = $scope.taskPage.Tasks[i].InitialWaitingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].WaitingTime = $scope.taskPage.Tasks[i].WaitingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].CalculatingTime = $scope.taskPage.Tasks[i].CalculatingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].TransferTime = $scope.taskPage.Tasks[i].TransferTime.toHHMMSS();
-                            var startTime = $scope.taskPage.Tasks[i].StartTime;
-                            if (isDefined(startTime)) {
-                                $scope.taskPage.Tasks[i].StartTime = CSharpDateToString(startTime);
-                            } else {
-                                $scope.taskPage.Tasks[i].StartTime = 'Not started';
-                            }
-                            var endTime = $scope.taskPage.Tasks[i].EndTime;
-                            if (isDefined(endTime)) {
-                                $scope.taskPage.Tasks[i].EndTime = CSharpDateToString(endTime);
-                            } else {
-                                $scope.taskPage.Tasks[i].EndTime = 'Not finished';
-                            }
-                        }
                     }
                 );
@@ -121,4 +94,10 @@
                 state.Selected = !state.Selected;
                 $scope.curTaskPage = 1;
+                getClientDetails();
+            };
+
+            $scope.userChanged = function(id, name) {
+                $scope.curUserId = id;
+                $scope.curUserName = name;
                 getClientDetails();
             };
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientTaskDetailsDialog.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientTaskDetailsDialog.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/clients/details/clientTaskDetailsDialog.cshtml	(revision 12551)
@@ -14,9 +14,11 @@
                             <tr>
                                 <td>Start Time:</td>
-                                <td class="text-right">{{task.StartTime}}</td>
+                                <td ng-show="task.StartTime" class="text-left">{{task.StartTime | toDate}}</td>
+                                <td ng-hide="task.StartTime" class="text-left">Not started</td>
                             </tr>
                             <tr>
                                 <td>End Time:</td>
-                                <td class="text-right">{{task.EndTime}}</td>
+                                <td ng-show="task.EndTime" class="text-left">{{task.EndTime | toDate}}</td>
+                                <td ng-hide="task.EndTime" class="text-left">Not finished</td>
                             </tr>
                             <tr>
@@ -58,21 +60,21 @@
                             <tr>
                                 <td>Total Time:</td>
-                                <td>{{task.TotalTime}}</td>
+                                <td>{{task.TotalTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Initial Waiting Time:</td>
-                                <td>{{task.InitialWaitingTime}}</td>
+                                <td>{{task.InitialWaitingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Waiting Time:</td>
-                                <td>{{task.WaitingTime}}</td>
+                                <td>{{task.WaitingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Calculating Time:</td>
-                                <td>{{task.CalculatingTime}}</td>
+                                <td>{{task.CalculatingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Transfer Time:</td>
-                                <td>{{task.TransferTime}}</td>
+                                <td>{{task.TransferTime | toTimespan}}</td>
                             </tr>
                         </table>
@@ -82,21 +84,21 @@
                             <tr>
                                 <td>Calculation Runs:</td>
-                                <td>{{task.NumCalculationRuns}}</td>
+                                <td class="text-right">{{task.NumCalculationRuns}}</td>
                             </tr>
                             <tr>
                                 <td>Retries Runs:</td>
-                                <td>{{task.NumRetries}}</td>
+                                <td class="text-right">{{task.NumRetries}}</td>
                             </tr>
                             <tr>
                                 <td>Cores Required:</td>
-                                <td>{{task.CoresRequired}}</td>
+                                <td class="text-right">{{task.CoresRequired}}</td>
                             </tr>
                             <tr>
                                 <td>Memory Required:</td>
-                                <td>{{task.MemoryRequired}}</td>
+                                <td class="text-right">{{task.MemoryRequired}} MB</td>
                             </tr>
                             <tr>
                                 <td>Priority:</td>
-                                <td>{{task.Priority}}</td>
+                                <td class="text-right">{{task.Priority}}</td>
                             </tr>
                         </table>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetails.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetails.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetails.cshtml	(revision 12551)
@@ -16,5 +16,10 @@
         <li class="active">
             <a ng-href="#/statistics/groups">Groups</a>
-        </li>
+        </li> 
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -22,5 +27,5 @@
 <div class="default-view-container">
     <div class="row">
-        <div class="col-lg-12">
+        <div class="col-lg-9">
             <div class="panel panel-default">
                 <div class="panel-heading">
@@ -29,5 +34,5 @@
                 <div class="panel-body">
                     <div class="row">
-                        <div class="col-md-5">
+                        <div class="col-md-6">
                             <table class="table table-no-border table-condensed table-auto-width table-content">
                                 <tr>
@@ -37,39 +42,128 @@
                                 <tr>
                                     <td class="text-left">Clients:</td>
-                                    <td class="text-right">{{group.Clients}}</td>
-                                </tr>
-                                <tr>
-                                    <td class="text-left">Cpu Utilization:</td>
-                                    <td class="text-right">{{group.CpuUtilization | number: 2}} %</td>
+                                    <td class="text-right">{{group.OnlineClients}} / {{group.TotalClients}}</td>
                                 </tr>
                             </table>
                         </div>
-                        <div class="col-md-5">
+                        <div class="col-md-6">
                             <table class="table table-no-border table-condensed table-auto-width table-content">
                                 <tr>
-                                    <td class="text-left">TotalCores:</td>
-                                    <td class="text-right">{{group.TotalCores}}</td>
-                                </tr>
-                                <tr>
-                                    <td class="text-left">UsedCores:</td>
-                                    <td class="text-right">{{group.UsedCores}}</td>
-                                </tr>
-                                <tr>
-                                    <td class="text-left">Total Memory:</td>
-                                    <td class="text-right">{{group.TotalMemory}}</td>
-                                </tr>
-                                <tr>
-                                    <td class="text-left">Used Memory:</td>
-                                    <td class="text-right">{{group.UsedMemory}}</td>
+                                    <td class="text-left">Total Unavailable Time:</td>
+                                    <td class="text-right">{{group.TotalUnavailableTime | toTimespan}}</td>
+                                </tr>
+                                <tr>
+                                    <td class="text-left">Total Calculating Time:</td>
+                                    <td class="text-right">{{group.TotalCalculatingTime | toTimespan}}</td>
+                                </tr>
+                                <tr>
+                                    <td class="text-left">Total Idle Time:</td>
+                                    <td class="text-right">{{group.TotalIdleTime | toTimespan}}</td>
+                                </tr>
+                                <tr>
+                                    <td class="text-left">Total Transferring Time:</td>
+                                    <td class="text-right">{{group.TotalTransferringTime | toTimespan}}</td>
+                                </tr>
+                                <tr>
+                                    <td class="text-left">Total Offline Time:</td>
+                                    <td class="text-right">{{group.TotalOfflineTime | toTimespan}}</td>
                                 </tr>
                             </table>
                         </div>
-
-                        <div class="col-md-2"></div>
-                    </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-lg-3 col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Tasks Overview</h3>
+                </div>
+                <div class="panel-body">
+                    <table class="table table-no-border table-condensed table-auto-width table-content">
+                        <tr>
+                            <td class="text-left">Total:</td>
+                            <td class="text-right">{{totalGroupTasks}}</td>
+                        </tr>
+                        <tr ng-repeat="state in group.TasksStates">
+                            <td class="text-left">{{state.State}}:</td>
+                            <td class="text-right">{{state.Count}}</td>
+                        </tr>
+                    </table>
                 </div>
             </div>
         </div>
     </div>
+
+    <div class="row">
+        <div class="col-lg-3 col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Cores</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="text-center">
+                        <knob knob-data="knobData.cores" knob-options="knobOptions"></knob>
+                    </div>
+                    <table class="table table-no-border table-condensed table-auto-width table-content">
+                        <tr>
+                            <td class="text-left">Total:</td>
+                            <td class="text-right">{{group.TotalCores | number}}</td>
+                        </tr>
+                        <tr>
+                            <td class="text-left">Used:</td>
+                            <td class="text-right">{{group.UsedCores | number}}</td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+
+        <div class="col-lg-3 col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">CPU Utilization</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="text-center">
+                        <knob knob-data="knobData.cpu" knob-options="knobOptions"></knob>
+                    </div>
+                    <table class="table table-no-border table-condensed table-auto-width table-content">
+                        <tr>
+                            <td class="text-left">Total:</td>
+                            <td class="text-right">{{group.TotalCpuUtilization | number: 2}} %</td>
+                        </tr>
+                        <tr>
+                            <td class="text-left">Active:</td>
+                            <td class="text-right">{{group.ActiveCpuUtilization | number: 2}} %</td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+
+        <div class="col-lg-3 col-md-6">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Memory</h3>
+                </div>
+                <div class="panel-body">
+                    <div class="text-center">
+                        <knob knob-data="knobData.memory" knob-options="knobOptions"></knob>
+                    </div>
+                    <table class="table table-no-border table-condensed table-auto-width table-content">
+                        <tr>
+                            <td class="text-left">Total:</td>
+                            <td class="text-right">{{group.TotalMemory | kbToGB}} GB</td>
+                        </tr>
+                        <tr>
+                            <td class="text-left">Used:</td>
+                            <td class="text-right">{{group.UsedMemory | kbToGB}} GB</td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+
     <div class="row">
         <div class="col-lg-12">
@@ -86,4 +180,5 @@
                                 <th>Cores</th>
                                 <th>Cpu Utilization</th>
+                                <th>Memory</th>
                                 <th>State</th>
                                 <th></th>
@@ -95,4 +190,5 @@
                             <td>{{client.UsedCores}} / {{client.TotalCores}}</td>
                             <td>{{client.CpuUtilization | number: 2}} %</td>
+                            <td>{{client.UsedMemory | kbToGB}} / {{client.TotalMemory | kbToGB}}</td>
                             <td>{{client.State}}</td>
                             <td>
@@ -101,5 +197,5 @@
                         </tr>
                         <tr ng-hide="clientPage.Clients.length">
-                            <td colspan="6" class="text-center">No clients found!</td>
+                            <td colspan="7" class="text-center">No clients found!</td>
                         </tr>
                     </table>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetailsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetailsCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/details/groupDetailsCtrl.js	(revision 12551)
@@ -8,7 +8,40 @@
             $scope.clientsPageSize = 20;
 
+
+            // details
+            $scope.knobOptions = {
+                'fgColor': "#f7921d",
+                'angleOffset': -125,
+                'angleArc': 250,
+                'readOnly': true,
+                'width': "80%",
+                'targetvalue': "100",
+                'format': function (value) {
+                    return value;
+                },
+                draw: function () {
+                    $(this.i).val(this.cv + '%');
+                }
+            };
+
+            $scope.knobData = {
+                cores: 0,
+                cpu: 0,
+                memory: 0
+            };
+
             var getGroupDetails = function() {
                 groupService.getGroupDetails({ id: $stateParams.id }, function (group) {
                     $scope.group = group;
+                    $scope.knobData.cores = (group.UsedCores / group.TotalCores) * 100;
+                    $scope.knobData.cpu = group.ActiveCpuUtilization;
+                    $scope.knobData.memory = (group.UsedMemory / group.TotalMemory) * 100;
+
+                    var length = group.TasksStates.length;
+                    var total = 0;
+                    for (var i = 0; i < length; ++i) {
+                        total += group.TasksStates[i].Count;
+                    }
+                    $scope.totalGroupTasks = total;
                 });
             };
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/groups.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/groups.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/groups/groups.cshtml	(revision 12551)
@@ -16,5 +16,10 @@
         <li class="active">
             <a ng-href="#/statistics/groups">Groups</a>
-        </li>
+        </li> 
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -35,4 +40,5 @@
                             <th>Cores</th>
                             <th>Cpu Utilization</th>
+                            <th>Memory</th>
                             <th>Clients</th>
                             <th></th>
@@ -44,5 +50,6 @@
                             <td>{{group.UsedCores}} / {{group.TotalCores}}</td>
                             <td>{{group.CpuUtilization | number: 2}} %</td>
-                            <td>{{group.Clients}}</td>
+                            <td>{{group.UsedMemory | kbToGB}} / {{group.TotalMemory | kbToGB}} GB</td>
+                            <td>{{group.OnlineClients}} / {{group.TotalClients}}</td>
                             <td>
                                 <a ng-href="#/statistics/groups/{{group.Id}}">Details</a>
@@ -50,5 +57,5 @@
                         </tr>
                         <tr ng-hide="groupPage.Groups.length">
-                            <td colspan="6" class="text-center">No groups found!</td>
+                            <td colspan="7" class="text-center">No groups found!</td>
                         </tr>
                     </table>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetails.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetails.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetails.cshtml	(revision 12551)
@@ -17,4 +17,9 @@
             <a ng-href="#/statistics/groups">Groups</a>
         </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -37,9 +42,10 @@
                                 <tr>
                                     <td class="text-left">Created at:</td>
-                                    <td>{{job.DateCreated}}</td>
+                                    <td>{{job.DateCreated | toDate}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Completed at:</td>
-                                    <td>{{job.DateCompleted}}</td>
+                                    <td ng-show="job.DateCompleted">{{job.DateCompleted | toDate}}</td>
+                                    <td ng-hide="job.DateCompleted">Not completed yet</td>
                                 </tr>
                                 @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
@@ -61,13 +67,13 @@
                                 <tr>
                                     <td class="text-left">Total Time:</td>
-                                    <td class="text-right">{{job.TotalTime}}</td>
+                                    <td class="text-right">{{job.TotalTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Calculating Time:</td>
-                                    <td class="text-right">{{job.TotalCalculatingTime}}</td>
+                                    <td class="text-right">{{job.TotalCalculatingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Total Waiting Time:</td>
-                                    <td class="text-right">{{job.TotalWaitingTime}}</td>
+                                    <td class="text-right">{{job.TotalWaitingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
@@ -81,17 +87,17 @@
                                 <tr>
                                     <td class="text-left">Min Calculating Time:</td>
-                                    <td class="text-right">{{job.MinCalculatingTime}}</td>
+                                    <td class="text-right">{{job.MinCalculatingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Max Calculating Time:</td>
-                                    <td class="text-right">{{job.MaxCalculatingTime}}</td>
+                                    <td class="text-right">{{job.MaxCalculatingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Avg. Calculating Time:</td>
-                                    <td class="text-right">{{job.AvgCalculatingTime}}</td>
+                                    <td class="text-right">{{job.AvgCalculatingTime | toTimespan}}</td>
                                 </tr>
                                 <tr>
                                     <td class="text-left">Avg. Transferring Time:</td>
-                                    <td class="text-right">{{job.AvgTransferringTime}}</td>
+                                    <td class="text-right">{{job.AvgTransferringTime | toTimespan}}</td>
                                 </tr>
                             </table>
@@ -158,13 +164,15 @@
                         <tr>
                             <td>Start Time:</td>
-                            <td class="text-right">{{task.StartTime}}</td>
+                            <td ng-show="task.StartTime" class="text-right">{{task.StartTime | toDate}}</td>
+                            <td ng-hide="task.StartTime" class="text-right">Not started</td>
                         </tr>
                         <tr>
                             <td>End Time:</td>
-                            <td class="text-right">{{task.EndTime}}</td>
+                            <td ng-show="task.EndTime" class="text-right">{{task.EndTime | toDate}}</td>
+                            <td ng-hide="task.EndTime" class="text-right">Not finished</td>
                         </tr>
                         <tr>
                             <td>Calculating Time:</td>
-                            <td class="text-right">{{task.CalculatingTime}}</td>
+                            <td class="text-right">{{task.CalculatingTime | toTimespan}}</td>
                         </tr>
                         <tr>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetailsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetailsCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobDetailsCtrl.js	(revision 12551)
@@ -11,18 +11,5 @@
                 jobService.getJobDetails({ id: $stateParams.id }, function (job) {
                     $scope.job = job;
-                    $scope.job.DateCreated = CSharpDateToString($scope.job.DateCreated);
-                    if (isDefined($scope.job.DateCompleted)) {
-                        $scope.job.DateCompleted = CSharpDateToString($scope.job.DateCompleted);
-                    } else {
-                        $scope.job.DateCompleted = 'Not completed yet';
-                    }
                     $scope.job.CalculatingWaitingRatio = ($scope.job.TotalCalculatingTime / $scope.job.TotalWaitingTime);
-                    $scope.job.AvgTransferringTime = $scope.job.AvgTransferringTime.toHHMMSS();
-                    $scope.job.AvgCalculatingTime = $scope.job.AvgCalculatingTime.toHHMMSS();
-                    $scope.job.MinCalculatingTime = $scope.job.MinCalculatingTime.toHHMMSS();
-                    $scope.job.MaxCalculatingTime = $scope.job.MaxCalculatingTime.toHHMMSS();
-                    $scope.job.TotalCalculatingTime = $scope.job.TotalCalculatingTime.toHHMMSS();
-                    $scope.job.TotalWaitingTime = $scope.job.TotalWaitingTime.toHHMMSS();
-                    $scope.job.TotalTime = $scope.job.TotalTime.toHHMMSS();
 
                     var length = job.TasksStates.length;
@@ -66,24 +53,4 @@
                     function (taskPage) {
                         $scope.taskPage = taskPage;
-                        var length = $scope.taskPage.Tasks.length;
-                        for (var i = 0; i < length; ++i) {
-                            $scope.taskPage.Tasks[i].TotalTime = $scope.taskPage.Tasks[i].TotalTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].InitialWaitingTime = $scope.taskPage.Tasks[i].InitialWaitingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].WaitingTime = $scope.taskPage.Tasks[i].WaitingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].CalculatingTime = $scope.taskPage.Tasks[i].CalculatingTime.toHHMMSS();
-                            $scope.taskPage.Tasks[i].TransferTime = $scope.taskPage.Tasks[i].TransferTime.toHHMMSS();
-                            var startTime = $scope.taskPage.Tasks[i].StartTime;
-                            if (isDefined(startTime)) {
-                                $scope.taskPage.Tasks[i].StartTime = CSharpDateToString(startTime);
-                            } else {
-                                $scope.taskPage.Tasks[i].StartTime = 'Not started';
-                            }
-                            var endTime = $scope.taskPage.Tasks[i].EndTime;
-                            if (isDefined(endTime)) {
-                                $scope.taskPage.Tasks[i].EndTime = CSharpDateToString(endTime);
-                            } else {
-                                $scope.taskPage.Tasks[i].EndTime = 'Not finished';
-                            }
-                        }
                     }
                 );
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobTaskDetailsDialog.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobTaskDetailsDialog.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/details/jobTaskDetailsDialog.cshtml	(revision 12551)
@@ -12,9 +12,11 @@
                             <tr>
                                 <td>Start Time:</td>
-                                <td class="text-right">{{task.StartTime}}</td>
+                                <td ng-show="task.StartTime" class="text-left">{{task.StartTime | toDate}}</td>
+                                <td ng-hide="task.StartTime" class="text-left">Not started</td>
                             </tr>
                             <tr>
                                 <td>End Time:</td>
-                                <td class="text-right">{{task.EndTime}}</td>
+                                <td ng-show="task.EndTime" class="text-left">{{task.EndTime | toDate}}</td>
+                                <td ng-hide="task.EndTime" class="text-left">Not finished</td>
                             </tr>
                             <tr>
@@ -37,21 +39,21 @@
                             <tr>
                                 <td>Total Time:</td>
-                                <td>{{task.TotalTime}}</td>
+                                <td>{{task.TotalTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Initial Waiting Time:</td>
-                                <td>{{task.InitialWaitingTime}}</td>
+                                <td>{{task.InitialWaitingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Waiting Time:</td>
-                                <td>{{task.WaitingTime}}</td>
+                                <td>{{task.WaitingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Calculating Time:</td>
-                                <td>{{task.CalculatingTime}}</td>
+                                <td>{{task.CalculatingTime | toTimespan}}</td>
                             </tr>
                             <tr>
                                 <td>Transfer Time:</td>
-                                <td>{{task.TransferTime}}</td>
+                                <td>{{task.TransferTime | toTimespan}}</td>
                             </tr>
                         </table>
@@ -61,21 +63,21 @@
                             <tr>
                                 <td>Calculation Runs:</td>
-                                <td>{{task.NumCalculationRuns}}</td>
+                                <td class="text-right">{{task.NumCalculationRuns}}</td>
                             </tr>
                             <tr>
                                 <td>Retries Runs:</td>
-                                <td>{{task.NumRetries}}</td>
+                                <td class="text-right">{{task.NumRetries}}</td>
                             </tr>
                             <tr>
                                 <td>Cores Required:</td>
-                                <td>{{task.CoresRequired}}</td>
+                                <td class="text-right">{{task.CoresRequired}}</td>
                             </tr>
                             <tr>
                                 <td>Memory Required:</td>
-                                <td>{{task.MemoryRequired}}</td>
+                                <td class="text-right">{{task.MemoryRequired}} MB</td>
                             </tr>
                             <tr>
                                 <td>Priority:</td>
-                                <td>{{task.Priority}}</td>
+                                <td class="text-right">{{task.Priority}}</td>
                             </tr>
                         </table>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobs.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobs.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobs.cshtml	(revision 12551)
@@ -17,4 +17,9 @@
             <a ng-href="#/statistics/groups">Groups</a>
         </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -33,4 +38,7 @@
                             <th>#</th>
                             <th>Job Name</th>
+                            @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+                                <th>User Name</th>
+                            }
                             <th>Date Created</th>
                             <th>Progress</th>
@@ -38,42 +46,5 @@
                         </tr>
                         </thead>
-                        <tr ng-repeat="job in jobs">
-                            <td>{{$index + 1}}</td>
-                            <td>{{job.Name}}</td>
-                            <td>{{job.DateCreated}}</td>
-                            <td>
-                                <progressbar class="progress active" max="job.TotalTasks" value="job.CompletedTasks" type="success"><i style="color:black; white-space:nowrap;">{{job.CompletedTasks}} / {{job.TotalTasks}}</i></progressbar>
-                            </td>
-                            <td>
-                                <a ng-href="#/statistics/jobs/{{job.Id}}">Details</a>
-                            </td>
-                        </tr>
-                        <tr ng-hide="jobs.length">
-                            <td colspan="5" class="text-center">No active jobs found!</td>
-                        </tr>
-                    </table>
-                </div>
-            </div>
-        </div>
-    </div>
-    @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
-        <div class="row">
-            <div class="col-lg-12">
-                <div class="panel panel-default">
-                    <div class="panel-heading">
-                        <h3 class="panel-title">Current Active Jobs</h3>
-                    </div>
-                    <div class="panel-body">
-                        <table class="table table-hover table-condensed">
-                            <thead>
-                                <tr>
-                                    <th>#</th>
-                                    <th>Job Name</th>
-                                    <th>User Name</th>
-                                    <th>Date Created</th>
-                                    <th>Progress</th>
-                                    <th></th>
-                                </tr>
-                            </thead>
+                        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
                             <tr ng-repeat="job in allUsersJobs">
                                 <td>{{$index + 1}}</td>
@@ -82,5 +53,5 @@
                                     <a ng-href="#/statistics/users/{{job.UserId}}" ng-show="job.UserName">{{job.UserName}}</a>
                                 </td>
-                                <td>{{job.DateCreated}}</td>
+                                <td>{{job.DateCreated | toDate}}</td>
                                 <td>
                                     <progressbar class="progress active" max="job.TotalTasks" value="job.CompletedTasks" type="success"><i style="color:black; white-space:nowrap;">{{job.CompletedTasks}} / {{job.TotalTasks}}</i></progressbar>
@@ -93,10 +64,26 @@
                                 <td colspan="6" class="text-center">No active jobs found!</td>
                             </tr>
-                        </table>
-                    </div>
+                        } else {
+                            <tr ng-repeat="job in jobs">
+                                <td>{{$index + 1}}</td>
+                                <td>{{job.Name}}</td>
+                                <td>{{job.DateCreated | toDate}}</td>
+                                <td>
+                                    <progressbar class="progress active" max="job.TotalTasks" value="job.CompletedTasks" type="success"><i style="color: black; white-space: nowrap;">{{job.CompletedTasks}} / {{job.TotalTasks}}</i></progressbar>
+                                </td>
+                                <td>
+                                    <a ng-href="#/statistics/jobs/{{job.Id}}">Details</a>
+                                </td>
+                            </tr>
+                            <tr ng-hide="jobs.length">
+                                <td colspan="5" class="text-center">No active jobs found!</td>
+                            </tr>
+                        }
+                    </table>
                 </div>
             </div>
         </div>
-    }
+    </div>
+
     <div class="row">
         <div class="col-lg-12">
@@ -120,6 +107,6 @@
                             <td>{{($index + 1)+((completedJobCurPage-1)*(completedJobPageSize))}}</td>
                             <td>{{job.Name}}</td>
-                            <td>{{job.DateCreated}}</td>
-                            <td>{{job.DateCompleted}}</td>
+                            <td>{{job.DateCreated | toDate}}</td>
+                            <td>{{job.DateCompleted | toDate}}</td>
                             <td>{{job.TotalTasks}}</td>
                             <td><a ng-href="#/statistics/jobs/{{job.Id}}">Details</a></td>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobsCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobsCtrl.js	(revision 12551)
@@ -12,8 +12,4 @@
                 jobService.getAllJobs({ completed: false }, function(jobs) {
                     $scope.jobs = jobs;
-                    var length = $scope.jobs.length;
-                    for (var i = 0; i < length; ++i) {
-                        $scope.jobs[i].DateCreated = CSharpDateToString($scope.jobs[i].DateCreated);
-                    }
                 });
             };
@@ -23,9 +19,4 @@
                     function (jobPage) {
                         $scope.completedJobPage = jobPage;
-                        var length = $scope.completedJobPage.Jobs.length;
-                        for (var i = 0; i < length; ++i) {
-                            $scope.completedJobPage.Jobs[i].DateCreated = CSharpDateToString($scope.completedJobPage.Jobs[i].DateCreated);
-                            $scope.completedJobPage.Jobs[i].DateCompleted = CSharpDateToString($scope.completedJobPage.Jobs[i].DateCompleted);
-                        }
                     }
                 );
@@ -36,8 +27,4 @@
                     $scope.isAdministrator = true;
                     $scope.allUsersJobs = jobs;
-                    var length = $scope.allUsersJobs.length;
-                    for (var i = 0; i < length; ++i) {
-                        $scope.allUsersJobs[i].DateCreated = CSharpDateToString($scope.allUsersJobs[i].DateCreated);
-                    }
                 });
             };
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/services/clientService.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/services/clientService.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/services/clientService.js	(revision 12551)
@@ -4,5 +4,5 @@
     module.factory('app.statistics.clientService',
         ['$resource', function ($resource) {
-            return $resource(apiUrl + ':action', { id: '@id', page: '@page', size: '@size', states: '@states', expired: '@expired', start: '@start', end: '@end' }, {
+            return $resource(apiUrl + ':action', { id: '@id', page: '@page', size: '@size', states: '@states', expired: '@expired', start: '@start', end: '@end', userId: '@userId' }, {
                 getClientDetails: { method: 'GET', params: { action: 'GetClientDetails' } },
                 getClients: { method: 'GET', params: { action: 'GetClients' } },
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetails.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetails.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetails.cshtml	(revision 12551)
@@ -16,4 +16,9 @@
             <a ng-href="#/statistics/groups">Groups</a>
         </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
@@ -46,7 +51,7 @@
                         <tr>
                             <td class="text-left">Total:</td>
-                            <td class="text-right">{{totalJobTasks}}</td>
+                            <td class="text-right">{{totalUserTasks}}</td>
                         </tr>
-                        <tr ng-repeat="state in states">
+                        <tr ng-repeat="state in user.TasksStates">
                             <td class="text-left">{{state.State}}:</td>
                             <td class="text-right">{{state.Count}}</td>
@@ -78,5 +83,5 @@
                             <td>{{$index + 1}}</td>
                             <td>{{job.Name}}</td>
-                            <td>{{job.DateCreated}}</td>
+                            <td>{{job.DateCreated | toDate}}</td>
                             <td>
                                 <progressbar class="progress active" max="job.TotalTasks" value="job.CompletedTasks" type="success"><i style="color:black; white-space:nowrap;">{{job.CompletedTasks}} / {{job.TotalTasks}}</i></progressbar>
@@ -116,6 +121,6 @@
                             <td>{{($index + 1)+((completedJobCurPage-1)*(completedJobPageSize))}}</td>
                             <td>{{job.Name}}</td>
-                            <td>{{job.DateCreated}}</td>
-                            <td>{{job.DateCompleted}}</td>
+                            <td>{{job.DateCreated | toDate}}</td>
+                            <td>{{job.DateCompleted | toDate}}</td>
                             <td>{{job.TotalTasks}}</td>
                             <td><a ng-href="#/statistics/jobs/{{job.Id}}">Details</a></td>
@@ -135,5 +140,4 @@
         </div>
     </div>
-
 </div>
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetailsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetailsCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/details/userDetailsCtrl.js	(revision 12551)
@@ -12,4 +12,11 @@
                 userService.getUser({ id: $stateParams.id }, function(user) {
                     $scope.user = user;
+
+                    var length = user.TasksStates.length;
+                    var total = 0;
+                    for (var i = 0; i < length; ++i) {
+                        total += user.TasksStates[i].Count;
+                    }
+                    $scope.totalUserTasks = total;
                 });
             };
@@ -18,8 +25,4 @@
                 jobService.getAllJobsByUserId({ id: $stateParams.id, completed: false }, function (jobs) {
                     $scope.jobs = jobs;
-                    var length = $scope.jobs.length;
-                    for (var i = 0; i < length; ++i) {
-                        $scope.jobs[i].DateCreated = CSharpDateToString($scope.jobs[i].DateCreated);
-                    }
                 });
             };
@@ -29,9 +32,4 @@
                     function (jobPage) {
                         $scope.completedJobPage = jobPage;
-                        var length = $scope.completedJobPage.Jobs.length;
-                        for (var i = 0; i < length; ++i) {
-                            $scope.completedJobPage.Jobs[i].DateCreated = CSharpDateToString($scope.completedJobPage.Jobs[i].DateCreated);
-                            $scope.completedJobPage.Jobs[i].DateCompleted = CSharpDateToString($scope.completedJobPage.Jobs[i].DateCompleted);
-                        }
                     }
                 );
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/users.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/users.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/users/users.cshtml	(revision 12551)
@@ -16,4 +16,9 @@
             <a ng-href="#/statistics/groups">Groups</a>
         </li>
+        @if (Request.IsAuthenticated && User.IsInRole(HiveRoles.Administrator)) {
+            <li>
+                <a ng-href="#/statistics/exceptions">Exceptions</a>
+            </li>
+        }
     </ul>
 </header>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/packages.config
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/packages.config	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/packages.config	(revision 12551)
@@ -9,4 +9,4 @@
   <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
   <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
 </packages>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/statistics.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/statistics.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/statistics.js	(revision 12551)
@@ -6,9 +6,10 @@
         'WebApp/statistics.css',
         'WebApp/services/statisticsService.js',
+        'WebApp/services/clientService.js',
+        'WebApp/services/exceptionService.js',
+        'WebApp/services/groupService.js',
         'WebApp/services/jobService.js',
         'WebApp/services/taskService.js',
         'WebApp/services/userService.js',
-        'WebApp/services/clientService.js',
-        'WebApp/services/groupService.js',
         'WebApp/jobs/jobsCtrl.js',
         'WebApp/jobs/details/jobDetailsCtrl.js',
@@ -20,5 +21,7 @@
         'WebApp/users/details/userDetailsCtrl.js',
         'WebApp/groups/groupsCtrl.js',
-        'WebApp/groups/details/groupDetailsCtrl.js'
+        'WebApp/groups/details/groupDetailsCtrl.js',
+        'WebApp/exceptions/exceptionsCtrl.js',
+        'WebApp/exceptions/exceptionDetailsDialogCtrl.js'
     ];
     plugin.view = 'WebApp/jobs/jobs.cshtml';
@@ -32,5 +35,6 @@
         new Route('users/:id', 'WebApp/users/details/userDetails.cshtml', 'app.statistics.userDetailsCtrl'),
         new Route('groups', 'WebApp/groups/groups.cshtml', 'app.statistics.groupsCtrl'),
-        new Route('groups/:id', 'WebApp/groups/details/groupDetails.cshtml', 'app.statistics.groupDetailsCtrl')
+        new Route('groups/:id', 'WebApp/groups/details/groupDetails.cshtml', 'app.statistics.groupDetailsCtrl'),
+        new Route('exceptions', 'WebApp/exceptions/exceptions.cshtml', 'app.statistics.exceptionsCtrl')
     ];
     var menu = app.getMenu();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj	(revision 12551)
@@ -73,7 +73,7 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
-      <Private>False</Private>
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="System" />
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs	(revision 12551)
@@ -22,16 +22,19 @@
 using System;
 using System.Collections.Generic;
-using System.Data.Linq;
 using System.Linq;
 using System.Web.Http;
 using HeuristicLab.Services.Hive;
 using HeuristicLab.Services.Hive.DataAccess;
-using DAL = HeuristicLab.Services.Hive.DataAccess;
-using DTO = HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer;
+using HeuristicLab.Services.Hive.DataAccess.Interfaces;
+using DT = HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer;
 
 namespace HeuristicLab.Services.WebApp.Status.WebApi {
   public class DataController : ApiController {
-
-    // start temporary quickfix
+    private const int LAST_TASKS = 20;
+
+    private IPersistenceManager PersistenceManager {
+      get { return ServiceLocator.Instance.PersistenceManager; }
+    }
+
     private const string SQL_USER_TASK_STATUS =
       @"WITH UserTasks AS (
@@ -53,35 +56,62 @@
     }
 
-    public IEnumerable<DTO.TaskStatus> GetTaskStatus(HiveDataContext db) {
-      var query = db.ExecuteQuery<UserTaskStatus>(SQL_USER_TASK_STATUS).ToList();
-      return query.Select(uts => new DTO.TaskStatus {
-        User = new DTO.User {
-          Id = uts.UserId.ToString(),
-          Name = ServiceLocator.Instance.UserManager.GetUserById(uts.UserId).UserName
-        },
-        CalculatingTasks = uts.CalculatingTasks,
-        WaitingTasks = uts.WaitingTasks
-      }).OrderBy(x => x.User.Name);
-    }
-    // end temporary quickfix
-
-    public DTO.Status GetStatus() {
-      using (var db = new HiveDataContext()) {
-        var onlineSlaves = (from slave in db.Resources.OfType<DAL.Slave>()
-                            where slave.SlaveState == SlaveState.Calculating || slave.SlaveState == SlaveState.Idle
-                            select slave).ToList();
+    private IEnumerable<DT.TaskStatus> GetTaskStatus(IPersistenceManager pm) {
+      return pm.UseTransaction(() => {
+        var query = pm.DataContext.ExecuteQuery<UserTaskStatus>(SQL_USER_TASK_STATUS).ToList();
+        return query.Select(uts => new DT.TaskStatus {
+          User = new DT.User {
+            Id = uts.UserId.ToString(),
+            Name = ServiceLocator.Instance.UserManager.GetUserById(uts.UserId).UserName
+          },
+          CalculatingTasks = uts.CalculatingTasks,
+          WaitingTasks = uts.WaitingTasks
+        }).OrderBy(x => x.User.Name);
+      });
+    }
+
+    private DT.TimeStatus GetTimeStatus(IPersistenceManager pm) {
+      return pm.UseTransaction(() => {
+        var factTaskDao = pm.FactTaskDao;
+        var factTasks = factTaskDao.GetAll();
+        var completedTasks = factTaskDao.GetCompletedTasks()
+          .OrderByDescending(x => x.EndTime)
+          .Take(LAST_TASKS);
+        var lastCalculatingTimes = completedTasks
+          .GroupBy(x => 1)
+          .Select(x => new {
+            Min = x.Min(y => y.CalculatingTime),
+            Max = x.Max(y => y.CalculatingTime),
+            Avg = (long)x.Average(y => (long?)y.CalculatingTime)
+          }).FirstOrDefault();
+        var calculatingTasks = factTasks.Where(x => x.TaskState == TaskState.Calculating);
+        int count = calculatingTasks.Count();
+        return new DT.TimeStatus {
+          MinCalculatingTime = lastCalculatingTimes != null ? lastCalculatingTimes.Min : 0,
+          MaxCalculatingTime = lastCalculatingTimes != null ? lastCalculatingTimes.Max : 0,
+          AvgWaitingTime = count > 0 ? (long)calculatingTasks.OrderBy(x => x.StartTime).Take(count / 3).Average(x => x.InitialWaitingTime) : 0,
+          AvgCalculatingTime = lastCalculatingTimes != null ? lastCalculatingTimes.Avg : 0,
+          TotalCpuTime = factTasks.Sum(x => x.CalculatingTime),
+          StandardDeviationCalculatingTime = (long)StandardDeviation(completedTasks.Select(x => (double)x.CalculatingTime)),
+          BeginDate = factTasks.OrderBy(x => x.StartTime).Select(x => x.StartTime).FirstOrDefault()
+        };
+      });
+    }
+
+    public DT.Status GetStatus() {
+      using (var pm = PersistenceManager) {
+        var slaveDao = pm.SlaveDao;
+        var onlineSlaves = pm.UseTransaction(() => slaveDao.GetOnlineSlaves().ToList());
         var activeSlaves = onlineSlaves.Where(s => s.IsAllowedToCalculate).ToList();
         var calculatingSlaves = activeSlaves.Where(s => s.SlaveState == SlaveState.Calculating).ToList();
-        int calculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.Memory) : 0;
-        int freeCalculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.FreeMemory) : 0;
-
-        return new DTO.Status {
-          CoreStatus = new DTO.CoreStatus {
-            TotalCores = onlineSlaves.Sum(s => s.Cores ?? 0),
-            FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0), // temporary for old chart data
+        int totalCores = onlineSlaves.Sum(s => s.Cores ?? 0);
+        int totalMemory = onlineSlaves.Sum(s => s.Memory ?? 0);
+        return new DT.Status {
+          CoreStatus = new DT.CoreStatus {
+            TotalCores = totalCores,
+            UsedCores = totalCores - onlineSlaves.Sum(s => s.FreeCores ?? 0),
             ActiveCores = activeSlaves.Sum(s => s.Cores ?? 0),
             CalculatingCores = calculatingSlaves.Sum(s => s.Cores ?? 0) - calculatingSlaves.Sum(s => s.FreeCores ?? 0)
           },
-          CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
+          CpuUtilizationStatus = new DT.CpuUtilizationStatus {
             TotalCpuUtilization = onlineSlaves.Any()
                                   ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2)
@@ -94,13 +124,14 @@
                                         : 0.0
           },
-          MemoryStatus = new DTO.MemoryStatus {
-            TotalMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.Memory) : 0,
-            FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) : 0,
-            ActiveMemory = activeSlaves.Any() ? (int)activeSlaves.Sum(s => s.Memory) : 0,
-            UsedMemory = calculatingMemory - freeCalculatingMemory
-          },
-          TasksStatus = GetTaskStatus(db),
-          SlavesStatus = onlineSlaves.Select(x => new DTO.SlaveStatus {
-            Slave = new DTO.Slave {
+          MemoryStatus = new DT.MemoryStatus {
+            TotalMemory = totalMemory,
+            UsedMemory = totalMemory - onlineSlaves.Sum(s => s.FreeMemory ?? 0),
+            ActiveMemory = activeSlaves.Sum(s => s.Memory ?? 0),
+            CalculatingMemory = calculatingSlaves.Sum(s => s.Memory ?? 0) - calculatingSlaves.Sum(s => s.FreeMemory ?? 0)
+          },
+          TimeStatus = GetTimeStatus(pm),
+          TasksStatus = GetTaskStatus(pm),
+          SlavesStatus = onlineSlaves.Select(x => new DT.SlaveStatus {
+            Slave = new DT.Slave {
               Id = x.ResourceId.ToString(),
               Name = x.Name
@@ -119,5 +150,5 @@
     }
 
-    public IEnumerable<DTO.Status> GetStatusHistory(DateTime start, DateTime end) {
+    public IEnumerable<DT.Status> GetStatusHistory(DateTime start, DateTime end) {
       TimeSpan ts = end - start;
       int increment = 1;
@@ -127,55 +158,73 @@
         increment += 5;
       }
-      using (var db = new HiveDataContext()) {
-        DataLoadOptions loadOptions = new DataLoadOptions();
-        loadOptions.LoadWith<Statistics>(o => o.SlaveStatistics);
-        db.LoadOptions = loadOptions;
-        db.DeferredLoadingEnabled = false;
-        var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end)
-                                      .OrderBy(s => s.Timestamp)
-                                      .ToList();
-        var status = new DTO.Status {
-          CoreStatus = new DTO.CoreStatus(),
-          CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
-          MemoryStatus = new DTO.MemoryStatus()
-        };
-        int freeCores = 0;
-        int freeMemory = 0;
-        int i = 1;
-        foreach (var statistic in statistics) {
-          status.CoreStatus.TotalCores += statistic.SlaveStatistics.Sum(x => x.Cores);
-          freeCores += statistic.SlaveStatistics.Sum(x => x.FreeCores);
-          status.CpuUtilizationStatus.TotalCpuUtilization += statistic.SlaveStatistics.Any()
-                                                             ? statistic.SlaveStatistics.Average(x => x.CpuUtilization)
-                                                             : 0.0;
-          status.MemoryStatus.TotalMemory += statistic.SlaveStatistics.Sum(x => x.Memory);
-          freeMemory += statistic.SlaveStatistics.Sum(x => x.FreeMemory);
-          if (i >= increment) {
-            status.Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp);
-            status.CoreStatus.TotalCores /= i;
-            freeCores /= i;
-            status.CpuUtilizationStatus.TotalCpuUtilization /= i;
-            status.MemoryStatus.TotalMemory /= i;
-            freeMemory /= i;
-            status.CoreStatus.ActiveCores = status.CoreStatus.TotalCores;
-            status.MemoryStatus.ActiveMemory = status.MemoryStatus.TotalMemory;
-            status.CpuUtilizationStatus.ActiveCpuUtilization = status.CpuUtilizationStatus.TotalCpuUtilization;
-            status.CpuUtilizationStatus.CalculatingCpuUtilization = status.CpuUtilizationStatus.CalculatingCpuUtilization;
-            status.CoreStatus.CalculatingCores = status.CoreStatus.TotalCores - freeCores;
-            status.MemoryStatus.UsedMemory = status.MemoryStatus.TotalMemory - freeMemory;
-            yield return status;
-            status = new DTO.Status {
-              CoreStatus = new DTO.CoreStatus(),
-              CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
-              MemoryStatus = new DTO.MemoryStatus()
-            };
-            freeCores = 0;
-            freeMemory = 0;
-            i = 1;
-          } else {
+      using (var pm = PersistenceManager) {
+        var factClientInfoDao = pm.FactClientInfoDao;
+        var clientInfos = pm.UseTransaction(() => {
+          return factClientInfoDao.GetAll()
+            .Where(s => s.Time >= start
+                        && s.Time <= end
+                        && s.SlaveState != SlaveState.Offline)
+            .OrderBy(s => s.Time)
+            .GroupBy(s => s.Time)
+            .Select(x => new {
+              Timestamp = x.Key,
+              TotalCores = x.Sum(y => y.NumTotalCores),
+              UsedCores = x.Sum(y => y.NumUsedCores),
+              TotalMemory = x.Sum(y => y.TotalMemory),
+              UsedMemory = x.Sum(y => y.UsedMemory),
+              CpuUtilization = x.Where(y => y.IsAllowedToCalculate).Average(y => y.CpuUtilization)
+            })
+            .ToList();
+        });
+        var statusList = new List<DT.Status>();
+        var e = clientInfos.GetEnumerator();
+        do {
+          var status = new DT.Status {
+            CoreStatus = new DT.CoreStatus(),
+            CpuUtilizationStatus = new DT.CpuUtilizationStatus(),
+            MemoryStatus = new DT.MemoryStatus()
+          };
+          int i = 0;
+          DateTime lastTimestamp = DateTime.Now;
+          while (e.MoveNext()) {
+            var clientInfo = e.Current;
+            status.CoreStatus.TotalCores += clientInfo.TotalCores;
+            status.CoreStatus.UsedCores += clientInfo.UsedCores;
+            status.MemoryStatus.TotalMemory += clientInfo.TotalMemory;
+            status.MemoryStatus.UsedMemory += clientInfo.UsedMemory;
+            status.CpuUtilizationStatus.TotalCpuUtilization += clientInfo.CpuUtilization;
+            lastTimestamp = clientInfo.Timestamp;
             i++;
+            if (i >= increment)
+              break;
           }
-        }
-      }
+          if (i <= 0) continue;
+          status.Timestamp = JavascriptUtils.ToTimestamp(lastTimestamp);
+          status.CoreStatus.TotalCores /= i;
+          status.CoreStatus.UsedCores /= i;
+          status.MemoryStatus.TotalMemory /= i;
+          status.MemoryStatus.UsedMemory /= i;
+          status.CpuUtilizationStatus.TotalCpuUtilization /= i;
+          statusList.Add(status);
+        } while (e.Current != null);
+        return statusList;
+      }
+    }
+
+    private double StandardDeviation(IEnumerable<double> source) {
+      int n = 0;
+      double mean = 0;
+      double M2 = 0;
+
+      foreach (double x in source) {
+        n = n + 1;
+        double delta = x - mean;
+        mean = mean + delta / n;
+        M2 += delta * (x - mean);
+      }
+      if (n < 2) {
+        return M2;
+      }
+      return Math.Sqrt(M2 / (n - 1));
     }
   }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs	(revision 12551)
@@ -27,5 +27,5 @@
   public class CoreStatus {
     public int TotalCores { get; set; }
-    public int FreeCores { get; set; } // temporary quickfix for old chart data
+    public int UsedCores { get; set; }
     public int ActiveCores { get; set; }
     public int CalculatingCores { get; set; }
@@ -40,7 +40,7 @@
   public class MemoryStatus {
     public int TotalMemory { get; set; }
-    public int FreeMemory { get; set; } // temporary quickfix for old chart data
+    public int UsedMemory { get; set; }
     public int ActiveMemory { get; set; }
-    public int UsedMemory { get; set; }
+    public int CalculatingMemory { get; set; }
   }
 
@@ -66,7 +66,8 @@
     public long MaxCalculatingTime { get; set; }
     public long AvgCalculatingTime { get; set; }
+    public long StandardDeviationCalculatingTime { get; set; }
     public long AvgWaitingTime { get; set; }
     public long TotalCpuTime { get; set; }
-    public DateTime BeginDate { get; set; }
+    public DateTime? BeginDate { get; set; }
   }
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js	(revision 12551)
@@ -78,9 +78,9 @@
                     for (var i = 0; i < noOfStatus; ++i) {
                         var curStatus = status[i];
-                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
+                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.TotalCpuUtilization);
                         cpuSeries.push([curStatus.Timestamp, cpuData]);
-                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
-                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
-                        memorySeries[0].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.ActiveMemory / 1024)]);
+                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
+                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.UsedCores]);
+                        memorySeries[0].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.TotalMemory / 1024)]);
                         memorySeries[1].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.UsedMemory / 1024)]);
                     }
@@ -94,5 +94,4 @@
                         { data: memorySeries[1], label: "&nbsp;Used Memory", color: "LightPink" }
                     ];
-
                 });
             };
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml	(revision 12551)
@@ -80,13 +80,13 @@
                     <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
                         <td class="text-left">Total:</td>
-                        <td class="text-right">{{status.MemoryStatus.TotalMemory | toGB}}</td>
+                        <td class="text-right">{{status.MemoryStatus.TotalMemory | kbToGB}} GB</td>
                     </tr>
                     <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
                         <td class="text-left">Active:</td>
-                        <td class="text-right">{{status.MemoryStatus.ActiveMemory | toGB}}</td>
+                        <td class="text-right">{{status.MemoryStatus.ActiveMemory | kbToGB}} GB</td>
                     </tr>
                     <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
                         <td class="text-left">Calculating:</td>
-                        <td class="text-right">{{status.MemoryStatus.UsedMemory | toGB}}</td>
+                        <td class="text-right">{{status.MemoryStatus.CalculatingMemory | kbToGB}} GB</td>
                     </tr>
                 </table>
@@ -115,4 +115,54 @@
                     </tr>
                 </table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Status Overview</h3>
+            </div>
+            <div class="panel-body">
+                <div class="row">
+                    <div class="col-md-6">
+                        <table class="table table-no-border table-condensed table-auto-width table-content">
+                            <tr>
+                                <td class="text-left">Current Average Waiting Time:</td>
+                                <td class="text-right">{{status.TimeStatus.AvgWaitingTime | toTimespan}}</td>
+                            </tr>
+                            <tr>
+                                <td class="text-left">Total CPU Time:</td>
+                                <td class="text-right">{{status.TimeStatus.TotalCpuTime | toTimespan}}</td>
+                            </tr>
+                            <tr>
+                                <td class="text-left">Since:</td>
+                                <td class="text-right">{{status.TimeStatus.BeginDate | toDate}}</td>
+                            </tr>
+                        </table>
+                    </div>
+                    <div class="col-md-6">
+                        <table class="table table-no-border table-condensed table-auto-width table-content">
+                            <tr>
+                                <td class="text-left">Minimum Calculating Time:</td>
+                                <td class="text-right">{{status.TimeStatus.MinCalculatingTime | toTimespan}}</td>
+                            </tr>
+                            <tr>
+                                <td class="text-left">Maximum Calculating Time:</td>
+                                <td class="text-right">{{status.TimeStatus.MaxCalculatingTime | toTimespan}}</td>
+                            </tr>
+                            <tr>
+                                <td class="text-left">Average Calculating Time:</td>
+                                <td class="text-right">{{status.TimeStatus.AvgCalculatingTime | toTimespan}}</td>
+                            </tr>
+                            <tr>
+                                <td class="text-left">Standard Deviation Calculating Time:</td>
+                                <td class="text-right">{{status.TimeStatus.StandardDeviationCalculatingTime | toTimespan}}</td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
             </div>
         </div>
@@ -233,6 +283,6 @@
                             <td>{{slave.Slave.Name}}</td>
                             <td>{{slave.CpuUtilization | number: 2}} %</td>
-                            <td>{{slave.Cores | number}}</td>
-                            <td>{{slave.Memory | toGB}}</td>
+                            <td>{{slave.Cores - slave.FreeCores | number}} / {{slave.Cores | number}}</td>
+                            <td>{{slave.Memory - slave.FreeMemory | kbToGB}} / {{slave.Memory | kbToGB}} GB</td>
                         </tr>
                         <tr ng-hide="activeCalculatingSlaves.length">
@@ -291,6 +341,6 @@
                             <td>{{slave.Slave.Name}}</td>
                             <td>{{slave.CpuUtilization | number: 2}} %</td>
-                            <td>{{slave.Cores | number}}</td>
-                            <td>{{slave.Memory | toGB}}</td>
+                            <td>{{slave.Cores - slave.FreeCores | number}} / {{slave.Cores | number}}</td>
+                            <td>{{slave.Memory - slave.FreeMemory | kbToGB}} / {{slave.Memory | kbToGB}} GB</td>
                         </tr>
                         <tr ng-hide="activeIdleSlaves.length">
@@ -348,6 +398,6 @@
                             <td>{{slave.Slave.Name}}</td>
                             <td>{{slave.CpuUtilization | number: 2}} %</td>
-                            <td>{{slave.Cores | number}}</td>
-                            <td>{{slave.Memory | toGB}}</td>
+                            <td>{{slave.Cores - slave.FreeCores | number}} / {{slave.Cores | number}}</td>
+                            <td>{{slave.Memory - slave.FreeMemory | kbToGB}} / {{slave.Memory | kbToGB}} GB</td>
                         </tr>
                         <tr ng-hide="inactiveSlaves.length">
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js	(revision 12551)
@@ -117,5 +117,5 @@
                     $scope.cpu.knobData = Math.round(status.CpuUtilizationStatus.ActiveCpuUtilization);
                     $scope.core.knobData = Math.round(status.CoreStatus.CalculatingCores / status.CoreStatus.ActiveCores * 100);
-                    $scope.memory.knobData = Math.round(status.MemoryStatus.UsedMemory / status.MemoryStatus.ActiveMemory * 100);
+                    $scope.memory.knobData = Math.round(status.MemoryStatus.CalculatingMemory / status.MemoryStatus.ActiveMemory * 100);
                     // chart series
                     var cpuSeries = $scope.cpu.series[0].data.splice(0);
@@ -141,13 +141,8 @@
                     cpuSeries.push([$scope.status.Timestamp, $scope.cpu.knobData]);
 
-                    // charts are currently filled with old total/used data
-                    // start temporary
-                    var usedCores = status.CoreStatus.TotalCores - status.CoreStatus.FreeCores;
-                    var usedMemory = status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory;
-                    // end temporary
                     coreSeries[0].push([$scope.status.Timestamp, status.CoreStatus.TotalCores]);
-                    coreSeries[1].push([$scope.status.Timestamp, usedCores]);
+                    coreSeries[1].push([$scope.status.Timestamp, status.CoreStatus.UsedCores]);
                     memorySeries[0].push([$scope.status.Timestamp, Math.round(status.MemoryStatus.TotalMemory / 1024)]);
-                    memorySeries[1].push([$scope.status.Timestamp, Math.round(usedMemory / 1024)]);
+                    memorySeries[1].push([$scope.status.Timestamp, Math.round(status.MemoryStatus.UsedMemory / 1024)]);
                     $scope.cpu.series = [{ data: cpuSeries, label: "&nbsp;CPU Utilization", color: "#f7921d" }];
                     $scope.core.series = [
@@ -174,9 +169,9 @@
                     for (var i = 0; i < noOfStatus; ++i) {
                         var curStatus = status[i];
-                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
+                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.TotalCpuUtilization);
                         cpuSeries.push([curStatus.Timestamp, cpuData]);
-                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
-                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
-                        memorySeries[0].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.ActiveMemory / 1024)]);
+                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
+                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.UsedCores]);
+                        memorySeries[0].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.TotalMemory / 1024)]);
                         memorySeries[1].push([curStatus.Timestamp, Math.round(curStatus.MemoryStatus.UsedMemory / 1024)]);
                     }
@@ -202,12 +197,3 @@
         }]
     );
-
-    module.filter('toGB', function () {
-        return function (text, length, end) {
-            if (text == null || text == '') text = '0';
-            text = Math.round(parseInt(text) / 1024);
-            return text + ' GB';
-        };
-    });
-
 })();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/packages.config
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/packages.config	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/packages.config	(revision 12551)
@@ -5,4 +5,4 @@
   <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
   <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
 </packages>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs	(revision 12551)
@@ -90,4 +90,5 @@
         .IncludeDirectory("~/WebApp/shared/services", "*.js", true)
         .IncludeDirectory("~/WebApp/shared/directives", "*.js", true)
+        .IncludeDirectory("~/WebApp/shared/filter", "*.js", true)
         .IncludeDirectory("~/WebApp/shared/menu", "*.js", true)
       );
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj	(revision 12551)
@@ -23,5 +23,4 @@
     <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
     <RestorePackages>true</RestorePackages>
-    <WebGreaseLibPath>..\..\packages\WebGrease.1.5.2\lib</WebGreaseLibPath>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -44,7 +43,7 @@
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Antlr3.Runtime, Version=3.4.1.9004, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Antlr.3.4.1.9004\lib\Antlr3.Runtime.dll</HintPath>
-      <Private>True</Private>
+    <Reference Include="Antlr3.Runtime, Version=3.5.0.2, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.CSharp" />
@@ -53,7 +52,7 @@
       <Private>True</Private>
     </Reference>
-    <Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
-      <Private>True</Private>
+    <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="System" />
@@ -119,7 +118,6 @@
     <Reference Include="System.Net.Http.WebRequest">
     </Reference>
-    <Reference Include="WebGrease, Version=1.5.2.14234, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\WebGrease.1.5.2\lib\WebGrease.dll</HintPath>
-      <Private>True</Private>
+    <Reference Include="WebGrease">
+      <HintPath>..\..\packages\WebGrease.1.6.0\lib\WebGrease.dll</HintPath>
     </Reference>
   </ItemGroup>
@@ -170,4 +168,6 @@
     <Content Include="WebApp\libs\smoothScroll\smoothScroll.js" />
     <Content Include="WebApp\app.js" />
+    <Content Include="WebApp\plugins\about\about.js" />
+    <Content Include="WebApp\plugins\about\aboutCtrl.js" />
     <Content Include="WebApp\plugins\login\login.css">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
@@ -232,4 +232,5 @@
     <Content Include="WebApp\libs\bootstrap\fonts\glyphicons-halflings-regular.woff2" />
     <Content Include="WebApp\shared\directives\scrollToTop.js" />
+    <Content Include="WebApp\shared\filter\filters.js" />
     <Content Include="WebApp\shared\images\HeuristicLab-Logo.png" />
     <Content Include="WebApp\shared\layout\layout.cshtml" />
@@ -239,13 +240,7 @@
     <Content Include="WebApp\shared\menu\menu.cshtml" />
     <Content Include="WebApp\shared\restricted\empty.cshtml" />
-    <Content Include="WebApp\plugins\login\login.cshtml">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </Content>
-    <Content Include="WebApp\plugins\plugins\plugins.cshtml">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </Content>
-    <Content Include="WebApp\plugins\plugins\Web.config">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </Content>
+    <Content Include="WebApp\plugins\login\login.cshtml" />
+    <Content Include="WebApp\plugins\plugins\plugins.cshtml" />
+    <Content Include="WebApp\plugins\plugins\Web.config" />
   </ItemGroup>
   <ItemGroup>
@@ -268,4 +263,5 @@
   <ItemGroup>
     <None Include="Properties\PublishProfiles\WebApp.pubxml" />
+    <Content Include="WebApp\plugins\about\about.cshtml" />
   </ItemGroup>
   <PropertyGroup>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.cshtml	(revision 12551)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.cshtml	(revision 12551)
@@ -0,0 +1,55 @@
+﻿<div class="default-view-container">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Responsible for Contents and Editing of Pages</h3>
+                </div>
+                <div class="panel-body">
+                    <p>
+                        Heuristic and Evolutionary Algorithms Laboratory (HEAL)<br />
+                        School of Informatics, Communications and Media<br />
+                        University of Applied Sciences Upper Austria<br />
+                        Softwarepark 11<br />
+                        A-4232 Hagenberg, Austria<br />
+                        (media owner and editor for the purposes of the Austrian Media Act)<br />
+                    </p>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Contact</h3>
+                </div>
+                <div class="panel-body">
+                    <p><strong>Support and Inquiries</strong>: ​<a href="mailto:#">support@heuristiclab.com</a></p>
+                    <p><strong>Heuristic and Evolutionary Algorithms Laboratory (HEAL)</strong>: <a href="​http://heal.heuristiclab.com">​http://heal.heuristiclab.com</a></p>
+                    <p>
+                        <strong>Head of HeuristicLab</strong>:<br />
+                        FH-Prof. DI Dr. Stefan Wagner<br />
+                        Phone: +43 50804 22030<br />
+                        Fax: +43 50804 21599<br />
+                        E-mail: <a href="mailto:#">stefan.wagner@heuristiclab.com</a><br />
+                    </p>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">Disclaimer of Liability and Endorsement</h3>
+                </div>
+                <div class="panel-body">
+                    <p style="text-align:justify">HeuristicLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details (http://www.gnu.org/licenses). All contents on the development homepage and wiki of the HeuristicLab have been compiled carefully. Still, the Heuristic and Evolutionary Algorithms Laboratory (HEAL) makes no guarantees of accuracy, completeness and timeliness of the information on this website. Therefore HEAL accepts no responsibility or liability for damages or losses resulting from the use of this website and/or the software.</p>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.js	(revision 12551)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/about.js	(revision 12551)
@@ -0,0 +1,19 @@
+﻿var appAboutPlugin = app.registerPlugin('about');
+(function () {
+    var plugin = appAboutPlugin;
+    plugin.dependencies = ['ngResource', 'ui.bootstrap'];
+    plugin.files = ['aboutCtrl.js'];
+    plugin.view = 'about.cshtml';
+    plugin.controller = 'app.about.ctrl';
+    plugin.routes = [];
+
+    var menu = app.getMenu();
+    var section = menu.getSection('Menü', -1);
+    section.addEntry({
+        index: 10000,
+        name: 'About',
+        route: '#/about',
+        icon: 'glyphicon glyphicon-info-sign',
+        entries: []
+    });
+})();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/aboutCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/aboutCtrl.js	(revision 12551)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/about/aboutCtrl.js	(revision 12551)
@@ -0,0 +1,4 @@
+﻿(function () {
+    var module = appAboutPlugin.getAngularModule();
+    module.controller('app.about.ctrl', ['$scope', function ($scope) { }]);
+})();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/plugins/plugins.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/plugins/plugins.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/plugins/plugins/plugins.cshtml	(revision 12551)
@@ -38,5 +38,5 @@
                             </td>
                             <td>
-                                <a ng-href="" data-ng-click="reloadPlugin(plugin.Name)">Reload</a>
+                                <a ng-href="" class="cursor-pointer" data-ng-click="reloadPlugin(plugin.Name)">Reload</a>
                             </td>
                         </tr>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/filter/filters.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/filter/filters.js	(revision 12551)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/filter/filters.js	(revision 12551)
@@ -0,0 +1,44 @@
+﻿(function () {
+    var module = appMainPlugin.getAngularModule();
+    module.filter('kbToGB', function () {
+        return function (text, length, end) {
+            if (text == null || text == '') text = '0';
+            text = Math.round(parseInt(text, 10) / 1024);
+            return text;
+        };
+    });
+
+    module.filter('toDate', function () {
+        return function (text, length, end) {
+            if (text == null || text == '' || text.length < 19)
+                return 'Invalid';
+            var day = text.slice(8, 10);
+            var month = text.slice(5, 7);
+            var year = text.slice(0, 4);
+            var hour = text.slice(11, 13);
+            var minute = text.slice(14, 16);
+            var second = text.slice(17, 19);
+            return day + '.' + month + '.' + year + ' ' + hour + ':' + minute + ':' + second;
+        };
+    });
+
+    module.filter('toTimespan', function () {
+        return function (text, length, end) {
+            if (text == null || text == '') text = '0';
+            var d = Number(parseInt(text, 10));
+            var years = Math.floor(d / 31536000);
+            var days = Math.floor(d / 86400 % 365);
+            var h = Math.floor(d / 3600 % 24);
+            var m = Math.floor(d % 3600 / 60);
+            var s = Math.floor(d % 3600 % 60);
+            var timeStr = "";
+            if (years > 0) {
+                timeStr = years + "y ";
+            }
+            if (days > 0) {
+                timeStr = timeStr + days + "d ";
+            }
+            return timeStr + h.zeropad(2) + ":" + m.zeropad(2) + ":" + s.zeropad(2);
+        };
+    });
+})();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12551)
@@ -69,5 +69,5 @@
                             </li>
                             <li>
-                                <a ng-href="" data-ng-click="logout()">Logout</a>
+                                <a ng-href="#" data-ng-click="logout()">Logout</a>
                             </li>
                         }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/packages.config
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/packages.config	(revision 12550)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/packages.config	(revision 12551)
@@ -1,5 +1,5 @@
 ﻿<?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Antlr" version="3.4.1.9004" targetFramework="net45" />
+  <package id="Antlr" version="3.5.0.2" targetFramework="net45" />
   <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
   <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
@@ -11,5 +11,5 @@
   <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
   <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
-  <package id="WebGrease" version="1.5.2" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
+  <package id="WebGrease" version="1.6.0" targetFramework="net45" />
 </packages>
Index: /branches/HiveStatistics/sources/Installers/HiveJanitorServiceInstaller.nsi
===================================================================
--- /branches/HiveStatistics/sources/Installers/HiveJanitorServiceInstaller.nsi	(revision 12550)
+++ /branches/HiveStatistics/sources/Installers/HiveJanitorServiceInstaller.nsi	(revision 12551)
@@ -1,4 +1,4 @@
 /* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
Index: /branches/HiveStatistics/sources/Installers/HiveSlaveInstaller.nsi
===================================================================
--- /branches/HiveStatistics/sources/Installers/HiveSlaveInstaller.nsi	(revision 12550)
+++ /branches/HiveStatistics/sources/Installers/HiveSlaveInstaller.nsi	(revision 12551)
@@ -1,4 +1,4 @@
 /* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
