Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.Designer.cs	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.Designer.cs	(revision 3547)
@@ -0,0 +1,78 @@
+﻿#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
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class BasicUpdateView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.updateAndInstallButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // updateAndInstallButton
+      // 
+      this.updateAndInstallButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.updateAndInstallButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.updateAndInstallButton.Location = new System.Drawing.Point(3, 2);
+      this.updateAndInstallButton.Name = "updateAndInstallButton";
+      this.updateAndInstallButton.Size = new System.Drawing.Size(155, 50);
+      this.updateAndInstallButton.TabIndex = 0;
+      this.updateAndInstallButton.Text = "Find and Install Updates";
+      this.updateAndInstallButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
+      this.updateAndInstallButton.UseVisualStyleBackColor = true;
+      this.updateAndInstallButton.Click += new System.EventHandler(this.updateAndInstallButton_Click);
+      // 
+      // BasicUpdateView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.updateAndInstallButton);
+      this.Name = "BasicUpdateView";
+      this.Size = new System.Drawing.Size(163, 55);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button updateAndInstallButton;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.cs	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.cs	(revision 3547)
@@ -0,0 +1,110 @@
+﻿#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class BasicUpdateView : InstallationManagerControl {
+    private BackgroundWorker updatePluginsBackgroundWorker;
+    private const string CheckingPluginsMessage = "Checking for updated plugins...";
+    private const string NoUpdatesAvailableMessage = "No updates available.";
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+
+    public BasicUpdateView() {
+      InitializeComponent();
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+    }
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      } else if (e.Cancelled) {
+        StatusView.ShowMessage(NoUpdatesAvailableMessage);
+      }
+      StatusView.RemoveMessage(CheckingPluginsMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> installedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      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 IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        installationManager.Update(pluginsToUpdate);
+        pluginManager.DiscoverAndCheckPlugins();
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      if (plugin1.Version.Build < plugin2.Version.Build) return false;
+      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
+      else return plugin1.Version.Revision > plugin2.Version.Revision;
+    }
+
+    #endregion
+    private void updateAndInstallButton_Click(object sender, EventArgs e) {
+      var installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>().ToList();
+      updatePluginsBackgroundWorker.RunWorkerAsync(installedPlugins);
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
+      StatusView.ShowMessage(CheckingPluginsMessage);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.resx	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/BasicUpdateView.resx	(revision 3547)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/IStatusDisplay.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/IStatusDisplay.cs	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/IStatusDisplay.cs	(revision 3547)
@@ -0,0 +1,44 @@
+﻿#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.Text;
+using HeuristicLab.PluginInfrastructure.Manager;
+using System.IO;
+using System.ComponentModel;
+using System.Reflection;
+using ICSharpCode.SharpZipLib.Zip;
+using System.ServiceModel;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal interface IStatusView {
+    void ShowProgressIndicator(double percentProgress);
+    void ShowProgressIndicator();
+    void HideProgressIndicator();
+    void ShowMessage(string message);
+    void RemoveMessage(string message);
+    void LockUI();
+    void UnlockUI();
+    void ShowError(string shortMessage, string description);
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs	(revision 3547)
@@ -30,15 +30,13 @@
 namespace HeuristicLab.PluginInfrastructure.Advanced {
   internal partial class InstallationManagerControl : UserControl {
-    public InstallationManagerControl() {
-      InitializeComponent();
+    private IStatusView statusView;
+    public IStatusView StatusView {
+      get { return statusView; }
+      set { statusView = value; }
     }
 
-    internal virtual void ShowInForm() {
-      Form form = new Form();
-      form.ClientSize = this.Size;
-      form.Text = this.Name;
-      this.Dock = DockStyle.Fill;
-      form.Controls.Add(this);
-      form.Show();
+    public InstallationManagerControl()
+      : base() {
+      InitializeComponent();
     }
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3547)
@@ -48,13 +48,15 @@
       this.toolStripProgressBar = new System.Windows.Forms.ToolStripProgressBar();
       this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
-      this.removeButton = new System.Windows.Forms.Button();
-      this.installButton = new System.Windows.Forms.Button();
       this.tabControl = new System.Windows.Forms.TabControl();
+      this.updateAllPluginsTabPage = new System.Windows.Forms.TabPage();
+      this.basicUpdateView = new HeuristicLab.PluginInfrastructure.Advanced.BasicUpdateView();
       this.localPluginsTabPage = new System.Windows.Forms.TabPage();
-      this.updateButton = new System.Windows.Forms.Button();
+      this.localPluginsView = new HeuristicLab.PluginInfrastructure.Advanced.LocalPluginsView();
       this.availablePluginsTabPage = new System.Windows.Forms.TabPage();
-      this.refreshButton = new System.Windows.Forms.Button();
+      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.RemotePluginInstallerView();
       this.uploadPluginsTabPage = new System.Windows.Forms.TabPage();
+      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.PluginEditor();
       this.manageProductsTabPage = new System.Windows.Forms.TabPage();
+      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.ProductEditor();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logTextBox = new System.Windows.Forms.TextBox();
@@ -65,10 +67,7 @@
       this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.connectionSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.localPluginManagerView = new HeuristicLab.PluginInfrastructure.Advanced.LocalPluginManagerView();
-      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.RemotePluginInstallerView();
-      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.PluginEditor();
-      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.ProductEditor();
       this.statusStrip.SuspendLayout();
       this.tabControl.SuspendLayout();
+      this.updateAllPluginsTabPage.SuspendLayout();
       this.localPluginsTabPage.SuspendLayout();
       this.availablePluginsTabPage.SuspendLayout();
@@ -84,7 +83,7 @@
             this.toolStripProgressBar,
             this.toolStripStatusLabel});
-      this.statusStrip.Location = new System.Drawing.Point(0, 398);
+      this.statusStrip.Location = new System.Drawing.Point(0, 422);
       this.statusStrip.Name = "statusStrip";
-      this.statusStrip.Size = new System.Drawing.Size(615, 22);
+      this.statusStrip.Size = new System.Drawing.Size(622, 22);
       this.statusStrip.TabIndex = 0;
       // 
@@ -102,32 +101,4 @@
       this.toolStripStatusLabel.Size = new System.Drawing.Size(0, 17);
       // 
-      // removeButton
-      // 
-      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.removeButton.Enabled = false;
-      this.removeButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
-      this.removeButton.Location = new System.Drawing.Point(103, 305);
-      this.removeButton.Name = "removeButton";
-      this.removeButton.Size = new System.Drawing.Size(110, 31);
-      this.removeButton.TabIndex = 11;
-      this.removeButton.Text = "Delete Selected";
-      this.removeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.removeButton.UseVisualStyleBackColor = true;
-      this.removeButton.Click += new System.EventHandler(this.removeLocalButton_Click);
-      // 
-      // installButton
-      // 
-      this.installButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.installButton.Enabled = false;
-      this.installButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
-      this.installButton.Location = new System.Drawing.Point(84, 305);
-      this.installButton.Name = "installButton";
-      this.installButton.Size = new System.Drawing.Size(140, 31);
-      this.installButton.TabIndex = 15;
-      this.installButton.Text = "Install Selected Items";
-      this.installButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.installButton.UseVisualStyleBackColor = true;
-      this.installButton.Click += new System.EventHandler(this.updateOrInstallButton_Click);
-      // 
       // tabControl
       // 
@@ -135,4 +106,5 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.updateAllPluginsTabPage);
       this.tabControl.Controls.Add(this.localPluginsTabPage);
       this.tabControl.Controls.Add(this.availablePluginsTabPage);
@@ -143,60 +115,80 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(591, 368);
+      this.tabControl.Size = new System.Drawing.Size(598, 392);
       this.tabControl.TabIndex = 16;
       this.tabControl.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl_Selected);
       // 
+      // updateAllPluginsTabPage
+      // 
+      this.updateAllPluginsTabPage.Controls.Add(this.basicUpdateView);
+      this.updateAllPluginsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.updateAllPluginsTabPage.Name = "updateAllPluginsTabPage";
+      this.updateAllPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.updateAllPluginsTabPage.Size = new System.Drawing.Size(590, 366);
+      this.updateAllPluginsTabPage.TabIndex = 5;
+      this.updateAllPluginsTabPage.Text = "Update Plugins";
+      this.updateAllPluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // basicUpdateView
+      // 
+      this.basicUpdateView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.basicUpdateView.InstallationManager = null;
+      this.basicUpdateView.Location = new System.Drawing.Point(6, 6);
+      this.basicUpdateView.Name = "basicUpdateView";
+      this.basicUpdateView.PluginManager = null;
+      this.basicUpdateView.Size = new System.Drawing.Size(578, 354);
+      this.basicUpdateView.StatusView = null;
+      this.basicUpdateView.TabIndex = 0;
+      // 
       // localPluginsTabPage
       // 
-      this.localPluginsTabPage.Controls.Add(this.updateButton);
-      this.localPluginsTabPage.Controls.Add(this.removeButton);
-      this.localPluginsTabPage.Controls.Add(this.localPluginManagerView);
+      this.localPluginsTabPage.Controls.Add(this.localPluginsView);
       this.localPluginsTabPage.Location = new System.Drawing.Point(4, 22);
       this.localPluginsTabPage.Name = "localPluginsTabPage";
       this.localPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.localPluginsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.localPluginsTabPage.Size = new System.Drawing.Size(590, 366);
       this.localPluginsTabPage.TabIndex = 0;
       this.localPluginsTabPage.Text = "Installed Plugins";
       this.localPluginsTabPage.UseVisualStyleBackColor = true;
       // 
-      // updateButton
-      // 
-      this.updateButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.updateButton.Enabled = false;
-      this.updateButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.updateButton.Location = new System.Drawing.Point(6, 305);
-      this.updateButton.Name = "updateButton";
-      this.updateButton.Size = new System.Drawing.Size(91, 31);
-      this.updateButton.TabIndex = 12;
-      this.updateButton.Text = "Update All";
-      this.updateButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.updateButton.UseVisualStyleBackColor = true;
-      this.updateButton.Click += new System.EventHandler(this.updateAllButton_Click);
+      // localPluginsView
+      // 
+      this.localPluginsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginsView.InstallationManager = null;
+      this.localPluginsView.Location = new System.Drawing.Point(6, 6);
+      this.localPluginsView.Name = "localPluginsView";
+      this.localPluginsView.PluginManager = null;
+      this.localPluginsView.Size = new System.Drawing.Size(578, 354);
+      this.localPluginsView.StatusView = null;
+      this.localPluginsView.TabIndex = 0;
       // 
       // availablePluginsTabPage
       // 
       this.availablePluginsTabPage.Controls.Add(this.remotePluginInstaller);
-      this.availablePluginsTabPage.Controls.Add(this.refreshButton);
-      this.availablePluginsTabPage.Controls.Add(this.installButton);
       this.availablePluginsTabPage.Location = new System.Drawing.Point(4, 22);
       this.availablePluginsTabPage.Name = "availablePluginsTabPage";
       this.availablePluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.availablePluginsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.availablePluginsTabPage.Size = new System.Drawing.Size(590, 366);
       this.availablePluginsTabPage.TabIndex = 1;
       this.availablePluginsTabPage.Text = "Available Plugins";
       this.availablePluginsTabPage.UseVisualStyleBackColor = true;
       // 
-      // refreshButton
-      // 
-      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
-      this.refreshButton.Location = new System.Drawing.Point(6, 305);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(72, 31);
-      this.refreshButton.TabIndex = 11;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
+      // remotePluginInstaller
+      // 
+      this.remotePluginInstaller.AllPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
+      this.remotePluginInstaller.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.remotePluginInstaller.Location = new System.Drawing.Point(6, 6);
+      this.remotePluginInstaller.Name = "remotePluginInstaller";
+      this.remotePluginInstaller.NewPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
+      this.remotePluginInstaller.Products = new HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[0];
+      this.remotePluginInstaller.ShowAllPlugins = false;
+      this.remotePluginInstaller.Size = new System.Drawing.Size(578, 354);
+      this.remotePluginInstaller.TabIndex = 14;
       // 
       // uploadPluginsTabPage
@@ -206,8 +198,19 @@
       this.uploadPluginsTabPage.Name = "uploadPluginsTabPage";
       this.uploadPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.uploadPluginsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.uploadPluginsTabPage.Size = new System.Drawing.Size(590, 366);
       this.uploadPluginsTabPage.TabIndex = 3;
       this.uploadPluginsTabPage.Text = "Upload Plugins";
       this.uploadPluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // pluginEditor
+      // 
+      this.pluginEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginEditor.Location = new System.Drawing.Point(6, 6);
+      this.pluginEditor.Name = "pluginEditor";
+      this.pluginEditor.PluginManager = null;
+      this.pluginEditor.Size = new System.Drawing.Size(578, 354);
+      this.pluginEditor.TabIndex = 0;
       // 
       // manageProductsTabPage
@@ -217,9 +220,19 @@
       this.manageProductsTabPage.Name = "manageProductsTabPage";
       this.manageProductsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.manageProductsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.manageProductsTabPage.Size = new System.Drawing.Size(590, 366);
       this.manageProductsTabPage.TabIndex = 4;
       this.manageProductsTabPage.Text = "Manage Products";
       this.manageProductsTabPage.UseVisualStyleBackColor = true;
       // 
+      // productEditor
+      // 
+      this.productEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productEditor.Location = new System.Drawing.Point(6, 6);
+      this.productEditor.Name = "productEditor";
+      this.productEditor.Size = new System.Drawing.Size(578, 354);
+      this.productEditor.TabIndex = 0;
+      // 
       // logTabPage
       // 
@@ -227,5 +240,5 @@
       this.logTabPage.Location = new System.Drawing.Point(4, 22);
       this.logTabPage.Name = "logTabPage";
-      this.logTabPage.Size = new System.Drawing.Size(583, 342);
+      this.logTabPage.Size = new System.Drawing.Size(590, 366);
       this.logTabPage.TabIndex = 2;
       this.logTabPage.Text = "Log";
@@ -242,5 +255,5 @@
       this.logTextBox.ReadOnly = true;
       this.logTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
-      this.logTextBox.Size = new System.Drawing.Size(577, 336);
+      this.logTextBox.Size = new System.Drawing.Size(584, 360);
       this.logTextBox.TabIndex = 0;
       // 
@@ -252,5 +265,5 @@
       this.menuStrip.Location = new System.Drawing.Point(0, 0);
       this.menuStrip.Name = "menuStrip";
-      this.menuStrip.Size = new System.Drawing.Size(615, 24);
+      this.menuStrip.Size = new System.Drawing.Size(622, 24);
       this.menuStrip.TabIndex = 17;
       this.menuStrip.Text = "menuStrip1";
@@ -300,56 +313,9 @@
       this.connectionSettingsToolStripMenuItem.Click += new System.EventHandler(this.connectionSettingsToolStripMenuItem_Click);
       // 
-      // localPluginManagerView
-      // 
-      this.localPluginManagerView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.localPluginManagerView.Location = new System.Drawing.Point(6, 6);
-      this.localPluginManagerView.Name = "localPluginManagerView";
-      this.localPluginManagerView.Plugins = null;
-      this.localPluginManagerView.Size = new System.Drawing.Size(569, 293);
-      this.localPluginManagerView.TabIndex = 0;
-      this.localPluginManagerView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.localPluginManager_ItemChecked);
-      // 
-      // remotePluginInstaller
-      // 
-      this.remotePluginInstaller.AllPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
-      this.remotePluginInstaller.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.remotePluginInstaller.Location = new System.Drawing.Point(6, 6);
-      this.remotePluginInstaller.Name = "remotePluginInstaller";
-      this.remotePluginInstaller.NewPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
-      this.remotePluginInstaller.Products = new HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[0];
-      this.remotePluginInstaller.ShowAllPlugins = false;
-      this.remotePluginInstaller.Size = new System.Drawing.Size(571, 293);
-      this.remotePluginInstaller.TabIndex = 14;
-      this.remotePluginInstaller.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginInstaller_ItemChecked);
-      // 
-      // pluginEditor
-      // 
-      this.pluginEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.pluginEditor.Location = new System.Drawing.Point(6, 6);
-      this.pluginEditor.Name = "pluginEditor";
-      this.pluginEditor.Size = new System.Drawing.Size(571, 330);
-      this.pluginEditor.TabIndex = 0;
-      // 
-      // productEditor
-      // 
-      this.productEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.productEditor.Location = new System.Drawing.Point(6, 6);
-      this.productEditor.Name = "productEditor";
-      this.productEditor.Size = new System.Drawing.Size(571, 330);
-      this.productEditor.TabIndex = 0;
-      // 
       // InstallationManagerForm
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.ClientSize = new System.Drawing.Size(615, 420);
+      this.ClientSize = new System.Drawing.Size(622, 444);
       this.Controls.Add(this.tabControl);
       this.Controls.Add(this.statusStrip);
