Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataController.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -21,6 +42,6 @@
         SELECT 
           DISTINCT UserId,
-          ISNULL((SELECT Count FROM UserTasks WHERE TaskState = 'Calculating' AND UserId = ut.UserId), 0) AS CalculatingTasks,
-          ISNULL((SELECT Count FROM UserTasks WHERE TaskState = 'Waiting' AND UserId = ut.UserId), 0) AS WaitingTasks
+          (SELECT Count FROM UserTasks WHERE TaskState = 'Calculating' AND UserId = ut.UserId) AS CalculatingTasks,
+          (SELECT Count FROM UserTasks WHERE TaskState = 'Waiting' AND UserId = ut.UserId) AS WaitingTasks
         FROM UserTasks ut;";
 
@@ -41,5 +62,5 @@
         CalculatingTasks = uts.CalculatingTasks,
         WaitingTasks = uts.WaitingTasks
-      });
+      }).OrderBy(x => x.User.Name);
     }
     // end temporary quickfix
@@ -50,9 +71,16 @@
                             where slave.SlaveState == SlaveState.Calculating || slave.SlaveState == SlaveState.Idle
                             select slave).ToList();
+        var activeSlaves = onlineSlaves.Where(s => s.IsAllowedToCalculate).ToList();
+        var calculatingSlaves = activeSlaves.Where(s => s.SlaveState == SlaveState.Calculating).ToList();
+
+        int calculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.Memory) / 1024 : 0;
+        int freeCalculatingMemory = calculatingSlaves.Any() ? (int)calculatingSlaves.Sum(s => s.FreeMemory) / 1024 : 0;
+
         return new DTO.Status {
           CoreStatus = new DTO.CoreStatus {
             TotalCores = onlineSlaves.Sum(s => s.Cores ?? 0),
-            AvailableCores = onlineSlaves.Where(s => s.IsAllowedToCalculate).Sum(s => s.Cores ?? 0),
-            FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0)
+            FreeCores = onlineSlaves.Sum(s => s.FreeCores ?? 0), // temporary for old chart data
+            ActiveCores = activeSlaves.Sum(s => s.Cores ?? 0),
+            CalculatingCores = calculatingSlaves.Sum(s => s.Cores ?? 0)
           },
           CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
@@ -60,20 +88,31 @@
                                   ? Math.Round(onlineSlaves.Average(s => s.CpuUtilization), 2)
                                   : 0.0,
-            UsedCpuUtilization = onlineSlaves.Any(x => x.IsAllowedToCalculate)
-                                 ? Math.Round(onlineSlaves.Where(x => x.IsAllowedToCalculate).Average(s => s.CpuUtilization), 2)
-                                 : 0.0
+            ActiveCpuUtilization = activeSlaves.Any()
+                                   ? Math.Round(activeSlaves.Average(s => s.CpuUtilization), 2)
+                                   : 0.0,
+            CalculatingCpuUtilization = calculatingSlaves.Any()
+                                        ? Math.Round(calculatingSlaves.Average(s => s.CpuUtilization), 2)
+                                        : 0.0
           },
           MemoryStatus = new DTO.MemoryStatus {
             TotalMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.Memory) / 1024 : 0,
-            FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) / 1024 : 0
+            FreeMemory = onlineSlaves.Any() ? (int)onlineSlaves.Sum(s => s.FreeMemory) / 1024 : 0,
+            ActiveMemory = activeSlaves.Any() ? (int)activeSlaves.Sum(s => s.Memory) / 1024 : 0,
+            UsedMemory = calculatingMemory - freeCalculatingMemory
           },
           TasksStatus = GetTaskStatus(db),
-          SlavesCpuStatus = onlineSlaves.Select(x => new DTO.SlaveCpuStatus {
-            CpuUtilization = Math.Round(x.CpuUtilization, 2),
+          SlavesStatus = onlineSlaves.Select(x => new DTO.SlaveStatus {
             Slave = new DTO.Slave {
               Id = x.ResourceId.ToString(),
               Name = x.Name
-            }
-          }),
+            },
+            CpuUtilization = x.CpuUtilization,
+            Cores = x.Cores ?? 0,
+            FreeCores = x.FreeCores ?? 0,
+            Memory = (x.Memory ?? 0) / 1024,
+            FreeMemory = (x.FreeMemory ?? 0) / 1024,
+            IsAllowedToCalculate = x.IsAllowedToCalculate,
+            State = x.SlaveState.ToString()
+          }).OrderBy(x => x.Slave.Name),
           Timestamp = JavascriptUtils.ToTimestamp(DateTime.Now)
         };
