Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/GenericDao.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/GenericDao.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/GenericDao.cs	(revision 12484)
@@ -108,4 +108,8 @@
     }
 
+    public bool Exists(T entity) {
+      return Table.Contains(entity);
+    }
+
     public bool Exists(PK id) {
       return GetById(id) != null;
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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveDao.cs	(revision 12484)
@@ -112,4 +112,8 @@
     }
 
+    public bool Exists(Slave entity) {
+      return Table.Contains(entity);
+    }
+
     public bool Exists(Guid id) {
       return GetById(id) != null;
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveGroupDao.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveGroupDao.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Daos/SlaveGroupDao.cs	(revision 12484)
@@ -111,4 +111,8 @@
     }
 
+    public bool Exists(SlaveGroup entity) {
+      return Table.Contains(entity);
+    }
+
     public bool Exists(Guid id) {
       return GetById(id) != null;
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 12484)
@@ -225,7 +225,7 @@
     <Type Name="FactTask">
       <Column Name="TaskId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
-      <Column Name="TotalRuntime" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TotalWaitingTime" Type="System.Double" DbType="Float NOT NULL" CanBeNull="false" />
-      <Column Name="TotalTransferTime" Type="System.Double" DbType="Float NOT NULL" 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="NumCalculationRuns" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
       <Column Name="NumRetries" Storage="_NumFails" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
@@ -235,12 +235,11 @@
       <Column Name="LastClientId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="true" />
       <Column Name="JobId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
-      <Column Name="StartTime" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="false" />
       <Column Name="EndTime" Type="System.DateTime" DbType="DateTime NOT NULL" CanBeNull="true" />
       <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="StartTime" Type="System.DateTime" CanBeNull="true" />
       <Association Name="DimClient_FactTask" Member="DimClient" ThisKey="LastClientId" OtherKey="Id" Type="DimClient" IsForeignKey="true" />
       <Association Name="DimJob_FactTask" Member="DimJob" ThisKey="JobId" OtherKey="JobId" Type="DimJob" IsForeignKey="true" />
-      <Association Name="DimTime_FactTask" Member="DimTimeEnd" Storage="_DimTime" ThisKey="EndTime" OtherKey="Time" Type="DimTime" IsForeignKey="true" />
-      <Association Name="DimTime_FactTask1" Member="DimTimeStart" Storage="_DimTime1" ThisKey="StartTime" OtherKey="Time" Type="DimTime" IsForeignKey="true" />
     </Type>
   </Table>
@@ -251,5 +250,5 @@
       <Column Name="JobName" Type="System.String" DbType="VarChar(MAX) NOT NULL" CanBeNull="false" />
       <Column Name="UserName" Type="System.String" DbType="VarChar(MAX) NOT NULL" CanBeNull="false" />
-      <Column Member="DateCreated" Type="System.DateTime" CanBeNull="false" />
+      <Column Name="DateCreated" Type="System.DateTime" CanBeNull="false" />
       <Association Name="DimJob_FactTask" Member="FactTasks" ThisKey="JobId" OtherKey="JobId" Type="FactTask" />
     </Type>
@@ -262,6 +261,5 @@
       <Column Name="Month" Type="System.DateTime" DbType="Date NOT NULL" CanBeNull="false" />
       <Column Name="Year" Type="System.DateTime" DbType="Date NOT NULL" CanBeNull="false" />
-      <Association Name="DimTime_FactTask" Member="FactTasks" ThisKey="Time" OtherKey="EndTime" Type="FactTask" />
-      <Association Name="DimTime_FactTask1" Member="FactTasks1" ThisKey="Time" OtherKey="StartTime" Type="FactTask" />
+      <Column Name="Minute" Type="System.DateTime" CanBeNull="false" />
       <Association Name="DimTime_FactClientInfo" Member="FactClientInfos" ThisKey="Time" OtherKey="Time" Type="FactClientInfo" />
     </Type>
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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout	(revision 12484)
@@ -253,8 +253,8 @@
       </nestedChildShapes>
     </classShape>
-    <classShape Id="04f52807-ce17-4d65-bd23-cc38c6dfbd7a" absoluteBounds="6.875, 11.25, 2, 3.6939111328125005">
+    <classShape Id="04f52807-ce17-4d65-bd23-cc38c6dfbd7a" absoluteBounds="6.875, 11.25, 2, 3.8862125651041666">
       <DataClassMoniker Name="/HiveDataContext/FactTask" />
       <nestedChildShapes>
-        <elementListCompartment Id="63e3ddcb-a6fe-48e0-a674-e650a55a9f2c" absoluteBounds="6.8900000000000006, 11.71, 1.9700000000000002, 3.1339111328125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="63e3ddcb-a6fe-48e0-a674-e650a55a9f2c" absoluteBounds="6.8900000000000006, 11.71, 1.9700000000000002, 3.3262125651041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -265,8 +265,8 @@
       </nestedChildShapes>
     </classShape>
