Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/AdminHelper.cshtml	(revision 11030)
@@ -37,18 +37,17 @@
 }
 
-@helper UserTaskStats(string destinationTag, string overallUrl, string userUrl, string userName, string start, string end)
+@helper UserTaskStats(string destinationTag, string url, string userName, string start, string end)
 {
-  if(userName!="") {
+  if (userName != "" || userName != null) {
     <text>
       $.ajax({
-        url: "@(new HtmlString(overallUrl))?start=" + @start + "&end=" + @end, datatype: "json", success: function (overallResult) {
+        url: "@(new HtmlString(url))?start=" + @start + "&end=" + @end, datatype: "json", success: function (overallResult) {
           $.ajax({
-            url: "@(new HtmlString(userUrl))?userName=" + @userName + "&start=" + @start + "&end=" + @end, datatype: "json", success: function (userResult) {
+            url: "@(new HtmlString(url))?start=" + @start + "&end=" + @end + "&userName=" + @userName, datatype: "json", success: function (userResult) {
               $("#" + "@destinationTag").html("");
               for (var i = 0; i < userResult.length; i++) {
                 $("#" + "@destinationTag").append('<label class="barLabel">' + userResult[i].Key + '</label>');
-                $("#" + "@destinationTag").append('<div class="outerBar"><div class="innerBar" id="InnerBar' + i + '"><p class="innerBarText">' + +userResult[i].Value.toFixed(4) + '</p></div><p class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].toFixed(4) + '</p></div>');
-                $("#InnerBar" + i).css('width',((userResult[i].Value/overallResult[i])*100).toFixed(2) + '%');
-                $("#OuterText" + i).css('width',(98 - ((userResult[i].Value/overallResult[i])*100)).toFixed(2) + '%');
+                $("#" + "@destinationTag").append('<div class="outerBar"><div class="innerBar" id="InnerBar' + i + '"><label class="innerBarText">' + +userResult[i].Value.toFixed(4) + '</label></div></div><label class="outerBarText" id="OuterText' + i + '">' + +overallResult[i].Value.toFixed(4) + '</label>');
+                $("#InnerBar" + i).css('width',((userResult[i].Value/overallResult[i].Value)*100).toFixed(2) + '%');
               }
             }
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ChartHelper.cshtml	(revision 11030)
@@ -110,12 +110,51 @@
 }
 
-@helper TasksForUser(string container, string destinationTag, string url, string userName, string startDate = null, string endDate = null)
-{
-  <text>
-    $.ajax({url: "@(new HtmlString(url))?userName=" + @(userName) + "&start=" + @startDate + "&end=" + @endDate, datatype: "json", success: function(result) {
-      $("#@container").html("");
-      if(result[0].length==0) {
+@helper TasksForUser(string container, string destinationTag, string pageUrl, string taskUrl, string functionName, string userName, string limit, string startDate = null, string endDate = null, string jobId=null, string taskState=null, string pageNumber=null)
+{
+  <text>
+    var GetRequest = "?userName=" + @(userName) + "&limit=" + @(limit);
+    @if(startDate!=null) {
+      @:if(@(startDate)!=null) {
+        @:GetRequest += "&start=" + @startDate;
+      @:}
+    }
+    @if(endDate!=null) {
+      @:if(@(endDate)!=null) {
+        @:GetRequest += "&end=" + @endDate;
+      @:}
+    }
+    @if(jobId!=null) {
+      @:if(@(jobId)!=null) {
+        @:GetRequest += "&jobId=" + @jobId;
+      @:}
+    }
+    @if(taskState!=null) {
+      @:if(@(taskState)!=null) {
+        @:GetRequest += "&taskState=" + @taskState;
+      @:}
+    }
+    $.ajax({async: false, url: "@(new HtmlString(pageUrl))" + GetRequest, datatype: "json", success: function(result) {
+      if(result > 1) {
+        $("#@container").append('<label class="pageTitle">Page: </label>')
+        for(var i=0; i < result; i++) {
+          $("#" + "@container").append('<a id="Page' + (i + 1) + '" class="page">' + (i + 1) + '</a>')
+        }
+        if(@pageNumber != null) {
+          $("#Page" + @pageNumber).css('color','#F7921D');
+        }
+        else {
+          $("#Page1").css('color','#F7921D');
+        }
+      }
+    }});
+    @if(pageNumber!=null) {
+      @:if(@(pageNumber)!=null) {
+        @:GetRequest += "&currentPage=" + @pageNumber;
+      @:}
+    }
+    $.ajax({url: "@(new HtmlString(taskUrl))" + GetRequest, datatype: "json", success: function(result) {
+      if(result.Key.length==0) {
         $("#@container").append(
-          '<section class="chartContainer"><h1 class="title">' + @userName + ' has no tasks for the given time period!</h1></section>'
+          '<section class="chartContainer"><h1 class="title">' + @userName + ' has no tasks for the specified filters!</h1></section>'
         )
       }
@@ -126,24 +165,32 @@
 
       //Globally accesible, for use when resizing, eliminates extra DB request
-      window["numberTasks"] = result[0].length;
+      window["numberTasks"] = result.Key.length;
+
+      //Set display of all errors to none, errors matching the tasks will be reset below
+      $(".errorContainer, .errorTitle, .errorTask, .errorMessage").css('display','none');
 
       //For each result create a seperate collapsable section with a chart and info label
-      for(var i = 0; i < result[0].length; i++){
+      for(var i = 0; i < result.Key.length; i++){
         $("#" + "@container").append(
-          '<section class="chartContainer"><h1 class="title">Task ' + (i + 1) + 
-          '</h1><button class="collapse" onclick="collapseSection(this)">-</button><div id="@(destinationTag)' + i + 
+          '<section class="chartContainer"><h1 class="title" id="' + result.Key[i] + '">Task ' + result.Key[i] + 
+          '</h1><button class="collapse" onclick="collapseSection(this)">+</button><div id="@(destinationTag)' + i + 
           '"></div><label id="@(destinationTag)' + i + 'Info"></label></section>'
         )
-        waitTime = [result[0][i]];
-        transferTime = [result[1][i]];
-        runTime = [result[2][i]];
+        $(".errorTask").each(function() { 
+          if($(this).html()==result.Key[i]) {
+            $("#" + result.Key[i]).css("color","red");
+            $("#" + result.Key[i]).append(" - ERROR");
+            $(".errorContainer, .errorTitle, .underline").css('display','inline-block');
+            $(this).css('display','inline-block');
+            $(this).next().css('display','inline-block');
+          }
+        });
+        waitTime = [result.Value[0][i]];
+        transferTime = [result.Value[1][i]];
+        runTime = [result.Value[2][i]];
         window["@(destinationTag)Plot" + i] = $.jqplot("@destinationTag" + i, [waitTime,transferTime,runTime], {
-          //stackSeries: true,
           seriesDefaults:{
             renderer:$.jqplot.BarRenderer,
             shadowAngle: 135,
-            //rendererOptions: {
-            //  barDirection: 'horizontal'
-            //},
             pointLabels: {show: true, formatString: '%.3f'}
           },
@@ -176,7 +223,22 @@
         $("#" + "@(destinationTag)" + i).bind('jqplotDataClick', function (ev, seriesIndex, pointIndex, data) {
           $("#" + $(this).attr('id') + "Info").html(seriesDescriptions[seriesIndex] + ': ' + data[1]);
-        }); 
+        });
+
+        window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
+
+        $('#@destinationTag' + i).contextmenu(function() {
+          window["@(destinationTag)Plot" + i].resetZoom();
+          window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
+          return false;
+        });
+
+        collapsedByDefault(document.getElementById("@(destinationTag)" + i));
       }
     }});
+
+    $(".page").click(function () {
+      pageNumber = $(this).html();
+      @(functionName)();
+    });
   </text>
 }
@@ -187,57 +249,12 @@
   $(window).resize(function() {
     for(var i = 0; i < numberTasks; i++) {
-      window[ "@(destinationTag)Plot" + i].replot({ resetAxes: true });
+      $.each(window[ "@(destinationTag)Plot" + i].series, function(index, series) { 
+        series.barWidth = undefined; 
+      });
+      window["@(destinationTag)Plot" + i].replot({ resetAxes: true });
     }
   });
   </text>
 }
-
-@* OLD SMOOTHIE CHART FUNCTIONS *@
-@*@helper CreateSmoothieChart(string destinationTag, string stroke, string fill, string label)
-{
-  <text>
-    var @(destinationTag)Smoothie = new SmoothieChart({
-      grid: {
-        strokeStyle: '@stroke', fillStyle: '@fill',
-        lineWidth: 1, millisPerLine: 450, verticalSections: 4,
-      },
-      labels: {
-        fillStyle: '@label'
-      }
-    });
-
-    var @(destinationTag)TimeSeries = new Array()
-  </text>
-}
-
-@helper SetSmoothieCanvas(string destinationTag, string delay)
-{
-  <text>
-  @(destinationTag)Smoothie.streamTo(document.getElementById("@destinationTag"), @delay);
-  </text>
-}
-
-@helper AssignTimeSeries(string seriesName, string destinationTag, string stroke, string fill)
-{
-  <text>
-  var @(seriesName)TS = new TimeSeries();
-  @(destinationTag)Smoothie.addTimeSeries(@(seriesName)TS, { strokeStyle: '@stroke', fillStyle: '@fill', lineWidth: 3 });
-  @(destinationTag)TimeSeries.push(@(seriesName)TS);
-  </text>
-}
-
-@helper UpdateChartData(string destinationTag, string url)
-{
-  <text>
-  $.ajax({
-    url: '@(url)', datatype: "json", success: function (result) {
-      var i
-      for (i = 0; i < @(destinationTag)TimeSeries.length; i++) {
-        @(destinationTag)TimeSeries[i].append(new Date().getTime(), result[i]);
-      }
-    }
-  });
-  </text>
-}*@
 
 @helper SetStreamingProperties(int refresh, int chartLength, int upperY) {
@@ -376,20 +393,2 @@
   </text>
 }
-
-@helper MakeCollapsable()
-{
-  <text>
-  $(document).ready(function() {
-    $(".collapse").click(function () {
-      if ($(this).html() == "-") {
-        $(this).parent().children("canvas, div, fieldset, label").fadeOut();
-        $(this).html("+");
-      }
-      else {
-        $(this).parent().children("canvas, div, fieldset, label").fadeIn();
-        $(this).html("-");
-      }
-    });
-  });
-  </text>
-}
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml	(revision 11030)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/App_Code/ExceptionHelper.cshtml	(revision 11030)
@@ -0,0 +1,92 @@
+﻿@* HeuristicLab
+ * Copyright (C) 2002-2013 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/>.
+ *@
+
+@helper UserExceptions(string destinationTag, string url, string userName, string limit, string startDate = null, string endDate = null, string jobId = null, string taskState = null) {
+  if(userName!="" || userName!=null) {
+    <text>
+      var GetRequest = "?userName=" + @(userName) + "&limit=" + @(limit);
+      @if(startDate!=null) {
+        @:if(@(startDate)!=null) {
+          @:GetRequest += "&start=" + @startDate;
+        @:}
+      }
+      @if(endDate!=null) {
+        @:if(@(endDate)!=null) {
+          @:GetRequest += "&end=" + @endDate;
+        @:}
+      }
+      @if(jobId!=null) {
+        @:if(@(jobId)!=null) {
+          @:GetRequest += "&jobId=" + @jobId;
+        @:}
+      }
+      @if(taskState!=null) {
+        @:if(@(taskState)==null) {
+          @:GetRequest += "&taskState=" + @taskState;
+        @:}
+      }
+      $.ajax({async: false, url: "@(new HtmlString(url))" + GetRequest, datatype: "json", success: function(result) {
+          $("#" + "@destinationTag").html("");
+          if(result.Key.length > 0) {
+            var ErrorHTML = '<section class="errorContainer"><p class="errorTitle">Some tasks were found in error state!</p><label class="errorTask underline">Task</label><label class="errorMessage underline">Error</label>';
+            for (var i = 0; i < result.Key.length; i++) {
+              ErrorHTML += '<a class="errorTask" onclick="scrollTo(this)">' + result.Key[i] + '</a><label class="errorMessage">' + result.Value[i] + '</label>';
+            }
+            ErrorHTML += '</section>';
+            $("#" + "@destinationTag").append(ErrorHTML);
+          }
+        }
+      });
+    </text>
+  }
+}
+
+@helper ScrollToException() {
+  <text>
+    function scrollTo(caller) {
+      openOnError(document.getElementById($(caller).html()));
+      $('html, body').animate({
+          scrollTop: $("#" + $(caller).html()).parent().offset().top
+      }, 2000);
+    }
+    
+    $('#ScrollTop').click(function() {
+      $('html, body').animate({
+          scrollTop: 0
+      }, 2000);
+    });
+
+    $(window).on("scrollstop",function() {
+      var newTop = $(window).scrollTop();
+      if(newTop==0) {
+        $('#ScrollTop').animate({
+          top: newTop + 20
+        }, 800, function() {
+          $('#ScrollTop').css('display','none');
+        });
+      }
+      else {
+        $('#ScrollTop').css('display','block');
+        $('#ScrollTop').animate({
+          top: newTop + 20
+        }, 800);
+      }
+    });
+  </text>
+}
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Content/Site.css	(revision 11030)
@@ -39,4 +39,5 @@
 body > div {
   max-width: 1000px;
+  min-width: 680px;
   margin: 0 auto;
   padding: 0;
@@ -44,4 +45,8 @@
   border-radius: 8px;
   box-shadow: 1px 1px 5px 1px rgba(0, 0, 0, 0.35);
+}
+
+#ui-datepicker-div {
+  min-width: 0px;
 }
 
@@ -61,4 +66,64 @@
 }
 
+/* Error container styles */
+.errorContainer {
+  width: 95%;
+  margin: 1% 0% 2% 2%;
+  -webkit-border-radius: 10px;
+  border-radius: 10px;
+  border: 3px solid #FF270A;
+  display: none;
+}
+
+.errorTitle {
+  width: 100%;
+  padding-left: 2%;
+  margin-bottom: 0%;
+  color: #FF5640;
+  font-size: 1.4em;
+}
+
+.errorTask, .errorMessage {
+  width: 40%;
+  margin: 0% 0% 1% 0%;
+  font-size: 1.3em;
+  color: #FF5640;
+  display: inline-block;
+}
+
+.errorTask {
+  margin-left: 2%;
+}
+
+a.errorTask {
+  cursor: pointer;
+}
+
+.underline {
+  text-decoration: underline;
+  margin-top: 1.5%;
+}
+
+#ScrollTop {
+  width: 40px;
+  height: 40px;
+  position: absolute;
+  right: 20px;
+  top: 20px;
+  background: none;
+  color: #F7921D;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  border: 2px solid #F7921D;
+  text-align: center;
+  font-size: 14pt;
+  display: none;
+}
+
+#ScrollTop:hover {
+  background-color: rgba(247,146,29,0.42);
+}
+
 /* Progress bar styles */
 .barLabel {
@@ -72,7 +137,8 @@
 .outerBar {
   height: 25px;
-  width: 80%;
+  width: 75%;
   margin-left: 10%;
   border: 2px outset grey;
+  display: inline-block;
 }
 
@@ -109,5 +175,80 @@
 
 .outerBarText {
-  text-align: right;
+  width: 5%;
+  text-align: left;
+}
+
+/* Tabular Diplay Styles */
+.tabButton {
+  margin: 3% 0% 0% 0%;
+  background: none;
+  color: #707070;
+  font-size: 1.4em;
+  -webkit-border-radius: 0 3px 0 0;
+  border-radius: 0 5px 0 0;
+  border: 1px solid #8297F5;
+  text-align: center;
+  z-index: 3;
+}
+
+.tabButton:hover {
+  background-color: #D1D9FF;
+}
+
+.tabButton:focus {
+  -webkit-border-radius: 0 3px 0 0;
+  border-radius: 0 5px 0 0;
+  border-bottom: 1px solid #FAFAFA;
+}
+
+.tabSection {
+  width: 90%;
+  padding: 1%;
+  margin: 0% 0% 3% 3%;
+  -webkit-border-radius: 0 15px 15px 15px;
+  border-radius: 0 15px 15px 15px;
+  -webkit-box-shadow: 5px 5px 3px #A3A3A2;
+  box-shadow: 5px 5px 3px #A3A3A2;
+  border: 1px solid #8297F5;
+  display: none;
+}
+
+.tabDataContainer {
+  width: 99%;
+  display: inline-block;
+}
+
+.taskOverview {
+  width: 70%;
+}
+
+.tabButton:first-of-type {
+  border-bottom: 1px solid #E0E6FF;
+  background-color: #E0E6FF;
+  margin-left: 3%;
+}
+
+.tabSection:first-of-type {
+  display: block;
+}
+
+/* Multi-page Task Styles */
+.pageTitle, .page {
+  margin-right: 1%;
+  font-size: 1.8em;
+  color: #6B6B6B;
+}
+
+.pageTitle {
+  margin-left: 2%;
+}
+
+.page {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+.page:hover {
+  color: #F7921D;
 }
 
@@ -316,9 +457,9 @@
 }
 /* User Page Styles*/
-#tasksContainer div[id^="Task"] {
+#TasksContainer div[id^="Task"] {
   margin: 2% 0%;
 }
 
-#tasksContainer .jqplot-xaxis {
+#TasksContainer .jqplot-xaxis {
   display: none;
 }
@@ -330,55 +471,103 @@
 }
 
-#filters {
+#FilterChoices {
+  width: 15%;
+  padding: 0% 2% 1% 2%;
+  vertical-align: top;
+}
+
+#FilterChoices label {
+  width: 75%;
+}
+
+#FilterChoices label:last-of-type {
+  width: 50%;
+}
+
+#FilterChoices input[type="checkbox"] {
+  margin: .4em;
+}
+
+#FilterChoices input[type="checkbox"], #FilterChoices label, #Filters label, #Filters input {
+  font-size: 1.5em;
+  display: inline-block;
+}
+
+#FilterChoices legend, #Filters legend {
+  font-size: 1.5em;
+}
+
+#Filters, #FilterChoices{
   margin: 2% 2% 3% 2%;
-}
-
-#filters legend, #filters label, #filters input {
-  font-size: 1.6em;
+  display: inline-block;
+}
+
+#Filters {
+  width: 71%;
+  margin: 2% 0% 2% 0%;
+}
+
+#TaskOverviewFilterFirst {
+  margin-top: 0%;
+}
+
+.filterContainer {
+  width: 28%;
+  margin: 0% 0% 1% 1%;
+  vertical-align: top;
+  display: none;
+}
+
+.filterContainer:first-of-type {
+  margin-left: 2%;
+  display: inline-block;
+}
+
+.filterContainer input, .filterContainer select, .filterContainer label {
+  width: 90%;
+  margin-left: 5%;
+}
+
+#Filters button{
+  margin: 1% 0% 1% 2%;
+  display: block;
 }
 
 /* Admin Page Styles */
