Index: trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 8677)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 8748)
@@ -182,5 +182,5 @@
       this.Text = "HeuristicLab Starter";
       this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.StarterForm_FormClosing);
-      this.Shown += new System.EventHandler(this.StarterForm_Shown);
+      this.Load += new System.EventHandler(this.StarterForm_Load);
       this.ResumeLayout(false);
 
Index: trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 8677)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 8748)
@@ -40,4 +40,5 @@
     private const string updatePluginsItemName = "Updates Available";
 
+    private readonly ICommandLineArgument[] arguments;
 
     private ListViewItem pluginManagerListViewItem;
@@ -46,5 +47,4 @@
     private SplashScreen splashScreen;
     private bool updatesAvailable = false;
-    private string[] arguments;
 
     /// <summary>
@@ -65,4 +65,5 @@
       pluginManager = new PluginManager(pluginPath);
       splashScreen = new SplashScreen(pluginManager, 1000);
+      splashScreen.VisibleChanged += new EventHandler(splashScreen_VisibleChanged);
       splashScreen.Show(this, "Loading HeuristicLab...");
 
@@ -71,4 +72,154 @@
 
       CheckUpdatesAvailableAsync();
+    }
+
+    /// <summary>
+    /// Creates a new StarterForm and passes the arguments in <paramref name="args"/>.
+    /// </summary>
+    /// <param name="args">The arguments that should be processed</param>
+    public StarterForm(string[] args)
+      : this() {
+      arguments = CommandLineArgumentHandling.GetArguments(args);
+    }
+
+    protected override void SetVisibleCore(bool value) {
+      value &= !arguments.OfType<HideStarterArgument>().Any();
+      if (!value) HandleArguments();
+      base.SetVisibleCore(value);
+    }
+
+    #region Events
+    private void StarterForm_Load(object sender, EventArgs e) {
+      HandleArguments();
+    }
+
+    private void StarterForm_FormClosing(object sender, FormClosingEventArgs e) {
+      splashScreen.Close();
+      abortRequested = true;
+    }
+
+    private void applicationsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      startButton.Enabled = applicationsListView.SelectedItems.Count > 0;
+    }
+
+    private void applicationsListView_ItemActivate(object sender, EventArgs e) {
+      if (applicationsListView.SelectedItems.Count > 0) {
+        ListViewItem selected = applicationsListView.SelectedItems[0];
+        if (selected.Text == pluginManagerItemName) {
+          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
+            MessageBox.Show("Installation Manager cannot be started while another HeuristicLab application is active." + Environment.NewLine +
+              "Please stop all active HeuristicLab applications and try again.", "Plugin Manager",
+              MessageBoxButtons.OK, MessageBoxIcon.Information);
+          } else {
+            try {
+              Cursor = Cursors.AppStarting;
+              using (InstallationManagerForm form = new InstallationManagerForm(pluginManager)) {
+                form.ShowDialog(this);
+              }
+              UpdateApplicationsList();
+            }
+            finally {
+              Cursor = Cursors.Arrow;
+            }
+          }
+        } else if (selected.Text == updatePluginsItemName) {
+          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
+            MessageBox.Show("Updating is not possible while another HeuristicLab application is active." + Environment.NewLine +
+              "Please stop all active HeuristicLab applications and try again.", "Update plugins",
+              MessageBoxButtons.OK, MessageBoxIcon.Information);
+          } else {
+            try {
+              Cursor = Cursors.AppStarting;
+              using (PluginUpdaterForm form = new PluginUpdaterForm(pluginManager)) {
+                form.ShowDialog(this);
+              }
+              updatesAvailable = false;
+              CheckUpdatesAvailableAsync();
+              UpdateApplicationsList();
+            }
+            finally {
+              Cursor = Cursors.Arrow;
+            }
+          }
+        } else {
+          ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
+          StartApplication(app);
+        }
+      }
+    }
+
+    private void largeIconsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.LargeIcon;
+    }
+
+    private void detailsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.Details;
+      foreach (ColumnHeader column in applicationsListView.Columns) {
+        if (applicationsListView.Items.Count > 0)
+          column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
+      }
+    }
+
+    private void aboutButton_Click(object sender, EventArgs e) {
+      List<IPluginDescription> plugins = new List<IPluginDescription>(pluginManager.Plugins.OfType<IPluginDescription>());
+      using (var dialog = new AboutDialog(plugins)) {
+        dialog.ShowDialog();
+      }
+    }
+
+    private void splashScreen_VisibleChanged(object sender, EventArgs e) {
+      // close hidden starter form
+      if (!splashScreen.Visible && arguments != null && arguments.OfType<HideStarterArgument>().Any())
+        Close();
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateApplicationsList() {
+      if (InvokeRequired) Invoke((Action)UpdateApplicationsList);
+      else {
+        applicationsListView.Items.Clear();
+        AddPluginManagerItem();
+        AddUpdatePluginsItem();
+
+        foreach (ApplicationDescription info in pluginManager.Applications) {
+          ListViewItem item = new ListViewItem(info.Name, 0);
+          item.Tag = info;
+          item.Group = applicationsListView.Groups["Applications"];
+          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Version.ToString()));
+          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Description));
+          item.ToolTipText = info.Description;
+          applicationsListView.Items.Add(item);
+        }
+        foreach (ColumnHeader column in applicationsListView.Columns) {
+          if (applicationsListView.Items.Count > 0)
+            column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+          else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
+        }
+      }
+    }
+
+    private void AddPluginManagerItem() {
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      pluginManagerListViewItem = new ListViewItem(pluginManagerItemName, 0);
+      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, pluginInfrastructureVersion.FileVersion));
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
+      pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
+
+      applicationsListView.Items.Add(pluginManagerListViewItem);
+    }
+
+    private void AddUpdatePluginsItem() {
+      if (updatesAvailable) {
+        var updateListViewItem = new ListViewItem(updatePluginsItemName, 1);
+        updateListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, ""));
+        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, "Download and install updates"));
+        updateListViewItem.ToolTipText = "Download and install updates";
+
+        applicationsListView.Items.Add(updateListViewItem);
+      }
     }
 