-    <classShape Id="a769f2ac-c8e3-4860-baa5-c46f46c38ed8" absoluteBounds="3.625, 8.5, 2, 1.7708968098958344">
+    <classShape Id="a769f2ac-c8e3-4860-baa5-c46f46c38ed8" absoluteBounds="3.625, 8.5, 2, 1.9631982421875005">
       <DataClassMoniker Name="/HiveDataContext/DimTime" />
       <nestedChildShapes>
-        <elementListCompartment Id="694c4a5a-20fb-43a9-bc9a-7b59d794a7fb" absoluteBounds="3.6399999999999997, 8.96, 1.9700000000000002, 1.2108968098958333" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="694c4a5a-20fb-43a9-bc9a-7b59d794a7fb" absoluteBounds="3.6399999999999997, 8.96, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -283,5 +283,5 @@
       </nestedChildShapes>
     </classShape>
-    <associationConnector edgePoints="[(6.625 : 15.25); (6.875 : 14.9439111328125)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(6.625 : 15.25); (6.875 : 15.1362125651042)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/DimClient/DimClient_FactTask" />
       <nodes>
@@ -290,5 +290,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(8.5 : 10.8958968098958); (8.5 : 11.25)]" fixedFrom="Algorithm" fixedTo="Algorithm">
+    <associationConnector edgePoints="[(8.5 : 10.8958968098958); (8.5 : 11.25)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/DimJob/DimJob_FactTask" />
       <nodes>
@@ -297,19 +297,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(5.02343625 : 10.2708968098958); (5.02343625 : 14.7227579166667); (5.90885291666667 : 14.7227579166667 : JumpStart); (6.07551958333333 : 14.7227579166667 : JumpEnd); (6.875 : 14.7227579166667)]" fixedFrom="NotFixed" fixedTo="NotFixed">
-      <AssociationMoniker Name="/HiveDataContext/DimTime/DimTime_FactTask" />
-      <nodes>
-        <classShapeMoniker Id="a769f2ac-c8e3-4860-baa5-c46f46c38ed8" />
-        <classShapeMoniker Id="04f52807-ce17-4d65-bd23-cc38c6dfbd7a" />
-      </nodes>
-    </associationConnector>
-    <associationConnector edgePoints="[(5.4218775 : 10.2708968098958); (5.4218775 : 13.3576659570313); (5.90885291666667 : 13.3576659570313 : JumpStart); (6.07551958333333 : 13.3576659570313 : JumpEnd); (6.71675495975 : 13.3576659570313); (6.71675495975 : 13.3568567264325); (6.875 : 13.3568567264325)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
-      <AssociationMoniker Name="/HiveDataContext/DimTime/DimTime_FactTask1" />
-      <nodes>
-        <classShapeMoniker Id="a769f2ac-c8e3-4860-baa5-c46f46c38ed8" />
-        <classShapeMoniker Id="04f52807-ce17-4d65-bd23-cc38c6dfbd7a" />
-      </nodes>
-    </associationConnector>
-    <associationConnector edgePoints="[(5.99218625 : 15.25); (5.99218625 : 12.1788329785157); (5.50521083333333 : 12.1788329785157 : JumpStart); (5.33854416666667 : 12.1788329785157 : JumpEnd); (5.10676958333333 : 12.1788329785157 : JumpStart); (4.94010291666667 : 12.1788329785157 : JumpEnd); (4.625 : 12.1788329785157)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(5.99218625 : 15.25); (5.99218625 : 12.1788329785157); (4.625 : 12.1788329785157)]" fixedFrom="NotFixed" fixedTo="NotFixed">
       <AssociationMoniker Name="/HiveDataContext/DimClient/DimClient_FactClientInfo" />
       <nodes>
@@ -318,5 +304,5 @@
       </nodes>
     </associationConnector>
-    <associationConnector edgePoints="[(4.125 : 10.2708968098958); (4.125 : 11)]" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(4.125 : 10.4631982421875); (4.125 : 11)]" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/HiveDataContext/DimTime/DimTime_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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs	(revision 12484)
@@ -4867,6 +4867,4 @@
 		private System.Guid _JobId;
 		
-		private System.DateTime _StartTime;
-		
 		private System.Nullable<System.DateTime> _EndTime;
 		
@@ -4875,11 +4873,11 @@
 		private string _Exception;
 		
+		private double _InitialWaitingTimeMs;
+		
+		private System.Nullable<System.DateTime> _StartTime;
+		
 		private EntityRef<DimClient> _DimClient;
 		
 		private EntityRef<DimJob> _DimJob;
-		
-		private EntityRef<DimTime> _DimTime;
-		
-		private EntityRef<DimTime> _DimTime1;
 		
     #region Extensibility Method Definitions
@@ -4889,10 +4887,10 @@
     partial void OnTaskIdChanging(System.Guid value);
     partial void OnTaskIdChanged();
