Index: trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 5972)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 6413)
@@ -29,4 +29,5 @@
 using HeuristicLab.PluginInfrastructure.Advanced;
 using HeuristicLab.PluginInfrastructure.Manager;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.PluginInfrastructure.Starter {
@@ -36,4 +37,7 @@
   /// </summary>
   public partial class StarterForm : Form {
+    private const string pluginManagerItemName = "Plugin Manager";
+    private const string updatePluginsItemName = "Updates Available";
+
 
     private ListViewItem pluginManagerListViewItem;
@@ -41,4 +45,5 @@
     private PluginManager pluginManager;
     private SplashScreen splashScreen;
+    private bool updatesAvailable = false;
 
     /// <summary>
@@ -50,5 +55,7 @@
       InitializeComponent();
       largeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.HeuristicLab.ToBitmap());
+      largeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.UpdateAvailable.ToBitmap());
       smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.HeuristicLab.ToBitmap());
+      smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.UpdateAvailable.ToBitmap());
       FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
       Text = "HeuristicLab " + pluginInfrastructureVersion.FileVersion;
@@ -61,4 +68,29 @@
       pluginManager.DiscoverAndCheckPlugins();
       UpdateApplicationsList();
+
+      CheckUpdatesAvailableAsync(pluginPath);
+    }
+
+    private void CheckUpdatesAvailableAsync(string pluginPath) {
+      var task = Task.Factory.StartNew<bool>(() => {
+        var installationManager = new InstallationManager(pluginPath);
+        IEnumerable<IPluginDescription> installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>();
+        var remotePlugins = installationManager.GetRemotePluginList();
+        // if there is a local plugin with same name and same major and minor version then it's an update
+        var pluginsToUpdate = from remotePlugin in remotePlugins
+                              let matchingLocalPlugins = from installedPlugin in installedPlugins
+                                                         where installedPlugin.Name == remotePlugin.Name
+                                                         where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                         where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                         where Util.IsNewerThan(remotePlugin, installedPlugin)
+                                                         select installedPlugin
+                              where matchingLocalPlugins.Count() > 0
+                              select remotePlugin;
+        return pluginsToUpdate.Count() > 0;
+      });
+      task.ContinueWith(t => {
+        updatesAvailable = t.Result;
+        UpdateApplicationsList();
+      }, TaskContinuationOptions.NotOnFaulted);
     }
 
@@ -85,5 +117,5 @@
       if (applicationsListView.SelectedItems.Count > 0) {
         ListViewItem selected = applicationsListView.SelectedItems[0];
-        if (selected == pluginManagerListViewItem) {
+        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 +
@@ -102,4 +134,21 @@
             }
           }
+        } 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);
+              }
+              UpdateApplicationsList();
+            }
+            finally {
+              Cursor = Cursors.Arrow;
+            }
+          }
         } else {
           ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
@@ -110,27 +159,49 @@
 
     private void UpdateApplicationsList() {
-      applicationsListView.Items.Clear();
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      pluginManagerListViewItem = new ListViewItem("Plugin Manager", 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);
-
-      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);
+      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() {
+      if (HeuristicLab.PluginInfrastructure.Properties.Settings.Default.ShowPluginUploadControls) {
+        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);
       }
     }