@@ -362,4 +328,5 @@
       this.statusStrip.PerformLayout();
       this.tabControl.ResumeLayout(false);
+      this.updateAllPluginsTabPage.ResumeLayout(false);
       this.localPluginsTabPage.ResumeLayout(false);
       this.availablePluginsTabPage.ResumeLayout(false);
@@ -380,8 +347,5 @@
     private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar;
     private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
-    private LocalPluginManagerView localPluginManagerView;
     private RemotePluginInstallerView remotePluginInstaller;
-    private System.Windows.Forms.Button removeButton;
-    private System.Windows.Forms.Button installButton;
     private System.Windows.Forms.TabControl tabControl;
     private System.Windows.Forms.TabPage localPluginsTabPage;
@@ -389,5 +353,4 @@
     private System.Windows.Forms.TabPage logTabPage;
     private System.Windows.Forms.TextBox logTextBox;
-    private System.Windows.Forms.Button refreshButton;
     private System.Windows.Forms.MenuStrip menuStrip;
     private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
@@ -396,9 +359,11 @@
     private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
     private System.Windows.Forms.ToolStripMenuItem connectionSettingsToolStripMenuItem;
-    private System.Windows.Forms.Button updateButton;
     private System.Windows.Forms.TabPage uploadPluginsTabPage;
     private System.Windows.Forms.TabPage manageProductsTabPage;
     private PluginEditor pluginEditor;
     private ProductEditor productEditor;