@@ -82,25 +121,54 @@
 
     public IEnumerable<DTO.Status> GetStatusHistory(DateTime start, DateTime end) {
+      TimeSpan ts = end - start;
+      int increment = 1;
+      double totalMinutes = ts.TotalMinutes;
+      while (totalMinutes > 5761) {
+        totalMinutes -= 5761;
+        increment += 5;
+      }
       using (var db = new HiveDataContext()) {
-        var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end)
-                                      .OrderBy(x => x.Timestamp)
-                                      .ToList();
+        var statistics = db.Statistics.Where(s => s.Timestamp >= start && s.Timestamp <= end);
+        var status = new DTO.Status {
+          CoreStatus = new DTO.CoreStatus(),
+          CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
+          MemoryStatus = new DTO.MemoryStatus()
+        };
+        int freeCores = 0;
+        int freeMemory = 0;
+        int i = 1;
         foreach (var statistic in statistics) {
-          yield return new DTO.Status {
-            CoreStatus = new DTO.CoreStatus {
-              TotalCores = statistic.SlaveStatistics.Sum(x => x.Cores),
-              AvailableCores = 0,
-              FreeCores = statistic.SlaveStatistics.Sum(x => x.FreeCores)
-            },
-            CpuUtilizationStatus = new DTO.CpuUtilizationStatus {
-              TotalCpuUtilization = 0.0,
-              UsedCpuUtilization = statistic.SlaveStatistics.Any() ? statistic.SlaveStatistics.Average(x => x.CpuUtilization) : 0.0
-            },
-            MemoryStatus = new DTO.MemoryStatus {
-              TotalMemory = statistic.SlaveStatistics.Sum(x => x.Memory) / 1024,
-              FreeMemory = statistic.SlaveStatistics.Sum(x => x.FreeMemory) / 1024
-            },
-            Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp)
-          };
+          status.CoreStatus.TotalCores += statistic.SlaveStatistics.Sum(x => x.Cores);
+          freeCores += statistic.SlaveStatistics.Sum(x => x.FreeCores);
+          status.CpuUtilizationStatus.TotalCpuUtilization += statistic.SlaveStatistics.Any()
+                                                             ? statistic.SlaveStatistics.Average(x => x.CpuUtilization)
+                                                             : 0.0;
+          status.MemoryStatus.TotalMemory += statistic.SlaveStatistics.Sum(x => x.Memory) / 1024;
+          freeMemory += statistic.SlaveStatistics.Sum(x => x.FreeMemory) / 1024;
+          if (i >= increment) {
+            status.Timestamp = JavascriptUtils.ToTimestamp(statistic.Timestamp);
+            status.CoreStatus.TotalCores /= i;
+            freeCores /= i;
+            status.CpuUtilizationStatus.TotalCpuUtilization /= i;
+            status.MemoryStatus.TotalMemory /= i;
+            freeMemory /= i;
+            status.CoreStatus.ActiveCores = status.CoreStatus.TotalCores;
+            status.MemoryStatus.ActiveMemory = status.MemoryStatus.TotalMemory;
+            status.CpuUtilizationStatus.ActiveCpuUtilization = status.CpuUtilizationStatus.TotalCpuUtilization;
+            status.CpuUtilizationStatus.CalculatingCpuUtilization = status.CpuUtilizationStatus.CalculatingCpuUtilization;
+            status.CoreStatus.CalculatingCores = status.CoreStatus.TotalCores - freeCores;
+            status.MemoryStatus.UsedMemory = status.MemoryStatus.TotalMemory - freeMemory;
+            yield return status;
+            status = new DTO.Status {
+              CoreStatus = new DTO.CoreStatus(),
+              CpuUtilizationStatus = new DTO.CpuUtilizationStatus(),
+              MemoryStatus = new DTO.MemoryStatus()
+            };
+            freeCores = 0;
+            freeMemory = 0;
+            i = 1;
+          } else {
+            i++;
+          }
         }
       }
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Slave.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Slave.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Slave.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
   public class Slave {
     public string Id { get; set; } // currently unused
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/Status.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System.Collections.Generic;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
 
 namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
@@ -5,16 +26,20 @@
   public class CoreStatus {
     public int TotalCores { get; set; }
-    public int AvailableCores { get; set; }
-    public int FreeCores { get; set; }
+    public int FreeCores { get; set; } // temporary quickfix for old chart data
+    public int ActiveCores { get; set; }
+    public int CalculatingCores { get; set; }
   }
 
   public class CpuUtilizationStatus {
     public double TotalCpuUtilization { get; set; }
-    public double UsedCpuUtilization { get; set; }
+    public double ActiveCpuUtilization { get; set; }
+    public double CalculatingCpuUtilization { get; set; }
   }
 
   public class MemoryStatus {
     public int TotalMemory { get; set; }
-    public int FreeMemory { get; set; }
+    public int FreeMemory { get; set; } // temporary quickfix for old chart data
+    public int ActiveMemory { get; set; }
+    public int UsedMemory { get; set; }
   }
 
@@ -25,7 +50,13 @@
   }
 