-[id$="OverviewButton"] {
-  margin: 3% 0% 0% 0%;
-  background: none;
-  color: #707070;
-  font-size: 1.4em;
-  -webkit-border-radius: 0 3px 0 0;
-  border-radius: 0 5px 0 0;
-  border: 1px solid #8297F5;
-  text-align: center;
-  z-index: 3;
-}
-
-#UserOverviewButton {
-  border-bottom: 1px solid #E0E6FF;
-  background-color: #E0E6FF;
-  margin-left: 3%;
-}
-
-[id$="OverviewButton"]:hover {
-  background-color: #D1D9FF;
-}
-
-[id$="OverviewButton"]:focus {
-  -webkit-border-radius: 0 3px 0 0;
-  border-radius: 0 5px 0 0;
-  border-bottom: 1px solid #FAFAFA;
-}
-
-[id$="OverviewTab"] {
-  width: 90%;
-  padding: 1%;
-  margin: 0% 0% 3% 3%;
-  -webkit-border-radius: 0 15px 15px 15px;
-  border-radius: 0 15px 15px 15px;
-  -webkit-box-shadow: 5px 5px 3px #A3A3A2;
-  box-shadow: 5px 5px 3px #A3A3A2;
-  border: 1px solid #8297F5;
-  display: none;
-}
-
-#UserOverviewTab {
-  display: block;
+.usersField #FilterChoices {
+  width: 92%;
+  margin: 1% 0% 1% 2%;
+}
+
+.usersField #FilterChoices legend {
+  font-size: 1em;
+  padding-top: 6%;
+}
+
+.usersField #FilterChoices label {
+  font-size: 1em;
+  width: 60%;
+  margin: 0% 0% 0% 10%;
+}
+
+.usersField #FilterChoices label:last-of-type {
+  width: 42%;
+}
+
+.usersField #FilterChoices label:last-of-type {
+  margin-bottom: 8%;
+}
+
+.usersField #FilterChoices input[type="checkbox"] {
+  margin: .3em;
+}
+
+#UserOverviewTab #Filters {
+  width: 67%;
+  margin: 1% 0% 0% 2%;
+}
+
+.tabSection .filterContainer {
+  width: 27%;
 }
 
