Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 36)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 37)
@@ -310,5 +310,6 @@
       allAvailablePlugins.ForEach(delegate(PluginDescription availablePlugin) {
         List<PluginTag> oldPlugins = allTags.FindAll(delegate(PluginTag currentPlugin) {
-          return currentPlugin.PluginName == availablePlugin.Name && currentPlugin.State == (PluginState.Installed | PluginState.Disabled);
+          return currentPlugin.PluginName == availablePlugin.Name && 
+            (currentPlugin.State & (PluginState.Installed | PluginState.Disabled)) !=0;
         });
 
@@ -330,8 +331,6 @@
         });
 
-        if(currentPlugins.Count == 1) {
-          if(currentPlugins[0].PluginVersion < availablePlugin.Version) {
-            overrides.Add(availablePlugin);
-          }
+        if(currentPlugins.Count == 1 && currentPlugins[0].PluginVersion < availablePlugin.Version) {
+          overrides.Add(availablePlugin);
         }
       });
@@ -584,5 +583,4 @@
 
     private void UpdateActionButtons(PluginTag tag) {
-
       publishButton.Enabled = (tag.State & PluginState.Installed) == PluginState.Installed;
       installButton.Enabled = (tag.State & PluginState.Available) == PluginState.Available;
@@ -597,5 +595,4 @@
       installMenuItem.Checked = installButton.Checked;
       deleteMenuItem.Checked = deleteButton.Checked;
-
     }
 
@@ -634,12 +631,7 @@
       return nodes;
     }
-
-
-
     private void DisplayPluginInfo(string pluginInformation) {
       infoTextBox.Text = pluginInformation;
     }
-
-
     private void upgradeButton_Click(object sender, EventArgs args) {
       try {
@@ -683,6 +675,4 @@
       });
     }
-
-
     private List<string> upgradedPlugins = new List<string>();
     private void OnPreUpgradePlugins() {
@@ -697,5 +687,4 @@
       });
     }
-
     private void OnPostUpgradePlugins() {
       allTags.ForEach(delegate(PluginTag tag) {
@@ -706,5 +695,4 @@
       upgradedPlugins.Clear();
     }
-
     /// <summary>
     /// Deletes all files in the directories cacheDir, backupDir, tempDir
Index: /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs	(revision 36)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure.GUI/PluginTag.cs	(revision 37)
@@ -85,4 +85,9 @@
     }
 
+    private string message;
+    public string Message {
+      get { return message; }
+    }
+
     public List<PluginTag> hull = new List<PluginTag>();
 
@@ -94,4 +99,5 @@
       this.pluginName = plugin.Name;
       this.pluginVersion = plugin.Version;
+      this.message = plugin.Message;
       pluginDetails = GeneratePluginDetails(plugin);
       pluginDependencies = GeneratePluginDependencies(plugin);
@@ -125,9 +131,10 @@
         dependents += dependentPlugin.Name + " (" + dependentPlugin.Version + ")\n";
       });
-      return "plugin: " + plugin.Name + "\n" +
+      return "Plugin: " + plugin.Name + "\n" +
       "Version: " + plugin.Version + "\n\n" +
-      "Requires: \n" + dependencies + "\n" +
-      "Used by:\n" + dependents + "\n" +
-      "Files:\n" + filenames + "\n";
+      (dependencies.Length != 0 ? "Requires: \n" + dependencies + "\n" : "") +
+      (dependents.Length != 0 ? "Used by:\n" + dependents + "\n" : "") +
+      (filenames.Length != 0 ? "Files:\n" + filenames + "\n" : "") + message;
+      ;
     }
 
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 36)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 37)
@@ -75,5 +75,7 @@
 
     private IPlugin FindPlugin(PluginInfo plugin) {
-      return allPlugins[plugin];
+      if(allPlugins.ContainsKey(plugin)) {
+        return allPlugins[plugin];
+      } else return null;
     }
 