-  public class SlaveCpuStatus {
+  public class SlaveStatus {
     public Slave Slave { get; set; }
     public double CpuUtilization { get; set; }
+    public int Cores { get; set; }
+    public int FreeCores { get; set; }
+    public int Memory { get; set; }
+    public int FreeMemory { get; set; }
+    public bool IsAllowedToCalculate { get; set; }
+    public string State { get; set; }
   }
 
@@ -35,5 +66,5 @@
     public MemoryStatus MemoryStatus { get; set; }
     public IEnumerable<TaskStatus> TasksStatus { get; set; }
-    public IEnumerable<SlaveCpuStatus> SlavesCpuStatus { get; set; }
+    public IEnumerable<SlaveStatus> SlavesStatus { get; set; }
     public long Timestamp { get; set; }
   }
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/User.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/User.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/DataTransfer/User.cs	(revision 12435)
@@ -1,3 +1,23 @@
-﻿
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
 namespace HeuristicLab.Services.WebApp.Status.WebApi.DataTransfer {
   public class User {
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/JavascriptUtils.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/JavascriptUtils.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApi/JavascriptUtils.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 
 namespace HeuristicLab.Services.WebApp.Status.WebApi {
@@ -6,5 +27,5 @@
       var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
       var time = input.Subtract(new TimeSpan(epoch.Ticks));
-      return (long)(time.Ticks / 10000);
+      return time.Ticks / 10000;
     }
   }
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/history.cshtml
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/history.cshtml	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/history.cshtml	(revision 12435)
@@ -56,4 +56,7 @@
                 <div class="panel-body">
                     <flot dataset="coreSeries" options="fillChartOptions"></flot>
+                    <p>{{maxUpper}}</p>
+                    <p>{{fromDateTime}}</p>
+                    <p>{{toDateTime}}</p>
                 </div>
             </div>
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/history/historyCtrl.js	(revision 12435)
@@ -4,5 +4,4 @@
         ['$scope', '$interval', 'app.status.data.service',
         function ($scope, $interval, dataService) {
-
             $scope.chartOptions = {
                 grid: {
@@ -59,4 +58,5 @@
             };
 
+
             $scope.fromDate = new Date();
             $scope.toDate = new Date();
@@ -89,5 +89,5 @@
 
             var updateCharts = function () {
-                dataService.getStatusHistory({start: ConvertFromDate($scope.fromDate), end: ConvertToDate($scope.toDate)}, function (status) {
+                dataService.getStatusHistory({ start: ConvertFromDate($scope.fromDate), end: ConvertToDate($scope.toDate) }, function (status) {
                     var noOfStatus = status.length;
                     var cpuSeries = [];
@@ -96,12 +96,10 @@
                     for (var i = 0; i < noOfStatus; ++i) {
                         var curStatus = status[i];
-                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.UsedCpuUtilization);
-                        var usedCores = curStatus.CoreStatus.TotalCores - curStatus.CoreStatus.FreeCores;
-                        var usedMemory = curStatus.MemoryStatus.TotalMemory - curStatus.MemoryStatus.FreeMemory;
+                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
                         cpuSeries.push([curStatus.Timestamp, cpuData]);
-                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
-                        coreSeries[1].push([curStatus.Timestamp, usedCores]);
-                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.TotalMemory]);
-                        memorySeries[1].push([curStatus.Timestamp, usedMemory]);
+                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
+                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
+                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.ActiveMemory]);
+                        memorySeries[1].push([curStatus.Timestamp, curStatus.MemoryStatus.UsedMemory]);
                     }
                     $scope.cpuSeries = [{ data: cpuSeries, label: "&nbsp;CPU Utilization", color: "#f7921d" }];
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/status.cshtml	(revision 12435)
@@ -11,122 +11,233 @@
 
 <div class="default-view-container">
-    <div class="row">
-        <div class="col-lg-3 col-md-6">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Cores</h3>
-                </div>
-                <div class="panel-body">
-                    <center>
-                        <knob knob-data="core.knobData" knob-options="knobOptions"></knob>
-                    </center>
-                    <p>Total Cores: {{status.CoreStatus.TotalCores}}</p>
-                    <p>Used Cores: {{status.CoreStatus.TotalCores - status.CoreStatus.FreeCores}}</p>
-                </div>
-            </div>
-        </div>
-
-        <div class="col-lg-3 col-md-6">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">CPU Utilization</h3>
-                </div>
-                <div class="panel-body">
-                    <center>
-                        <knob knob-data="cpu.knobData" knob-options="knobOptions"></knob>
-                    </center>
-                    <p>Total Utilization: {{status.CpuUtilizationStatus.TotalCpuUtilization}} %</p>
-                    <p>Used Utilization: {{status.CpuUtilizationStatus.UsedCpuUtilization}} %</p>
-                </div>
-            </div>
-        </div>
-
-        <div class="col-lg-3 col-md-6">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Memory</h3>
-                </div>
-                <div class="panel-body">
-                    <center>
-                        <knob knob-data="memory.knobData" knob-options="knobOptions"></knob>
-                    </center>
-                    <p>TotalMemory: {{status.MemoryStatus.TotalMemory}} GB</p>
-                    <p>UsedMemory: {{status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory}} GB</p>
-                </div>
-            </div>
-        </div>
-
-        <div class="col-lg-3 col-md-6">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Tasks</h3>
-                </div>
-                <div class="panel-body">
-                    <p>Total: {{tasks.WaitingTasks + tasks.CalculatingTasks}}</p>
-                    <p>Waiting: {{tasks.WaitingTasks}}</p>
-                    <p>Calculating: {{tasks.CalculatingTasks}}</p>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="row">
-        <div class="col-lg-12">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">CPU Utilization Chart</h3>
-                </div>
-                <div class="panel-body">
-                    <flot dataset="cpu.series" options="chartOptions"></flot>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="row">
-        <div class="col-lg-12">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Core Chart</h3>
-                </div>
-                <div class="panel-body">
-                    <flot dataset="core.series" options="fillChartOptions"></flot>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="row">
-        <div class="col-lg-12">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Memory Chart</h3>
-                </div>
-                <div class="panel-body">
-                    <flot dataset="memory.series" options="fillChartOptions"></flot>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div class="row">
-        <div class="col-lg-12">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">Tasks by User</h3>
-                </div>
+<div class="row">
+    <div class="col-lg-3 col-md-6">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Cores</h3>
+            </div>
+            <div class="panel-body">
+                <div class="text-center">
+                    <knob knob-data="core.knobData" knob-options="knobOptions"></knob>
+                </div>
+                <table class="table table-no-border table-condensed table-auto-width table-content">
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
+                        <td class="text-left">
+                            Total:
+                        </td>
+                        <td class="text-right">{{status.CoreStatus.TotalCores | number}}</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
+                        <td class="text-left">Active:</td>
+                        <td class="text-right">{{status.CoreStatus.ActiveCores | number}}</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
+                        <td class="text-left">Calculating:</td>
+                        <td class="text-right">{{status.CoreStatus.CalculatingCores | number}}</td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+
+    <div class="col-lg-3 col-md-6">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">CPU Utilization</h3>
+            </div>
+            <div class="panel-body">
+                <div class="text-center">
+                    <knob knob-data="cpu.knobData" knob-options="knobOptions"></knob>
+                </div>
+                <table class="table table-no-border table-condensed table-auto-width table-content">
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
+                        <td class="text-left">Total:</td>
+                        <td class="text-right">{{status.CpuUtilizationStatus.TotalCpuUtilization | number: 2}} %</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
+                        <td class="text-left">Active:</td>
+                        <td class="text-right">{{status.CpuUtilizationStatus.ActiveCpuUtilization | number: 2}} %</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
+                        <td class="text-left">Calculating:</td>
+                        <td class="text-right">{{status.CpuUtilizationStatus.CalculatingCpuUtilization | number: 2}} %</td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+
+    <div class="col-lg-3 col-md-6">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Memory</h3>
+            </div>
+            <div class="panel-body">
+                <div class="text-center">
+                    <knob knob-data="memory.knobData" knob-options="knobOptions"></knob>
+                </div>
+                <table class="table table-no-border table-condensed table-auto-width table-content">
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All online slaves">
+                        <td class="text-left">Total:</td>
+                        <td class="text-right">{{status.MemoryStatus.TotalMemory | number}} GB</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating and idle slaves that are allowed to calculate">
+                        <td class="text-left">Active:</td>
+                        <td class="text-right">{{status.MemoryStatus.ActiveMemory | number}} GB</td>
+                    </tr>
+                    <tr data-toggle="tooltip" data-placement="bottom" title="All calculating slaves that are allowed to calculate">
+                        <td class="text-left">Calculating:</td>
+                        <td class="text-right">{{status.MemoryStatus.UsedMemory | number}} GB</td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+
+    <div class="col-lg-3 col-md-6">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Tasks</h3>
+            </div>
+            <div class="panel-body">
+                <table class="table table-no-border table-condensed table-auto-width table-content">
+                    <tr>
+                        <td class="text-left">Total:</td>
+                        <td class="text-right">{{tasks.WaitingTasks + tasks.CalculatingTasks | number}}</td>
+                    </tr>
+                    <tr>
+                        <td class="text-left">Waiting:</td>
+                        <td class="text-right">{{tasks.WaitingTasks | number}}</td>
+                    </tr>
+                    <tr>
+                        <td class="text-left">Calculating:</td>
+                        <td class="text-right">{{tasks.CalculatingTasks | number}}</td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">CPU Utilization Chart</h3>
+            </div>
+            <div class="panel-body">
+                <flot dataset="cpu.series" options="chartOptions"></flot>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Core Chart</h3>
+            </div>
+            <div class="panel-body">
+                <flot dataset="core.series" options="fillChartOptions"></flot>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Memory Chart</h3>
+            </div>
+            <div class="panel-body">
+                <flot dataset="memory.series" options="fillChartOptions"></flot>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Tasks by User</h3>
+            </div>
+            <div class="panel-body">
+                <table class="table table-hover">
+                    <thead>
+                    <tr>
+                        <th>Username</th>
+                        <th>Calculating Tasks</th>
+                        <th>Waiting Tasks</th>
+                    </tr>
+                    </thead>
+                    <tr ng-repeat="task in status.TasksStatus">
+                        <td>{{task.User.Name}}</td>
+                        <td>{{task.CalculatingTasks | number}}</td>
+                        <td>{{task.WaitingTasks | number}}</td>
+                    </tr>
+                    <tr ng-hide="status.TasksStatus.length">
+                        <td colspan="3" class="text-center">
+                            There are no waiting or calculating tasks available!
+                        </td>
+                    </tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">
+                    <a data-toggle="collapse" data-target="#collapseActiveCalculatingSlaves"
+                       ng-href="#/status">
+                        Active Calculating Slaves
+                    </a>
+                </h3>
+            </div>
+            <div id="collapseActiveCalculatingSlaves"
+                 class="panel-collapse collapse in">
                 <div class="panel-body">
                     <table class="table table-hover">
                         <thead>
-                            <tr>
-                                <th>Username</th>
-                                <th>Calculating Tasks</th>
-                                <th>Waiting Tasks</th>
-                            </tr>
+                        <tr>
+                            <th ng-click="activeCalculatingSlavesOrderColumn='Slave.Name';
+                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
+                                Slave
+                            </th>
+                            <th ng-click="activeCalculatingSlavesOrderColumn='CpuUtilization';
+                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
+                                CPU Utilization
+                            </th>
+                            <th ng-click="activeCalculatingSlavesOrderColumn='Cores';
+                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
+                                Cores
+                            </th>
+                            <th ng-click="activeCalculatingSlavesOrderColumn='Memory';
+                                                  activeCalculatingSlavesReverseSort=!activeCalculatingSlavesReverseSort">
+                                Memory
+                            </th>
+                        </tr>
                         </thead>
-                        <tr ng-repeat="task in status.TasksStatus">
-                            <td>{{task.User.Name}}</td>
-                            <td>{{task.CalculatingTasks}}</td>
-                            <td>{{task.WaitingTasks}}</td>
+                        <tr ng-repeat="slave in activeCalculatingSlaves = (status.SlavesStatus
+                                | filter: {
+                                    IsAllowedToCalculate: true,
+                                    State: 'Calculating'
+                                  }
+                                | orderBy: activeCalculatingSlavesOrderColumn:activeCalculatingSlavesReverseSort)">
+                            <td>{{slave.Slave.Name}}</td>
+                            <td>{{slave.CpuUtilization | number: 2}} %</td>
+                            <td>{{slave.Cores | number}}</td>
+                            <td>{{slave.Memory | number}} GB</td>
+                        </tr>
+                        <tr ng-hide="activeCalculatingSlaves.length">
+                            <td colspan="4" class="text-center">
+                                There are no active calculating slaves available!
+                            </td>
                         </tr>
                     </table>
@@ -135,22 +246,56 @@
         </div>
     </div>
-
-    <div class="row">
-        <div class="col-lg-12">
-            <div class="panel panel-default">
-                <div class="panel-heading">
-                    <h3 class="panel-title">CPU Utilization by Slave</h3>
-                </div>
+</div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">
+                    <a data-toggle="collapse" data-target="#collapseActiveIdleSlaves"
+                       ng-href="#/status" class="collapsed">
+                        Active Idle Slaves
+                    </a>
+                </h3>
+            </div>
+            <div id="collapseActiveIdleSlaves"
+                 class="panel-collapse collapse">
                 <div class="panel-body">
                     <table class="table table-hover">
                         <thead>
-                            <tr>
-                                <th>Slave</th>
-                                <th>CPU Utilization</th>
-                            </tr>
+                        <tr>
+                            <th ng-click="activeIdleSlavesOrderColumn='Slave.Name';
+                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
+                                Slave
+                            </th>
+                            <th ng-click="activeIdleSlavesOrderColumn='CpuUtilization';
+                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
+                                CPU Utilization
+                            </th>
+                            <th ng-click="activeIdleSlavesOrderColumn='Cores';
+                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
+                                Cores
+                            </th>
+                            <th ng-click="activeIdleSlavesOrderColumn='Memory';
+                                                  activeIdleSlavesReverseSort=!activeIdleSlavesReverseSort">
+                                Memory
+                            </th>
+                        </tr>
                         </thead>
-                        <tr ng-repeat="slave in status.SlavesCpuStatus">
+                        <tr ng-repeat="slave in activeIdleSlaves = (status.SlavesStatus
+                                | filter: {
+                                    IsAllowedToCalculate: true,
+                                    State: 'Idle'
+                                  }
+                                | orderBy: activeIdleSlavesOrderColumn:activeIdleSlavesReverseSort)">
                             <td>{{slave.Slave.Name}}</td>
-                            <td>{{slave.CpuUtilization}} %</td>
+                            <td>{{slave.CpuUtilization | number: 2}} %</td>
+                            <td>{{slave.Cores | number}}</td>
+                            <td>{{slave.Memory | number}} GB</td>
+                        </tr>
+                        <tr ng-hide="activeIdleSlaves.length">
+                            <td colspan="4" class="text-center">
+                            There are no active idle slaves available!
+                            <td>
                         </tr>
                     </table>
@@ -160,2 +305,64 @@
     </div>
 </div>
+
+<div class="row">
+    <div class="col-lg-12">
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">
+                    <a data-toggle="collapse" data-target="#collapseInactiveSlaves"
+                       ng-href="#/status" class="collapsed">
+                        Inactive Slaves
+                    </a>
+                </h3>
+            </div>
+            <div id="collapseInactiveSlaves"
+                 class="panel-collapse collapse">
+                <div class="panel-body">
+                    <table class="table table-hover">
+                        <thead>
+                        <tr>
+                            <th ng-click="inactiveSlavesOrderColumn='Slave.Name';
+                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
+                                Slave
+                            </th>
+                            <th ng-click="inactiveSlavesOrderColumn='CpuUtilization';
+                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
+                                CPU Utilization
+                            </th>
+                            <th ng-click="inactiveSlavesOrderColumn='Cores';
+                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
+                                Cores
+                            </th>
+                            <th ng-click="inactiveSlavesOrderColumn='Memory';
+                                                  inactiveSlavesReverseSort=!inactiveSlavesReverseSort">
+                                Memory
+                            </th>
+                        </tr>
+                        </thead>
+                        <tr ng-repeat="slave in inactiveSlaves = (status.SlavesStatus
+                                | filter: {
+                                    IsAllowedToCalculate: false
+                                  }
+                                | orderBy: inactiveSlavesOrderColumn:inactiveSlavesReverseSort)">
+                            <td>{{slave.Slave.Name}}</td>
+                            <td>{{slave.CpuUtilization | number: 2}} %</td>
+                            <td>{{slave.Cores | number}}</td>
+                            <td>{{slave.Memory | number}} GB</td>
+                        </tr>
+                        <tr ng-hide="inactiveSlaves.length">
+                            <td colspan="4" class="text-center">No inactive slaves available!</td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+</div>
+
+<script>
+    $(document).ready(function () {
+        $('[data-toggle="tooltip"]').tooltip();
+    });
+</script>
Index: /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp.Status/3.3/WebApp/status/statusCtrl.js	(revision 12435)
@@ -53,4 +53,7 @@
                     mode: "time",
                     twelveHourClock: false
+                },
+                yaxis: {
+                    min: 0
                 }
             };