@@ -402,8 +591,2 @@
   margin-top: 1em;
 }
-
-.adminDataContainer {
-  width: 70%;
-  padding-left: 1%;
-  display: inline-block;
-}
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/AdminDataController.cs	(revision 11030)
@@ -24,5 +24,5 @@
     }
 
-    public JsonResult UserTaskStats(string userName, DateTime start, DateTime end)
+    public JsonResult TaskStats(DateTime start, DateTime end, string userName=null)
     {
       using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
@@ -31,7 +31,7 @@
                         join jobs in db.DimJobs
                           on tasks.JobId equals jobs.JobId
-                        where jobs.UserName == userName &&
-                        tasks.StartTime >= start &&
-                        tasks.EndTime < end
+                        where tasks.StartTime >= start &&
+                        tasks.EndTime < end &&
+                        (string.IsNullOrEmpty(userName) || jobs.UserName == userName)
                         select new { tasks.TotalWaitingTime, tasks.TotalTransferTime, tasks.TotalRuntime, tasks.NumCalculationRuns, 
                           tasks.CoresRequired, tasks.MemoryRequired, tasks.TaskSize, tasks.ResultSize})
@@ -51,38 +51,4 @@
       }
     }
-
-    public JsonResult AllTaskStats(DateTime start, DateTime end)
-    {
-      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
-      {
-        var taskStats = (from tasks in db.FactTasks
-                         where tasks.StartTime >= start &&
-                         tasks.EndTime < end
-                         select new
-                         {
-                           tasks.TotalWaitingTime,
-                           tasks.TotalTransferTime,
-                           tasks.TotalRuntime,
-                           tasks.NumCalculationRuns,
-                           tasks.CoresRequired,
-                           tasks.MemoryRequired,
-                           tasks.TaskSize,
-                           tasks.ResultSize
-                         })
-                          .ToList();
-
-        List<double> FullStats = new List<double>();
-        FullStats.Add(taskStats.Sum(w => w.TotalWaitingTime));
-        FullStats.Add(taskStats.Sum(t => t.TotalTransferTime));
-        FullStats.Add(taskStats.Sum(r => r.TotalRuntime));
-        FullStats.Add(taskStats.Sum(n => n.NumCalculationRuns));
-        FullStats.Add(taskStats.Sum(c => c.CoresRequired));
-        FullStats.Add(taskStats.Sum(m => m.MemoryRequired));
-        FullStats.Add(taskStats.Sum(ts => ts.TaskSize));
-        FullStats.Add(taskStats.Sum(rs => Convert.ToDouble(rs.ResultSize)));
-
-        return Json(FullStats, JsonRequestBehavior.AllowGet);
-      }
-    }
   }
 }
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ChartDataController.cs	(revision 11030)
@@ -139,37 +139,117 @@
     }
 
