Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs	(revision 12773)
@@ -125,56 +125,61 @@
     /// </summary>
     private IEnumerable<MessageContainer> UpdateTasks(Heartbeat heartbeat, bool IsAllowedToCalculate) {
-      List<MessageContainer> actions = new List<MessageContainer>();
+      using (new PerformanceLogger("Old_UpdateTasks")) {
+        List<MessageContainer> actions = new List<MessageContainer>();
 
-      if (heartbeat.JobProgress == null)
-        return actions;
+        if (heartbeat.JobProgress == null)
+          return actions;
 
-      if (!IsAllowedToCalculate && heartbeat.JobProgress.Count != 0) {
-        actions.Add(new MessageContainer(MessageContainer.MessageType.PauseAll));
-      } else {
-        // process the jobProgresses
-        foreach (var jobProgress in heartbeat.JobProgress) {
-          Tuple<Task, Guid?> taskWithLastStateLogSlaveId = null;
-          trans.UseTransaction(() => {
-            taskWithLastStateLogSlaveId = dao.GetTaskByIdAndLastStateLogSlaveId(jobProgress.Key);
-          });
-          var curTask = taskWithLastStateLogSlaveId != null ? taskWithLastStateLogSlaveId.Item1 : null;
-          if (curTask == null) {
-            // task does not exist in db
-            actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, jobProgress.Key));
-            LogFactory.GetLogger(this.GetType().Namespace).Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key);
-          } else {
-            var slaveId = taskWithLastStateLogSlaveId.Item2;
-            if (slaveId == Guid.Empty || slaveId != heartbeat.SlaveId) {
-              // assigned slave does not match heartbeat
-              actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
-              LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask);
-            } else if (!dao.TaskIsAllowedToBeCalculatedBySlave(curTask.TaskId, heartbeat.SlaveId)) {
-              // assigned resources ids of task do not match with slaveId (and parent resourceGroupIds); this might happen when slave is moved to different group
-              actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
+        if (!IsAllowedToCalculate && heartbeat.JobProgress.Count != 0) {
+          actions.Add(new MessageContainer(MessageContainer.MessageType.PauseAll));
+        } else {
+          // process the jobProgresses
+          foreach (var jobProgress in heartbeat.JobProgress) {
+            Tuple<Task, Guid?> taskWithLastStateLogSlaveId = null;
+            trans.UseTransaction(() => {
+              taskWithLastStateLogSlaveId =
+                dao.GetTaskByIdAndLastStateLogSlaveId(jobProgress.Key);
+            });
+            var curTask = taskWithLastStateLogSlaveId != null ? taskWithLastStateLogSlaveId.Item1 : null;
+            if (curTask == null) {
+              // task does not exist in db
+              actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, jobProgress.Key));
+              LogFactory.GetLogger(this.GetType().Namespace)
+                .Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key);
             } else {
-              // save task execution time
-              curTask.ExecutionTimeMs = jobProgress.Value.TotalMilliseconds;
-              curTask.LastHeartbeat = DateTime.Now;
+              var slaveId = taskWithLastStateLogSlaveId.Item2;
+              if (slaveId == Guid.Empty || slaveId != heartbeat.SlaveId) {
+                // assigned slave does not match heartbeat
+                actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
+                LogFactory.GetLogger(this.GetType().Namespace)
+                  .Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask);
+              } else if (!dao.TaskIsAllowedToBeCalculatedBySlave(curTask.TaskId, heartbeat.SlaveId)) {
+                // assigned resources ids of task do not match with slaveId (and parent resourceGroupIds); this might happen when slave is moved to different group
+                actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
+              } else {
+                // save task execution time
+                curTask.ExecutionTimeMs = jobProgress.Value.TotalMilliseconds;
+                curTask.LastHeartbeat = DateTime.Now;
 
-              switch (curTask.Command) {
-                case Command.Stop:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.TaskId));
-                  break;
-                case Command.Pause:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
-                  break;
-                case Command.Abort:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
-                  break;
+                switch (curTask.Command) {
+                  case Command.Stop:
+                    actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.TaskId));
+                    break;
+                  case Command.Pause:
+                    actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
+                    break;
+                  case Command.Abort:
+                    actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
+                    break;
+                }
+                trans.UseTransaction(() => {
+                  dao.UpdateTask(curTask);
+                });
               }
-              trans.UseTransaction(() => {
-                dao.UpdateTask(curTask);
-              });
             }
           }
         }
+        return actions;
       }
-      return actions;
     }
   }
Index: branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/NewHeartbeatManager.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/NewHeartbeatManager.cs	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.Hive/3.3/Manager/NewHeartbeatManager.cs	(revision 12773)
@@ -50,5 +50,4 @@
         var slaveDao = pm.SlaveDao;
         var taskDao = pm.TaskDao;