+    private LocalPluginsView localPluginsView;
+    private System.Windows.Forms.TabPage updateAllPluginsTabPage;
+    private BasicUpdateView basicUpdateView;
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3547)
@@ -31,25 +31,6 @@
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class InstallationManagerForm : Form {
-    private class UpdateOrInstallPluginsBackgroundWorkerArgument {
-      public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
-      public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
-    }
-
-    private class RemovePluginsBackgroundWorkerArgument {
-      public IEnumerable<IPluginDescription> PluginsToRemove { get; set; }
-    }
-
-    private class RefreshBackgroundWorkerResult {
-      public IEnumerable<IPluginDescription> RemotePlugins { get; set; }
-      public IEnumerable<DeploymentService.ProductDescription> RemoteProducts { get; set; }
-    }
-
+  internal partial class InstallationManagerForm : Form, IStatusView {
     private InstallationManager installationManager;
-    private BackgroundWorker refreshServerPluginsBackgroundWorker;
-    private BackgroundWorker updateOrInstallPluginsBackgroundWorker;
-    private BackgroundWorker removePluginsBackgroundWorker;
-    private BackgroundWorker refreshLocalPluginsBackgroundWorker;
-    private BackgroundWorker updateAllPluginsBackgroundWorker;
     private PluginManager pluginManager;
     private string pluginDir;
@@ -58,4 +39,5 @@
       InitializeComponent();
       this.pluginManager = pluginManager;
+
       pluginManager.PluginLoaded += pluginManager_PluginLoaded;
       pluginManager.PluginUnloaded += pluginManager_PluginUnloaded;
@@ -64,26 +46,4 @@
 
       pluginDir = Application.StartupPath;
-
-      #region initialize background workers
-      refreshServerPluginsBackgroundWorker = new BackgroundWorker();
-      refreshServerPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshServerPluginsBackgroundWorker_DoWork);
-      refreshServerPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshServerPluginsBackgroundWorker_RunWorkerCompleted);
-
-      updateOrInstallPluginsBackgroundWorker = new BackgroundWorker();
-      updateOrInstallPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateOrInstallPluginsBackgroundWorker_DoWork);
-      updateOrInstallPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted);
-
-      removePluginsBackgroundWorker = new BackgroundWorker();
-      removePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(removePluginsBackgroundWorker_DoWork);
-      removePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(removePluginsBackgroundWorker_RunWorkerCompleted);
-
-      refreshLocalPluginsBackgroundWorker = new BackgroundWorker();
-      refreshLocalPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshLocalPluginsBackgroundWorker_DoWork);
-      refreshLocalPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshLocalPluginsBackgroundWorker_RunWorkerCompleted);
-
-      updateAllPluginsBackgroundWorker = new BackgroundWorker();
-      updateAllPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateAllPluginsBackgroundWorker_DoWork);
-      updateAllPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateAllPluginsBackgroundWorker_RunWorkerCompleted);
-      #endregion
 
       installationManager = new InstallationManager(pluginDir);
@@ -99,116 +59,21 @@
         tabControl.Controls.Remove(uploadPluginsTabPage);
         tabControl.Controls.Remove(manageProductsTabPage);
-      }
-
-      UpdateLocalPluginList(pluginManager.Plugins);
-      UpdateControlsConnected();
-    }
-
-    #region event handlers for update all plugins backgroundworker
-    void updateAllPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
-           "Please check your connection settings and user credentials.");
-        UpdateControlsDisconnected();
       } else {
-        RefreshLocalPluginListAsync();
-        UpdateControlsConnected();
-      }
-    }
-
-    void updateAllPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      IEnumerable<IPluginDescription> installedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
-      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 installedPlugin.Version.Build <= remotePlugin.Version.Build ||
-                                                         installedPlugin.Version.Revision < remotePlugin.Version.Revision
-                                                       select installedPlugin
-                            where matchingLocalPlugins.Count() > 0
-                            select remotePlugin;
-      installationManager.Update(pluginsToUpdate);
-    }
-    #endregion
-
-    #region event handlers for refresh local plugin list backgroundworker
-    void refreshLocalPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (!e.Cancelled && e.Error == null) {
-        UpdateLocalPluginList((IEnumerable<PluginDescription>)e.Result);
-        UpdateControlsConnected();
-      }
-    }
-
-    void refreshLocalPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      pluginManager.DiscoverAndCheckPlugins();
-      e.Result = new List<PluginDescription>(pluginManager.Plugins);
-    }
-    #endregion
-
-    #region event handlers for plugin removal background worker
-    void removePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        MessageBox.Show("There was problem while deleting files." + Environment.NewLine +
-              e.Error.Message);
-        UpdateControlsDisconnected();
-      } else {
-        RefreshLocalPluginListAsync();
-        UpdateControlsConnected();
-      }
-    }
-
-    void removePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      IEnumerable<IPluginDescription> pluginsToRemove = (IEnumerable<IPluginDescription>)e.Argument;
-      installationManager.Remove(pluginsToRemove);
-    }
-    #endregion
-
-    #region event handlers for plugin update background worker
-    void updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
-          "Please check your connection settings and user credentials.");
-        UpdateControlsDisconnected();
-      } else {
-        RefreshLocalPluginListAsync();
-        RefreshRemotePluginListAsync();
-        UpdateControlsConnected();
-      }
-    }
-
-    void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
-      installationManager.Install(info.PluginsToInstall);
-      installationManager.Update(info.PluginsToUpdate);
-    }
-    #endregion
-
-    #region event handlers for refresh server plugins background worker
-    void refreshServerPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (e.Error != null) {
-        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
-          "Please check your connection settings and user credentials.");
-        UpdateControlsDisconnected();
-      } else {
-        RefreshBackgroundWorkerResult refreshResult = (RefreshBackgroundWorkerResult)e.Result;
-        UpdateRemotePluginList(refreshResult.RemoteProducts, refreshResult.RemotePlugins);
-        UpdateControlsConnected();
-      }
-    }
-
-    void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
-      result.RemotePlugins = installationManager.GetRemotePluginList();
-      result.RemoteProducts = installationManager.GetRemoteProductList();
-      e.Cancel = false;
-      e.Result = result;
-    }
-
-
-
-    #endregion
+        pluginEditor.PluginManager = pluginManager;
+      }
+
+      localPluginsView.StatusView = this;
+      localPluginsView.PluginManager = pluginManager;
+      localPluginsView.InstallationManager = installationManager;
+
+      basicUpdateView.StatusView = this;
+      basicUpdateView.PluginManager = pluginManager;
+      basicUpdateView.InstallationManager = installationManager;
+
+      remotePluginInstaller.StatusView = this;
+      remotePluginInstaller.InstallationManager = installationManager;
+      remotePluginInstaller.PluginManager = pluginManager;
+    }
+
 
     #region plugin manager event handlers
@@ -267,53 +132,5 @@
     #endregion
 
-
-
     #region button events
-
-    private void refreshRemoteButton_Click(object sender, EventArgs e) {
-      Cursor = Cursors.AppStarting;
-      RefreshRemotePluginListAsync();
-      toolStripProgressBar.Visible = true;
-      DisableControls();
-    }
-
-    private void updateOrInstallButton_Click(object sender, EventArgs e) {
-      Cursor = Cursors.AppStarting;
-      toolStripProgressBar.Visible = true;
-      DisableControls();
-      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
-      // 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 remotePluginInstaller.CheckedPlugins
-                            let matchingLocalPlugins = from localPlugin in localPluginManagerView.Plugins
-                                                       where localPlugin.Name == remotePlugin.Name
-                                                       where localPlugin.Version.Major == remotePlugin.Version.Major
-                                                       where localPlugin.Version.Minor == remotePlugin.Version.Minor
-                                                       select localPlugin
-                            where matchingLocalPlugins.Count() > 0
-                            select remotePlugin;
-
-      // otherwise install a new plugin
-      var pluginsToInstall = remotePluginInstaller.CheckedPlugins.Except(pluginsToUpdate);
-
-      updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
-      updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
-      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
-    }
-
-    private void removeLocalButton_Click(object sender, EventArgs e) {
-      Cursor = Cursors.AppStarting;
-      toolStripProgressBar.Visible = true;
-      DisableControls();
-      removePluginsBackgroundWorker.RunWorkerAsync(localPluginManagerView.CheckedPlugins);
-    }
-
-    private void updateAllButton_Click(object sender, EventArgs e) {
-      Cursor = Cursors.AppStarting;
-      toolStripProgressBar.Visible = true;
-      updateButton.Enabled = false;
-      var installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>();
-      updateAllPluginsBackgroundWorker.RunWorkerAsync(installedPlugins);
-    }
-
     private void connectionSettingsToolStripMenuItem_Click(object sender, EventArgs e) {
       new ConnectionSetupView().ShowDialog();
@@ -321,5 +138,7 @@
 
     private void tabControl_Selected(object sender, TabControlEventArgs e) {
-      viewToolStripMenuItem.Enabled = e.TabPage == availablePluginsTabPage;
+      viewToolStripMenuItem.Enabled = e.TabPage == availablePluginsTabPage;      
+      toolStripStatusLabel.Text = string.Empty;
+      toolStripProgressBar.Visible = false;
     }
 
@@ -377,71 +196,6 @@
     }
 
-    private void UpdateLocalPluginList(IEnumerable<PluginDescription> plugins) {
-      localPluginManagerView.Plugins = plugins;
-    }
-
-    private void UpdateRemotePluginList(
-      IEnumerable<DeploymentService.ProductDescription> remoteProducts,
-      IEnumerable<IPluginDescription> remotePlugins) {
-
-      var mostRecentRemotePlugins = from remote in remotePlugins
-                                    where !remotePlugins.Any(x => x.Name == remote.Name && x.Version > remote.Version) // same name and higher version
-                                    select remote;
-
-      var newPlugins = from remote in mostRecentRemotePlugins
-                       let matchingLocal = (from local in localPluginManagerView.Plugins
-                                            where local.Name == remote.Name
-                                            where local.Version < remote.Version
-                                            select local).FirstOrDefault()
-                       where matchingLocal != null
-                       select remote;
-
-      remotePluginInstaller.NewPlugins = newPlugins;
-      remotePluginInstaller.Products = remoteProducts;
-      remotePluginInstaller.AllPlugins = remotePlugins;
-    }
-
-    private void RefreshRemotePluginListAsync() {
-      Cursor = Cursors.AppStarting;
-      toolStripProgressBar.Visible = true;
-      refreshButton.Enabled = false;
-      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
-    }
-
-    private void RefreshLocalPluginListAsync() {
-      Cursor = Cursors.AppStarting;
-      toolStripProgressBar.Visible = true;
-      DisableControls();
-      refreshLocalPluginsBackgroundWorker.RunWorkerAsync();
-    }
-
-    private void UpdateControlsDisconnected() {
-      //localPluginsListView.Enabled = false;
-      //ClearPluginsList(remotePluginsListView);
-      refreshButton.Enabled = true;
-      toolStripProgressBar.Visible = false;
-      Cursor = Cursors.Default;
-    }
-
-    private void UpdateControlsConnected() {
-      refreshButton.Enabled = true;
-      updateButton.Enabled = true;
-      toolStripProgressBar.Visible = false;
-      Cursor = Cursors.Default;
-    }
-
-    private void DisableControls() {
-      refreshButton.Enabled = false;
-      Cursor = Cursors.Default;
-    }
-    #endregion
-
-    private void localPluginManager_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      removeButton.Enabled = localPluginManagerView.CheckedPlugins.Count() > 0;
-    }
-
-    private void remotePluginInstaller_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      installButton.Enabled = remotePluginInstaller.CheckedPlugins.Count() > 0;
-    }
+    #endregion
+
 
     protected override void OnClosing(CancelEventArgs e) {
@@ -455,7 +209,50 @@
     }
 