@@ -90,5 +92,11 @@
     /// </summary>
     internal void Init() {
-      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += delegate(object sender, ResolveEventArgs args) { return Assembly.ReflectionOnlyLoad(args.Name); };
+      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += delegate(object sender, ResolveEventArgs args) {
+        try {
+          return Assembly.ReflectionOnlyLoad(args.Name);
+        } catch(FileLoadException ex) {
+          return null;
+        }
+        };
       allPlugins.Clear();
       disabledPlugins.Clear();
@@ -150,6 +158,22 @@
             }
           }
-        } catch(FileNotFoundException) {
-          // when a referenced assembly cannot be loaded then ignore this assembly in the plugin discovery
+        } catch(FileNotFoundException ex) {
+          PluginInfo info = new PluginInfo();
+          AssemblyName name = assembly.GetName();
+          info.Name = name.Name;
+          info.Version = name.Version;
+          info.Assemblies.Add(assembly.FullName);
+          info.Files.Add(assembly.Location);
+          info.Message = "File not found: " + ex.FileName;
+          disabledPlugins.Add(info);
+        } catch(FileLoadException ex) {
+          PluginInfo info = new PluginInfo();
+          AssemblyName name = assembly.GetName();
+          info.Name = name.Name;
+          info.Version = name.Version;
+          info.Files.Add(assembly.Location);
+          info.Assemblies.Add(assembly.FullName);
+          info.Message = "Couldn't load file: " + ex.FileName;
+          disabledPlugins.Add(info);
         }
       }
@@ -208,4 +232,5 @@
         PluginInfo info = new PluginInfo();
         info.Name = pluginName;
+        info.Version = t.Assembly.GetName().Version;
         info.Assemblies = pluginAssemblies;
         info.Files.AddRange(pluginFiles);
@@ -226,4 +251,13 @@
         visitedDependencies.Clear();
         if(!CheckPluginDependencies(pluginInfo.Name)) {
+          PluginInfo matchingInfo = preloadedPluginInfos.Find(delegate(PluginInfo info) { return info.Name == pluginInfo.Name; });
+          if(matchingInfo == null) throw new InvalidProgramException(); // shouldn't happen
+          foreach(string dependency in pluginDependencies[matchingInfo]) {
+            PluginInfo dependencyInfo = new PluginInfo();
+            dependencyInfo.Name = dependency;
+            pluginInfo.Dependencies.Add(dependencyInfo);
+          }
+
+          pluginInfo.Message = "Disabled: missing plugin dependency.";
           disabledPlugins.Add(pluginInfo);
         }
@@ -325,4 +359,5 @@
       foreach(PluginInfo plugin in preloadedPluginInfos) {
         if(!CheckPluginFiles(plugin)) {
+          plugin.Message = "Disabled: missing plugin file.";
           disabledPlugins.Add(plugin);
         }
@@ -348,17 +383,21 @@
 
     internal void OnDelete(PluginInfo pluginInfo) {
-      FindPlugin(pluginInfo).OnDelete();
+      IPlugin plugin = FindPlugin(pluginInfo);
+      if(plugin!=null) plugin.OnDelete();
     }
 
     internal void OnInstall(PluginInfo pluginInfo) {
-      FindPlugin(pluginInfo).OnInstall();
+      IPlugin plugin = FindPlugin(pluginInfo);
+      if(plugin != null) plugin.OnInstall();
     }
 
     internal void OnPreUpdate(PluginInfo pluginInfo) {
-      FindPlugin(pluginInfo).OnPreUpdate();
+      IPlugin plugin = FindPlugin(pluginInfo);
+      if(plugin != null) plugin.OnPreUpdate();
     }
 
     internal void OnPostUpdate(PluginInfo pluginInfo) {
-      FindPlugin(pluginInfo).OnPostUpdate();
+      IPlugin plugin = FindPlugin(pluginInfo);
+      if(plugin != null) plugin.OnPostUpdate();
     }
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs	(revision 36)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/PluginInfo.cs	(revision 37)
@@ -68,4 +68,11 @@
     }
 
+
+    private string message;
+    public string Message {
+      get { return message; }
+      set { message = value; }
+    }
+
     public override string ToString() {
       return Name;