-    partial void OnTotalRuntimeChanging(double value);
-    partial void OnTotalRuntimeChanged();
-    partial void OnTotalWaitingTimeChanging(double value);
-    partial void OnTotalWaitingTimeChanged();
-    partial void OnTotalTransferTimeChanging(double value);
-    partial void OnTotalTransferTimeChanged();
+    partial void OnCalculatingTimeChanging(double value);
+    partial void OnCalculatingTimeChanged();
+    partial void OnWaitingTimeChanging(double value);
+    partial void OnWaitingTimeChanged();
+    partial void OnTransferTimeChanging(double value);
+    partial void OnTransferTimeChanged();
     partial void OnNumCalculationRunsChanging(int value);
     partial void OnNumCalculationRunsChanged();
@@ -4909,6 +4907,4 @@
     partial void OnJobIdChanging(System.Guid value);
     partial void OnJobIdChanged();
-    partial void OnStartTimeChanging(System.DateTime value);
-    partial void OnStartTimeChanged();
     partial void OnEndTimeChanging(System.Nullable<System.DateTime> value);
     partial void OnEndTimeChanged();
@@ -4917,4 +4913,8 @@
     partial void OnExceptionChanging(string value);
     partial void OnExceptionChanged();
+    partial void OnInitialWaitingTimeChanging(double value);
+    partial void OnInitialWaitingTimeChanged();
+    partial void OnStartTimeChanging(System.Nullable<System.DateTime> value);
+    partial void OnStartTimeChanged();
     #endregion
 		
@@ -4923,6 +4923,4 @@
 			this._DimClient = default(EntityRef<DimClient>);
 			this._DimJob = default(EntityRef<DimJob>);
-			this._DimTime = default(EntityRef<DimTime>);
-			this._DimTime1 = default(EntityRef<DimTime>);
 			OnCreated();
 		}
@@ -4949,5 +4947,5 @@
 		
 		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalRuntime", DbType="Float NOT NULL")]
-		public double TotalRuntime
+		public double CalculatingTime
 		{
 			get
@@ -4959,9 +4957,9 @@
 				if ((this._TotalRuntime != value))
 				{
-					this.OnTotalRuntimeChanging(value);
+					this.OnCalculatingTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalRuntime = value;
-					this.SendPropertyChanged("TotalRuntime");
-					this.OnTotalRuntimeChanged();
+					this.SendPropertyChanged("CalculatingTime");
+					this.OnCalculatingTimeChanged();
 				}
 			}
@@ -4969,5 +4967,5 @@
 		
 		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalWaitingTime", DbType="Float NOT NULL")]
-		public double TotalWaitingTime
+		public double WaitingTime
 		{
 			get
@@ -4979,9 +4977,9 @@
 				if ((this._TotalWaitingTime != value))
 				{
-					this.OnTotalWaitingTimeChanging(value);
+					this.OnWaitingTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalWaitingTime = value;
-					this.SendPropertyChanged("TotalWaitingTime");
-					this.OnTotalWaitingTimeChanged();
+					this.SendPropertyChanged("WaitingTime");
+					this.OnWaitingTimeChanged();
 				}
 			}
@@ -4989,5 +4987,5 @@
 		
 		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TotalTransferTime", DbType="Float NOT NULL")]
-		public double TotalTransferTime
+		public double TransferTime
 		{
 			get
@@ -4999,9 +4997,9 @@
 				if ((this._TotalTransferTime != value))
 				{
-					this.OnTotalTransferTimeChanging(value);
+					this.OnTransferTimeChanging(value);
 					this.SendPropertyChanging();
 					this._TotalTransferTime = value;
-					this.SendPropertyChanged("TotalTransferTime");
-					this.OnTotalTransferTimeChanged();
+					this.SendPropertyChanged("TransferTime");
+					this.OnTransferTimeChanged();
 				}
 			}