@@ -82,7 +85,23 @@
             };
 
+            $scope.activeIdleSlaveFilter = function (slave) {
+                return (slave.IsAllowedToCalculate == true) && (slave.State == 'Idle');
+            };
+
+            $scope.activeCalculatingSlavesReverseSort = false;
+            $scope.activeCalculatingSlavesOrderColumn = 'slave.Slave.Name';
+
+            $scope.activeIdleSlavesReverseSort = false;
+            $scope.activeIdleSlavesOrderColumn = 'slave.Slave.Name';
+
+            $scope.inactiveSlavesReverseSort = false;
+            $scope.inactiveSlavesOrderColumn = 'slave.Slave.Name';
+
+
             var updateStatus = function () {
                 // update status data
                 dataService.getStatus({}, function (status) {
+                    var oneDayInMs = 24 * 60 * 60 * 1000;
+                    var today = new Date().getTime() - oneDayInMs;
                     // raw status data
                     $scope.status = status;
@@ -96,29 +115,35 @@
                     }
                     // knobs
-                    $scope.cpu.knobData = Math.round(status.CpuUtilizationStatus.UsedCpuUtilization);
-                    var usedCores = status.CoreStatus.TotalCores - status.CoreStatus.FreeCores;
-                    $scope.core.knobData = Math.round(usedCores / status.CoreStatus.TotalCores * 100);
-                    var usedMemory = status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory;
-                    $scope.memory.knobData = Math.round(usedMemory / status.MemoryStatus.TotalMemory * 100);
+                    $scope.cpu.knobData = Math.round(status.CpuUtilizationStatus.ActiveCpuUtilization);
+                    $scope.core.knobData = Math.round(status.CoreStatus.CalculatingCores / status.CoreStatus.ActiveCores * 100);
+                    $scope.memory.knobData = Math.round(status.MemoryStatus.UsedMemory / status.MemoryStatus.ActiveMemory * 100);
                     // chart series
                     var cpuSeries = $scope.cpu.series[0].data.splice(0);
-                    if (cpuSeries.length > 2) {
-                        cpuSeries.splice(0, 1);
-                    }
                     var coreSeries = [$scope.core.series[0].data, $scope.core.series[1].data];
-                    if (coreSeries[0].length > 2) {
-                        coreSeries[0].splice(0, 1);
-                    }
-                    if (coreSeries[1].length > 2) {
-                        coreSeries[1].splice(0, 1);
-                    }
                     var memorySeries = [$scope.memory.series[0].data, $scope.memory.series[1].data];
-                    if (memorySeries[0].length > 2) {
-                        memorySeries[0].splice(0, 1);
-                    }
-                    if (memorySeries[1].length > 2) {
-                        memorySeries[1].splice(0, 1);
+                    if ($scope.status.Timestamp < today) {
+                        if (cpuSeries.length > 2) {
+                            cpuSeries.splice(0, 1);
+                        }
+                        if (coreSeries[0].length > 2) {
+                            coreSeries[0].splice(0, 1);
+                        }
+                        if (coreSeries[1].length > 2) {
+                            coreSeries[1].splice(0, 1);
+                        }
+                        if (memorySeries[0].length > 2) {
+                            memorySeries[0].splice(0, 1);
+                        }
+                        if (memorySeries[1].length > 2) {
+                            memorySeries[1].splice(0, 1);
+                        }
                     }
                     cpuSeries.push([$scope.status.Timestamp, $scope.cpu.knobData]);
+
+                    // charts are currently filled with old total/used data
+                    // start temporary
+                    var usedCores = status.CoreStatus.TotalCores - status.getCoreStatus.FreeCores;
+                    var usedMemory = status.MemoryStatus.TotalMemory - status.MemoryStatus.FreeMemory;
+                    // end temporary
                     coreSeries[0].push([$scope.status.Timestamp, status.CoreStatus.TotalCores]);
                     coreSeries[1].push([$scope.status.Timestamp, usedCores]);
@@ -149,12 +174,10 @@
                     for (var i = 0; i < noOfStatus; ++i) {
                         var curStatus = status[i];
-                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.UsedCpuUtilization);
-                        var usedCores = curStatus.CoreStatus.TotalCores - curStatus.CoreStatus.FreeCores;
-                        var usedMemory = curStatus.MemoryStatus.TotalMemory - curStatus.MemoryStatus.FreeMemory;
+                        var cpuData = Math.round(curStatus.CpuUtilizationStatus.ActiveCpuUtilization);
                         cpuSeries.push([curStatus.Timestamp, cpuData]);
-                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.TotalCores]);
-                        coreSeries[1].push([curStatus.Timestamp, usedCores]);
-                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.TotalMemory]);
-                        memorySeries[1].push([curStatus.Timestamp, usedMemory]);
+                        coreSeries[0].push([curStatus.Timestamp, curStatus.CoreStatus.ActiveCores]);
+                        coreSeries[1].push([curStatus.Timestamp, curStatus.CoreStatus.CalculatingCores]);
+                        memorySeries[0].push([curStatus.Timestamp, curStatus.MemoryStatus.ActiveMemory]);
+                        memorySeries[1].push([curStatus.Timestamp, curStatus.MemoryStatus.UsedMemory]);
                     }
                     $scope.cpu.series = [{ data: cpuSeries, label: "&nbsp;CPU Utilization", color: "#f7921d" }];
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/BundleConfig.cs	(revision 12435)
@@ -1,10 +1,30 @@
-﻿using System.Collections.Generic;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
 using System.IO;