-
         var slave = pm.UseTransaction(() => slaveDao.GetById(heartbeat.SlaveId));
         if (slave == null) {
@@ -85,10 +84,10 @@
               if (mutexAquired) {
                 var waitingTasks = pm.UseTransaction(() => taskDao.GetWaitingTasks(slave)
-                  .Select(x => new TaskInfoForScheduler {
-                    TaskId = x.TaskId,
-                    JobId = x.JobId,
-                    Priority = x.Priority
-                  })
-                  .ToList()
+                    .Select(x => new TaskInfoForScheduler {
+                      TaskId = x.TaskId,
+                      JobId = x.JobId,
+                      Priority = x.Priority
+                    })
+                    .ToList()
                 );
                 var availableTasks = TaskScheduler.Schedule(waitingTasks);
@@ -146,5 +145,5 @@
       var assignedResourceDao = pm.AssignedResourceDao;
       var actions = new List<MessageContainer>();
-      if (heartbeat.JobProgress == null)
+      if (heartbeat.JobProgress == null || !heartbeat.JobProgress.Any())
         return actions;
 
@@ -154,5 +153,5 @@
         // select all tasks and statelogs with one query
         var taskIds = heartbeat.JobProgress.Select(x => x.Key).ToList();
-        var taskInfos =
+        var taskInfos = pm.UseTransaction(() =>
           (from task in taskDao.GetAll()
            where taskIds.Contains(task.TaskId)
@@ -162,6 +161,6 @@
              Command = task.Command,
              SlaveId = lastStateLog != null ? lastStateLog.SlaveId : default(Guid)
-           })
-           .ToList();
+           }).ToList()
+        );
 
         // process the jobProgresses
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/HeuristicLab.Services.WebApp.Statistics-3.3.csproj	(revision 12773)
@@ -9,5 +9,5 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>HeuristicLab.Services.WebApp.Statistics</RootNamespace>
-    <AssemblyName>HeuristicLab.Services.WebApp.Statistics</AssemblyName>
+    <AssemblyName>HeuristicLab.Services.WebApp.Statistics-3.3</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/exceptions/exceptions.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/exceptions/exceptions.cshtml	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Statistics/3.3/WebApp/exceptions/exceptions.cshtml	(revision 12773)
@@ -45,5 +45,5 @@
                             <td>{{($index + 1)+((curExceptionsPage-1)*(exceptionsPageSize))}}</td>
                             <td><a ng-href="#/statistics/jobs/{{exception.JobId}}">{{exception.JobName}}</a></td>
-                            <td><a ng-href="#/statistics/tasks/{{exception.TaskId}}">{{exception.TaskId}}</a></td>
+                            <td>{{exception.TaskId}}</td>
                             <td><a ng-href="#/statistics/users/{{exception.UserId}}">{{exception.UserName}}</a></td>
                             <td><a ng-href="#/statistics/clients/{{exception.ClientId}}">{{exception.ClientName}}</a></td>
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/3.3/HeuristicLab.Services.WebApp.Status-3.3.csproj	(revision 12773)
@@ -9,5 +9,5 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>HeuristicLab.Services.WebApp.Status</RootNamespace>
-    <AssemblyName>HeuristicLab.Services.WebApp.Status</AssemblyName>
+    <AssemblyName>HeuristicLab.Services.WebApp.Status-3.3</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs	(revision 12773)
@@ -20,4 +20,5 @@
 #endregion
 
+using System.Web;
 using System.Web.Mvc;
 
@@ -30,4 +31,5 @@
         return RedirectPermanent(Request.Url + "/");
       }
+      Response.Cache.SetCacheability(HttpCacheability.NoCache);
       return View("~/WebApp/shared/layout/layout.cshtml");
     }
@@ -38,10 +40,12 @@
 
     public ActionResult LoadSharedView(string directory, string view, string dateTime) {
-      // dateTime is optional to avoid browser caching
+      Response.Cache.SetCacheability(HttpCacheability.NoCache);
+      // dateTime is optional to definitly avoid browser caching
       return View(string.Format("~/WebApp/shared/{0}/{1}", directory, view));
     }
 
     public ActionResult LoadPluginView(string plugin, string view, string dateTime) {
-      // dateTime is optional to avoid browser caching
+      Response.Cache.SetCacheability(HttpCacheability.NoCache);
+      // dateTime is optional to definitly avoid browser caching
       return View(string.Format("~/WebApp/plugins/{0}/{1}", plugin, view));
     }
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/HeuristicLab.Services.WebApp-3.3.csproj	(revision 12773)
@@ -13,5 +13,5 @@
     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>HeuristicLab.Services.WebApp</RootNamespace>
-    <AssemblyName>HeuristicLab.Services.WebApp</AssemblyName>
+    <AssemblyName>HeuristicLab.Services.WebApp-3.3</AssemblyName>
     <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <MvcBuildViews>false</MvcBuildViews>
Index: branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml
===================================================================
--- branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12769)
+++ branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12773)
@@ -24,9 +24,10 @@
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta http-equiv="pragma" content="no-cache" />
     <title>HeuristicLab Hive</title>
     <link href="~/WebApp/HeuristicLab.ico" rel="shortcut icon" type="image/x-icon" />
     @Styles.Render("~/Bundles/Vendors/css")
     @Styles.Render("~/Bundles/WebApp/css")
-    <link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700">
+    <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700">
     <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
     <!--[if lt IE 9]>
@@ -63,6 +64,5 @@
                 <div class="navbar-content">
                     <ul class="nav navbar-nav navbar-right">
-                        @if (Request.IsAuthenticated)
-                        {
+                        @if (Request.IsAuthenticated) {
                             <li>
                                 <span class="navbar-text">Hello @User.Identity.Name!</span>
@@ -71,7 +71,5 @@
                                 <a ng-href="#" data-ng-click="logout()">Logout</a>
                             </li>
-                        }
-                        else
-                        {
+                        } else {
                             <li>
                                 <a ng-href="#/login" data-ng-click="hideMenu()">Login</a>
