Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/HeuristicLab.Services.WebApp.Status.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/HeuristicLab.Services.WebApp.Status.csproj	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/HeuristicLab.Services.WebApp.Status.csproj	(revision 12425)
@@ -97,4 +97,5 @@
       <Project>{9fac0b23-2730-452a-9ba0-d7ca1746c541}</Project>
       <Name>HeuristicLab.Services.Access-3.3</Name>
+      <Private>False</Private>
     </ProjectReference>
     <ProjectReference Include="..\HeuristicLab.Services.Hive.DataAccess\3.3\HeuristicLab.Services.Hive.DataAccess-3.3.csproj">
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/history.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/history.cshtml	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/history.cshtml	(revision 12425)
@@ -34,5 +34,5 @@
 
 
-<div id="history">
+<div class="default-view-container">
     <div class="row">
         <div class="col-lg-12">
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/historyCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/historyCtrl.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/history/historyCtrl.js	(revision 12425)
@@ -1,4 +1,4 @@
 ﻿(function () {
-    var module = appStatusModule.getAngularModule();
+    var module = appStatusPlugin.getAngularModule();
     module.controller('app.status.historyCtrl',
         ['$scope', '$interval', 'app.status.data.service',
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/services/statusService.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/services/statusService.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/services/statusService.js	(revision 12425)
@@ -1,4 +1,4 @@
 ﻿(function () {
-    var module = appStatusModule.getAngularModule();
+    var module = appStatusPlugin.getAngularModule();
     var apiUrl = 'api/Status/Data/';
     module.factory('app.status.data.service',
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status.css
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status.css	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status.css	(revision 12425)
@@ -1,13 +1,5 @@
-﻿#status {
-  padding: 30px;
-}
-
-#history-header {
+﻿#history-header {
   padding: 30px;
   background: #F5F5F5;
   border-bottom: 1px solid #D3D3D3;
 }
-
-#history {
-  padding: 30px;
-}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/status.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/status.cshtml	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/status.cshtml	(revision 12425)
@@ -10,5 +10,5 @@
 </header>
 
-<div id="status">
+<div class="default-view-container">
     <div class="row">
         <div class="col-lg-3 col-md-6">
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/statusCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/statusCtrl.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/WebApp/status/statusCtrl.js	(revision 12425)
@@ -1,4 +1,4 @@
 ﻿(function () {
-    var module = appStatusModule.getAngularModule();
+    var module = appStatusPlugin.getAngularModule();
     module.controller('app.status.ctrl',
         ['$scope', '$interval', 'app.status.data.service',
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/status.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/status.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp.Status/status.js	(revision 12425)
@@ -1,7 +1,7 @@
-﻿var appStatusModule = app.registerModule('status');
+﻿var appStatusPlugin = app.registerPlugin('status');
 (function () {
-    var module = appStatusModule;
-    module.dependencies = ['ngResource', 'ui.knob', 'ui.bootstrap'];
-    module.files = [
+    var plugin = appStatusPlugin;
+    plugin.dependencies = ['ngResource', 'ui.knob', 'ui.bootstrap'];
+    plugin.files = [
         'WebApp/status.css',
         'WebApp/services/statusService.js',
@@ -9,7 +9,7 @@
         'WebApp/history/historyCtrl.js'
     ];
-    module.view = 'WebApp/status/status.cshtml';
-    module.controller = 'app.status.ctrl';
-    module.routes = [
+    plugin.view = 'WebApp/status/status.cshtml';
+    plugin.controller = 'app.status.ctrl';
+    plugin.routes = [
         new Route('history', 'WebApp/history/history.cshtml', 'app.status.historyCtrl')
     ];
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Configs/BundleConfig.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Configs/BundleConfig.cs	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Configs/BundleConfig.cs	(revision 12425)
@@ -61,17 +61,23 @@
         "~/WebApp/app.css"
       ));
+      AddOrUpdateWebAppBundle();
+    }
 
+    public static void AddOrUpdateWebAppBundle() {
+      var jsBundle = BundleTable.Bundles.GetBundleFor("~/Bundles/WebApp/js");
+      if (jsBundle != null) {
+        BundleTable.Bundles.Remove(jsBundle);
+      }
       var jsFiles = new List<string> {
         "~/WebApp/helper.js",
-        "~/WebApp/module.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/app.js");
-
-      var jsBundle = new ScriptBundle("~/Bundles/WebApp/js");
+      jsFiles.Add("~/WebApp/main.js");
+      jsBundle = new ScriptBundle("~/Bundles/WebApp/js");
       jsBundle.Include(jsFiles.ToArray());
       jsBundle.IncludeDirectory("~/WebApp/shared/", "*.js", true);
-      bundles.Add(jsBundle);
+      BundleTable.Bundles.Add(jsBundle);
     }
   }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AppController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AppController.cs	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AppController.cs	(revision 12425)
@@ -1,3 +1,4 @@
 ﻿using System.Web.Mvc;
+using HeuristicLab.Services.WebApp.Configs;
 
 namespace HeuristicLab.Services.WebApp.Controllers {
@@ -9,4 +10,5 @@
         return RedirectPermanent(Request.Url + "/");
       }
+      BundleConfig.AddOrUpdateWebAppBundle();
       return View("~/WebApp/shared/layout/layout.cshtml");
     }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AuthenticationController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AuthenticationController.cs	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/AuthenticationController.cs	(revision 12425)
@@ -23,5 +23,4 @@
       return true;
     }
-
   }
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/DataTransfer/Plugin.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/DataTransfer/Plugin.cs	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/DataTransfer/Plugin.cs	(revision 12425)
@@ -0,0 +1,10 @@
+﻿using System;
+
+namespace HeuristicLab.Services.WebApp.Controllers.DataTransfer {
+  public class Plugin {
+    public string Name { get; set; }
+    public string AssemblyName { get; set; }
+    public DateTime? LastReload { get; set; }
+    public int Reloads { get; set; }
+  }
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/PluginController.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/PluginController.cs	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/PluginController.cs	(revision 12425)
@@ -0,0 +1,28 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using System.Web.Http;
+using DTO = HeuristicLab.Services.WebApp.Controllers.DataTransfer;
+
+namespace HeuristicLab.Services.WebApp.Controllers {
+
+  [Authorize(Roles = "Hive Administrator")]
+  public class PluginController : ApiController {
+
+    private readonly PluginManager pluginManager = PluginManager.Instance;
+
+    public IEnumerable<DTO.Plugin> GetPlugins() {
+      var plugins = pluginManager.GetPlugins();
+      return plugins.Select(plugin => new DTO.Plugin {
+        Name = plugin.Name,
+        AssemblyName = plugin.AssemblyName,
+        LastReload = plugin.LastReload
+      });
+    }
+
+    public bool ReloadPlugin(string name) {
+      var plugin = PluginManager.Instance.GetPlugin(name);
+      plugin.ReloadControllers();
+      return true;
+    }
+  }
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/WebAppControllerSelector.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/WebAppControllerSelector.cs	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Controllers/WebAppControllerSelector.cs	(revision 12425)
@@ -2,9 +2,7 @@
 using System.Collections.Concurrent;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Reflection;
-using System.Web;
 using System.Web.Http;
 using System.Web.Http.Controllers;
@@ -14,10 +12,23 @@
   public class WebAppHttpControllerSelector : DefaultHttpControllerSelector {
     private readonly HttpConfiguration configuration;
-    private readonly IDictionary<string, IDictionary<string, HttpControllerDescriptor>> plugins;
+    private readonly IDictionary<string, HttpControllerDescriptor> controllers;
+    private readonly PluginManager pluginManager = PluginManager.Instance;
 
     public WebAppHttpControllerSelector(HttpConfiguration configuration)
       : base(configuration) {
       this.configuration = configuration;
-      plugins = new ConcurrentDictionary<string, IDictionary<string, HttpControllerDescriptor>>();
+      pluginManager.Configuration = configuration;
+      controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>();
+      LoadAppControllers();
+    }
+
+    private void LoadAppControllers() {
+      var assembly = Assembly.GetExecutingAssembly();
+      var assemblyTypes = assembly.GetTypes();
+      var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList();
+      foreach (var apiController in apiControllers) {
+        var apiControllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower();
+        controllers.Add(apiControllerName, new HttpControllerDescriptor(configuration, apiControllerName, apiController));
+      }
     }
 
@@ -31,39 +42,19 @@
         throw new ArgumentException("invalid request path");
       }
-      string pluginName = parts[startIndex + 1];
+      string pluginName = parts[startIndex + 1].ToLower();
       string controllerName = parts[startIndex + 2].ToLower();
-      IDictionary<string, HttpControllerDescriptor> controllers;
-      if (!plugins.TryGetValue(pluginName, out controllers)) {
-        var assembly = Assembly.GetExecutingAssembly();
-        try {
-          if (pluginName != "App") {
-            string directory = string.Format(@"{0}WebApp\plugins\{1}\", HttpRuntime.AppDomainAppPath, pluginName);
-            string[] assemblies = Directory.GetFiles(directory, string.Format("HeuristicLab.Services.WebApp.{0}*.dll", pluginName));
-            if (assemblies.Length < 1) {
-              throw new ArgumentException("invalid plugin '{0}'", pluginName);
-            }
-            assembly = Assembly.Load(File.ReadAllBytes(assemblies.First()));
-          }
-          var assemblyTypes = assembly.GetTypes();
-          var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList();
-          if (apiControllers.Any()) {
-            controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>();
-            foreach (var apiController in apiControllers) {
-              var apiControllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower();
-              controllers.Add(apiControllerName, new HttpControllerDescriptor(configuration, apiControllerName, apiController));
-            }
-            plugins.Add(pluginName, controllers);
-          }
-        }
-        catch (Exception) {
-          throw new ArgumentException("error loading plugin '{0}'", pluginName);
-        }
+      // load controller
+      if (pluginName == "app") {
+        // from main app
+        HttpControllerDescriptor controller;
+        controllers.TryGetValue(controllerName, out controller);
+        return controller;
       }
-      if (controllers == null) {
-        throw new ArgumentException("invalid plugin '{0}'", pluginName);
+      // from plugin
+      var plugin = pluginManager.GetPlugin(pluginName);
+      if (plugin == null) {
+        throw new ArgumentException(string.Format("invalid plugin '{0}'", pluginName));
       }
-      HttpControllerDescriptor controller;
-      controllers.TryGetValue(controllerName, out controller);
-      return controller;
+      return plugin.GetController(controllerName);
     }
   }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/HeuristicLab.Services.WebApp.csproj
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/HeuristicLab.Services.WebApp.csproj	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/HeuristicLab.Services.WebApp.csproj	(revision 12425)
@@ -129,16 +129,20 @@
     <Compile Include="Controllers\AppController.cs" />
     <Compile Include="Controllers\AuthenticationController.cs" />
+    <Compile Include="Controllers\DataTransfer\Plugin.cs" />
     <Compile Include="Controllers\DataTransfer\User.cs" />
+    <Compile Include="Controllers\PluginController.cs" />
     <Compile Include="Controllers\WebAppControllerSelector.cs" />
     <Compile Include="Global.asax.cs">
       <DependentUpon>Global.asax</DependentUpon>
     </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="PluginManager.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="WebApp\app.css" />
-    <Content Include="WebApp\app.js" />
     <Content Include="favicon.ico" />
     <Content Include="Global.asax" />
+    <Content Include="WebApp\main.js" />
     <Content Include="WebApp\helper.js" />
     <Content Include="WebApp\HeuristicLab.ico" />
@@ -163,5 +167,5 @@
     <Content Include="WebApp\libs\misc\respond.min.js" />
     <Content Include="WebApp\libs\smoothScroll\smoothScroll.js" />
-    <Content Include="WebApp\module.js" />
+    <Content Include="WebApp\app.js" />
     <Content Include="WebApp\plugins\login\login.css">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
@@ -179,4 +183,5 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </Content>
+    <Content Include="WebApp\plugins\plugins\pluginsService.js" />
     <Content Include="WebApp\shared\directives\flot.js" />
     <Content Include="WebApp\libs\angularjs\angular-ui\ui-bootstrap-tpls-0.13.0.min.js" />
@@ -240,4 +245,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Services.Access\3.3\HeuristicLab.Services.Access-3.3.csproj">
+      <Project>{9fac0b23-2730-452a-9ba0-d7ca1746c541}</Project>
+      <Name>HeuristicLab.Services.Access-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\HeuristicLab.Services.Hive.DataAccess\3.3\HeuristicLab.Services.Hive.DataAccess-3.3.csproj">
       <Project>{ec2c8109-6e1e-4c88-9a2b-908cff2ef4ac}</Project>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Plugin.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Plugin.cs	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/Plugin.cs	(revision 12425)
@@ -0,0 +1,63 @@
+﻿using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Web.Http;
+using System.Web.Http.Controllers;
+
+namespace HeuristicLab.Services.WebApp {
+  public class Plugin {
+    private HttpConfiguration configuration;
+    public string Name { get; set; }
+    public string Directory { get; set; }
+    public string AssemblyName { get; set; }
+    public DateTime? LastReload { get; set; }
+
+    private IDictionary<string, HttpControllerDescriptor> controllers;
+    public IDictionary<string, HttpControllerDescriptor> Controllers {
+      get { return controllers ?? (controllers = new ConcurrentDictionary<string, HttpControllerDescriptor>()); }
+    }
+
+    public void Configure(HttpConfiguration configuration) {
+      if (this.configuration != configuration) {
+        this.configuration = configuration;
+        ReloadControllers();
+      }
+    }
+
+    public HttpControllerDescriptor GetController(string name) {
+      HttpControllerDescriptor controller;
+      Controllers.TryGetValue(name, out controller);
+      return controller;
+    }
+
+    public void ReloadControllers() {
+      AssemblyName = null;
+      Controllers.Clear();
+      LastReload = DateTime.Now;
+      if (configuration == null)
+        return;
+      try {
+        string searchPattern = string.Format("HeuristicLab.Services.WebApp.{0}*.dll", Name);
+        var assemblies = System.IO.Directory.GetFiles(Directory, searchPattern);
+        if (!assemblies.Any())
+          return;
+        var assemblyPath = assemblies.First();
+        var assembly = Assembly.Load(File.ReadAllBytes(assemblyPath));
+        var assemblyTypes = assembly.GetTypes();
+        var apiControllers = assemblyTypes.Where(c => typeof(ApiController).IsAssignableFrom(c)).ToList();
+        foreach (var apiController in apiControllers) {
+          var controllerName = apiController.Name.Remove(apiController.Name.Length - 10).ToLower();
+          Controllers.Add(controllerName, new HttpControllerDescriptor(configuration, controllerName, apiController));
+        }
+        AssemblyName = Path.GetFileName(assemblyPath);
+      }
+      catch (Exception) {
+        AssemblyName = "Error loading assembly";
+        Controllers.Clear();
+      }
+    }
+  }
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/PluginManager.cs
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/PluginManager.cs	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/PluginManager.cs	(revision 12425)
@@ -0,0 +1,66 @@
+﻿using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.IO;
+using System.Web;
+using System.Web.Http;
+
+namespace HeuristicLab.Services.WebApp {
+  public class PluginManager {
+
+    private static PluginManager instance;
+    public static PluginManager Instance {
+      get { return instance ?? (instance = new PluginManager()); }
+    }
+
+    private readonly IDictionary<string, Plugin> plugins;
+
+    public HttpConfiguration Configuration { get; set; }
+
+    private string PluginsDirectory {
+      get { return string.Format(@"{0}WebApp\plugins", HttpRuntime.AppDomainAppPath); }
+    }
+
+    public PluginManager() {
+      plugins = new ConcurrentDictionary<string, Plugin>();
+    }
+
+    public Plugin GetPlugin(string name) {
+      Plugin plugin;
+      plugins.TryGetValue(name, out plugin);
+      if (plugin == null) {
+        string directory = string.Format(@"{0}\{1}", PluginsDirectory, name);
+        if (Directory.Exists(directory)) {
+          plugin = new Plugin {
+            Name = name,
+            Directory = directory
+          };
+          plugin.Configure(Configuration);
+          plugins.Add(name, plugin);
+        }
+      }
+      return plugin;
+    }
+
+    public IEnumerable<Plugin> GetPlugins() {
+      DiscoverPlugins();
+      return plugins.Values;
+    }
+
+    private void DiscoverPlugins() {
+      var pluginDirectories = Directory.GetDirectories(PluginsDirectory);
+      foreach (var directory in pluginDirectories) {
+        string pluginName = Path.GetFileName(directory);
+        Plugin plugin;
+        plugins.TryGetValue(pluginName, out plugin);
+        if (plugin == null) {
+          plugin = new Plugin {
+            Name = pluginName,
+            Directory = directory
+          };
+          plugin.Configure(Configuration);
+          plugins.Add(pluginName, plugin);
+        }
+      }
+    }
+  }
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.css
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.css	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.css	(revision 12425)
@@ -314,2 +314,7 @@
   text-shadow: none !important;
 }
+
+
+.default-view-container {
+  padding: 30px;
+}
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/app.js	(revision 12425)
@@ -1,68 +1,167 @@
-﻿var appMainModule = app.registerModule(appName);
-appMainModule.dependencies = ['oc.lazyLoad', 'ui.router', 'angular-loading-bar', 'ngResource'];
-appMainModule.loadModule();
-(function () {
-    'use strict';
-    var module = appMainModule.getAngularModule();
+﻿// app configuration
+var appName = 'app';
+var appPath = 'WebApp';
 
-    module.config(['$ocLazyLoadProvider', function ($ocLazyLoadProvider) {
-        app.modules.forEach(function (module) {
-            $ocLazyLoadProvider.config({
-                modules: [{
-                    name: module.getFullModuleName(),
-                    files: module.getFiles()
-                }]
+// route, plugin, menu, section and main app
+var Route = function (name, view, controller) {
+    this.name = name;
+    this.view = view;
+    this.controller = controller;
+};
+
+var Plugin = function (pluginName) {
+    this.name = pluginName;
+    this.parent = appName;
+    this.view = '';
+    this.controller = '';
+    this.dependencies = [];
+    this.routes = [];
+    this.files = [];
+
+    this.getPluginDirectory = function () {
+        return appPath + '/plugins/' + this.name + '/';
+    };
+
+    this.getFullPluginName = function() {
+        if (this.name.localeCompare(appName) == 0) {
+            return this.name;
+        }
+        return this.parent + '.' + this.name;
+    };
+
+    this.getRouteName = function() {
+        return '/' + this.name;
+    };
+
+    this.getAngularModule = function() {
+        return angular.module(this.getFullPluginName());
+    };
+
+    this.getFilePath = function (file) {
+        return this.getPluginDirectory() + file;
+    };
+
+    this.getViewUrl = function (view) {
+        return 'plugin=' + this.name + '&view=' + view;
+    };
+
+    // getFiles is used in the lazy loading provider 
+    this.getFiles = function () {
+        var plugin = this;
+        var filesToLoad = [];
+        plugin.files.forEach(function (file) {
+            filesToLoad.push(plugin.getFilePath(file));
+        });
+        return filesToLoad;
+    };
+
+    this.configureRoutes = function ($stateProvider) {
+        var plugin = this;
+        this.routes.forEach(function (route) {
+            $stateProvider.state(plugin.name + route.name, {
+                url: '/' + plugin.name + '/' + route.name,
+                controller: route.controller,
+                templateUrl: plugin.getViewUrl(route.view),
+                cache: false,
+                resolve: {
+                    loadPlugin: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
+                        cfpLoadingBar.start();
+                        var retVal = plugin.load($ocLazyLoad);
+                        cfpLoadingBar.complete();
+                        return retVal;
+                    }]
+                }
             });
         });
-    }]);
+    };
 
-    module.config([
-        '$stateProvider', '$urlRouterProvider',
-        function ($stateProvider, $urlRouterProvider) {
-            $urlRouterProvider.otherwise('/status');
-            // load module routes
-            app.modules.forEach(function (module) {
-                // home route
-                $stateProvider.state(module.name, {
-                    url: module.getRouteName(),
-                    controller: module.getController(),
-                    templateUrl: module.getViewUrl(module.getView()),
-                    cache: false,
-                    resolve: {
-                        loadModule: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
-                            cfpLoadingBar.start();
-                            var retVal = module.loadModule($ocLazyLoad);
-                            cfpLoadingBar.complete();
-                            return retVal;
-                        }]
-                    }
-                });
-                // sub-routes
-                module.configureRoutes($stateProvider);
+    this.load = function ($ocLazyLoad) {
+        var plugin = this;
+        var params = [];
+        var lazyLoadingFiles = [];
+        plugin.dependencies.forEach(function (dependency) {
+            params.push(dependency);
+        });
+        plugin.files.forEach(function (file) {
+            lazyLoadingFiles.push(plugin.getFilePath(file));
+        });
+        // load required files
+        var lazyLoaded = null;
+        if (!($ocLazyLoad === undefined || $ocLazyLoad === null)) {
+            lazyLoaded = $ocLazyLoad.load(plugin.getFullPluginName());
+        }
+        // load angular module
+        angular.module(this.getFullPluginName(), params);
+        return lazyLoaded;
+    };
+};
+
+var Section = function (name, index) {
+    this.name = name;
+    this.index = index;
+    this.entries = [];
+
+    this.addEntry = function (entry) {
+        this.entries.push(entry);
+    };
+};
+
+var Menu = function () {
+    this.sections = [];
+    this.nextIndex = 0;
+
+    this.getSection = function (name, index) {
+        var length = this.sections.length;
+        for (var i = 0; i < length; ++i) {
+            var section = this.sections[i];
+            if (section.name == name) {
+                return section;
+            }
+        }
+        if (index === undefined || index === null) {
+            this.nextIndex++;
+            index = this.nextIndex;
+        } else {
+            if (index > this.nextIndex) {
+                this.nextIndex = index;
+            }
+        }
+        var newSection = new Section(name, index);
+        this.sections.push(newSection);
+        return newSection;
+    };
+
+    this.getMenuEntries = function () {
+        var entries = [];
+        this.sections.sort(function (a, b) {
+            return parseFloat(a.index) - parseFloat(b.index);
+        });
+        this.sections.forEach(function (section) {
+            entries.push({ name: section.name, isCategory: true, route: '?' });
+            section.entries.sort(function(a, b) {
+                return parseFloat(a.index) - parseFloat(b.index);
             });
+            section.entries.forEach(function (entry) {
+                entries.push(entry);
+            });
+        });
+        return entries;
+    };
+};
+
+// app that holds references to plugins and menu
+var app = new function () {
+    this.plugins = [];
+    this.registerPlugin = function (name) {
+        var plugin = new Plugin(name);
+        if (name.localeCompare(appName) != 0) {
+            this.plugins.push(plugin);
         }
-    ]);
+        return plugin;
+    };
 
-    module.config([
-        '$httpProvider', function ($httpProvider) {
-            $httpProvider.interceptors.push(['$q', function ($q) {
-                return {
-                    'request': function (config) {
-                        if (endsWith(config.url, '.cshtml')) {
-                            config.url = 'App/LoadPluginView?' + config.url + "&dateTime=" + Date.now().toString();
-                        }
-                        return config;
-                    }
-                };
-            }]);
-        }
-    ]);
-
-    function endsWith(str, suffix) {
-        if (suffix.length > str.length) {
-            return false;
-        }
-        return str.indexOf(suffix, str.length - suffix.length) !== -1;
-    }
-
-})();
+    this.menu = new Menu();
+    this.getMenu = function () {
+        return this.menu;
+    };
+};
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/helper.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/helper.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/helper.js	(revision 12425)
@@ -32,2 +32,14 @@
     return year + '-' + month + '-' + day + 'T23:59:59.000Z';
 };
+
+
+var CSharpDateToString = function (datetime) {
+    var date = new Date(Date.parse(datetime));
+    var day = date.getDate().zeropad(2);
+    var month = (1 + date.getMonth()).zeropad(2);
+    var year = date.getFullYear();
+    var hour = date.getHours().zeropad(2);
+    var minute = date.getMinutes().zeropad(2);
+    var second = date.getSeconds().zeropad(2);
+    return day + '.' + month + '.' + year + ' ' + hour + ':' + minute + ':' + second;
+};
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/main.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/main.js	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/main.js	(revision 12425)
@@ -0,0 +1,67 @@
+﻿// main app as plugin
+var appMainPlugin = app.registerPlugin(appName);
+appMainPlugin.dependencies = ['oc.lazyLoad', 'ui.router', 'angular-loading-bar', 'ngResource'];
+appMainPlugin.load();
+(function () {
+    'use strict';
+    var module = appMainPlugin.getAngularModule();
+    module.config(['$ocLazyLoadProvider', function ($ocLazyLoadProvider) {
+        app.plugins.forEach(function (plugin) {
+            $ocLazyLoadProvider.config({
+                modules: [{
+                    name: plugin.getFullPluginName(),
+                    files: plugin.getFiles()
+                }]
+            });
+        });
+    }]);
+
+    module.config([
+        '$stateProvider', '$urlRouterProvider',
+        function ($stateProvider, $urlRouterProvider) {
+            $urlRouterProvider.otherwise('/status');
+            // load module routes
+            app.plugins.forEach(function (plugin) {
+                // home route
+                $stateProvider.state(plugin.name, {
+                    url: plugin.getRouteName(),
+                    controller: plugin.controller,
+                    templateUrl: plugin.getViewUrl(plugin.view),
+                    cache: false,
+                    resolve: {
+                        loadModule: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
+                            cfpLoadingBar.start();
+                            var retVal = plugin.load($ocLazyLoad);
+                            cfpLoadingBar.complete();
+                            return retVal;
+                        }]
+                    }
+                });
+                // sub-routes
+                plugin.configureRoutes($stateProvider);
+            });
+        }
+    ]);
+
+    module.config([
+        '$httpProvider', function ($httpProvider) {
+            $httpProvider.interceptors.push(['$q', function ($q) {
+                return {
+                    'request': function (config) {
+                        if (endsWith(config.url, '.cshtml')) {
+                            config.url = 'App/LoadPluginView?' + config.url + "&dateTime=" + Date.now().toString();
+                        }
+                        return config;
+                    }
+                };
+            }]);
+        }
+    ]);
+
+    function endsWith(str, suffix) {
+        if (suffix.length > str.length) {
+            return false;
+        }
+        return str.indexOf(suffix, str.length - suffix.length) !== -1;
+    }
+})();
Index: anches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/module.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/module.js	(revision 12424)
+++ 	(revision )
@@ -1,190 +1,0 @@
-﻿var appName = 'app';
-var appPath = 'WebApp';
-
-var Route = function (name, view, controller) {
-    this.name = name;
-    this.view = view;
-    this.controller = controller;
-};
-
-var Module = function (moduleName) {
-    this.name = moduleName;
-    this.parent = 'app';
-    this.view = moduleName + '.cshtml';
-    this.controller = this.parent + "." + this.name + ".ctrl";
-    this.dependencies = [];
-    this.routes = [];
-    this.files = [];
-
-    this.getModulePath = function() {
-        return appPath + '/plugins/' + this.name + '/';
-    };
-
-    this.getFullModuleName = function () {
-        if (moduleName.localeCompare(appName) == 0) {
-            return this.name;
-        }
-        return this.parent + '.' + this.name;
-    };
-
-    this.getRouteName = function() {
-        return '/' + this.name;
-    }
-
-    this.getServiceName = function() {
-        return this.parent + "." + this.name + ".service";
-    };
-
-    this.getControllerName = function() {
-        return this.parent + "." + this.name + ".ctrl";
-    }
-
-    this.getAngularModule = function() {
-        return angular.module(this.getFullModuleName());
-    };
-
-    this.getFilePath = function(file) {
-        return this.getModulePath() + file;
-    };
-
-    this.getViewUrl = function(view) {
-        return 'plugin=' + this.name + '&view=' + view;
-    };
-
-    this.getFiles = function() {
-        var module = this;
-        var filesToLoad = [];
-        module.files.forEach(function(file) {
-            filesToLoad.push(module.getFilePath(file));
-        });
-        return filesToLoad;
-    };
-
-    this.getView = function() {
-        return this.view;
-    };
-
-    this.getController = function() {
-        return this.controller;
-    };
-
-    this.setView = function(view) {
-        this.view = view;
-    };
-
-    this.setController = function(ctrl) {
-        this.controller = ctrl;
-    };
-
-    this.configureFiles = function() {
-        var module = this.getAngularModule();
-        module.requires.push();
-    };
-
-    this.configureRoutes = function ($stateProvider) {
-        var module = this;
-        this.routes.forEach(function(route) {
-            $stateProvider.state(module.name + route.name, {
-                url: '/' + module.name + '/' + route.name,
-                controller: route.controller,
-                templateUrl: module.getViewUrl(route.view),
-                cache: false,
-                resolve: {
-                    loadModule: ['$ocLazyLoad', 'cfpLoadingBar', function ($ocLazyLoad, cfpLoadingBar) {
-                        cfpLoadingBar.start();
-                        var retVal = module.loadModule($ocLazyLoad);
-                        cfpLoadingBar.complete();
-                        return retVal;
-                    }]
-                }
-            });
-        });
-    };
-
-    this.loadModule = function ($ocLazyLoad) {
-        var module = this;
-        var params = [];
-        var lazyLoadingFiles = [];
-        module.dependencies.forEach(function (dependency) {
-            params.push(dependency);
-        });
-        module.files.forEach(function (file) {
-            lazyLoadingFiles.push(module.getFilePath(file));
-        });
-        // load required files
-        var lazyLoaded = null;
-        if (!($ocLazyLoad === undefined || $ocLazyLoad === null)) {
-            lazyLoaded = $ocLazyLoad.load(module.getFullModuleName());
-        }
-        // load angular module
-        angular.module(this.getFullModuleName(), params);
-        return lazyLoaded;
-    };
-};
-
-
-var Menu = function () {
-    this.sections = [];
-    this.nextIndex = 0;
-
-    this.getSection = function (name, index) {
-        var length = this.sections.length;
-        for (var i = 0; i < length; ++i) {
-            var section = this.sections[i];
-            if (section.name == name) {
-                return section;
-            }
-        }
-        if (index === undefined || index === null) {
-            this.nextIndex++;
-            index = this.nextIndex;
-        } else {
-            if (index > this.nextIndex) {
-                this.nextIndex = index;
-            }
-        }
-        var newSection = new Section(name, index);
-        this.sections.push(newSection);
-        return newSection;
-    };
-
-    this.getMenuEntries = function () {
-        var entries = [];
-        this.sections.sort(function (a, b) {
-            return parseFloat(a.index) - parseFloat(b.index);
-        });
-        this.sections.forEach(function (section) {
-            entries.push({name: section.name, isCategory: true, route: '?'});
-            section.entries.forEach(function (entry) {
-                entries.push(entry);
-            });
-        });
-        return entries;
-    };
-};
-
-var Section = function (name, index) {
-    this.name = name;
-    this.index = index;
-    this.entries = [];
-
-    this.addEntry = function (entry) {
-        this.entries.push(entry);
-    };
-};
-
-var app = new function () {
-    this.modules = [];
-    this.registerModule = function (moduleName) {
-        var module = new Module(moduleName);
-        if (moduleName.localeCompare(appName) != 0) {
-            this.modules.push(module);
-        }
-        return module;
-    };
-
-    this.menu = new Menu();
-    this.getMenu = function () {
-        return this.menu;
-    };
-};
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.cshtml	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.cshtml	(revision 12425)
@@ -1,4 +1,3 @@
-﻿@using System.Web.Security
-<div id="login">
+﻿<div class="default-view-container">
     <div class="row">
         <div class="col-md-6 center-block" style="float: none">
@@ -27,5 +26,5 @@
                         </div>
                         <div class="form-group">
-                            <input type="submit" value="Login" href="#" class="btn btn-default pull-right" data-ng-click="login()"/>
+                            <input type="submit" value="Login" href="#" class="btn btn-default pull-right" data-ng-click="login()" />
                         </div>
                     </form>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.css
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.css	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.css	(revision 12425)
@@ -1,7 +1,3 @@
-﻿#login {
-  padding: 30px;
-}
-
-.loginError {
+﻿.loginError {
   padding: 15px;  
 }
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/login.js	(revision 12425)
@@ -1,12 +1,12 @@
-﻿var appLoginModule = app.registerModule('login');
+﻿var appLoginPlugin = app.registerPlugin('login');
 (function () {
-    var module = appLoginModule;
-    module.dependencies = ['ngResource', 'ui.bootstrap'];
-    module.files = [
+    var plugin = appLoginPlugin;
+    plugin.dependencies = ['ngResource', 'ui.bootstrap'];
+    plugin.files = [
         'loginCtrl.js',
         'login.css'
     ];
-    module.view = 'login.cshtml';
-    module.controller = appLoginModule.getControllerName();
-    module.routes = [];
+    plugin.view = 'login.cshtml';
+    plugin.controller = 'app.login.ctrl';
+    plugin.routes = [];
 })();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/loginCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/loginCtrl.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/login/loginCtrl.js	(revision 12425)
@@ -1,6 +1,5 @@
 ﻿(function () {
-    var moduleName = appLoginModule.getFullModuleName();
-    var module = appLoginModule.getAngularModule();
-    module.controller(appLoginModule.getControllerName(),
+    var module = appLoginPlugin.getAngularModule();
+    module.controller('app.login.ctrl',
         ['$scope', '$window', 'app.authentication.service', function ($scope, $window, authService) {
             $scope.login = function () {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.cshtml	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.cshtml	(revision 12425)
@@ -1,1 +1,33 @@
-﻿<h1>{{test}}</h1>
+﻿<div class="default-view-container">
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="panel panel-default">
+                <div class="panel-heading">
+                    <h3 class="panel-title">WebApp Plugins</h3>
+                </div>
+                <div class="panel-body">
+                    <table class="table table-hover table-condensed">
+                        <thead>
+                            <tr>
+                                <th>#</th>
+                                <th>Name</th>
+                                <th>Assembly</th>
+                                <th>Last reload</th>
+                                <th></th>
+                            </tr>
+                        </thead>
+                        <tr ng-repeat="plugin in plugins">
+                            <td>{{$index + 1}}</td>
+                            <td>{{plugin.Name}}</td>
+                            <td>{{plugin.AssemblyName}}</td>
+                            <td>{{plugin.LastReload}}</td>
+                            <td>
+                                <a ng-href="" data-ng-click="reloadPlugin(plugin.Name)">Reload</a>
+                            </td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/plugins.js	(revision 12425)
@@ -1,14 +1,18 @@
-﻿var appPluginsModule = app.registerModule('plugins');
+﻿var appPluginsPlugin = app.registerPlugin('plugins');
 (function () {
-    var module = appPluginsModule;
-    module.dependencies = ['ngResource', 'ui.bootstrap'];
-    module.files = ['pluginsCtrl.js'];
-    module.view = 'plugins.cshtml';
-    module.controller = 'app.plugins.ctrl';
-    module.routes = [];
+    var plugin = appPluginsPlugin;
+    plugin.dependencies = ['ngResource', 'ui.bootstrap'];
+    plugin.files = [
+        'pluginsService.js',
+        'pluginsCtrl.js'
+    ];
+    plugin.view = 'plugins.cshtml';
+    plugin.controller = 'app.plugins.ctrl';
+    plugin.routes = [];
 
     var menu = app.getMenu();
     var section = menu.getSection('Administration', -1);
     section.addEntry({
+        index: 10,
         name: 'Plugins',
         route: '#/plugins',
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsCtrl.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsCtrl.js	(revision 12425)
@@ -1,7 +1,31 @@
 ﻿(function () {
-    var module = appPluginsModule.getAngularModule();
+    var module = appPluginsPlugin.getAngularModule();
     module.controller('app.plugins.ctrl',
-        ['$scope', function ($scope) {
-            $scope.test = "a test message";
+        ['$scope', 'app.plugins.service', function ($scope, pluginService) {
+            var getPlugins = function () {
+                pluginService.getPlugins({}, function (plugins) {
+                    $scope.plugins = plugins;
+                    var length = $scope.plugins.length;
+                    for (var i = 0; i < length; ++i) {
+                        if (!isDefined($scope.plugins[i].AssemblyName)) {
+                            $scope.plugins[i].AssemblyName = 'Not found';
+                        }
+                        var datetime = $scope.plugins[i].LastReload;
+                        if (isDefined(datetime)) {
+                            $scope.plugins[i].LastReload = CSharpDateToString(datetime);
+                        } else {
+                            $scope.plugins[i].LastReload = 'Never';
+                        }
+                    }
+                });
+            };
+
+            $scope.reloadPlugin = function (name) {
+                pluginService.reloadPlugin({ name: name }, function() {
+                    getPlugins();
+                });
+            };
+
+            getPlugins();
         }]
     );
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsService.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsService.js	(revision 12425)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/plugins/plugins/pluginsService.js	(revision 12425)
@@ -0,0 +1,12 @@
+﻿(function () {
+    var apiUrl = 'api/App/Plugin/';
+    var module = appPluginsPlugin.getAngularModule();
+    module.factory('app.plugins.service',
+        ['$resource', function ($resource) {
+            return $resource(apiUrl + ':action', { name: "@name" }, {
+                getPlugins: { method: 'GET', params: { action: 'GetPlugins' }, isArray: true },
+                reloadPlugin: { method: 'POST', params: { action: 'ReloadPlugin' } }
+            });
+        }]
+    );
+})();
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/directives/flot.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/directives/flot.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/directives/flot.js	(revision 12425)
@@ -1,4 +1,4 @@
 ﻿(function () {
-    var module = appMainModule.getAngularModule();
+    var module = appMainPlugin.getAngularModule();
     module.directive('flot', function () {
         return {
@@ -41,5 +41,4 @@
                         chart.setupGrid();
                         chart.draw();
-
                     }
                 });
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/layout/layout.cshtml
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/layout/layout.cshtml	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/layout/layout.cshtml	(revision 12425)
@@ -1,3 +1,4 @@
-﻿<!DOCTYPE html>
+﻿@using HeuristicLab.Services.WebApp.Configs
+<!DOCTYPE html>
 <html lang="en" ng-app="app">
 <head>
@@ -25,5 +26,5 @@
     <div id="app">
         <header id="toolbar" class="navbar navbar-default navbar-static-top no-border no-padding-margin"
-                ng-controller="app.menu">
+                ng-controller="app.menu.ctrl">
             <nav>
                 <div class="container-fluid">
@@ -61,5 +62,5 @@
         </header>
 
-        <aside id="menu" ng-controller="app.menu">
+        <aside id="menu" ng-controller="app.menu.ctrl">
             <ul class="nav nav-sidebar"
                 ng-include="'App/LoadSharedView?directory=menu&view=menu.cshtml&dateTime=@DateTime.Now'"
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/menu/menuCtrl.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/menu/menuCtrl.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/menu/menuCtrl.js	(revision 12425)
@@ -1,5 +1,5 @@
 ﻿(function () {
-    var module = appMainModule.getAngularModule();
-    module.controller('app.menu',
+    var module = appMainPlugin.getAngularModule();
+    module.controller('app.menu.ctrl',
         ['$scope', '$timeout', '$location', '$window', 'app.authentication.service',
         function ($scope, $timeout, $location, $window, authService) {
Index: /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/services/authenticationService.js
===================================================================
--- /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/services/authenticationService.js	(revision 12424)
+++ /branches/HiveStatistics/sources/HeuristicLab.Services.WebApp/WebApp/shared/services/authenticationService.js	(revision 12425)
@@ -1,5 +1,5 @@
 ﻿(function () {
     var apiUrl = 'api/App/Authentication/';
-    var module = appMainModule.getAngularModule();
+    var module = appMainPlugin.getAngularModule();
     module.factory('app.authentication.service',
         ['$resource', function ($resource) {