-using System.Linq;
-using System.Web;
 using System.Web.Optimization;
 
 namespace HeuristicLab.Services.WebApp.Configs {
   public class BundleConfig {
+
     public static void RegisterBundles(BundleCollection bundles) {
       bundles.IgnoreList.Clear();
@@ -61,23 +81,29 @@
         "~/WebApp/app.css"
       ));
-      AddOrUpdateWebAppBundle();
+
+      bundles.Add(new ScriptBundle("~/Bundles/WebApp/Main").Include(
+        "~/WebApp/main.js"
+      ));
+
+      bundles.Add(new ScriptBundle("~/Bundles/WebApp/Shared")
+        .IncludeDirectory("~/WebApp/shared/services", "*.js", true)
+        .IncludeDirectory("~/WebApp/shared/directives", "*.js", true)
+        .IncludeDirectory("~/WebApp/shared/menu", "*.js", true)
+      );
     }
 
-    public static void AddOrUpdateWebAppBundle() {
-      var jsBundle = BundleTable.Bundles.GetBundleFor("~/Bundles/WebApp/js");
-      if (jsBundle != null) {
-        BundleTable.Bundles.Remove(jsBundle);
+    public static IEnumerable<string> GetWebAppScripts() {
+      var jsFiles = new List<string> {
+        "WebApp/helper.js",
+        "WebApp/app.js"
+      };
+      PluginManager pluginManager = PluginManager.Instance;
+      foreach (var plugin in pluginManager.GetPlugins()) {
+        if (File.Exists(string.Format(@"{0}\{1}\{1}.js", PluginManager.PluginsDirectory, plugin.Name))) {
+          jsFiles.Add(string.Format("WebApp/plugins/{0}/{0}.js", plugin.Name));
+        }
       }
-      var jsFiles = new List<string> {
-        "~/WebApp/helper.js",
-        "~/WebApp/app.js"
-      };
-      var directories = Directory.GetDirectories(string.Format(@"{0}WebApp\plugins", HttpRuntime.AppDomainAppPath));
-      jsFiles.AddRange(directories.Select(Path.GetFileName).Select(directory => string.Format("~/WebApp/plugins/{0}/{0}.js", directory)));
-      jsFiles.Add("~/WebApp/main.js");
-      jsBundle = new ScriptBundle("~/Bundles/WebApp/js");
-      jsBundle.Include(jsFiles.ToArray());
-      jsBundle.IncludeDirectory("~/WebApp/shared/", "*.js", true);
-      BundleTable.Bundles.Add(jsBundle);
+      jsFiles.Add("WebApp/main.js");
+      return jsFiles;
     }
   }
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/FilterConfig.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/FilterConfig.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/FilterConfig.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System.Web.Mvc;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Web.Mvc;
 
 namespace HeuristicLab.Services.WebApp.Configs {
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/RouteConfig.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/RouteConfig.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/RouteConfig.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System.Web.Mvc;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Web.Mvc;
 using System.Web.Routing;
 
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/WebApiConfig.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/WebApiConfig.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Configs/WebApiConfig.cs	(revision 12435)
@@ -1,3 +1,23 @@
-﻿
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
 using System.Net.Http.Formatting;
 using System.Web.Http;
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AppController.cs	(revision 12435)
@@ -21,5 +21,4 @@
 
 using System.Web.Mvc;
-using HeuristicLab.Services.WebApp.Configs;
 
 namespace HeuristicLab.Services.WebApp.Controllers {
@@ -31,5 +30,4 @@
         return RedirectPermanent(Request.Url + "/");
       }
-      BundleConfig.AddOrUpdateWebAppBundle();
       return View("~/WebApp/shared/layout/layout.cshtml");
     }
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AuthenticationController.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AuthenticationController.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/AuthenticationController.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System.Web.Http;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Web.Http;
 using System.Web.Security;
 using HeuristicLab.Services.WebApp.Controllers.DataTransfer;
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/Plugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/Plugin.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/Plugin.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 
 namespace HeuristicLab.Services.WebApp.Controllers.DataTransfer {
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/User.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/User.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/DataTransfer/User.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿namespace HeuristicLab.Services.WebApp.Controllers.DataTransfer {
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Services.WebApp.Controllers.DataTransfer {
   public class User {
     public string Username { get; set; }
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/PluginController.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/PluginController.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/PluginController.cs	(revision 12435)
@@ -1,10 +1,32 @@
-﻿using System.Collections.Generic;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
 using System.Linq;
 using System.Web.Http;
+using HeuristicLab.Services.Hive;
 using DTO = HeuristicLab.Services.WebApp.Controllers.DataTransfer;
 
 namespace HeuristicLab.Services.WebApp.Controllers {
 
-  [Authorize(Roles = "Hive Administrator")]
+  [Authorize(Roles = HiveRoles.Administrator)]
   public class PluginController : ApiController {
 
@@ -21,5 +43,7 @@
 
     public bool ReloadPlugin(string name) {
-      var plugin = PluginManager.Instance.GetPlugin(name);
+      var plugin = pluginManager.GetPlugin(name);
+      if (plugin == null)
+        return false;
       plugin.ReloadControllers();
       return true;
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/WebAppControllerSelector.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/WebAppControllerSelector.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Controllers/WebAppControllerSelector.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -18,5 +39,4 @@
       : base(configuration) {
       this.configuration = configuration;
-      pluginManager.Configuration = configuration;
       controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>();
       LoadAppControllers();
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Global.asax.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Global.asax.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Global.asax.cs	(revision 12435)
@@ -8,4 +8,7 @@
   public class MvcApplication : System.Web.HttpApplication {
     protected void Application_Start() {
+      var pluginManager = PluginManager.Instance;
+      pluginManager.Configuration = GlobalConfiguration.Configuration;
+      pluginManager.DiscoverPlugins();
       AreaRegistration.RegisterAllAreas();
       GlobalConfiguration.Configure(WebApiConfig.Register);
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/Plugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/Plugin.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/Plugin.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -5,5 +26,4 @@
 using System.Linq;
 using System.Reflection;
-using System.Text;
 using System.Web.Http;
 using System.Web.Http.Controllers;
@@ -56,18 +76,6 @@
         AssemblyName = Path.GetFileName(assemblyPath);
       }
-      catch (ReflectionTypeLoadException ex) {
-        StringBuilder sb = new StringBuilder();
-        foreach (Exception exSub in ex.LoaderExceptions) {
-          sb.AppendLine(exSub.Message);
-          FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
-          if (exFileNotFound != null) {
-            if (!string.IsNullOrEmpty(exFileNotFound.FusionLog)) {
-              sb.AppendLine("Fusion Log:");
-              sb.AppendLine(exFileNotFound.FusionLog);
-            }
-          }
-          sb.AppendLine();
-        }
-        AssemblyName = "Error loading assembly: " + sb.ToString();
+      catch (Exception) {
+        AssemblyName = "Error loading assembly";
         Controllers.Clear();
       }
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/PluginManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/PluginManager.cs	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/PluginManager.cs	(revision 12435)
@@ -1,3 +1,24 @@
-﻿using System.Collections.Concurrent;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
@@ -17,5 +38,5 @@
     public HttpConfiguration Configuration { get; set; }
 
-    private string PluginsDirectory {
+    public static string PluginsDirectory {
       get { return string.Format(@"{0}WebApp\plugins", HttpRuntime.AppDomainAppPath); }
     }
@@ -23,9 +44,49 @@
     public PluginManager() {
       plugins = new ConcurrentDictionary<string, Plugin>();
+      var fileWatcher = new FileSystemWatcher(PluginsDirectory, "*") {
+        IncludeSubdirectories = true,
+        EnableRaisingEvents = true
+      };
+      fileWatcher.Created += OnFilesChanged;
+      fileWatcher.Changed += OnFilesChanged;
+      fileWatcher.Deleted += OnFilesChanged;
+      fileWatcher.Renamed += OnFilesChanged;
+    }
+
+    private void OnFilesChanged(object sender, FileSystemEventArgs args) {
+      string path = args.FullPath.Remove(0, PluginsDirectory.Length + 1);
+      var pathParts = path.Split('\\');
+      string pluginName = pathParts[0];
+      if (pathParts.Length == 1) {
+        switch (args.ChangeType) {
+          case WatcherChangeTypes.Created:
+            GetPlugin(pluginName);
+            break;
+
+          case WatcherChangeTypes.Deleted:
+            plugins.Remove(pluginName);
+            break;
+
+          case WatcherChangeTypes.Renamed:
+            RenamedEventArgs renamedArgs = (RenamedEventArgs)args;
+            string oldPath = renamedArgs.OldFullPath.Remove(0, PluginsDirectory.Length + 1);
+            var oldPathParts = oldPath.Split('\\');
+            string oldPluginName = oldPathParts[0];
+            plugins.Remove(oldPluginName);
+            GetPlugin(pluginName);
+            break;
+
+          case WatcherChangeTypes.Changed:
+            Plugin plugin = LookupPlugin(pluginName);
+            if (plugin != null) {
+              plugin.ReloadControllers();
+            }
+            break;
+        }
+      }
     }
 
     public Plugin GetPlugin(string name) {
-      Plugin plugin;
-      plugins.TryGetValue(name, out plugin);
+      Plugin plugin = LookupPlugin(name);
       if (plugin == null) {
         string directory = string.Format(@"{0}\{1}", PluginsDirectory, name);
@@ -43,14 +104,12 @@
 
     public IEnumerable<Plugin> GetPlugins() {
-      DiscoverPlugins();
       return plugins.Values;
     }
 
-    private void DiscoverPlugins() {
+    public void DiscoverPlugins() {
       var pluginDirectories = Directory.GetDirectories(PluginsDirectory);
       foreach (var directory in pluginDirectories) {
         string pluginName = Path.GetFileName(directory);
-        Plugin plugin;
-        plugins.TryGetValue(pluginName, out plugin);
+        Plugin plugin = LookupPlugin(pluginName);
         if (plugin == null) {
           plugin = new Plugin {
@@ -63,4 +122,10 @@
       }
     }
+
+    private Plugin LookupPlugin(string name) {
+      Plugin plugin;
+      plugins.TryGetValue(name, out plugin);
+      return plugin;
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/app.css
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/app.css	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/app.css	(revision 12435)
@@ -79,11 +79,10 @@
 
 #menu {
-  position: absolute;
-  min-height: inherit;
-  width: 250px;
+  position: relative;
   background: #FAFAFA;
   display: block;
   overflow: hidden;
-  border-right: 1px solid #D3D3D3;
+  z-index: 10000;
+  width: 100%;
 }
 
@@ -101,9 +100,10 @@
 #view {
   position: relative;
-  left: 0px;
-  margin-left: 250px;
+  left: 0;
+  margin-left: 0px;
   display: block;
   overflow: hidden;
 }
+
 
 .view-header {
@@ -124,8 +124,55 @@
 }
 
-.navbar-header{
-  width: 250px;
+.navbar-header {
+  width: 100%;
   background: #3c3a39;
   color: #FFFFFF;
+  float: left;
+}
+
+
+@media (min-width: 768px) {
+  #view {
+    margin-left: 250px;
+  }
+
+  #menu {
+    visibility: visible;
+    position: absolute;
+    width: 250px;
+    min-height: inherit;
+    border-right: 1px solid #D3D3D3;
+    z-index: 0;
+  }
+
+  .navbar-header {
+    width: 250px;
+  }
+}
+.container-fluid .navbar-header {
+  margin: 0;
+  padding: 0;
+}
+
+.navbar-nav {
+  margin: 0;
+  padding: 0;
+}
+
+.navbar-right {
+  float: right!important
+}
+
+.navbar-nav>li>a {
+  padding-top: 15px;
+  padding-bottom: 15px;
+}
+
+.navbar-content {
+  padding-right: 15px;
+}
+
+.navbar-nav > li {
+  float: left;
 }
 
@@ -140,4 +187,5 @@
 .nav-sidebar {
   font-size: 12px;
+  padding-bottom: 30px;
 }
 
@@ -279,4 +327,28 @@
 }
 
+.table-no-border>thead>tr>th, 
+.table-no-border>tbody>tr>th, 
+.table-no-border>tfoot>tr>th, 
+.table-no-border>thead>tr>td, 
+.table-no-border>tbody>tr>td, 
+.table-no-border>tfoot>tr>td,
+.table-no-border>tbody,
+.table-no-border>thead,
+.table-no-border>tfoot{
+  border-top: none !important; 
+  border-bottom: none !important; 
+}
+
+.table-auto-width {
+  width: auto !important;
+}
+
+.center-element {
+  margin: 0 auto;
+}
+
+.table-content {
+  margin-bottom: 0;
+}
 
 #top-navbar {
@@ -311,10 +383,57 @@
 
 .navbar-default .navbar-text {
+  display: block;
   color: #ffffff;
   text-shadow: none !important;
-}
-
+  margin: 0;
+  padding: 15px;
+}
+
+.navbar-nav {
+  float:left;
+  margin:0
+}
+
+.navbar-nav>li {
+  float:left
+}
+
+.navbar-nav>li>a {
+  padding-top:15px;
+  padding-bottom:15px
+}
+
+.navbar-toggle {
+  border: none !important;
+}
+
+.navbar-toggle:focus {
+  background-color: transparent !important;
+}
+
+.navbar-toggle:hover {
+  background-color: #D3D3D3 !important;
+}
+
+#menu .navbar-collapse {
+  padding: 0;
+  margin: 0;
+}
 
 .default-view-container {
   padding: 30px;
 }
+
+.panel-heading a:after {
+    font-family:'Glyphicons Halflings';
+    content:"\e114";
+    float: right;
+    color: grey;
+}
+.panel-heading a.collapsed:after {
+    content:"\e080";
+}
+
+.panel-heading a:focus, a:hover {
+  text-decoration: none;
+}
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/directives/flot.js
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/directives/flot.js	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/directives/flot.js	(revision 12435)
@@ -6,8 +6,9 @@
             link: function (scope, element, attrs) {
                 var chart = null, opts = scope[attrs.options];
+                var div = null;
 
                 scope.$watchCollection(attrs.dataset, function (newData, oldData) {
                     if (!chart) {
-                        var div = element.append("<div>");
+                        div = element.append("<div>");
                         div.bind("plotselected", function (event, ranges) {
                             $.each(chart.getXAxes(), function (_, axis) {
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/layout/layout.cshtml	(revision 12435)
@@ -1,3 +1,22 @@
-﻿@using HeuristicLab.Services.WebApp.Configs
+﻿@* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+*@
+
+@using HeuristicLab.Services.WebApp.Configs
 <!DOCTYPE html>
 <html lang="en" ng-app="app">
@@ -15,20 +34,23 @@
     <![endif]-->
     @Scripts.Render("~/Bundles/Vendors/js")
-    @{
-        BundleTable.EnableOptimizations = false;
+    @foreach (var script in BundleConfig.GetWebAppScripts()) {
+        <script src="@script"></script>
     }
-    @Scripts.Render("~/Bundles/WebApp/js") 
-    @{
-        BundleTable.EnableOptimizations = true;
-    }
+
+    @Scripts.Render("~/Bundles/WebApp/Shared")
 </head>
-<body>
-    <div id="app">
-        <header id="toolbar" class="navbar navbar-default navbar-static-top no-border no-padding-margin"
-                ng-controller="app.menu.ctrl">
-            <nav>
-                <div class="container-fluid">
-                    <div class="navbar-header">
-                        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#top-navbar">
+<body ngcloak>
+<div id="app">
+    <header id="toolbar" class="navbar navbar-default navbar-static-top no-border no-padding-margin"
+            ng-controller="app.menu.ctrl">
+        <nav>
+            <div class="container-fluid">
+                <div class="navbar-header">
+                    <div class="center-block">
+                        <a class="navbar-brand" href="#">
+                            <img src="~/WebApp/shared/images/HeuristicLab-Logo.png" style="float: left; height: 100%; margin-right: 5px;"/>
+                            <span style="color: #f7921d">HeuristicLab</span>
+                        </a>
+                        <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#menu .navbar-collapse">
                             <span class="sr-only">Toggle navigation</span>
                             <span class="icon-bar"></span>
@@ -36,40 +58,42 @@
                             <span class="icon-bar"></span>
                         </button>
-                        <a class="navbar-brand" href="#">
-                            <img src="~/WebApp/shared/images/HeuristicLab-Logo.png" style="float: left; height: 100%; margin-left: 25px; margin-right: 5px;" />
-                            Heuristic<span style="color: #f7921d">Lab</span>
-                        </a>
-                    </div>
-
-                    <div class="collapse navbar-collapse" id="top-navbar">
-                        <ul class="nav navbar-nav navbar-right">
-                            @if (Request.IsAuthenticated) {
-                                <li>
-                                    <p class="navbar-text">Hello @User.Identity.Name!</p>
-                                </li>
-                                <li>
-                                    <a ng-href="" data-ng-click="logout()">Logout</a>
-                                </li>
-                            } else {
-                                <li>
-                                    <a ng-href="#/login">Login</a>
-                                </li>
-                            }
-                        </ul>
                     </div>
                 </div>
-            </nav>
-        </header>
 
-        <aside id="menu" ng-controller="app.menu.ctrl">
+                <div class="navbar-content">
+                    <ul class="nav navbar-nav navbar-right">
+                        @if (Request.IsAuthenticated)
+                        {
+                            <li>
+                                <span class="navbar-text">Hello @User.Identity.Name!</span>
+                            </li>
+                            <li>
+                                <a ng-href="" data-ng-click="logout()">Logout</a>
+                            </li>
+                        }
+                        else
+                        {
+                            <li>
+                                <a ng-href="#/login" data-ng-click="hideMenu()">Login</a>
+                            </li>
+                        }
+                    </ul>
+                </div>
+            </div>
+        </nav>
+    </header>
+
+    <aside id="menu" ng-controller="app.menu.ctrl">
+        <div class="navbar-collapse collapse">
             <ul class="nav nav-sidebar"
                 ng-include="'App/LoadSharedView?directory=menu&view=menu.cshtml&dateTime=@DateTime.Now'"
                 ng-init="entries = menuEntries;"></ul>
-        </aside>
+        </div>
+    </aside>
 
-        <section id="view">
-            <ui-view/>
-        </section>
-    </div>
+    <section id="view">
+        <ui-view/>
+    </section>
+</div>
 </body>
 </html>
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menu.cshtml
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menu.cshtml	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menu.cshtml	(revision 12435)
@@ -1,4 +1,5 @@
 ﻿<li ng-repeat="section in entries" ng-class="{'category':section.isCategory === true, 'active': isActive(section.route)}">
-    <a ng-href="{{section.route}}" ng-if="!section.isCategory">
+    <a ng-href="{{section.route}}" ng-if="!section.isCategory"
+       data-toggle="collapse" data-target="#menu .navbar-collapse">
         <span ng-if="section.icon != ''" ng-class="section.icon" style="padding-right: 10px;"></span>
         <span>{{section.name}}</span>
Index: /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menuCtrl.js
===================================================================
--- /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menuCtrl.js	(revision 12434)
+++ /trunk/sources/HeuristicLab.Services.WebApp/3.3/WebApp/shared/menu/menuCtrl.js	(revision 12435)
@@ -27,4 +27,8 @@
                 });
             };
+
+            $scope.hideMenu = function() {
+                $(".navbar-collapse").collapse('hide');
+            };
         }]
     );