-    public JsonResult GetUserTask(string userName, DateTime? start = null, DateTime? end = null)
-    {
-      start = start ?? DateTime.Now - DefaultDuration;
-      end = end ?? DateTime.Now;
-      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
-      {
-        var data =
+    public JsonResult NumberPages(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState = null)
+    {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
+      {
+        TaskState state = GetTaskState(taskState);
+        var numberRecords =
           (from tasks in db.FactTasks
-          join jobs in db.DimJobs
-            on tasks.JobId equals jobs.JobId
-          where jobs.UserName == userName &&
-          tasks.StartTime >= start &&
-          tasks.EndTime < end
-          select new
-          {
-            TotalWaiting = tasks.TotalWaitingTime,
-            TotalTransfer = tasks.TotalTransferTime,
-            TotalRuntime = tasks.TotalRuntime
-          }).ToList();
-
-        List<List<double>> overallResult = new List<List<double>>();
+           join jobs in db.DimJobs
+             on tasks.JobId equals jobs.JobId
+           where jobs.UserName == userName &&
+           (!start.HasValue || tasks.StartTime >= start) &&
+           (!end.HasValue || tasks.EndTime < end) &&
+           (string.IsNullOrEmpty(jobId) || tasks.JobId.ToString() == jobId) &&
+           (string.IsNullOrEmpty(taskState) || tasks.TaskState == state)
+           select new
+           {
+             TaskID = tasks.TaskId,
+             TotalWaiting = tasks.TotalWaitingTime,
+             TotalTransfer = tasks.TotalTransferTime,
+             TotalRuntime = tasks.TotalRuntime,
+             StartDate = tasks.StartTime
+           }).OrderByDescending(s => s.StartDate).ToList().Count;
+
+        var numberPages = numberRecords / Convert.ToDecimal(limit);
+        numberPages = Decimal.Truncate(numberPages);
+        numberPages += 1;
+
+        return Json(numberPages, JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    public JsonResult GetUserTask(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState=null, string currentPage=null)
+    {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString))
+      {
+        TaskState state = GetTaskState(taskState);
+        var data =
+          (from tasks in db.FactTasks
+           join jobs in db.DimJobs
+             on tasks.JobId equals jobs.JobId
+           where jobs.UserName == userName &&
+           (!start.HasValue || tasks.StartTime >= start) &&
+           (!end.HasValue || tasks.EndTime < end) &&
+           (string.IsNullOrEmpty(jobId) || tasks.JobId.ToString() == jobId) &&
+           (string.IsNullOrEmpty(taskState) || tasks.TaskState == state)
+           select new
+           {
+             TaskID = tasks.TaskId,
+             TotalWaiting = tasks.TotalWaitingTime,
+             TotalTransfer = tasks.TotalTransferTime,
+             TotalRuntime = tasks.TotalRuntime,
+             StartDate = tasks.StartTime
+           }).OrderByDescending(s => s.StartDate).ToList();
+
+        if (currentPage != null) {
+          data.RemoveRange(0, (Convert.ToInt32(currentPage) - 1) * Convert.ToInt32(limit));
+          if (data.Count > Convert.ToInt32(limit)) {
+            data.RemoveRange(Convert.ToInt32(limit), data.Count - Convert.ToInt32(limit));
+          }
+        }
+        else if (data.Count > Convert.ToInt32(limit))
+        {
+          data.RemoveRange(Convert.ToInt32(limit), data.Count - Convert.ToInt32(limit));
+        }
+
+        List<string> id = new List<string>();
         List<double> wait = new List<double>();
         List<double> transfer = new List<double>();
         List<double> run = new List<double>();
+        data.ForEach(i => id.Add(i.TaskID.ToString()));
         data.ForEach(w => wait.Add(w.TotalWaiting));
         data.ForEach(t => transfer.Add(t.TotalTransfer));
         data.ForEach(r => run.Add(r.TotalRuntime));
-        overallResult.Add(wait);
-        overallResult.Add(transfer);
-        overallResult.Add(run);
-
-        return Json(overallResult,JsonRequestBehavior.AllowGet);
-      }
+
+        List<List<double>> taskStats = new List<List<double>>();
+        taskStats.Add(wait);
+        taskStats.Add(transfer);
+        taskStats.Add(run);
+
+        return Json(new KeyValuePair<List<string>, List<List<double>>>(id, taskStats), JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    private static TaskState GetTaskState(string taskState) {
+      TaskState state = TaskState.Finished;
+      switch (taskState)
+      {
+        case "Aborted":
+          state = TaskState.Aborted;
+          break;
+        case "Calculating":
+          state = TaskState.Calculating;
+          break;
+        case "Failed":
+          state = TaskState.Failed;
+          break;
+        case "Finished":
+          state = TaskState.Finished;
+          break;
+        case "Offline":
+          state = TaskState.Offline;
+          break;
+        case "Paused":
+          state = TaskState.Paused;
+          break;
+        case "Transferring":
+          state = TaskState.Transferring;
+          break;
+        case "Waiting":
+          state = TaskState.Waiting;
+          break;
+      }
+      return state;
     }
 
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs	(revision 11030)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/ExceptionDataController.cs	(revision 11030)
@@ -0,0 +1,74 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.Mvc;
+using HeuristicLab.Services.Hive.DataAccess;
+
+namespace HeuristicLab.Services.Hive.Statistics.Controllers {
+  public class ExceptionDataController : Controller {
+
+    public JsonResult TaskExceptions(string userName, string limit, DateTime? start = null, DateTime? end = null, string jobId = null, string taskState = null) {
+      using (var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString)) {
+        TaskState state = GetTaskState(taskState);
+        var data =
+        (from errors in db.StateLogs
+          join tasks in db.FactTasks
+            on errors.TaskId equals tasks.TaskId
+          join jobs in db.DimJobs
+            on tasks.JobId equals jobs.JobId
+          where jobs.UserName == userName &&
+          errors.Exception != null && 
+          !errors.Exception.Equals(string.Empty) &&
+          (!start.HasValue || tasks.StartTime >= start) &&
+          (!end.HasValue || tasks.EndTime < end) &&
+          (string.IsNullOrEmpty(jobId) || tasks.JobId.ToString() == jobId) &&
+          (string.IsNullOrEmpty(taskState) || tasks.TaskState == state)
+          select new
+          {
+            TaskID = errors.TaskId,
+            ErrorMessage = errors.Exception,
+            StartDate = tasks.StartTime
+          }).OrderByDescending(s => s.StartDate).Take(Convert.ToInt32(limit)).ToList();
+
+        List<string> Task = new List<string>();
+        List<string> Error = new List<string>();
+        data.ForEach(t => Task.Add(t.TaskID.ToString()));
+        data.ForEach(e => Error.Add(e.ErrorMessage));
+
+        return Json(new KeyValuePair<List<string>, List<string>>(Task, Error), JsonRequestBehavior.AllowGet);
+      }
+    }
+
+    private static TaskState GetTaskState(string taskState) {
+      TaskState state = TaskState.Finished;
+      switch (taskState) {
+        case "Aborted":
+          state = TaskState.Aborted;
+          break;
+        case "Calculating":
+          state = TaskState.Calculating;
+          break;
+        case "Failed":
+          state = TaskState.Failed;
+          break;
+        case "Finished":
+          state = TaskState.Finished;
+          break;
+        case "Offline":
+          state = TaskState.Offline;
+          break;
+        case "Paused":
+          state = TaskState.Paused;
+          break;
+        case "Transferring":
+          state = TaskState.Transferring;
+          break;
+        case "Waiting":
+          state = TaskState.Waiting;
+          break;
+      }
+      return state;
+    }
+  }
+}
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Controllers/LoginRequiredController.cs	(revision 11030)
@@ -5,4 +5,5 @@
 using System.Web.Mvc;
 using HeuristicLab.Services.Hive.Statistics.Models;
+using HeuristicLab.Services.Hive.DataAccess;
 
 namespace HeuristicLab.Services.Hive.Statistics.Controllers {
@@ -14,4 +15,12 @@
         UserName = User.Identity.Name
       };
+
+      //Initialize drop down list values
+      var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
+      ViewBag.JobNames = new SelectList(db.DimJobs, "JobId", "JobName");
+      var TaskStateList = (from task in db.FactTasks
+                           select task.TaskState).Distinct();
+      ViewBag.TaskStates = new SelectList(TaskStateList);
+
       return View(result);
     }
@@ -25,4 +34,11 @@
       if (User.IsInRole("Hive Administrator")) {
         result.IsAdmin = true;
+
+        //Initialize drop down list values
+        var db = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
+        ViewBag.JobNames = new SelectList(db.DimJobs, "JobId", "JobName");
+        var TaskStateList = (from task in db.FactTasks
+                             select task.TaskState).Distinct();
+        ViewBag.TaskStates = new SelectList(TaskStateList);
       }
 
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/HeuristicLab.Services.Hive.Statistics-3.3.csproj	(revision 11030)
@@ -110,4 +110,5 @@
     <Compile Include="Controllers\AdminDataController.cs" />
     <Compile Include="Controllers\ChartDataController.cs" />
+    <Compile Include="Controllers\ExceptionDataController.cs" />
     <Compile Include="Controllers\HomeController.cs" />
     <Compile Include="Controllers\LoginRequiredController.cs" />
@@ -123,6 +124,8 @@
     <Content Include="App_Code\ChartHelper.cshtml" />
     <Content Include="App_Code\AdminHelper.cshtml" />
+    <Content Include="App_Code\ExceptionHelper.cshtml" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <Content Include="Scripts\CollapsingSection.js" />
+    <Content Include="Scripts\jquery.scrollstop.js" />
     <Content Include="Scripts\SmoothieChartResize.js" />
     <Content Include="Views\LoginRequired\UserTask.cshtml" />
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/CollapsingSection.js	(revision 11030)
@@ -26,2 +26,15 @@
   }
 }
