Index: /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/MainForm.cs
===================================================================
--- /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/MainForm.cs	(revision 2504)
+++ /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/MainForm.cs	(revision 2505)
@@ -47,9 +47,5 @@
       pluginManager = new PluginManager(pluginPath);
       SplashScreen splashScreen = new SplashScreen(pluginManager, 1000, "Loading HeuristicLab...");
-      splashScreen.Owner = this;
       splashScreen.Show();
-
-      Application.DoEvents();
-      this.Enabled = false;
 
       pluginManager.DiscoverAndCheckPlugins();
@@ -98,5 +94,4 @@
           ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
           SplashScreen splashScreen = new SplashScreen(pluginManager, 2000, "Loading " + app.Name);
-          splashScreen.Owner = this;
           splashScreen.Show();
           Thread t = new Thread(delegate() {
@@ -143,5 +138,5 @@
     private void ShowErrorMessageBox(Exception ex) {
       MessageBoxOptions options = RightToLeft == RightToLeft.Yes ? MessageBoxOptions.RightAlign | MessageBoxOptions.RtlReading : MessageBoxOptions.DefaultDesktopOnly;
-      MessageBox.Show(this,
+      MessageBox.Show(null,
          BuildErrorMessage(ex),
          "Error - " + ex.GetType().Name,
Index: /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/SplashScreen.cs
===================================================================
--- /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/SplashScreen.cs	(revision 2504)
+++ /branches/PluginInfrastructure Refactoring/HeuristicLab.PluginInfrastructure/Starter/SplashScreen.cs	(revision 2505)
@@ -26,4 +26,5 @@
 using System.Windows.Forms;
 using System.Reflection;
+using System.Linq;
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.PluginInfrastructure.Manager;
@@ -32,8 +33,8 @@
   internal partial class SplashScreen : Form {
     private const int FADE_INTERVAL = 50;
-    private System.Timers.Timer fadeTimer;
+    private Timer fadeTimer;
+    // private System.Timers.Timer fadeTimer;
     private int initialInterval;
-    private object bigLock = new object();
-    private bool closing;
+    //    private object bigLock = new object();
     private PluginManager manager;
 
@@ -45,102 +46,70 @@
       : this() {
       this.initialInterval = initialInterval;
+      this.manager = manager;
+
+      manager.Action += managerActionEventHandler;
+
       infoLabel.Text = initialText;
-      this.manager = manager;
-      manager.Action += managerActionEventHandler;
-      Assembly assembly = this.GetType().Assembly;
-      object[] attributes = assembly.GetCustomAttributes(false);
-      string user, company;
-
       titleLabel.Text = Application.ProductName;
       versionLabel.Text = "Version " + Application.ProductVersion;
       infoLabel.Text = "";
 
-      foreach (object obj in attributes) {
-        var attr = obj as AssemblyCopyrightAttribute;
-        if (attr != null) {
-          copyrightLabel.Text = "Copyright " + attr.Copyright;
-        }
-      }
+      var attr = (AssemblyCopyrightAttribute)this.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false).Single();
+      copyrightLabel.Text = "Copyright " + attr.Copyright;
 
-      user = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.User;
-      company = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.Organization;
+      string user = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.User;
+      string company = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.Organization;
 
-      if (string.IsNullOrEmpty(user)) {
-        userNameLabel.Text = "-";
-      } else {
-        userNameLabel.Text = user;
-      }
+      userNameLabel.Text = string.IsNullOrEmpty(user) ? "-" : user;
+      companyLabel.Text = string.IsNullOrEmpty(company) ? "-" : company;
 
-      if (string.IsNullOrEmpty(company)) {
-        companyLabel.Text = "-";
-      } else {
-        companyLabel.Text = company;
+      fadeTimer = new Timer();
+      fadeTimer.Tick += fadeTimer_Elapsed;
+      fadeTimer.Interval = initialInterval;
+    }
+
+    private void SetInfoText(string text) {
+      if (InvokeRequired) Invoke((Action<string>)SetInfoText, text);
+      else {
+        infoLabel.Text = text;
       }
     }
 
-    private void SetInfoText(string text) {
-      this.Invoke((MethodInvoker)delegate() { infoLabel.Text = text; });
-    }
-
     private void managerActionEventHandler(object sender, PluginInfrastructureEventArgs e) {
-      string info = e.Action + ": " + e.Entity;
-      //if (e.Action == PluginManagerAction.Initializing) info = "Initializing ...";
-      //else if (e.Action == PluginManagerAction.PluginLoaded) info = "Loaded plugin " + e.Id + " ...";
-      //else if (e.Action == PluginManagerAction.Initialized) {
-      //  info = "Initialization Completed";
-      //  fadeTimer = new System.Timers.Timer();
-      //  fadeTimer.SynchronizingObject = this;
-      //  fadeTimer.Elapsed += new System.Timers.ElapsedEventHandler(fadeTimer_Elapsed);
-      //  fadeTimer.Interval = initialInterval;
-      //  fadeTimer.AutoReset = true;
-      //  fadeTimer.Start();
-      //} else {
-      //  if (e.Id != null) info = e.Action.ToString() + "   (" + e.Id + ")";
-      //  else info = e.Action.ToString();
-      //}
-      SetInfoText(info);
-      Application.DoEvents();
-    }
-
-    private void fadeTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
-      fadeTimer.Stop();
       if (InvokeRequired) {
-        Invoke((MethodInvoker)UpdateOpacity);
+        Invoke((EventHandler<PluginInfrastructureEventArgs>)managerActionEventHandler, sender, e);
       } else {
-        UpdateOpacity();
+        ResetFadeTimer();
+        string info = e.Action + ": " + e.Entity;
+        SetInfoText(info);
+        Application.DoEvents(); // force immediate update of splash screen control
       }
     }
 
-    private void UpdateOpacity() {
-      lock (bigLock) {
-        if (closing) return;
-        if (Opacity > 0.9) {
-          Opacity = 0.9;
-          fadeTimer.Interval = FADE_INTERVAL;
-          fadeTimer.Start();
-        } else if (this.Opacity > 0) {
-          Opacity -= 0.1;
-          fadeTimer.Start();
-        } else {
-          Opacity = 0;
-          CloseSplashScreen();
-        }
+    private void ResetFadeTimer() {
+      fadeTimer.Stop(); fadeTimer.Start();
+    }
+
+    private void fadeTimer_Elapsed(object sender, EventArgs e) {
+      FadeOutAndClose();
+    }
+
+    private void FadeOutAndClose() {
+      fadeTimer.Stop();
+      fadeTimer.Interval = FADE_INTERVAL;
+      if (this.Opacity > 0) {
+        Opacity -= 0.1;
+        fadeTimer.Start();
+      } else {
+        Opacity = 0;
+        fadeTimer.Stop();
+        fadeTimer.Dispose();
+        manager.Action -= managerActionEventHandler; // remove event before calling close
+        Close();
       }
     }
 
     private void closeButton_Click(object sender, EventArgs e) {
-      CloseSplashScreen();
-    }
-
-    private void CloseSplashScreen() {
-      lock (bigLock) {
-        if (!closing) { // just close once
-          closing = true;
-          if (fadeTimer != null) fadeTimer.Stop();
-          manager.Action -= managerActionEventHandler; // remove event before calling close
-          Application.DoEvents(); // work up all existing events
-          Close(); // close
-        }
-      }
+      FadeOutAndClose();
     }
   }