-
-
-
+    #region IStatusView Members
+
+    public void ShowProgressIndicator(double percentProgress) {
+      if (percentProgress < 0.0 || percentProgress > 1.0) throw new ArgumentException();
+      toolStripProgressBar.Visible = true;
+      toolStripProgressBar.Style = ProgressBarStyle.Continuous;
+      int range = toolStripProgressBar.Maximum - toolStripProgressBar.Minimum;
+      toolStripProgressBar.Value = (int)(percentProgress * range + toolStripProgressBar.Minimum);
+    }
+
+    public void ShowProgressIndicator() {
+      toolStripProgressBar.Visible = true;
+      toolStripProgressBar.Style = ProgressBarStyle.Marquee;
+    }
+
+    public void HideProgressIndicator() {
+      toolStripProgressBar.Visible = false;
+    }
+
+    public void ShowMessage(string message) {
+      if (toolStripStatusLabel.Text == string.Empty)
+        toolStripStatusLabel.Text = message;
+      else
+        toolStripStatusLabel.Text += "; " + message;
+    }
+
+    public void RemoveMessage(string message) {
+      if (toolStripStatusLabel.Text.IndexOf("; " + message) > 0) {
+        toolStripStatusLabel.Text = toolStripStatusLabel.Text.Replace("; " + message, "");
+      }
+      toolStripStatusLabel.Text = toolStripStatusLabel.Text.Replace(message, "");
+      toolStripStatusLabel.Text = toolStripStatusLabel.Text.TrimStart(' ', ';');
+    }
+    public void LockUI() {
+      Cursor = Cursors.AppStarting;
+      tabControl.Enabled = false;
+    }
+    public void UnlockUI() {
+      tabControl.Enabled = true;
+      Cursor = Cursors.Default;
+    }
+    public void ShowError(string shortMessage, string description) {
+      logTextBox.Text += DateTime.Now + ": " + shortMessage + Environment.NewLine + description + Environment.NewLine;
+      MessageBox.Show(description, shortMessage);
+    }
+    #endregion
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.Designer.cs	(revision 3547)
@@ -74,6 +74,6 @@
       this.localPluginsListView.UseCompatibleStateImageBehavior = false;
       this.localPluginsListView.View = System.Windows.Forms.View.Details;
-      this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
-      this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
+      //this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
+      //this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
       // 
       // nameHeader
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs	(revision 3547)
@@ -34,105 +34,11 @@
     public event ItemCheckedEventHandler ItemChecked;
 
-    private BackgroundWorker refreshPluginListBackgroundWorker = new BackgroundWorker();
-
-    private ListViewGroup enabledPluginsGroup;
-    private ListViewGroup disabledPluginsGroup;
 
     public LocalPluginManagerView() {
       InitializeComponent();
 
-      enabledPluginsGroup = localPluginsListView.Groups["activePluginsGroup"];
-      disabledPluginsGroup = localPluginsListView.Groups["disabledPluginsGroup"];
+      
     }
-
-    private IEnumerable<PluginDescription> plugins;
-    public IEnumerable<PluginDescription> Plugins {
-      get { return plugins; }
-      set {
-        if (value != plugins) {
-          this.plugins = value;
-          UpdateControl();
-        }
-      }
-    }
-
-    public IEnumerable<IPluginDescription> CheckedPlugins {
-      get {
-        return (from item in localPluginsListView.Items.OfType<ListViewItem>()
-                where item.Checked
-                let plugin = item.Tag as IPluginDescription
-                where plugin != null
-                select plugin).ToList();
-      }
-    }
-
-    private void UpdateControl() {
-      ClearPluginList();
-      localPluginsListView.SuppressItemCheckedEvents = true;
-      foreach (var plugin in plugins) {
-        var item = CreateListViewItem(plugin);
-        if (plugin.PluginState == PluginState.Enabled) {
-          item.Group = enabledPluginsGroup;
-        } else if (plugin.PluginState == PluginState.Disabled) {
-          item.Group = disabledPluginsGroup;
-        }
-        localPluginsListView.Items.Add(item);
-      }
-      localPluginsListView.SuppressItemCheckedEvents = false;
-    }
-
-    private void ClearPluginList() {
-      List<ListViewItem> itemsToRemove = new List<ListViewItem>(from item in localPluginsListView.Items.OfType<ListViewItem>()
-                                                                select item);
-      itemsToRemove.ForEach(item => localPluginsListView.Items.Remove(item));
-    }
-
-    private ListViewItem CreateListViewItem(PluginDescription plugin) {
-      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
-      item.Tag = plugin;
-      return item;
-    }
-
-    private void pluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
-      // checked items are marked for removal
-      if (e.Item.Checked) {
-        List<ListViewItem> modifiedItems = new List<ListViewItem>();
-        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          modifiedItems.Add(item);
-          // also uncheck all dependent plugins
-          foreach (ListViewItem dependentItem in localPluginsListView.Items) {
-            var dependent = (IPluginDescription)dependentItem.Tag;
-            if (!dependentItem.Checked && (from dep in dependent.Dependencies
-                                           where dep.Name == plugin.Name
-                                           where dep.Version == plugin.Version
-                                           select dep).Any()) {
-              modifiedItems.Add(dependentItem);
-            }
-          }
-        }
-        localPluginsListView.CheckItems(modifiedItems);
-      } else {
-        List<ListViewItem> modifiedItems = new List<ListViewItem>();
-        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
-          var plugin = (IPluginDescription)item.Tag;
-          modifiedItems.Add(item);
-        }
-        localPluginsListView.UncheckItems(modifiedItems);
-      }
-      OnItemChecked(e);
-    }
-
-    private void OnItemChecked(ItemCheckedEventArgs e) {
-      if (ItemChecked != null) ItemChecked(this, e);
-    }
-
-    private void localPluginsListView_ItemActivate(object sender, EventArgs e) {
-      if (localPluginsListView.SelectedItems.Count > 0) {
-        var plugin = (PluginDescription)localPluginsListView.SelectedItems[0].Tag;
-        PluginView pluginView = new PluginView(plugin);
-        pluginView.Show();
-      }
-    }
+    
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.Designer.cs	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.Designer.cs	(revision 3547)
@@ -0,0 +1,150 @@
+﻿#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
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class LocalPluginsView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Active Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Disabled Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      this.updateSelectedButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.localPluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.SuspendLayout();
+      // 
+      // updateSelectedButton
+      // 
+      this.updateSelectedButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.updateSelectedButton.Enabled = false;
+      this.updateSelectedButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.updateSelectedButton.Location = new System.Drawing.Point(3, 483);
+      this.updateSelectedButton.Name = "updateSelectedButton";
+      this.updateSelectedButton.Size = new System.Drawing.Size(114, 25);
+      this.updateSelectedButton.TabIndex = 6;
+      this.updateSelectedButton.Text = "Update Selected";
+      this.updateSelectedButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.updateSelectedButton.UseVisualStyleBackColor = true;
+      this.updateSelectedButton.Click += new System.EventHandler(this.updateSelectedButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Remove;
+      this.removeButton.Location = new System.Drawing.Point(123, 483);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(110, 25);
+      this.removeButton.TabIndex = 12;
+      this.removeButton.Text = "Delete Selected";
+      this.removeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // localPluginsListView
+      // 
+      this.localPluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginsListView.CheckBoxes = true;
+      this.localPluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader,
+            this.descriptionHeader});
+      listViewGroup1.Header = "Active Plugins";
+      listViewGroup1.Name = "listViewGroup2";
+      listViewGroup2.Header = "Disabled Plugins";
+      listViewGroup2.Name = "listViewGroup1";
+      this.localPluginsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2});
+      this.localPluginsListView.Location = new System.Drawing.Point(3, 3);
+      this.localPluginsListView.Name = "localPluginsListView";
+      this.localPluginsListView.Size = new System.Drawing.Size(536, 474);
+      this.localPluginsListView.SuppressItemCheckedEvents = false;
+      this.localPluginsListView.TabIndex = 13;
+      this.localPluginsListView.UseCompatibleStateImageBehavior = false;
+      this.localPluginsListView.View = System.Windows.Forms.View.Details;
+      this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
+      this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 199;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      this.versionHeader.Width = 84;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 245;
+      // 
+      // LocalPluginsView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.localPluginsListView);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.updateSelectedButton);
+      this.Name = "LocalPluginsView";
+      this.Size = new System.Drawing.Size(539, 508);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button updateSelectedButton;
+    private System.Windows.Forms.Button removeButton;
+    private MultiSelectListView localPluginsListView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    // private LocalPluginManagerView localPluginManagerView;
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.cs	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.cs	(revision 3547)
@@ -0,0 +1,236 @@
+﻿#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.ServiceModel;
+using ICSharpCode.SharpZipLib.Zip;
+using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class LocalPluginsView : InstallationManagerControl {
+    private const string CheckingPluginsMessage = "Checking for updated plugins...";
+    private const string NoUpdatesAvailableMessage = "No updates available.";
+    private BackgroundWorker removePluginsBackgroundWorker;
+    private BackgroundWorker updatePluginsBackgroundWorker;
+
+    private ListViewGroup enabledPluginsGroup;
+    private ListViewGroup disabledPluginsGroup;
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set {
+        pluginManager = value;
+        UpdateControl();
+      }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+
+    public LocalPluginsView()
+      : base() {
+      InitializeComponent();
+      enabledPluginsGroup = localPluginsListView.Groups["activePluginsGroup"];
+      disabledPluginsGroup = localPluginsListView.Groups["disabledPluginsGroup"];
+
+      removePluginsBackgroundWorker = new BackgroundWorker();
+      removePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(removePluginsBackgroundWorker_DoWork);
+      removePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(removePluginsBackgroundWorker_RunWorkerCompleted);
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+
+      UpdateControl();
+    }
+
+
+
+    #region event handlers for plugin removal background worker
+    void removePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("File Deletion Error", "There was problem while deleting files." + Environment.NewLine + e.Error.Message);
+      }
+      UpdateControl();
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void removePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> pluginsToRemove = (IEnumerable<IPluginDescription>)e.Argument;
+      if (pluginsToRemove.Count() > 0) {
+        installationManager.Remove(pluginsToRemove);
+        pluginManager.DiscoverAndCheckPlugins();
+      }
+    }
+    #endregion
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      } else if (e.Cancelled) {
+        StatusView.ShowMessage(NoUpdatesAvailableMessage);
+      }
+      StatusView.RemoveMessage(CheckingPluginsMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      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 selectedPlugins
+                                                       where installedPlugin.Name == remotePlugin.Name
+                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        installationManager.Update(pluginsToUpdate);
+        pluginManager.DiscoverAndCheckPlugins();
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      if (plugin1.Version.Build < plugin2.Version.Build) return false;
+      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
+      else return plugin1.Version.Revision > plugin2.Version.Revision;
+    }
+    #endregion
+
+    private void UpdateControl() {
+      ClearPluginList();
+      if (pluginManager != null) {
+        localPluginsListView.SuppressItemCheckedEvents = true;
+        foreach (var plugin in pluginManager.Plugins) {
+          var item = CreateListViewItem(plugin);
+          if (plugin.PluginState == PluginState.Enabled) {
+            item.Group = enabledPluginsGroup;
+          } else if (plugin.PluginState == PluginState.Disabled) {
+            item.Group = disabledPluginsGroup;
+          }
+          localPluginsListView.Items.Add(item);
+        }
+        localPluginsListView.SuppressItemCheckedEvents = false;
+      }
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void ClearPluginList() {
+      List<ListViewItem> itemsToRemove = new List<ListViewItem>(localPluginsListView.Items.OfType<ListViewItem>());
+      itemsToRemove.ForEach(item => localPluginsListView.Items.Remove(item));
+    }
+
+    private ListViewItem CreateListViewItem(PluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      return item;
+    }
+
+    private void pluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      // checked items are marked for removal
+      if (e.Item.Checked) {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          modifiedItems.Add(item);
+          // also uncheck all dependent plugins
+          foreach (ListViewItem dependentItem in localPluginsListView.Items) {
+            var dependent = (IPluginDescription)dependentItem.Tag;
+            if (!dependentItem.Checked && (from dep in dependent.Dependencies
+                                           where dep.Name == plugin.Name
+                                           where dep.Version == plugin.Version
+                                           select dep).Any()) {
+              modifiedItems.Add(dependentItem);
+            }
+          }
+        }
+        localPluginsListView.CheckItems(modifiedItems);
+      } else {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          modifiedItems.Add(item);
+        }
+        localPluginsListView.UncheckItems(modifiedItems);
+      }
+      OnItemsCheckedChanged(EventArgs.Empty);
+    }
+
+    private void localPluginsListView_ItemActivate(object sender, EventArgs e) {
+      if (localPluginsListView.SelectedItems.Count > 0) {
+        var plugin = (PluginDescription)localPluginsListView.SelectedItems[0].Tag;
+        PluginView pluginView = new PluginView(plugin);
+        pluginView.Show();
+      }
+    }
+
+    private void OnItemsCheckedChanged(EventArgs eventArgs) {
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void updateSelectedButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
+      StatusView.ShowMessage(CheckingPluginsMessage);
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      updatePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+
+    private void removeButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      removePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.resx	(revision 3547)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginsView.resx	(revision 3547)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.Designer.cs	(revision 3547)
@@ -45,6 +45,6 @@
     /// </summary>
     private void InitializeComponent() {
+      this.uploadButton = new System.Windows.Forms.Button();
       this.refreshButton = new System.Windows.Forms.Button();
-      this.uploadButton = new System.Windows.Forms.Button();
       this.listView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
       this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
@@ -54,24 +54,30 @@
       this.SuspendLayout();
       // 
-      // refreshButton
-      // 
-      this.refreshButton.Location = new System.Drawing.Point(3, 3);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(75, 23);
-      this.refreshButton.TabIndex = 6;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
       // uploadButton
       // 
       this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.uploadButton.Location = new System.Drawing.Point(3, 482);
+      this.uploadButton.Enabled = false;
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Objects_Arrow_Up;
+      this.uploadButton.Location = new System.Drawing.Point(78, 477);
       this.uploadButton.Name = "uploadButton";
-      this.uploadButton.Size = new System.Drawing.Size(75, 23);
+      this.uploadButton.Size = new System.Drawing.Size(114, 31);
       this.uploadButton.TabIndex = 7;
-      this.uploadButton.Text = "Upload";
+      this.uploadButton.Text = "Upload Selected";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
       this.uploadButton.UseVisualStyleBackColor = true;
       this.uploadButton.Click += new System.EventHandler(this.uploadButton_Click);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(0, 477);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 31);
+      this.refreshButton.TabIndex = 6;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
       // 
       // listView
@@ -86,7 +92,7 @@
             this.serverVersionHeader,
             this.descriptionHeader});