+
+/* Passed the interior div this fucntion is used to create an automatically collapsed 
+  section */
+function collapsedByDefault(caller) {
+  $(caller).parent().children("canvas, div, fieldset, label").css("display","none");
+}
+
+/* Used when scrolling to a task by error, opens the container before task is scrolled to */
+function openOnError(caller) {
+  var jqCaller = $(caller);
+  jqCaller.parent().children("canvas, div, fieldset, label").fadeIn();
+  jqCaller.parent().children("button").html("-");
+}
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/jquery.scrollstop.js
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/jquery.scrollstop.js	(revision 11030)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Scripts/jquery.scrollstop.js	(revision 11030)
@@ -0,0 +1,78 @@
+/*!
+ * jQuery Scrollstop Plugin v1.1.0
+ * https://github.com/ssorallen/jquery-scrollstop
+ */
+(function($) {
+  // $.event.dispatch was undocumented and was deprecated in jQuery 1.7[1]. It
+  // was replaced by $.event.handle in jQuery 1.9.
+  //
+  // Use the first of the available functions to support jQuery <1.8.
+  //
+  // [1] https://github.com/jquery/jquery-migrate/blob/master/src/event.js#L25
+  var dispatch = $.event.dispatch || $.event.handle;
+
+  var special = $.event.special,
+      uid1 = 'D' + (+new Date()),
+      uid2 = 'D' + (+new Date() + 1);
+
+  special.scrollstart = {
+    setup: function(data) {
+      var _data = $.extend({
+        latency: special.scrollstop.latency
+      }, data);
+
+      var timer,
+          handler = function(evt) {
+            var _self = this,
+                _args = arguments;
+
+            if (timer) {
+              clearTimeout(timer);
+            } else {
+              evt.type = 'scrollstart';
+              dispatch.apply(_self, _args);
+            }
+
+            timer = setTimeout(function() {
+              timer = null;
+            }, _data.latency);
+          };
+
+      $(this).bind('scroll', handler).data(uid1, handler);
+    },
+    teardown: function() {
+      $(this).unbind('scroll', $(this).data(uid1));
+    }
+  };
+
+  special.scrollstop = {
+    latency: 250,
+    setup: function(data) {
+      var _data = $.extend({
+        latency: special.scrollstop.latency
+      }, data);
+
+      var timer,
+          handler = function(evt) {
+            var _self = this,
+                _args = arguments;
+
+            if (timer) {
+              clearTimeout(timer);
+            }
+
+            timer = setTimeout(function() {
+              timer = null;
+              evt.type = 'scrollstop';
+              dispatch.apply(_self, _args);
+            }, _data.latency);
+          };
+
+      $(this).bind('scroll', handler).data(uid2, handler);
+    },
+    teardown: function() {
+      $(this).unbind('scroll', $(this).data(uid2));
+    }
+  };
+
+})(jQuery);
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/Admin.cshtml	(revision 11030)
@@ -25,10 +25,42 @@
       <select id="UserList" class="usersList">
       </select>