@@ -110,19 +261,10 @@
     }
 
-    /// <summary>
-    /// Creates a new StarterForm and passes the arguments in <paramref name="args"/>.
-    /// </summary>
-    /// <param name="args">The arguments that should be processed</param>
-    public StarterForm(string[] args)
-      : this() {
-      this.arguments = args;
-    }
-
-    private void StarterForm_Shown(object sender, EventArgs e) {
+    private void HandleArguments() {
       try {
-        foreach (var argument in ArgumentHandling.GetArguments(arguments)) {
-          if (argument.Token == Argument.START) {
+        foreach (var argument in arguments) {
+          if (argument is StartArgument) {
             var appDesc = (from desc in pluginManager.Applications
-                           where desc.Name == argument.Value
+                           where desc.Name.Equals(argument.Value)
                            select desc).SingleOrDefault();
             if (appDesc != null) {
@@ -142,97 +284,4 @@
     }
 
-    private void applicationsListView_ItemActivate(object sender, EventArgs e) {
-      if (applicationsListView.SelectedItems.Count > 0) {
-        ListViewItem selected = applicationsListView.SelectedItems[0];
-        if (selected.Text == pluginManagerItemName) {
-          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
-            MessageBox.Show("Installation Manager cannot be started while another HeuristicLab application is active." + Environment.NewLine +
-              "Please stop all active HeuristicLab applications and try again.", "Plugin Manager",
-              MessageBoxButtons.OK, MessageBoxIcon.Information);
-          } else {
-            try {
-              Cursor = Cursors.AppStarting;
-              using (InstallationManagerForm form = new InstallationManagerForm(pluginManager)) {
-                form.ShowDialog(this);
-              }
-              UpdateApplicationsList();
-            }
-            finally {
-              Cursor = Cursors.Arrow;
-            }
-          }
-        } else if (selected.Text == updatePluginsItemName) {
-          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
-            MessageBox.Show("Updating is not possible while another HeuristicLab application is active." + Environment.NewLine +
-              "Please stop all active HeuristicLab applications and try again.", "Update plugins",
-              MessageBoxButtons.OK, MessageBoxIcon.Information);
-          } else {
-            try {
-              Cursor = Cursors.AppStarting;
-              using (PluginUpdaterForm form = new PluginUpdaterForm(pluginManager)) {
-                form.ShowDialog(this);
-              }
-              updatesAvailable = false;
-              CheckUpdatesAvailableAsync();
-              UpdateApplicationsList();
-            }
-            finally {
-              Cursor = Cursors.Arrow;
-            }
-          }
-        } else {
-          ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
-          StartApplication(app);
-        }
-      }
-    }
-
-    private void UpdateApplicationsList() {
-      if (InvokeRequired) Invoke((Action)UpdateApplicationsList);
-      else {
-        applicationsListView.Items.Clear();
-        AddPluginManagerItem();
-        AddUpdatePluginsItem();
-
-        foreach (ApplicationDescription info in pluginManager.Applications) {
-          ListViewItem item = new ListViewItem(info.Name, 0);
-          item.Tag = info;
-          item.Group = applicationsListView.Groups["Applications"];
-          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Version.ToString()));
-          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Description));
-          item.ToolTipText = info.Description;
-          applicationsListView.Items.Add(item);
-        }
-        foreach (ColumnHeader column in applicationsListView.Columns) {
-          if (applicationsListView.Items.Count > 0)
-            column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-          else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
-        }
-      }
-    }
-
-    private void AddPluginManagerItem() {
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      pluginManagerListViewItem = new ListViewItem(pluginManagerItemName, 0);
-      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
-      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, pluginInfrastructureVersion.FileVersion));
-      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
-      pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
-
-      applicationsListView.Items.Add(pluginManagerListViewItem);
-    }
-
-    private void AddUpdatePluginsItem() {
-      if (updatesAvailable) {
-        var updateListViewItem = new ListViewItem(updatePluginsItemName, 1);
-        updateListViewItem.Group = applicationsListView.Groups["Plugin Management"];
-        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, ""));
-        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, "Download and install updates"));
-        updateListViewItem.ToolTipText = "Download and install updates";
-
-        applicationsListView.Items.Add(updateListViewItem);
-      }
-    }
-
     private void StartApplication(ApplicationDescription app) {
       splashScreen.Show("Loading " + app.Name);
@@ -256,33 +305,5 @@
       t.Start();
     }
-
-    private void applicationsListView_SelectedIndexChanged(object sender, EventArgs e) {
-      startButton.Enabled = applicationsListView.SelectedItems.Count > 0;
-    }
-
-    private void largeIconsButton_Click(object sender, EventArgs e) {
-      applicationsListView.View = View.LargeIcon;
-    }
-
-    private void detailsButton_Click(object sender, EventArgs e) {
-      applicationsListView.View = View.Details;
-      foreach (ColumnHeader column in applicationsListView.Columns) {
-        if (applicationsListView.Items.Count > 0)
-          column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
-        else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
-      }
-    }
-
-    private void StarterForm_FormClosing(object sender, FormClosingEventArgs e) {
-      splashScreen.Close();
-      abortRequested = true;
-    }
-
-    private void aboutButton_Click(object sender, EventArgs e) {
-      List<IPluginDescription> plugins = new List<IPluginDescription>(pluginManager.Plugins.OfType<IPluginDescription>());
-      using (var dialog = new AboutDialog(plugins)) {
-        dialog.ShowDialog();
-      }
-    }
+    #endregion
   }
 }