-      this.listView.Location = new System.Drawing.Point(3, 32);
+      this.listView.Location = new System.Drawing.Point(0, 0);
       this.listView.Name = "listView";
-      this.listView.Size = new System.Drawing.Size(536, 444);
+      this.listView.Size = new System.Drawing.Size(539, 471);
       this.listView.SuppressItemCheckedEvents = false;
       this.listView.TabIndex = 8;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs	(revision 3547)
@@ -39,4 +39,13 @@
     private BackgroundWorker updateServerPluginsWorker;
 
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set {
+        // if (value == null) throw new ArgumentNullException();
+        pluginManager = value;
+      }
+    }
+
     public PluginEditor() {
       InitializeComponent();
@@ -58,8 +67,12 @@
     #region refresh plugins from server backgroundworker
     void updateServerPluginsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (!e.Cancelled && e.Result != null) {
+      if (e.Error != null) {
+        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+        UpdateControlsDisconnectedState();
+      } else {
         // refresh local plugins
         localAndServerPlugins.Clear();
-        foreach (var plugin in ApplicationManager.Manager.Plugins) {
+        foreach (var plugin in pluginManager.Plugins) {
           localAndServerPlugins.Add(plugin, null);
         }
@@ -88,6 +101,4 @@
         listView.CheckBoxes = true;
         UpdateControlsConnectedState();
-      } else {
-        UpdateControlsDisconnectedState();
       }
       // make sure cursor is set correctly
@@ -96,17 +107,6 @@
 
     void updateServerPluginsWorker_DoWork(object sender, DoWorkEventArgs e) {
-      try {
-        var client = DeploymentService.UpdateClientFactory.CreateClient();
-        e.Result = client.GetPlugins();
-        e.Cancel = false;
-      }
-      catch (EndpointNotFoundException) {
-        e.Result = null;
-        e.Cancel = true;
-      }
-      catch (FaultException) {
-        e.Result = null;
-        e.Cancel = true;
-      }
+      var client = DeploymentService.UpdateClientFactory.CreateClient();
+      e.Result = client.GetPlugins();
     }
     #endregion
@@ -115,5 +115,7 @@
     void pluginUploadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
       Cursor = Cursors.Default;
-      if (e.Cancelled) {
+      if (e.Error != null) {
+        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
         UpdateControlsDisconnectedState();
       } else {
@@ -125,19 +127,10 @@
 
     void pluginUploadWorker_DoWork(object sender, DoWorkEventArgs e) {
-      try {
-        var selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
-        DeploymentService.AdminClient adminClient = DeploymentService.AdminClientFactory.CreateClient();
-
-        foreach (var plugin in IteratePlugins(selectedPlugins)) {
-          SetMainFormStatusBar("Uploading", plugin);
-          adminClient.DeployPlugin(MakePluginDescription(plugin), CreateZipPackage(plugin));
-        }
-        e.Cancel = false;
-      }
-      catch (EndpointNotFoundException) {
-        e.Cancel = true;
-      }
-      catch (FaultException) {
-        e.Cancel = true;
+      var selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      DeploymentService.AdminClient adminClient = DeploymentService.AdminClientFactory.CreateClient();
+
+      foreach (var plugin in IteratePlugins(selectedPlugins)) {
+        SetMainFormStatusBar("Uploading", plugin);
+        adminClient.DeployPlugin(MakePluginDescription(plugin), CreateZipPackage(plugin));
       }
     }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3547)
@@ -74,5 +74,5 @@
       // 
       this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(3, 6);
+      this.nameLabel.Location = new System.Drawing.Point(12, 6);
       this.nameLabel.Name = "nameLabel";
       this.nameLabel.Size = new System.Drawing.Size(38, 13);
@@ -84,8 +84,8 @@
       this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(74, 3);
+      this.nameTextBox.Location = new System.Drawing.Point(81, 3);
       this.nameTextBox.Name = "nameTextBox";
       this.nameTextBox.ReadOnly = true;
-      this.nameTextBox.Size = new System.Drawing.Size(284, 20);
+      this.nameTextBox.Size = new System.Drawing.Size(268, 20);
       this.nameTextBox.TabIndex = 1;
       // 
@@ -94,8 +94,8 @@
       this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.versionTextBox.Location = new System.Drawing.Point(74, 29);
+      this.versionTextBox.Location = new System.Drawing.Point(81, 29);
       this.versionTextBox.Name = "versionTextBox";
       this.versionTextBox.ReadOnly = true;
-      this.versionTextBox.Size = new System.Drawing.Size(284, 20);
+      this.versionTextBox.Size = new System.Drawing.Size(268, 20);
       this.versionTextBox.TabIndex = 3;
       // 
@@ -103,5 +103,5 @@
       // 
       this.versionLabel.AutoSize = true;
-      this.versionLabel.Location = new System.Drawing.Point(3, 32);
+      this.versionLabel.Location = new System.Drawing.Point(12, 32);
       this.versionLabel.Name = "versionLabel";
       this.versionLabel.Size = new System.Drawing.Size(45, 13);
@@ -113,8 +113,8 @@
       this.contactTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.contactTextBox.Location = new System.Drawing.Point(74, 55);
+      this.contactTextBox.Location = new System.Drawing.Point(81, 55);
       this.contactTextBox.Name = "contactTextBox";
       this.contactTextBox.ReadOnly = true;
-      this.contactTextBox.Size = new System.Drawing.Size(284, 20);
+      this.contactTextBox.Size = new System.Drawing.Size(268, 20);
       this.contactTextBox.TabIndex = 5;
       // 
@@ -122,5 +122,5 @@
       // 
       this.contactInfoLabel.AutoSize = true;
-      this.contactInfoLabel.Location = new System.Drawing.Point(3, 58);
+      this.contactInfoLabel.Location = new System.Drawing.Point(12, 58);
       this.contactInfoLabel.Name = "contactInfoLabel";
       this.contactInfoLabel.Size = new System.Drawing.Size(47, 13);
@@ -131,5 +131,5 @@
       // 
       this.licenseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
-      this.licenseButton.Location = new System.Drawing.Point(3, 586);
+      this.licenseButton.Location = new System.Drawing.Point(3, 575);
       this.licenseButton.Name = "licenseButton";
       this.licenseButton.Size = new System.Drawing.Size(103, 23);
@@ -145,7 +145,7 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.dependenciesGroupBox.Controls.Add(this.dependenciesListView);
-      this.dependenciesGroupBox.Location = new System.Drawing.Point(6, 408);
+      this.dependenciesGroupBox.Location = new System.Drawing.Point(12, 408);
       this.dependenciesGroupBox.Name = "dependenciesGroupBox";
-      this.dependenciesGroupBox.Size = new System.Drawing.Size(355, 172);
+      this.dependenciesGroupBox.Size = new System.Drawing.Size(337, 145);
       this.dependenciesGroupBox.TabIndex = 1;
       this.dependenciesGroupBox.TabStop = false;
@@ -160,5 +160,5 @@
       this.dependenciesListView.Location = new System.Drawing.Point(3, 16);
       this.dependenciesListView.Name = "dependenciesListView";
-      this.dependenciesListView.Size = new System.Drawing.Size(349, 153);
+      this.dependenciesListView.Size = new System.Drawing.Size(331, 126);
       this.dependenciesListView.SmallImageList = this.imageList;
       this.dependenciesListView.TabIndex = 0;
@@ -191,5 +191,5 @@
       this.filesListView.Location = new System.Drawing.Point(3, 16);
       this.filesListView.Name = "filesListView";
-      this.filesListView.Size = new System.Drawing.Size(346, 140);
+      this.filesListView.Size = new System.Drawing.Size(331, 140);
       this.filesListView.SmallImageList = this.imageList;
       this.filesListView.TabIndex = 0;
@@ -212,7 +212,7 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.filesGroupBox.Controls.Add(this.filesListView);
-      this.filesGroupBox.Location = new System.Drawing.Point(9, 243);
+      this.filesGroupBox.Location = new System.Drawing.Point(12, 243);
       this.filesGroupBox.Name = "filesGroupBox";
-      this.filesGroupBox.Size = new System.Drawing.Size(352, 159);
+      this.filesGroupBox.Size = new System.Drawing.Size(337, 159);
       this.filesGroupBox.TabIndex = 11;
       this.filesGroupBox.TabStop = false;
@@ -223,8 +223,8 @@
       this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.stateTextBox.Location = new System.Drawing.Point(74, 145);
+      this.stateTextBox.Location = new System.Drawing.Point(81, 145);
       this.stateTextBox.Name = "stateTextBox";
       this.stateTextBox.ReadOnly = true;
-      this.stateTextBox.Size = new System.Drawing.Size(284, 20);
+      this.stateTextBox.Size = new System.Drawing.Size(268, 20);
       this.stateTextBox.TabIndex = 13;
       // 
@@ -232,5 +232,5 @@
       // 
       this.stateLabel.AutoSize = true;
-      this.stateLabel.Location = new System.Drawing.Point(3, 148);
+      this.stateLabel.Location = new System.Drawing.Point(12, 148);
       this.stateLabel.Name = "stateLabel";
       this.stateLabel.Size = new System.Drawing.Size(35, 13);
@@ -241,5 +241,5 @@
       // 
       this.errorLabel.AutoSize = true;
-      this.errorLabel.Location = new System.Drawing.Point(3, 174);
+      this.errorLabel.Location = new System.Drawing.Point(12, 174);
       this.errorLabel.Name = "errorLabel";
       this.errorLabel.Size = new System.Drawing.Size(32, 13);
@@ -250,5 +250,5 @@
       // 
       this.descriptionLabel.AutoSize = true;
-      this.descriptionLabel.Location = new System.Drawing.Point(3, 84);
+      this.descriptionLabel.Location = new System.Drawing.Point(12, 84);
       this.descriptionLabel.Name = "descriptionLabel";
       this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
@@ -260,8 +260,8 @@
       this.errorTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.errorTextBox.Location = new System.Drawing.Point(74, 171);
+      this.errorTextBox.Location = new System.Drawing.Point(81, 171);
       this.errorTextBox.Name = "errorTextBox";
       this.errorTextBox.ReadOnly = true;
-      this.errorTextBox.Size = new System.Drawing.Size(284, 66);
+      this.errorTextBox.Size = new System.Drawing.Size(268, 66);
       this.errorTextBox.TabIndex = 18;
       this.errorTextBox.Text = "";
@@ -271,8 +271,8 @@
       this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
-      this.descriptionTextBox.Location = new System.Drawing.Point(74, 81);
+      this.descriptionTextBox.Location = new System.Drawing.Point(81, 81);
       this.descriptionTextBox.Name = "descriptionTextBox";
       this.descriptionTextBox.ReadOnly = true;
-      this.descriptionTextBox.Size = new System.Drawing.Size(284, 58);
+      this.descriptionTextBox.Size = new System.Drawing.Size(268, 58);
       this.descriptionTextBox.TabIndex = 19;
       this.descriptionTextBox.Text = "";
@@ -282,5 +282,5 @@
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.ClientSize = new System.Drawing.Size(345, 576);
+      this.ClientSize = new System.Drawing.Size(361, 565);
       this.Controls.Add(this.descriptionTextBox);
       this.Controls.Add(this.errorTextBox);
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3547)
@@ -32,5 +32,5 @@
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class PluginView : UserControl {
+  internal partial class PluginView : Form {
     private const string IMAGE_KEY_ASSEMBLY = "Assembly";
     private const string IMAGE_KEY_FILE = "File";
@@ -49,5 +49,5 @@
 
       this.plugin = plugin;
-      this.Name = "Plugin Details: " + plugin.ToString();
+      this.Text = "Plugin Details: " + plugin.ToString();
       UpdateControls();
     }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.Designer.cs	(revision 3547)
@@ -48,5 +48,4 @@
       this.refreshButton = new System.Windows.Forms.Button();
       this.uploadButton = new System.Windows.Forms.Button();
-      this.newProductButton = new System.Windows.Forms.Button();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.productsGroupBox = new System.Windows.Forms.GroupBox();
@@ -57,5 +56,4 @@
       this.detailsGroupBox = new System.Windows.Forms.GroupBox();
       this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
-      this.pluginListView = new HeuristicLab.PluginInfrastructure.Advanced.PluginListView();
       this.versionTextBox = new System.Windows.Forms.TextBox();
       this.nameLabel = new System.Windows.Forms.Label();
@@ -63,5 +61,7 @@
       this.versionLabel = new System.Windows.Forms.Label();
       this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.newProductButton = new System.Windows.Forms.Button();
       this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.pluginListView = new HeuristicLab.PluginInfrastructure.Advanced.PluginListView();
       this.splitContainer.Panel1.SuspendLayout();
       this.splitContainer.Panel2.SuspendLayout();
@@ -75,9 +75,12 @@
       // refreshButton
       // 
-      this.refreshButton.Location = new System.Drawing.Point(6, 19);
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(6, 389);
       this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(75, 23);
+      this.refreshButton.Size = new System.Drawing.Size(73, 31);
       this.refreshButton.TabIndex = 1;
       this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
       this.refreshButton.UseVisualStyleBackColor = true;
       this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
@@ -87,22 +90,13 @@
       this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
       this.uploadButton.Enabled = false;
-      this.uploadButton.Location = new System.Drawing.Point(6, 397);
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Objects_Arrow_Up;
+      this.uploadButton.Location = new System.Drawing.Point(85, 389);
       this.uploadButton.Name = "uploadButton";
-      this.uploadButton.Size = new System.Drawing.Size(96, 23);
+      this.uploadButton.Size = new System.Drawing.Size(120, 31);
       this.uploadButton.TabIndex = 2;
       this.uploadButton.Text = "Upload Products";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
       this.uploadButton.UseVisualStyleBackColor = true;
       this.uploadButton.Click += new System.EventHandler(this.saveButton_Click);
-      // 
-      // newProductButton
-      // 
-      this.newProductButton.Enabled = false;
-      this.newProductButton.Location = new System.Drawing.Point(87, 19);
-      this.newProductButton.Name = "newProductButton";
-      this.newProductButton.Size = new System.Drawing.Size(91, 23);
-      this.newProductButton.TabIndex = 3;
-      this.newProductButton.Text = "New product";
-      this.newProductButton.UseVisualStyleBackColor = true;
-      this.newProductButton.Click += new System.EventHandler(this.newProductButton_Click);
       // 
       // splitContainer
@@ -125,9 +119,11 @@
       // productsGroupBox
       // 
+      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
       this.productsGroupBox.Controls.Add(this.uploadButton);
       this.productsGroupBox.Controls.Add(this.newProductButton);
       this.productsGroupBox.Controls.Add(this.productsListView);
       this.productsGroupBox.Controls.Add(this.refreshButton);
-      this.productsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
       this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
       this.productsGroupBox.Name = "productsGroupBox";
@@ -147,8 +143,8 @@
       this.productsListView.Enabled = false;
       this.productsListView.FullRowSelect = true;
-      this.productsListView.Location = new System.Drawing.Point(6, 48);
+      this.productsListView.Location = new System.Drawing.Point(6, 56);
       this.productsListView.MultiSelect = false;
       this.productsListView.Name = "productsListView";
-      this.productsListView.Size = new System.Drawing.Size(309, 343);
+      this.productsListView.Size = new System.Drawing.Size(309, 327);
       this.productsListView.SmallImageList = this.productImageList;
       this.productsListView.TabIndex = 4;
@@ -175,4 +171,7 @@
       // detailsGroupBox
       // 
+      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
       this.detailsGroupBox.Controls.Add(this.pluginsGroupBox);
       this.detailsGroupBox.Controls.Add(this.versionTextBox);
@@ -180,5 +179,4 @@
       this.detailsGroupBox.Controls.Add(this.nameTextBox);
       this.detailsGroupBox.Controls.Add(this.versionLabel);
-      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
       this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
       this.detailsGroupBox.Name = "detailsGroupBox";
@@ -201,7 +199,74 @@
       this.pluginsGroupBox.Text = "Plugins";
       // 
+      // versionTextBox
+      // 
+      this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.versionTextBox.Enabled = false;
+      this.versionTextBox.Location = new System.Drawing.Point(57, 45);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.Size = new System.Drawing.Size(277, 20);
+      this.versionTextBox.TabIndex = 5;
+      this.versionTextBox.TextChanged += new System.EventHandler(this.versionTextBox_TextChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Enabled = false;
+      this.nameLabel.Location = new System.Drawing.Point(13, 22);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 2;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Enabled = false;
+      this.nameTextBox.Location = new System.Drawing.Point(57, 19);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(277, 20);
+      this.nameTextBox.TabIndex = 3;
+      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.AutoSize = true;
+      this.versionLabel.Enabled = false;
+      this.versionLabel.Location = new System.Drawing.Point(6, 48);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(45, 13);
+      this.versionLabel.TabIndex = 4;
+      this.versionLabel.Text = "Version:";
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // newProductButton
+      // 
+      this.newProductButton.Enabled = false;
+      this.newProductButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_CommonElements_Actions_Add;
+      this.newProductButton.Location = new System.Drawing.Point(6, 19);
+      this.newProductButton.Name = "newProductButton";
+      this.newProductButton.Size = new System.Drawing.Size(104, 31);
+      this.newProductButton.TabIndex = 3;
+      this.newProductButton.Text = "Create Product";
+      this.newProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.newProductButton.UseVisualStyleBackColor = true;
+      this.newProductButton.Click += new System.EventHandler(this.newProductButton_Click);
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
       // pluginListView
       // 
-      this.pluginListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
       this.pluginListView.Enabled = false;
       this.pluginListView.Location = new System.Drawing.Point(3, 16);
@@ -211,56 +276,4 @@
       this.pluginListView.TabIndex = 7;
       this.pluginListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginListView_ItemChecked);
-      // 
-      // versionTextBox
-      // 
-      this.versionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.versionTextBox.Enabled = false;
-      this.versionTextBox.Location = new System.Drawing.Point(57, 45);
-      this.versionTextBox.Name = "versionTextBox";
-      this.versionTextBox.Size = new System.Drawing.Size(277, 20);
-      this.versionTextBox.TabIndex = 5;
-      this.versionTextBox.TextChanged += new System.EventHandler(this.versionTextBox_TextChanged);
-      // 
-      // nameLabel
-      // 
-      this.nameLabel.AutoSize = true;
-      this.nameLabel.Enabled = false;
-      this.nameLabel.Location = new System.Drawing.Point(13, 22);
-      this.nameLabel.Name = "nameLabel";
-      this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 2;
-      this.nameLabel.Text = "Name:";
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Enabled = false;
-      this.nameTextBox.Location = new System.Drawing.Point(57, 19);
-      this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.Size = new System.Drawing.Size(277, 20);
-      this.nameTextBox.TabIndex = 3;
-      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
-      // 
-      // versionLabel
-      // 
-      this.versionLabel.AutoSize = true;
-      this.versionLabel.Enabled = false;
-      this.versionLabel.Location = new System.Drawing.Point(6, 48);
-      this.versionLabel.Name = "versionLabel";
-      this.versionLabel.Size = new System.Drawing.Size(45, 13);
-      this.versionLabel.TabIndex = 4;
-      this.versionLabel.Text = "Version:";
-      // 
-      // pluginImageList
-      // 
-      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
-      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
-      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
-      // 
-      // errorProvider
-      // 
-      this.errorProvider.ContainerControl = this;
       // 
       // ProductEditor
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ProductEditor.cs	(revision 3547)
@@ -60,17 +60,17 @@
       var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
       var adminClient = DeploymentService.AdminClientFactory.CreateClient();
-      try {
-        foreach (var product in products) {
-          adminClient.DeployProduct(product);
-        }
-        e.Cancel = false;
-      }
-      catch (FaultException) {
+      foreach (var product in products) {
+        adminClient.DeployProduct(product);
       }
     }
 
     private void uploadChangedProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      this.Enabled = true;
-      refreshProductsWorker.RunWorkerAsync();
+      if (e.Error != null) {
+        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      } else {
+        this.Enabled = true;
+        refreshProductsWorker.RunWorkerAsync();
+      }
     }
     #endregion
@@ -79,14 +79,12 @@
     private void refreshProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
       var updateClient = DeploymentService.UpdateClientFactory.CreateClient();
-      try {
-        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
-      }
-      catch (FaultException) {
-        e.Cancel = true;
-      }
+      e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
     }
 
     private void refreshProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
-      if (!e.Cancelled && e.Result != null) {
+      if (e.Error != null) {
+        MessageBox.Show("There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+      } else {
         this.products = new List<DeploymentService.ProductDescription>(
           (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.Designer.cs	(revision 3547)
@@ -51,4 +51,6 @@
       this.versionHeader = new System.Windows.Forms.ColumnHeader();
       this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.installButton = new System.Windows.Forms.Button();
       this.SuspendLayout();
       // 
@@ -75,5 +77,5 @@
       this.remotePluginsListView.Location = new System.Drawing.Point(0, 0);
       this.remotePluginsListView.Name = "remotePluginsListView";
-      this.remotePluginsListView.Size = new System.Drawing.Size(533, 558);
+      this.remotePluginsListView.Size = new System.Drawing.Size(533, 527);
       this.remotePluginsListView.SuppressItemCheckedEvents = false;
       this.remotePluginsListView.TabIndex = 0;
@@ -97,8 +99,37 @@
       this.descriptionHeader.Width = 250;
       // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Internet;
+      this.refreshButton.Location = new System.Drawing.Point(0, 533);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 25);
+      this.refreshButton.TabIndex = 16;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
+      // 
+      // installButton
+      // 
+      this.installButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.installButton.Enabled = false;
+      this.installButton.Image = global::HeuristicLab.PluginInfrastructure.Properties.Resources.VS2008ImageLibrary_Objects_Install;
+      this.installButton.Location = new System.Drawing.Point(78, 533);
+      this.installButton.Name = "installButton";
+      this.installButton.Size = new System.Drawing.Size(140, 25);
+      this.installButton.TabIndex = 17;
+      this.installButton.Text = "Install Selected Items";
+      this.installButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.installButton.UseVisualStyleBackColor = true;
+      this.installButton.Click += new System.EventHandler(this.installButton_Click);
+      // 
       // RemotePluginInstallerView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.installButton);
       this.Controls.Add(this.remotePluginsListView);
       this.Name = "RemotePluginInstallerView";
@@ -114,4 +145,6 @@
     private System.Windows.Forms.ColumnHeader versionHeader;
     private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button installButton;
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/RemotePluginInstaller.cs	(revision 3547)
@@ -27,8 +27,19 @@
 using System.Text;
 using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class RemotePluginInstallerView : UserControl {
-    public event ItemCheckedEventHandler ItemChecked;
+  internal partial class RemotePluginInstallerView : InstallationManagerControl {
+    private class RefreshBackgroundWorkerResult {
+      public IEnumerable<IPluginDescription> RemotePlugins { get; set; }
+      public IEnumerable<DeploymentService.ProductDescription> RemoteProducts { get; set; }
+    }
+    private class UpdateOrInstallPluginsBackgroundWorkerArgument {
+      public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
+      public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
+    }
+    private const string PluginDiscoveryMessage = "Looking for new plugins...";
+    private BackgroundWorker refreshServerPluginsBackgroundWorker;
+    private BackgroundWorker updateOrInstallPluginsBackgroundWorker;
 
     private ListViewGroup newPluginsGroup;
@@ -47,12 +58,4 @@
     }
 
-    public RemotePluginInstallerView() {
-      InitializeComponent();
-
-      newPluginsGroup = remotePluginsListView.Groups["newPluginsGroup"];
-      productsGroup = remotePluginsListView.Groups["productsGroup"];
-      allPluginsGroup = remotePluginsListView.Groups["allPluginsGroup"];
-    }
-
     private IEnumerable<DeploymentService.ProductDescription> products;
     public IEnumerable<DeploymentService.ProductDescription> Products {
@@ -97,4 +100,110 @@
       }
     }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+    public RemotePluginInstallerView() {
+      InitializeComponent();
+
+      refreshServerPluginsBackgroundWorker = new BackgroundWorker();
+      refreshServerPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshServerPluginsBackgroundWorker_DoWork);
+      refreshServerPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshServerPluginsBackgroundWorker_RunWorkerCompleted);
+
+      updateOrInstallPluginsBackgroundWorker = new BackgroundWorker();
+      updateOrInstallPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateOrInstallPluginsBackgroundWorker_DoWork);
+      updateOrInstallPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted);
+
+      newPluginsGroup = remotePluginsListView.Groups["newPluginsGroup"];
+      productsGroup = remotePluginsListView.Groups["productsGroup"];
+      allPluginsGroup = remotePluginsListView.Groups["allPluginsGroup"];
+    }
+
+
+    #region event handlers for refresh server plugins background worker
+    void refreshServerPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        RefreshBackgroundWorkerResult refreshResult = (RefreshBackgroundWorkerResult)e.Result;
+        UpdateRemotePluginList(refreshResult.RemoteProducts, refreshResult.RemotePlugins);
+      }
+      StatusView.UnlockUI();
+      StatusView.RemoveMessage(PluginDiscoveryMessage);
+      StatusView.HideProgressIndicator();
+    }
+
+    void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
+      result.RemotePlugins = installationManager.GetRemotePluginList();
+      result.RemoteProducts = installationManager.GetRemoteProductList();
+      e.Result = result;
+    }
+    #endregion
+    #region event handlers for plugin update background worker
+    void updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        UpdateControl();
+      }
+      StatusView.UnlockUI();
+      StatusView.HideProgressIndicator();
+    }
+
+    void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
+      if (info.PluginsToInstall.Count() > 0)
+        installationManager.Install(info.PluginsToInstall);
+      if (info.PluginsToUpdate.Count() > 0)
+        installationManager.Update(info.PluginsToUpdate);
+
+      if (info.PluginsToInstall.Count() > 0 || info.PluginsToUpdate.Count() > 0)
+        pluginManager.DiscoverAndCheckPlugins();
+    }
+    #endregion
+
+
+    #region button events
+    private void refreshRemoteButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(PluginDiscoveryMessage);
+      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
+    }
+    private void installButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
+      // 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 CheckedPlugins
+                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
+                                                       where localPlugin.Name == remotePlugin.Name
+                                                       where localPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where localPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, localPlugin)
+                                                       select localPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+
+      // otherwise install a new plugin
+      var pluginsToInstall = CheckedPlugins.Except(pluginsToUpdate);
+
+      updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
+      updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
+      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
+    }
+    #endregion
 
     private void UpdateControl() {
@@ -159,5 +268,5 @@
         }
       }