-      <label>Start</label>
-      @Html.TextBox("UserStart", (DateTime.Now - new TimeSpan(8, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
-      <label>End</label>
-      @Html.TextBox("UserEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+      <fieldset id="FilterChoices">
+        <legend>Filter by</legend>
+        <label>Date</label>
+        <input type="checkbox" name="filterChoice" value="Date" checked="checked">
+        <label>Job Name</label>
+        <input type="checkbox" name="filterChoice" value="JobName">
+        <label>Task State</label>
+        <input type="checkbox" name="filterChoice" value="TaskState">
+        <label>Limit</label>
+        <select id="Limit">
+          <option>20</option>
+          <option>50</option>
+          <option selected="selected">100</option>
+          <option>200</option>
+        </select>
+      </fieldset>
     </fieldset>
-    <section id="TasksContainer" class="adminDataContainer"></section>
+    <fieldset id="Filters">
+      <legend>Filters</legend>
+      <fieldset id="FilterDate" class="filterContainer">
+        <legend>Date</legend>
+        <label>Start</label>
+        @Html.TextBox("UserStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+        <label>End</label>
+        @Html.TextBox("UserEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+      </fieldset>
+      <fieldset id="FilterJobName" class="filterContainer">
+        <legend>Job Name</legend>
+        @Html.DropDownList("JobNames")
+      </fieldset>
+      <fieldset id="FilterTaskState" class="filterContainer">
+        <legend>Task State</legend>
+        @Html.DropDownList("TaskStates")
+      </fieldset>
+      <button id="Apply">Apply</button>
+    </fieldset>
+    <button id="ScrollTop">^</button>
+    <section id="TasksContainer" class="tabDataContainer"></section>
   </section>
   //Task overview
@@ -39,9 +71,9 @@
       </select>
       <label>Start</label>
-      @Html.TextBox("TaskStart", (DateTime.Now - new TimeSpan(8, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+      @Html.TextBox("TaskStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
       <label>End</label>
       @Html.TextBox("TaskEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
     </fieldset>
-    <section id="TaskStatsContainer" class="adminDataContainer"></section>
+    <section id="TaskStatsContainer" class="tabDataContainer taskOverview"></section>
   </section>
 }
@@ -55,4 +87,5 @@
   @Scripts.Render("~/bundles/jqueryui")
   @Scripts.Render("~/Scripts/CollapsingSection.js")
+  @Scripts.Render("~/Scripts/jquery.scrollstop.js")
   @Scripts.Render("~/Scripts/jqPlot/jquery.jqplot")
   @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.barRenderer.min.js")
@@ -67,4 +100,6 @@
     var endDate;
     var selectedUser;
+    var limit;
+    var pageNumber;
 
     $(document).ready(function () {
@@ -73,4 +108,18 @@
         onSelect: function () { RefreshUser(); }
       });
+      $("#TaskStart, #TaskEnd").datepicker({
+        dateFormat: "yy-mm-dd",
+        onSelect: function () { RefreshTask(); }
+      });
+    });
+
+    $("#Apply").button({
+      icons: {
+        primary: "ui-icon-refresh"
+      }
+    });
+
+    $("#Apply").click(function () {
+      RefreshUser();
     });
 
@@ -79,18 +128,37 @@
     });
 
-    function RefreshUser () {
+    $("[name='filterChoice']").click(function () {
+      var filterName = $(this).val();
+      if ($(this).is(':checked')) {
+        $("#Filter" + filterName).css("display", "inline-block");
+      }
+      else {
+        $("#Filter" + filterName).css("display", "none");
+      }
+    });
+
+    function RefreshUser() {
       selectedUser = $("#UserList").val();
-      startDate = $('#UserStart').val();
-      endDate = $('#UserEnd').val();
-      @ChartHelper.TasksForUser("TasksContainer", "Task", Url.Action("GetUserTask", "ChartData"),"selectedUser","startDate","endDate")
-      @ChartHelper.ResizeTasks("Task")
+      limit = $("#Limit").val();
+      startDate = null;
+      endDate = null;
+      jobId = null;
+      taskState = null;
+      if ($("[value='Date']").is(":checked")) {
+        startDate = $('#UserStart').val();
+        endDate = $('#UserEnd').val();
+      }
+      if ($("[value='JobName']").is(':checked')) {
+        jobId = $('#JobNames').val();
+      }
+      if ($("[value='TaskState']").is(':checked')) {
+        taskState = $('#TaskState').val();
+      }
+      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"selectedUser","limit","startDate","endDate","jobId","taskState")
+      @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("NumberPages", "ChartData"),Url.Action("GetUserTask", "ChartData"),"RefreshUser","selectedUser","limit","startDate","endDate","jobId","taskState","pageNumber")
     }
 
-    $(document).ready(function () {
-      $("#TaskStart, #TaskEnd").datepicker({
-        dateFormat: "yy-mm-dd",
-        onSelect: function () { RefreshTask(); }
-      });
-    });
+    @ChartHelper.ResizeTasks("Task")
+    @ExceptionHelper.ScrollToException()
 
     $("#TaskUserList").change(function () {
@@ -102,5 +170,5 @@
       startDate = $('#TaskStart').val();
       endDate = $('#TaskEnd').val();
-      @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("AllTaskStats", "AdminData"),Url.Action("UserTaskStats", "AdminData"),"selectedUser","startDate","endDate")
+      @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("TaskStats", "AdminData"),"selectedUser","startDate","endDate")
     }
 
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml	(revision 11020)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive.Statistics/3.3/Views/LoginRequired/UserTask.cshtml	(revision 11030)
@@ -6,15 +6,54 @@
 
 <h1>Task Information for User: @Model.UserName</h1>
-<section>
-  <fieldset id="filters">
+<button id="TaskInformationButton" class="tabButton">Task Information</button>
+<button id="TaskOverviewButton" class="tabButton">Task Overview</button>
+<section id="TaskInformationTab" class="tabSection">
+  <fieldset id="FilterChoices">
+    <legend>Filter by</legend>
+    <label>Date</label>
+    <input type="checkbox" name="filterChoice" value="Date" checked="checked">
+    <label>Job Name</label>
+    <input type="checkbox" name="filterChoice" value="JobName">
+    <label>Task State</label>
+    <input type="checkbox" name="filterChoice" value="TaskState">
+    <label>Limit</label>
+    <select id="Limit">
+      <option>10</option>
+      <option>50</option>
+      <option selected="selected">100</option>
+      <option>200</option>
+    </select>
+  </fieldset>
+  <fieldset id="Filters">
     <legend>Filters</legend>
-    <label>Start</label>
-    @Html.TextBox("Start", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
-    <label>End</label>
-    @Html.TextBox("End", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+    <fieldset id="FilterDate" class="filterContainer">
+      <legend>Date</legend>
+      <label>Start</label>
+      @Html.TextBox("InfoStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+      <label>End</label>
+      @Html.TextBox("InfoEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+    </fieldset>
+    <fieldset id="FilterJobName" class="filterContainer">
+      <legend>Job Name</legend>
+      @Html.DropDownList("JobNames")
+    </fieldset>
+    <fieldset id="FilterTaskState" class="filterContainer">
+      <legend>Task State</legend>
+      @Html.DropDownList("TaskStates")
+    </fieldset>
     <button id="Apply">Apply</button>
   </fieldset>
+  <button id="ScrollTop">^</button>
+  <section id="TasksContainer" class="tabDataContainer"></section>
 </section>
-<section id="TasksContainer">
+<section id="TaskOverviewTab" class="tabSection">
+  <fieldset id="TaskOverviewFilter" class="usersField">
+    <legend>Filters</legend>
+    <label id="TaskOverviewFilterFirst">Start</label>
+    @Html.TextBox("OverviewStart", (DateTime.Now - new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+    <label>End</label>
+    @Html.TextBox("OverviewEnd", (DateTime.Now + new TimeSpan(1, 0, 0, 0)).ToString("yyyy-MM-dd"), new { @class = "date" })
+  </fieldset>
+  <section id="TaskStatsContainer" class="tabDataContainer taskOverview"></section>
 </section>
 
@@ -27,4 +66,5 @@
   @Scripts.Render("~/bundles/jqueryui")
   @Scripts.Render("~/Scripts/CollapsingSection.js")
+  @Scripts.Render("~/Scripts/jquery.scrollstop.js")
   @Scripts.Render("~/Scripts/jqPlot/jquery.jqplot")
   @Scripts.Render("~/Scripts/jqPlot/plugins/jqplot.barRenderer.min.js")
@@ -40,29 +80,75 @@
       }
     });
+    $("#Apply").click(function () {
+      TaskInformation();
+    });
+
     $(document).ready(function () {
-      $(".date").datepicker({
+      $("#InfoStart, #InfoEnd").datepicker({
         dateFormat: "yy-mm-dd",
-        onSelect: function () { filterTasks(); }
+        onSelect: function () { TaskInformation(); }
+      });
+      $("#OverviewStart, #OverviewEnd").datepicker({
+        dateFormat: "yy-mm-dd",
+        onSelect: function () { TaskOverview(); }
       });
     });
-    $("#Apply").click(function () {
-      filterTasks();
+
+    $("[name='filterChoice']").click(function () {
+      var filterName = $(this).val();
+      if ($(this).is(':checked')) {
+        $("#Filter" + filterName).css("display", "inline-block");
+      }
+      else {
+        $("#Filter" + filterName).css("display", "none");
+      }
     });
 
-    function filterTasks() {
-      startDate = $('#Start').val();
-      endDate = $('#End').val();
+    var userName = "@Model.UserName";
+    var limit = $('#Limit').val();
+    var startDate = $('#InfoStart').val();
+    var endDate = $('#InfoEnd').val();
+    var jobId;
+    var taskState;
+    var pageNumber;
 
-      @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("GetUserTask", "ChartData"),"userName","startDate","endDate")
-      @ChartHelper.ResizeTasks("Task")
+    function TaskInformation() {
+      limit = $('#Limit').val();
+      startDate = null;
+      endDate = null;
+      jobId = null;
+      taskState = null;
+      if ($("[value='Date']").is(":checked")) {
+        startDate = $('#InfoStart').val();
+        endDate = $('#InfoEnd').val();
+      }
+      if ($("[value='JobName']").is(':checked')) {
+        jobId = $('#JobNames').val();
+      }
+      if ($("[value='TaskState']").is(':checked')) {
+        taskState = $('#TaskState').val();
+      }
+      @ExceptionHelper.UserExceptions("TasksContainer",Url.Action("TaskExceptions", "ExceptionData"),"userName","limit","startDate","endDate","jobId","taskState")
+      @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("NumberPages", "ChartData"),Url.Action("GetUserTask", "ChartData"),"TaskInformation","userName","limit","startDate","endDate","jobId","taskState","pageNumber")
+      pageNumber = null;
     }
 
-    var userName = "@Model.UserName";
-    var startDate = $('#Start').val();
-    var endDate = $('#End').val();
+    function TaskOverview() {
+      startDate = $('#OverviewStart').val();
+      endDate = $('#OverviewEnd').val();
+      @AdminHelper.UserTaskStats("TaskStatsContainer",Url.Action("TaskStats", "AdminData"),"userName","startDate","endDate")
+    }
 
-    @ChartHelper.TasksForUser("TasksContainer","Task",Url.Action("GetUserTask", "ChartData"),"userName","startDate","endDate")
+    $(".tabButton").click(function () {
+      var sender = $(this).attr('id');
+      $(".tabButton").css({ 'border-bottom': '1px solid #8297F5', 'background': 'none' });
+      $(this).css({ 'border-bottom': '1px solid #E0E6FF', 'background-color': '#E0E6FF' });
+      $(".tabSection").css('display', 'none');
+      $("#" + sender.slice(0, -6) + "Tab").css('display', 'block');
+    })
+
+    TaskInformation();
     @ChartHelper.ResizeTasks("Task")
+    @ExceptionHelper.ScrollToException()
   </script>
-
 }