@@ -5156,6 +5154,86 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_StartTime", DbType="DateTime NOT NULL")]
-		public System.DateTime StartTime
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EndTime", DbType="DateTime NOT NULL")]
+		public System.Nullable<System.DateTime> EndTime
+		{
+			get
+			{
+				return this._EndTime;
+			}
+			set
+			{
+				if ((this._EndTime != value))
+				{
+					this.OnEndTimeChanging(value);
+					this.SendPropertyChanging();
+					this._EndTime = value;
+					this.SendPropertyChanged("EndTime");
+					this.OnEndTimeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TaskState", DbType="varchar(30)", CanBeNull=false)]
+		public global::HeuristicLab.Services.Hive.DataAccess.TaskState TaskState
+		{
+			get
+			{
+				return this._TaskState;
+			}
+			set
+			{
+				if ((this._TaskState != value))
+				{
+					this.OnTaskStateChanging(value);
+					this.SendPropertyChanging();
+					this._TaskState = value;
+					this.SendPropertyChanged("TaskState");
+					this.OnTaskStateChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Exception", DbType="varchar(MAX)")]
+		public string Exception
+		{
+			get
+			{
+				return this._Exception;
+			}
+			set
+			{
+				if ((this._Exception != value))
+				{
+					this.OnExceptionChanging(value);
+					this.SendPropertyChanging();
+					this._Exception = value;
+					this.SendPropertyChanged("Exception");
+					this.OnExceptionChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_InitialWaitingTimeMs")]
+		public double InitialWaitingTime
+		{
+			get
+			{
+				return this._InitialWaitingTimeMs;
+			}
+			set
+			{
+				if ((this._InitialWaitingTimeMs != value))
+				{
+					this.OnInitialWaitingTimeChanging(value);
+					this.SendPropertyChanging();
+					this._InitialWaitingTimeMs = value;
+					this.SendPropertyChanged("InitialWaitingTime");
+					this.OnInitialWaitingTimeChanged();
+				}
+			}
+		}
+		
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_StartTime")]
+		public System.Nullable<System.DateTime> StartTime
 		{
 			get
@@ -5167,8 +5245,4 @@
 				if ((this._StartTime != value))
 				{
-					if (this._DimTime1.HasLoadedOrAssignedValue)
-					{
-						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
-					}
 					this.OnStartTimeChanging(value);
 					this.SendPropertyChanging();
@@ -5180,68 +5254,4 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_EndTime", DbType="DateTime NOT NULL")]
-		public System.Nullable<System.DateTime> EndTime
-		{
-			get
-			{
-				return this._EndTime;
-			}
-			set
-			{
-				if ((this._EndTime != value))
-				{
-					if (this._DimTime.HasLoadedOrAssignedValue)
-					{
-						throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
-					}
-					this.OnEndTimeChanging(value);
-					this.SendPropertyChanging();
-					this._EndTime = value;
-					this.SendPropertyChanged("EndTime");
-					this.OnEndTimeChanged();
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_TaskState", DbType="varchar(30)", CanBeNull=false)]
-		public global::HeuristicLab.Services.Hive.DataAccess.TaskState TaskState
-		{
-			get
-			{
-				return this._TaskState;
-			}
-			set
-			{
-				if ((this._TaskState != value))
-				{
-					this.OnTaskStateChanging(value);
-					this.SendPropertyChanging();
-					this._TaskState = value;
-					this.SendPropertyChanged("TaskState");
-					this.OnTaskStateChanged();
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Exception", DbType="varchar(MAX)")]
-		public string Exception
-		{
-			get
-			{
-				return this._Exception;
-			}
-			set
-			{
-				if ((this._Exception != value))
-				{
-					this.OnExceptionChanging(value);
-					this.SendPropertyChanging();
-					this._Exception = value;
-					this.SendPropertyChanged("Exception");
-					this.OnExceptionChanged();
-				}
-			}
-		}
-		
 		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimClient_FactTask", Storage="_DimClient", ThisKey="LastClientId", OtherKey="Id", IsForeignKey=true)]
 		public DimClient DimClient
@@ -5308,72 +5318,4 @@
 					}
 					this.SendPropertyChanged("DimJob");
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimTime_FactTask", Storage="_DimTime", ThisKey="EndTime", OtherKey="Time", IsForeignKey=true)]
-		public DimTime DimTimeEnd
-		{
-			get
-			{
-				return this._DimTime.Entity;
-			}
-			set
-			{
-				DimTime previousValue = this._DimTime.Entity;
-				if (((previousValue != value) 
-							|| (this._DimTime.HasLoadedOrAssignedValue == false)))
-				{
-					this.SendPropertyChanging();
-					if ((previousValue != null))
-					{
-						this._DimTime.Entity = null;
-						previousValue.FactTasks.Remove(this);
-					}
-					this._DimTime.Entity = value;
-					if ((value != null))
-					{
-						value.FactTasks.Add(this);
-						this._EndTime = value.Time;
-					}
-					else
-					{
-						this._EndTime = default(Nullable<System.DateTime>);
-					}
-					this.SendPropertyChanged("DimTimeEnd");
-				}
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimTime_FactTask1", Storage="_DimTime1", ThisKey="StartTime", OtherKey="Time", IsForeignKey=true)]
-		public DimTime DimTimeStart
-		{
-			get
-			{
-				return this._DimTime1.Entity;
-			}
-			set
-			{
-				DimTime previousValue = this._DimTime1.Entity;
-				if (((previousValue != value) 
-							|| (this._DimTime1.HasLoadedOrAssignedValue == false)))
-				{
-					this.SendPropertyChanging();
-					if ((previousValue != null))
-					{
-						this._DimTime1.Entity = null;
-						previousValue.FactTasks1.Remove(this);
-					}
-					this._DimTime1.Entity = value;
-					if ((value != null))
-					{
-						value.FactTasks1.Add(this);
-						this._StartTime = value.Time;
-					}
-					else
-					{
-						this._StartTime = default(System.DateTime);
-					}
-					this.SendPropertyChanged("DimTimeStart");
 				}
 			}
@@ -5603,7 +5545,5 @@
 		private System.DateTime _Year;
 		
-		private EntitySet<FactTask> _FactTasks;
-		
-		private EntitySet<FactTask> _FactTasks1;
+		private System.DateTime _Minute;
 		
 		private EntitySet<FactClientInfo> _FactClientInfos;
@@ -5623,10 +5563,10 @@
     partial void OnYearChanging(System.DateTime value);
     partial void OnYearChanged();
+    partial void OnMinuteChanging(System.DateTime value);
+    partial void OnMinuteChanged();
     #endregion
 		
 		public DimTime()
 		{
-			this._FactTasks = new EntitySet<FactTask>(new Action<FactTask>(this.attach_FactTasks), new Action<FactTask>(this.detach_FactTasks));
-			this._FactTasks1 = new EntitySet<FactTask>(new Action<FactTask>(this.attach_FactTasks1), new Action<FactTask>(this.detach_FactTasks1));
 			this._FactClientInfos = new EntitySet<FactClientInfo>(new Action<FactClientInfo>(this.attach_FactClientInfos), new Action<FactClientInfo>(this.detach_FactClientInfos));
 			OnCreated();
@@ -5733,27 +5673,21 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimTime_FactTask", Storage="_FactTasks", ThisKey="Time", OtherKey="EndTime")]
-		public EntitySet<FactTask> FactTasks
-		{
-			get
-			{
-				return this._FactTasks;
-			}
-			set
-			{
-				this._FactTasks.Assign(value);
-			}
-		}
-		
-		[global::System.Data.Linq.Mapping.AssociationAttribute(Name="DimTime_FactTask1", Storage="_FactTasks1", ThisKey="Time", OtherKey="StartTime")]
-		public EntitySet<FactTask> FactTasks1
-		{
-			get
-			{
-				return this._FactTasks1;
-			}
-			set
-			{
-				this._FactTasks1.Assign(value);
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Minute")]
+		public System.DateTime Minute
+		{
+			get
+			{
+				return this._Minute;
+			}
+			set
+			{
+				if ((this._Minute != value))
+				{
+					this.OnMinuteChanging(value);
+					this.SendPropertyChanging();
+					this._Minute = value;
+					this.SendPropertyChanged("Minute");
+					this.OnMinuteChanged();
+				}
 			}
 		}
@@ -5790,28 +5724,4 @@
 				this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
 			}
-		}
-		
-		private void attach_FactTasks(FactTask entity)
-		{
-			this.SendPropertyChanging();
-			entity.DimTimeEnd = this;
-		}
-		
-		private void detach_FactTasks(FactTask entity)
-		{
-			this.SendPropertyChanging();
-			entity.DimTimeEnd = null;
-		}
-		
-		private void attach_FactTasks1(FactTask entity)
-		{
-			this.SendPropertyChanging();
-			entity.DimTimeStart = this;
-		}
-		
-		private void detach_FactTasks1(FactTask entity)
-		{
-			this.SendPropertyChanging();
-			entity.DimTimeStart = null;
 		}
 		
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Interfaces/IGenericDao.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Interfaces/IGenericDao.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/Interfaces/IGenericDao.cs	(revision 12484)
@@ -40,4 +40,5 @@
     void Delete(T entity);
     void Delete(IEnumerable<T> entities);
+    bool Exists(T entity);
     bool Exists(PK id);
   }
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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql	(revision 12484)
@@ -202,9 +202,10 @@
 
 CREATE TABLE [statistics].[DimTime] (
-    [Time]  DATETIME NOT NULL,
-    [Hour]  DATETIME NOT NULL,
-    [Day]   DATE     NOT NULL,
-    [Month] DATE     NOT NULL,
-    [Year]  DATE     NOT NULL,
+    [Time]   DATETIME NOT NULL,
+    [Minute] DATETIME NOT NULL,
+    [Hour]   DATETIME NOT NULL,
+    [Day]    DATE     NOT NULL,
+    [Month]  DATE     NOT NULL,
+    [Year]   DATE     NOT NULL,
     CONSTRAINT [PK_DimTime] PRIMARY KEY CLUSTERED ([Time] ASC)
 );
@@ -223,5 +224,5 @@
     [JobName]     VARCHAR (MAX)    NOT NULL,
     [UserName]    VARCHAR (MAX)    NOT NULL,
-	[DateCreated] DATETIME		   NOT NULL,
+    [DateCreated] DATETIME		   NOT NULL,
     CONSTRAINT [PK_DimJob] PRIMARY KEY CLUSTERED ([JobId] ASC)
 );
@@ -252,24 +253,23 @@
 );
 CREATE TABLE [statistics].[FactTask] (
-    [TaskId]             UNIQUEIDENTIFIER NOT NULL,
-    [TotalRuntime]       FLOAT (53)       NOT NULL,
-    [TotalWaitingTime]   FLOAT (53)       NOT NULL,
-    [TotalTransferTime]  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         NOT NULL,
-    [EndTime]            DATETIME         NULL,
-    [TaskState]          VARCHAR (30)     NOT NULL,
-    [Exception]			 VARCHAR (MAX)	  NULL,
+    [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]),
-    CONSTRAINT [FK_FactTask_DimTimeStart] FOREIGN KEY ([StartTime]) REFERENCES [statistics].[DimTime] ([Time]),
-    CONSTRAINT [FK_FactTask_DimTimeEnd] FOREIGN KEY ([EndTime]) REFERENCES [statistics].[DimTime] ([Time])
+    CONSTRAINT [FK_FactTask_DimJob] FOREIGN KEY ([JobId]) REFERENCES [statistics].[DimJob] ([JobId])
 );
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveJanitor.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveJanitor.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveJanitor.cs	(revision 12484)
@@ -49,6 +49,6 @@
     public HiveJanitor() {
       stop = false;
-      cleanupWaitHandle = new AutoResetEvent(true);
-      generateStatisticsWaitHandle = new AutoResetEvent(true);
+      cleanupWaitHandle = new AutoResetEvent(false);
+      generateStatisticsWaitHandle = new AutoResetEvent(false);
     }
 
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/HiveStatisticsGenerator.cs	(revision 12484)
@@ -38,5 +38,5 @@
           UpdateDimUserTable(pm);
           UpdateDimJobTable(pm);
-          UpdateDimClients(pm);
+          UpdateDimClientsTable(pm);
           pm.SubmitChanges();
         });
@@ -47,5 +47,5 @@
             pm.SubmitChanges();
             UpdateFactClientInfoTable(newTime, pm);
-            UpdateTaskFacts(newTime, pm);
+            UpdateTaskFactsTable(newTime, pm);
             try {
               pm.SubmitChanges();
@@ -67,5 +67,6 @@
       var now = DateTime.Now;
       var timeEntry = new DimTime {
-        Time = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0),
+        Time = now,
+        Minute = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0),
         Hour = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0),
         Day = new DateTime(now.Year, now.Month, now.Day, 0, 0, 0),
@@ -73,8 +74,5 @@
         Year = new DateTime(now.Year, 1, 1, 0, 0, 0)
       };
-      // using SaveOrAttach instead of save because the table can only be updated once every minute
-      // (pk restriction) save would cause a duplicate key exception if the method is accidentally 
-      // called more than once every minute (e.g. restarting the service within a minute)
-      return dimTimeDao.SaveOrAttach(timeEntry);
+      return dimTimeDao.Save(timeEntry);
     }
 
@@ -118,5 +116,5 @@
     }
 
-    private void UpdateDimClients(PersistenceManager pm) {
+    private void UpdateDimClientsTable(PersistenceManager pm) {
       var dimClientDao = pm.DimClientDao;
       var slaveDao = pm.SlaveDao;
@@ -208,5 +206,5 @@
     }
 
-    private void UpdateTaskFacts(DimTime newTime, PersistenceManager pm) {
+    private void UpdateTaskFactsTable(DimTime newTime, PersistenceManager pm) {
       var factTaskDao = pm.FactTaskDao;
       var taskDao = pm.TaskDao;
@@ -217,5 +215,4 @@
       var notFinishedFactTasks = factTaskDao.GetNotFinishedTasks().Select(x => new {
         x.TaskId,
-        x.DimTimeStart,
         x.LastClientId
       });
@@ -238,32 +235,29 @@
           MemoryRequired = task.MemoryNeeded,
           State = task.State,
-          StateLogs = stateLogs,
-          DimTimeStart = lastFact != null ? lastFact.DimTimeStart : newTime,
+          StateLogs = stateLogs.OrderBy(x => x.DateTime),
           LastClientId = client != null
                          ? client.Id : lastFact != null
                          ? lastFact.LastClientId : (Guid?)null
         };
-
-      var endStates = new[] { TaskState.Finished, TaskState.Failed, TaskState.Aborted };
       factTaskDao.Save(
         from x in newTasks.ToList()
-        let stateLogsLinkedList = new LinkedList<StateLog>(x.StateLogs.OrderBy(y => y.DateTime))
-        let lastStateLog = stateLogsLinkedList.OrderByDescending(y => y.DateTime).FirstOrDefault(sl => sl.Exception != null)
+        let taskData = CalculateFactTaskData(x.StateLogs)
         select new FactTask {
           TaskId = x.TaskId,
           JobId = x.JobId,
-          DimTimeStart = x.DimTimeStart,
-          DimTimeEnd = endStates.Contains(x.State) ? newTime : null,
+          StartTime = taskData.StartTime,
+          EndTime = taskData.EndTime,
           LastClientId = x.LastClientId,
           Priority = x.Priority,
           CoresRequired = x.CoresRequired,
           MemoryRequired = x.MemoryRequired,
-          NumCalculationRuns = stateLogsLinkedList.CountCalculationRuns(),
-          NumRetries = stateLogsLinkedList.CountRetries(),
-          TotalWaitingTime = stateLogsLinkedList.SumTotalTimeWhere(stateLog => stateLog.Value.State == TaskState.Waiting),
-          TotalRuntime = stateLogsLinkedList.SumTotalTimeWhere(stateLog => stateLog.Value.State == TaskState.Calculating && stateLog.NextIs(y => y.State == TaskState.Transferring)),
-          TotalTransferTime = stateLogsLinkedList.SumTotalTimeWhere(stateLog => stateLog.Value.State == TaskState.Transferring),
+          NumCalculationRuns = taskData.CalculationRuns,
+          NumRetries = taskData.Retries,
+          WaitingTime = taskData.WaitingTime,
+          CalculatingTime = taskData.CalculatingTime,
+          TransferTime = taskData.TransferTime,
           TaskState = x.State,
-          Exception = lastStateLog == null ? string.Empty : lastStateLog.Exception
+          Exception = taskData.Exception,
+          InitialWaitingTime = taskData.InitialWaitingTime
         });
       factTaskDao.Delete(notFinishedFactTasks.Select(x => x.TaskId));
@@ -280,35 +274,63 @@
       }
     }
-  }
-
-  public static class StateLogLinkedListExtensions {
-    public static int CountCalculationRuns(this LinkedList<StateLog> stateLogs) {
-      return stateLogs.EnumerateNodes()
-                      .Count(sl => sl.Value.State == TaskState.Calculating && sl.NextIs(nsl => nsl.State == TaskState.Transferring));
-    }
-
-    public static int CountRetries(this LinkedList<StateLog> stateLogs) {
-      return stateLogs.EnumerateNodes()
-                      .Count(sl => sl.Value.State == TaskState.Calculating && sl.Next != null && sl.NextIs(nsl => nsl.State != TaskState.Transferring));
-    }
-
-    public static double SumTotalTimeWhere(this LinkedList<StateLog> stateLogs, Predicate<LinkedListNode<StateLog>> predicate) {
-      return stateLogs.EnumerateNodes()
-                      .Where(stateLog => predicate(stateLog))
-                      .Sum(stateLog => stateLog.Next != null ? (stateLog.Next.Value.DateTime - stateLog.Value.DateTime).TotalMinutes : 0.0);
-    }
-  }
-
-  public static class LinkedListExtensions {
-    public static IEnumerable<LinkedListNode<T>> EnumerateNodes<T>(this LinkedList<T> list) {
-      var node = list.First;
-      while (node != null) {
-        yield return node;
-        node = node.Next;
+
+    private class FactTaskData {
+      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 string Exception { get; set; }
+      public DateTime? StartTime { get; set; }
+      public DateTime? EndTime { get; set; }
+    }
+
+    private FactTaskData CalculateFactTaskData(IEnumerable<StateLog> stateLogs) {
+      var factTaskData = new FactTaskData();
+      var enumerator = stateLogs.GetEnumerator();
+      if (enumerator.MoveNext()) {
+        StateLog current = enumerator.Current, first = current, prev = null;
+        while (current != null) {
+          var next = enumerator.MoveNext() ? enumerator.Current : null;
+          int timeSpanInSeconds;
+          if (next != null) {
+            timeSpanInSeconds = (int)(next.DateTime - current.DateTime).TotalSeconds;
+          } else {
+            timeSpanInSeconds = (int)(DateTime.Now - current.DateTime).TotalSeconds;
+            factTaskData.Exception = current.Exception;
+          }
+          switch (current.State) {
+            case TaskState.Calculating:
+              factTaskData.CalculatingTime += timeSpanInSeconds;
+              factTaskData.CalculationRuns++;
+              if (factTaskData.CalculationRuns == 1) {
+                factTaskData.StartTime = current.DateTime;
+                factTaskData.InitialWaitingTime = (int)(current.DateTime - first.DateTime).TotalSeconds;
+              }
+              if (prev != null && prev.State != TaskState.Transferring) {
+                factTaskData.Retries++;
+              }
+              break;
+
+            case TaskState.Waiting:
+              factTaskData.WaitingTime += timeSpanInSeconds;
+              break;
+
+            case TaskState.Transferring:
+              factTaskData.TransferTime += timeSpanInSeconds;
+              break;
+
+            case TaskState.Finished:
+            case TaskState.Failed:
+            case TaskState.Aborted:
+              factTaskData.EndTime = current.DateTime;
+              break;
+          }
+          prev = current;
+          current = next;
+        }
       }
-    }
-
-    public static bool NextIs<T>(this LinkedListNode<T> node, Predicate<T> predicate) {
-      return node.Next != null && predicate(node.Next.Value);
+      return factTaskData;
     }
   }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataController.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataController.cs	(revision 12484)
@@ -41,4 +41,10 @@
       get { return ServiceLocator.Instance.UserManager; }
     }
+    private IRoleVerifier RoleVerifier {
+      get { return ServiceLocator.Instance.RoleVerifier; }
+    }
+    private IAuthorizationManager AuthorizationManager {
+      get { return ServiceLocator.Instance.AuthorizationManager; }
+    }
 
     public IEnumerable<DTO.Job> GetJobs() {
@@ -47,4 +53,7 @@
 
     public IEnumerable<DTO.Job> GetJobsByUserId(Guid id) {
+      if (id != UserManager.CurrentUserId) {
+        RoleVerifier.AuthenticateForAnyRole(HiveRoles.Administrator);
+      }
       using (var pm = PersistenceManager) {
         return pm.UseTransaction(() => {
@@ -62,9 +71,16 @@
       using (var pm = PersistenceManager) {
         return pm.UseTransaction(() => {
+          var dimJobDao = pm.JobDao;
           var factTaskDao = pm.FactTaskDao;
+          var job = dimJobDao.GetById(id);
+          if (job != null && job.OwnerUserId != UserManager.CurrentUserId) {
+            RoleVerifier.AuthenticateForAllRoles(HiveRoles.Administrator);
+          }
           return factTaskDao.GetByJobId(id).Select(x => new DTO.Task {
-            TotalRuntime = x.TotalRuntime,
-            TotalWaitingTime = x.TotalWaitingTime,
-            TotalTransferTime = x.TotalTransferTime,
+            Id = x.TaskId,
+            CalculatingTime = x.CalculatingTime,
+            WaitingTime = x.WaitingTime,
+            TransferTime = x.TransferTime,
+            InitialWaitingTime = x.InitialWaitingTime,
             NumCalculationRuns = x.NumCalculationRuns,
             NumRetries = x.NumRetries,
@@ -72,7 +88,9 @@
             MemoryRequired = x.MemoryRequired,
             Priority = x.Priority,
+            State = x.TaskState.ToString(),
             LastClientId = x.LastClientId,
             StartTime = x.StartTime,
-            EndTime = x.EndTime
+            EndTime = x.EndTime,
+            Exception = x.Exception
           }).ToList();
         });
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Task.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Task.cs	(revision 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApi/DataTransfer/Task.cs	(revision 12484)
@@ -24,7 +24,9 @@
 namespace HeuristicLab.Services.WebApp.Statistics.WebApi.DataTransfer {
   public class Task {
-    public double TotalRuntime { get; set; }
-    public double TotalWaitingTime { get; set; }
-    public double TotalTransferTime { get; set; }
+    public Guid Id { get; set; }
+    public double CalculatingTime { get; set; }
+    public double WaitingTime { get; set; }
+    public double TransferTime { get; set; }
+    public double InitialWaitingTime { get; set; }
     public int NumCalculationRuns { get; set; }
     public int NumRetries { get; set; }
@@ -32,7 +34,9 @@
     public int MemoryRequired { get; set; }
     public int Priority { get; set; }
+    public string State { get; set; }
     public Guid? LastClientId { get; set; }
-    public DateTime StartTime { get; set; }
+    public DateTime? StartTime { get; set; }
     public DateTime? EndTime { get; set; }
+    public string Exception { get; set; }
   }
 }
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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobs.cshtml	(revision 12484)
@@ -27,11 +27,12 @@
                 </div>
                 <div class="panel-body">
-                    <table class="table table-hover">
+                    <table class="table table-hover table-condensed">
                         <thead>
-                        <tr>
-                            <th>#</th>
-                            <th>Job Name</th>
-                            <th>Date Created</th>
-                        </tr>
+                            <tr>
+                                <th>#</th>
+                                <th>Job Name</th>
+                                <th>Date Created</th>
+                                <th></th>
+                            </tr>
                         </thead>
                         <tr ng-repeat="job in jobs">
@@ -39,4 +40,5 @@
                             <td>{{job.Name}}</td>
                             <td>{{job.DateCreated}}</td>
+                            <td><a ng-href="" data-ng-click="getTasksByJobId(job.Id)">Load Tasks</a></td>
                         </tr>
                         <tr ng-hide="jobs.length">
@@ -49,3 +51,63 @@
     </div>
 
+    <div class="row" ng-show="tasks.length">
+
+        <div class="col-lg-3 col-md-6" ng-repeat="task in tasks">
+            <div class="panel panel-default">
+
+                <div class="panel-heading">
+                    <h3 class="panel-title">Task {{$index + 1}}</h3>
+                </div>
+                <div class="panel-body">
+                    <table class="table table-hover table-condensed table-no-border table-auto-width">
+                        <tr>
+                            <td>Initial Waiting Time:</td>
+                            <td>{{task.InitialWaitingTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>Waiting Time:</td>
+                            <td>{{task.WaitingTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>Calculating Time:</td>
+                            <td>{{task.CalculatingTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>Transfer Time:</td>
+                            <td>{{task.TransferTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>Start Time:</td>
+                            <td>{{task.StartTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>End Time:</td>
+                            <td>{{task.EndTime}}</td>
+                        </tr>
+                        <tr>
+                            <td>Calculation Runs:</td>
+                            <td>{{task.NumCalculationRuns}}</td>
+                        </tr>
+                        <tr>
+                            <td>Retries Runs:</td>
+                            <td>{{task.NumRetries}}</td>
+                        </tr>
+                        <tr>
+                            <td>Cores Required:</td>
+                            <td>{{task.CoresRequired}}</td>
+                        </tr>
+                        <tr>
+                            <td>Memory Required:</td>
+                            <td>{{task.MemoryRequired}}</td>
+                        </tr>
+                        <tr>
+                            <td>Priority:</td>
+                            <td>{{task.Priority}}</td>
+                        </tr>
+                    </table>
+                </div>
+
+            </div>
+        </div>
+    </div>
 </div>
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 12483)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/jobs/jobsCtrl.js	(revision 12484)
@@ -8,4 +8,11 @@
                 });
             };
+
+            $scope.getTasksByJobId = function(id) {
+                statisticsService.getTasksByJobId({ id: id }, function(tasks) {
+                    $scope.tasks = tasks;
+                });
+            };
+
             getJobs();
         }]