-      OnItemChecked(e);
+      installButton.Enabled = remotePluginsListView.CheckedItems.Count > 0;
     }
 
@@ -238,7 +347,4 @@
     }
 
-    private void OnItemChecked(ItemCheckedEventArgs e) {
-      if (ItemChecked != null) ItemChecked(this, e);
-    }
     #endregion
 
@@ -258,5 +364,32 @@
     }
 
-    #endregion
+    private void UpdateRemotePluginList(
+      IEnumerable<DeploymentService.ProductDescription> remoteProducts,
+      IEnumerable<IPluginDescription> remotePlugins) {
+
+      var mostRecentRemotePlugins = from remote in remotePlugins
+                                    where !remotePlugins.Any(x => x.Name == remote.Name && x.Version > remote.Version) // same name and higher version
+                                    select remote;
+
+      var newPlugins = from remote in mostRecentRemotePlugins
+                       let matchingLocal = (from local in pluginManager.Plugins
+                                            where local.Name == remote.Name
+                                            where local.Version < remote.Version
+                                            select local).FirstOrDefault()
+                       where matchingLocal != null
+                       select remote;
+
+      NewPlugins = newPlugins;
+      Products = remoteProducts;
+      AllPlugins = remotePlugins;
+    }
+    private bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      if (plugin1.Version.Build < plugin2.Version.Build) return false;
+      else if (plugin1.Version.Build > plugin2.Version.Build) return true;
+      else return plugin1.Version.Revision > plugin2.Version.Revision;
+    }
+    #endregion
+
 
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3547)
@@ -93,4 +93,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Advanced\BasicUpdateView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\BasicUpdateView.Designer.cs">
+      <DependentUpon>BasicUpdateView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Advanced\ConfirmationDialog.cs">
       <SubType>Form</SubType>
