Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.3/HeuristicLabAlgorithmsDataAnalysisPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.3/HeuristicLabAlgorithmsDataAnalysisPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.3/HeuristicLabAlgorithmsDataAnalysisPlugin.cs.frame	(revision 4490)
@@ -28,4 +28,15 @@
   [Plugin("HeuristicLab.Algorithms.DataAnalysis", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Algorithms.DataAnalysis-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Regression", "3.3")]
   public class HeuristicLabAlgorithmsDataAnalysisPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/HeuristicLabAlgorithmsTabuSearchPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/HeuristicLabAlgorithmsTabuSearchPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Algorithms.TabuSearch/3.3/HeuristicLabAlgorithmsTabuSearchPlugin.cs.frame	(revision 4490)
@@ -35,4 +35,5 @@
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLabEncodingsRealVectorEncodingPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLabEncodingsRealVectorEncodingPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLabEncodingsRealVectorEncodingPlugin.cs.frame	(revision 4490)
@@ -37,4 +37,5 @@
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
   public class HeuristicLabEncodingsRealVectorEncodingPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views/3.3/HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin.cs.frame	(revision 4490)
@@ -28,10 +28,11 @@
   [Plugin("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views", "3.3.0.$WCREV$")]
   [PluginFile("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.3.dll", PluginFileType.Assembly)]
-  [PluginDependency("HeuristicLab.Collections", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Common", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Core", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.MainForm", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3.0.0")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   public class HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj	(revision 4489)
+++ trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/HeuristicLab.MainForm.WindowsForms-3.3.csproj	(revision 4490)
@@ -203,4 +203,8 @@
       <Name>HeuristicLab.Common-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\HeuristicLab.WinFormsUI-2.3.1\HeuristicLab.WinFormsUI-2.3.1.csproj">
+      <Project>{678E2145-8152-4E19-9646-07D439D00301}</Project>
+      <Name>HeuristicLab.WinFormsUI-2.3.1 %28HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\HeuristicLab.WinFormsUI-2.3.1\HeuristicLab.WinFormsUI-2.3.1%29</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.WinFormsUI\2.3.1\WinFormsUI-2.3.1\WinFormsUI-2.3.1.csproj">
       <Project>{1849A92E-DCFC-4E05-BB0A-D7B7A3DAFCFB}</Project>
Index: trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Operators.Programmable/3.3/HeuristicLabOperatorsProgrammablePlugin.cs.frame	(revision 4490)
@@ -30,4 +30,6 @@
   [PluginDependency("HeuristicLab.CodeEditor", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
@@ -36,4 +38,5 @@
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabOperatorsProgrammablePlugin : PluginBase {
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLabOperatorsViewsGraphVisualizationPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLabOperatorsViewsGraphVisualizationPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLabOperatorsViewsGraphVisualizationPlugin.cs.frame	(revision 4490)
@@ -33,4 +33,5 @@
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
@@ -39,4 +40,5 @@
   [PluginDependency("HeuristicLab.Netron", "3.0")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabOperatorsViewsGraphVisualizationPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLabOptimizationOperatorsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLabOptimizationOperatorsPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Optimization.Operators/3.3/HeuristicLabOptimizationOperatorsPlugin.cs.frame	(revision 4490)
@@ -33,4 +33,5 @@
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization","3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 4490)
@@ -33,4 +33,6 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
Index: trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLabProblemsDataAnalysisPlugin.cs.frame	(revision 4490)
@@ -29,15 +29,16 @@
   [PluginFile("HeuristicLab.Problems.DataAnalysis-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.ALGLIB", "2.5")]
-  [PluginDependency("HeuristicLab.Collections", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Common", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Common.Resources", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Core", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Data", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3.0.0")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3")]
   [PluginDependency("HeuristicLab.LibSVM", "1.6.3.0")]
-  [PluginDependency("HeuristicLab.Operators", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Parameters", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Persistence", "3.3.0.0")]
-  [PluginDependency("HeuristicLab.Random", "3.3.0.0")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization","3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
   public class HeuristicLabProblemsDataAnalysisPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP.Views/3.3/HeuristicLabProblemsExternalEvaluationGPViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP.Views/3.3/HeuristicLabProblemsExternalEvaluationGPViewsPlugin.cs.frame	(revision 4489)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP.Views/3.3/HeuristicLabProblemsExternalEvaluationGPViewsPlugin.cs.frame	(revision 4490)
@@ -33,7 +33,9 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
   [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation.GP", "3.3")]
   [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.3")]
   public class HeuristicLabProblemsExternalEvaluationGPViewsPlugin : PluginBase { }
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP/3.3/HeuristicLab.Problems.ExternalEvaluation.GP-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP/3.3/HeuristicLab.Problems.ExternalEvaluation.GP-3.3.csproj	(revision 4489)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation.GP/3.3/HeuristicLab.Problems.ExternalEvaluation.GP-3.3.csproj	(revision 4490)
@@ -153,4 +153,8 @@
       <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.ProtobufCS\0.9.1\HeuristicLab.ProtobufCS\HeuristicLab.ProtobufCS-0.9.1.csproj">
+      <Project>{236459CE-80CF-4991-972F-DE74C826BCCC}</Project>
+      <Name>HeuristicLab.ProtobufCS-0.9.1 %28HeuristicLab.ExtLibs\HeuristicLab.ProtobufCS\HeuristicLab.ProtobufCS-0.9.1\HeuristicLab.ProtobufCS-0.9.1%29</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.ProtobufCS\0.9.1\ProtobufCS\src\ProtocolBuffers\ProtocolBuffers.csproj">
       <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
Index: trunk/sources/HeuristicLab.Tracing/3.3/HeuristicLab.Tracing-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Tracing/3.3/HeuristicLab.Tracing-3.3.csproj	(revision 4489)
+++ trunk/sources/HeuristicLab.Tracing/3.3/HeuristicLab.Tracing-3.3.csproj	(revision 4490)
@@ -124,4 +124,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.log4net\1.2.10.0\HeuristicLab.log4net-1.2.10.0.csproj">
+      <Project>{1B3063DB-D71C-4A6A-A359-883E8F53A140}</Project>
+      <Name>HeuristicLab.log4net-1.2.10.0</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
Index: trunk/sources/HeuristicLab/3.3/Tests/ContentViewTests.cs
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/ContentViewTests.cs	(revision 4489)
+++ trunk/sources/HeuristicLab/3.3/Tests/ContentViewTests.cs	(revision 4490)
@@ -1,3 +1,24 @@
-﻿using System;
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
 using HeuristicLab.Common;
@@ -31,5 +52,5 @@
     [ClassInitialize]
     public static void MyClassInitialize(TestContext testContext) {
-      PluginLoader.LoadPluginsIntoAppDomain();
+      PluginLoader.pluginAssemblies.Any();
     }
 
Index: trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj	(revision 4489)
+++ trunk/sources/HeuristicLab/3.3/Tests/HeuristicLab-3.3.Tests.csproj	(revision 4490)
@@ -99,4 +99,5 @@
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
     </Reference>
+    <Reference Include="System.Windows.Forms" />
   </ItemGroup>
   <ItemGroup>
@@ -107,4 +108,5 @@
   <ItemGroup>
     <Compile Include="ContentViewTests.cs" />
+    <Compile Include="PluginDependenciesTest.cs" />
     <Compile Include="PluginLoader.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
Index: trunk/sources/HeuristicLab/3.3/Tests/PluginDependenciesTest.cs
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/PluginDependenciesTest.cs	(revision 4490)
+++ trunk/sources/HeuristicLab/3.3/Tests/PluginDependenciesTest.cs	(revision 4490)
@@ -0,0 +1,92 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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;
+using System.Reflection;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab_3._3.Tests {
+  [TestClass]
+  public class PluginDependenciesTest {
+    private static Dictionary<Assembly, Type> loadedPlugins;
+    private static Dictionary<string, string> pluginNames;
+
+    // Use ClassInitialize to run code before running the first test in the class
+    [ClassInitialize]
+    public static void MyClassInitialize(TestContext testContext) {
+      loadedPlugins = PluginLoader.pluginAssemblies.ToDictionary(a => a, GetPluginFromAssembly);
+      pluginNames = loadedPlugins.ToDictionary(a => a.Key.GetName().FullName,
+                                                                          a => GetPluginName(a.Value));
+    }
+
+    [TestMethod]
+    public void CheckReferenceAssembliesForPluginDependencies() {
+      StringBuilder errorMessage = new StringBuilder();
+      foreach (Assembly pluginAssembly in loadedPlugins.Keys) {
+        Type plugin = loadedPlugins[pluginAssembly];
+        Dictionary<string, PluginDependencyAttribute> pluginDependencies =
+          Attribute.GetCustomAttributes(plugin, false).OfType<PluginDependencyAttribute>().ToDictionary(a => a.Dependency);
+        foreach (AssemblyName referencedPluginName in pluginAssembly.GetReferencedAssemblies())
+          if (pluginNames.ContainsKey(referencedPluginName.FullName)) {  //check if reference assembly is a plugin
+            if (!pluginDependencies.ContainsKey(pluginNames[referencedPluginName.FullName]))
+              errorMessage.AppendLine("Missing dependency in plugin " + plugin + " to referenced plugin " + pluginNames[referencedPluginName.FullName] + ".");
+          }
+      }
+
+      Assert.IsTrue(errorMessage.Length == 0, errorMessage.ToString());
+    }
+
+    [TestMethod]
+    public void CheckPluginDependenciesForReferencedAssemblies() {
+      StringBuilder errorMessage = new StringBuilder();
+      foreach (Assembly pluginAssembly in loadedPlugins.Keys) {
+        Type plugin = loadedPlugins[pluginAssembly];
+        Dictionary<PluginDependencyAttribute, string> pluginDependencies =
+          Attribute.GetCustomAttributes(plugin, false).OfType<PluginDependencyAttribute>().ToDictionary(a => a, a => a.Dependency);
+
+        foreach (PluginDependencyAttribute attribute in pluginDependencies.Keys) {
+          string pluginDependencyName = pluginDependencies[attribute];
+          if (pluginAssembly.GetReferencedAssemblies()
+            .All(a => pluginNames.ContainsKey(a.FullName) && pluginNames[a.FullName] != pluginDependencyName)) {
+            errorMessage.AppendLine("Unnecessary plugin dependency in " + GetPluginName(plugin) + " to " + pluginDependencyName + ".");
+          }
+        }
+      }
+
+      Assert.IsTrue(errorMessage.Length == 0, errorMessage.ToString());
+    }
+
+    private static Type GetPluginFromAssembly(Assembly assembly) {
+      return assembly.GetExportedTypes().Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface).FirstOrDefault();
+    }
+    private static string GetPluginName(Type plugin) {
+      string name = string.Empty;
+      PluginAttribute pluginAttribute = (PluginAttribute)Attribute.GetCustomAttribute(plugin, typeof(PluginAttribute));
+      if (pluginAttribute != null)
+        name = pluginAttribute.Name;
+      return name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab/3.3/Tests/PluginLoader.cs
===================================================================
--- trunk/sources/HeuristicLab/3.3/Tests/PluginLoader.cs	(revision 4489)
+++ trunk/sources/HeuristicLab/3.3/Tests/PluginLoader.cs	(revision 4490)
@@ -1,79 +1,101 @@
 ﻿
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using HeuristicLab.PluginInfrastructure;
+
 namespace HeuristicLab_3._3.Tests {
   internal static class PluginLoader {
-    public static void LoadPluginsIntoAppDomain() {
-      new HeuristicLab.ALGLIB.HeuristicLabAlgLibPlugin();
+    public const string AssemblyExtension = ".dll";
+    public static List<Assembly> pluginAssemblies;
 
-      new HeuristicLab.Algorithms.DataAnalysis.HeuristicLabAlgorithmsDataAnalysisPlugin();
-      new HeuristicLab.Algorithms.EvolutionStrategy.HeuristicLabAlgorithmsEvolutionStrategyPlugin();
-      new HeuristicLab.Algorithms.GeneticAlgorithm.HeuristicLabAlgorithmsGeneticAlgorithmPlugin();
-      new HeuristicLab.Algorithms.LocalSearch.HeuristicLabAlgorithmsLocalSearchPlugin();
-      new HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm.HeuristicLabAlgorithmsOffspringSelectionGeneticAlgorithmPlugin();
-      new HeuristicLab.Algorithms.SimulatedAnnealing.HeuristicLabAlgorithmsSimulatedAnnealingPlugin();
-      new HeuristicLab.Algorithms.TabuSearch.HeuristicLabAlgorithmsTabuSearchPlugin();
+    static PluginLoader() {
+      foreach (string path in Directory.EnumerateFiles(AppDomain.CurrentDomain.BaseDirectory)
+        .Where(s => s.EndsWith(AssemblyExtension)))
+        Assembly.LoadFrom(path);
 
-      new HeuristicLab.Analysis.HeuristicLabAnalysisPlugin();
-      new HeuristicLab.Analysis.Views.HeuristicLabAnalysisViewsPlugin();
+      pluginAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(IsPluginAssembly).ToList();
+    }
 
-      new HeuristicLab.Clients.Common.HeuristicLabClientsCommonPlugin();
-      new HeuristicLab.CodeEditor.HeuristicLabCodeEditorPlugin();
-      new HeuristicLab.Collections.HeuristicLabCollectionsPlugin();
+    private static bool IsPluginAssembly(Assembly assembly) {
+      return assembly.GetExportedTypes()
+        .Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsAbstract && !t.IsInterface).Any();
+    }
 
-      new HeuristicLab.Common.HeuristicLabCommonPlugin();
-      new HeuristicLab.Common.Resources.HeuristicLabCommonResourcesPlugin();
 
-      new HeuristicLab.Core.HeuristicLabCorePlugin();
-      new HeuristicLab.Core.Views.HeuristicLabCoreViewsPlugin();
+    //public static void LoadPluginsIntoAppDomain() {
+    //  new HeuristicLab.Algorithms.DataAnalysis.HeuristicLabAlgorithmsDataAnalysisPlugin();
+    //  new HeuristicLab.Algorithms.EvolutionStrategy.HeuristicLabAlgorithmsEvolutionStrategyPlugin();
+    //  new HeuristicLab.Algorithms.GeneticAlgorithm.HeuristicLabAlgorithmsGeneticAlgorithmPlugin();
+    //  new HeuristicLab.Algorithms.LocalSearch.HeuristicLabAlgorithmsLocalSearchPlugin();
+    //  new HeuristicLab.Algorithms.OffspringSelectionGeneticAlgorithm.HeuristicLabAlgorithmsOffspringSelectionGeneticAlgorithmPlugin();
+    //  new HeuristicLab.Algorithms.SimulatedAnnealing.HeuristicLabAlgorithmsSimulatedAnnealingPlugin();
+    //  new HeuristicLab.Algorithms.TabuSearch.HeuristicLabAlgorithmsTabuSearchPlugin();
 
-      new HeuristicLab.Data.HeuristicLabDataPlugin();
-      new HeuristicLab.Data.Views.HeuristicLabDataViewsPlugin();
+    //  new HeuristicLab.Analysis.HeuristicLabAnalysisPlugin();
+    //  new HeuristicLab.Analysis.Views.HeuristicLabAnalysisViewsPlugin();
 
-      new HeuristicLab.Encodings.BinaryVectorEncoding.HeuristicLabEncodingsBinaryVectorEncodingPlugin();
-      new HeuristicLab.Encodings.IntegerVectorEncoding.HeuristicLabEncodingsIntegerVectorEncodingPlugin();
-      new HeuristicLab.Encodings.PermutationEncoding.HeuristicLabEncodingsPermutationEncodingPlugin();
-      new HeuristicLab.Encodings.PermutationEncoding.Views.HeuristicLabEncodingsPermutationEncodingViewsPlugin();
-      new HeuristicLab.Encodings.RealVectorEncoding.HeuristicLabEncodingsRealVectorEncodingPlugin();
-      new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin();
-      new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin();
+    //  new HeuristicLab.Clients.Common.HeuristicLabClientsCommonPlugin();
+    //  new HeuristicLab.CodeEditor.HeuristicLabCodeEditorPlugin();
+    //  new HeuristicLab.Collections.HeuristicLabCollectionsPlugin();
 
-      new HeuristicLab.MainForm.HeuristicLabMainFormPlugin();
-      new HeuristicLab.MainForm.WindowsForms.HeuristicLabMainFormPlugin();
+    //  new HeuristicLab.Common.HeuristicLabCommonPlugin();
+    //  new HeuristicLab.Common.Resources.HeuristicLabCommonResourcesPlugin();
 
-      new HeuristicLab.Operators.HeuristicLabOperatorsPlugin();
-      new HeuristicLab.Operators.Programmable.HeuristicLabOperatorsProgrammablePlugin();
-      new HeuristicLab.Operators.Views.HeuristicLabOperatorsViewsPlugin();
-      new HeuristicLab.Operators.Views.GraphVisualization.HeuristicLabOperatorsViewsGraphVisualizationPlugin();
+    //  new HeuristicLab.Core.HeuristicLabCorePlugin();
+    //  new HeuristicLab.Core.Views.HeuristicLabCoreViewsPlugin();
 
-      new HeuristicLab.Parameters.HeuristicLabParametersPlugin();
-      new HeuristicLab.Parameters.Views.HeuristicLabParametersViewsPlugin();
+    //  new HeuristicLab.Data.HeuristicLabDataPlugin();
+    //  new HeuristicLab.Data.Views.HeuristicLabDataViewsPlugin();
 
-      new HeuristicLab.Persistence.HeuristicLabPersistencePlugin();
-      new HeuristicLab.Persistence.GUI.HeuristicLabPersistenceGUIPlugin();
+    //  new HeuristicLab.Encodings.BinaryVectorEncoding.HeuristicLabEncodingsBinaryVectorEncodingPlugin();
+    //  new HeuristicLab.Encodings.IntegerVectorEncoding.HeuristicLabEncodingsIntegerVectorEncodingPlugin();
+    //  new HeuristicLab.Encodings.PermutationEncoding.HeuristicLabEncodingsPermutationEncodingPlugin();
+    //  new HeuristicLab.Encodings.PermutationEncoding.Views.HeuristicLabEncodingsPermutationEncodingViewsPlugin();
+    //  new HeuristicLab.Encodings.RealVectorEncoding.HeuristicLabEncodingsRealVectorEncodingPlugin();
+    //  new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.HeuristicLabEncodingsSymbolicExpressionTreeEncodingPlugin();
+    //  new HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views.HeuristicLabEncodingsSymbolicExpressionTreeEncodingViewsPlugin();
 
-      new HeuristicLab.Problems.ArtificialAnt.HeuristicLabProblemsArtificialAntPlugin();
-      new HeuristicLab.Problems.ArtificialAnt.Views.HeuristicLabProblemsArtificialAntViewsPlugin();
-      new HeuristicLab.Problems.DataAnalysis.HeuristicLabProblemsDataAnalysisPlugin();
-      new HeuristicLab.Problems.DataAnalysis.Regression.HeuristicLabProblemsDataAnalysisRegressionPlugin();
-      new HeuristicLab.Problems.DataAnalysis.Views.HeuristicLabProblemsDataAnalysisViewsPlugin();
-      new HeuristicLab.Problems.ExternalEvaluation.HeuristicLabProblemsExternalEvaluationPlugin();
-      new HeuristicLab.Problems.ExternalEvaluation.GP.HeuristicLabProblemsExternalEvaluationGPPlugin();
-      new HeuristicLab.Problems.ExternalEvaluation.GP.Views.HeuristicLabProblemsExternalEvaluationGPViewsPlugin();
-      new HeuristicLab.Problems.ExternalEvaluation.Views.HeuristicLabProblemsExternalEvaluationViewsPlugin();
-      new HeuristicLab.Problems.Knapsack.HeuristicLabProblemsKnapsackPlugin();
-      new HeuristicLab.Problems.Knapsack.Views.HeuristicLabProblemsKnapsackViewsPlugin();
-      new HeuristicLab.Problems.OneMax.HeuristicLabProblemsOneMaxPlugin();
-      new HeuristicLab.Problems.OneMax.Views.HeuristicLabProblemsKnapsackViewsPlugin();
-      new HeuristicLab.Problems.TestFunctions.HeuristicLabProblemsTestFunctionsPlugin();
-      new HeuristicLab.Problems.TestFunctions.Views.HeuristicLabProblemsTestFunctionsViewsPlugin();
-      new HeuristicLab.Problems.TravelingSalesman.HeuristicLabProblemsTravelingSalesmanPlugin();
-      new HeuristicLab.Problems.TravelingSalesman.Views.HeuristicLabProblemsTravelingSalesmanViewsPlugin();
-      new HeuristicLab.Problems.VehicleRouting.HeuristicLabProblemsVehicleRoutingPlugin();
-      new HeuristicLab.Problems.VehicleRouting.Views.HeuristicLabProblemsVehicleRoutingViewsPlugin();
+    //  new HeuristicLab.MainForm.HeuristicLabMainFormPlugin();
+    //  new HeuristicLab.MainForm.WindowsForms.HeuristicLabMainFormPlugin();
 
-      new HeuristicLab.Random.HeuristicLabRandomPlugin();
-      new HeuristicLab.Selection.HeuristicLabSelectionPlugin();
-      new HeuristicLab.SequentialEngine.HeuristicLabSequentialEnginePlugin();
-      new HeuristicLab.Tracing.HeuristicLabPersistencePlugin();
-    }
+    //  new HeuristicLab.Operators.HeuristicLabOperatorsPlugin();
+    //  new HeuristicLab.Operators.Programmable.HeuristicLabOperatorsProgrammablePlugin();
+    //  new HeuristicLab.Operators.Views.HeuristicLabOperatorsViewsPlugin();
+    //  new HeuristicLab.Operators.Views.GraphVisualization.HeuristicLabOperatorsViewsGraphVisualizationPlugin();
+
+    //  new HeuristicLab.Parameters.HeuristicLabParametersPlugin();
+    //  new HeuristicLab.Parameters.Views.HeuristicLabParametersViewsPlugin();
+
+    //  new HeuristicLab.Persistence.HeuristicLabPersistencePlugin();
+    //  new HeuristicLab.Persistence.GUI.HeuristicLabPersistenceGUIPlugin();
+
+    //  new HeuristicLab.Problems.ArtificialAnt.HeuristicLabProblemsArtificialAntPlugin();
+    //  new HeuristicLab.Problems.ArtificialAnt.Views.HeuristicLabProblemsArtificialAntViewsPlugin();
+    //  new HeuristicLab.Problems.DataAnalysis.HeuristicLabProblemsDataAnalysisPlugin();
+    //  new HeuristicLab.Problems.DataAnalysis.Regression.HeuristicLabProblemsDataAnalysisRegressionPlugin();
+    //  new HeuristicLab.Problems.DataAnalysis.Views.HeuristicLabProblemsDataAnalysisViewsPlugin();
+    //  new HeuristicLab.Problems.ExternalEvaluation.HeuristicLabProblemsExternalEvaluationPlugin();
+    //  new HeuristicLab.Problems.ExternalEvaluation.GP.HeuristicLabProblemsExternalEvaluationGPPlugin();
+    //  new HeuristicLab.Problems.ExternalEvaluation.GP.Views.HeuristicLabProblemsExternalEvaluationGPViewsPlugin();
+    //  new HeuristicLab.Problems.ExternalEvaluation.Views.HeuristicLabProblemsExternalEvaluationViewsPlugin();
+    //  new HeuristicLab.Problems.Knapsack.HeuristicLabProblemsKnapsackPlugin();
+    //  new HeuristicLab.Problems.Knapsack.Views.HeuristicLabProblemsKnapsackViewsPlugin();
+    //  new HeuristicLab.Problems.OneMax.HeuristicLabProblemsOneMaxPlugin();
+    //  new HeuristicLab.Problems.OneMax.Views.HeuristicLabProblemsKnapsackViewsPlugin();
+    //  new HeuristicLab.Problems.TestFunctions.HeuristicLabProblemsTestFunctionsPlugin();
+    //  new HeuristicLab.Problems.TestFunctions.Views.HeuristicLabProblemsTestFunctionsViewsPlugin();
+    //  new HeuristicLab.Problems.TravelingSalesman.HeuristicLabProblemsTravelingSalesmanPlugin();
+    //  new HeuristicLab.Problems.TravelingSalesman.Views.HeuristicLabProblemsTravelingSalesmanViewsPlugin();
+    //  new HeuristicLab.Problems.VehicleRouting.HeuristicLabProblemsVehicleRoutingPlugin();
+    //  new HeuristicLab.Problems.VehicleRouting.Views.HeuristicLabProblemsVehicleRoutingViewsPlugin();
+
+    //  new HeuristicLab.Random.HeuristicLabRandomPlugin();
+    //  new HeuristicLab.Selection.HeuristicLabSelectionPlugin();
+    //  new HeuristicLab.SequentialEngine.HeuristicLabSequentialEnginePlugin();
+    //  new HeuristicLab.Tracing.HeuristicLabPersistencePlugin();
+    //}
   }
 }