@@ -105,4 +111,17 @@
       <DependentUpon>ConnectionSetupView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Advanced\InstallationManagerControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\InstallationManagerControl.Designer.cs">
+      <DependentUpon>InstallationManagerControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\LocalPluginsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\LocalPluginsView.Designer.cs">
+      <DependentUpon>LocalPluginsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\IStatusDisplay.cs" />
     <Compile Include="Advanced\InstallationManagerException.cs" />
     <Compile Include="Advanced\DeploymentService\AdminClientFactory.cs" />
@@ -135,10 +154,4 @@
       <DependentUpon>LicenseView.cs</DependentUpon>
     </Compile>
-    <Compile Include="Advanced\LocalPluginManager.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Advanced\LocalPluginManager.Designer.cs">
-      <DependentUpon>LocalPluginManager.cs</DependentUpon>
-    </Compile>
     <Compile Include="Advanced\MultiSelectListView.cs">
       <SubType>Component</SubType>
@@ -166,5 +179,5 @@
     </Compile>
     <Compile Include="Advanced\PluginView.cs">
-      <SubType>UserControl</SubType>
+      <SubType>Form</SubType>
     </Compile>
     <Compile Include="Advanced\PluginView.Designer.cs">
@@ -217,7 +230,4 @@
       <DependentUpon>InstallationManagerForm.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="Advanced\LocalPluginManager.resx">
-      <DependentUpon>LocalPluginManager.cs</DependentUpon>
-    </EmbeddedResource>
     <EmbeddedResource Include="Advanced\RemotePluginInstaller.resx">
       <DependentUpon>RemotePluginInstaller.cs</DependentUpon>
@@ -286,4 +296,7 @@
     <Content Include="Resources\List.gif" />
     <Content Include="Resources\Logo_white.gif" />
+    <EmbeddedResource Include="Advanced\BasicUpdateView.resx">
+      <DependentUpon>BasicUpdateView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Advanced\ConfirmationDialog.resx">
       <DependentUpon>ConfirmationDialog.cs</DependentUpon>
@@ -291,4 +304,7 @@
     <EmbeddedResource Include="Advanced\ConnectionSetupView.resx">
       <DependentUpon>ConnectionSetupView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\LocalPluginsView.resx">
+      <DependentUpon>LocalPluginsView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="Advanced\DeploymentService\servdev.cer" />
@@ -317,5 +333,7 @@
     <None Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Remove.png" />
     <None Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Remove1.png" />
+    <None Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Add.png" />
     <Content Include="Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Down.png" />
+    <None Include="Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up1.png" />
     <None Include="Resources\VS2008ImageLibrary_Objects_NetworkConnections.png" />
     <None Include="Resources\VS2008ImageLibrary_Objects_Install1.png" />
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 3547)
@@ -260,4 +260,6 @@
         catch (TypeLoadException) {
         }
+        catch (MissingMemberException) {
+        }
       }
       return pluginDescriptions;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.Designer.cs	(revision 3547)
@@ -96,7 +96,21 @@
         }
         
+        internal static System.Drawing.Bitmap VS2008ImageLibrary_CommonElements_Actions_Add {
+            get {
+                object obj = ResourceManager.GetObject("VS2008ImageLibrary_CommonElements_Actions_Add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap VS2008ImageLibrary_CommonElements_Actions_Remove {
             get {
                 object obj = ResourceManager.GetObject("VS2008ImageLibrary_CommonElements_Actions_Remove", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap VS2008ImageLibrary_CommonElements_Objects_Arrow_Up {
+            get {
+                object obj = ResourceManager.GetObject("VS2008ImageLibrary_CommonElements_Objects_Arrow_Up", resourceCulture);
                 return ((System.Drawing.Bitmap)(obj));
             }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Resources.resx	(revision 3547)
@@ -122,6 +122,9 @@
     <value>..\Resources\VS2008ImageLibrary_CommonElements_Actions_Remove1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="Logo_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\Logo_white.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="VS2008ImageLibrary_CommonElements_Objects_Arrow_Up" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="VS2008ImageLibrary_Objects_NetworkConnections" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\VS2008ImageLibrary_Objects_NetworkConnections.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
   <data name="List" type="System.Resources.ResXFileRef, System.Windows.Forms">
@@ -137,4 +140,7 @@
     <value>..\Resources\LargeIcons.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Logo_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Logo_white.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="VS2008ImageLibrary_Objects_Install" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\VS2008ImageLibrary_Objects_Install1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -143,6 +149,6 @@
     <value>..\Resources\VS2008ImageLibrary_Objects_Internet1.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
-  <data name="VS2008ImageLibrary_Objects_NetworkConnections" type="System.Resources.ResXFileRef, System.Windows.Forms">
-    <value>..\Resources\VS2008ImageLibrary_Objects_NetworkConnections.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  <data name="VS2008ImageLibrary_CommonElements_Actions_Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\VS2008ImageLibrary_CommonElements_Actions_Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
 </root>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 3547)
@@ -92,5 +92,5 @@
         [global::System.Configuration.UserScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
         public bool ShowPluginUploadControls {
             get {
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 3547)
@@ -22,5 +22,5 @@
     </Setting>
     <Setting Name="ShowPluginUploadControls" Type="System.Boolean" Scope="User">
-      <Value Profile="(Default)">True</Value>
+      <Value Profile="(Default)">False</Value>
     </Setting>
   </Settings>
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/app.config
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 3546)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 3547)
@@ -99,5 +99,5 @@
             </setting>
             <setting name="ShowPluginUploadControls" serializeAs="String">
-                <value>True</value>
+                <value>False</value>
             </setting>
         </HeuristicLab.PluginInfrastructure.Properties.Settings>
