Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.Designer.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.Designer.cs	(revision 3006)
@@ -0,0 +1,155 @@
+﻿namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class ConnectionSetupView {
+    /// <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.urlTextBox = new System.Windows.Forms.TextBox();
+      this.urlLabel = new System.Windows.Forms.Label();
+      this.userLabel = new System.Windows.Forms.Label();
+      this.userTextBox = new System.Windows.Forms.TextBox();
+      this.passwordLabel = new System.Windows.Forms.Label();
+      this.passwordTextBox = new System.Windows.Forms.TextBox();
+      this.applyButton = new System.Windows.Forms.Button();
+      this.savePasswordCheckbox = new System.Windows.Forms.CheckBox();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // urlTextBox
+      // 
+      this.urlTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.urlTextBox.Location = new System.Drawing.Point(71, 3);
+      this.urlTextBox.Name = "urlTextBox";
+      this.urlTextBox.Size = new System.Drawing.Size(177, 20);
+      this.urlTextBox.TabIndex = 0;
+      // 
+      // urlLabel
+      // 
+      this.urlLabel.AutoSize = true;
+      this.urlLabel.Location = new System.Drawing.Point(3, 6);
+      this.urlLabel.Name = "urlLabel";
+      this.urlLabel.Size = new System.Drawing.Size(48, 13);
+      this.urlLabel.TabIndex = 1;
+      this.urlLabel.Text = "Address:";
+      // 
+      // userLabel
+      // 
+      this.userLabel.AutoSize = true;
+      this.userLabel.Location = new System.Drawing.Point(3, 32);
+      this.userLabel.Name = "userLabel";
+      this.userLabel.Size = new System.Drawing.Size(32, 13);
+      this.userLabel.TabIndex = 3;
+      this.userLabel.Text = "User:";
+      // 
+      // userTextBox
+      // 
+      this.userTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userTextBox.Location = new System.Drawing.Point(71, 29);
+      this.userTextBox.Name = "userTextBox";
+      this.userTextBox.Size = new System.Drawing.Size(177, 20);
+      this.userTextBox.TabIndex = 2;
+      // 
+      // passwordLabel
+      // 
+      this.passwordLabel.AutoSize = true;
+      this.passwordLabel.Location = new System.Drawing.Point(3, 58);
+      this.passwordLabel.Name = "passwordLabel";
+      this.passwordLabel.Size = new System.Drawing.Size(56, 13);
+      this.passwordLabel.TabIndex = 5;
+      this.passwordLabel.Text = "Password:";
+      // 
+      // passwordTextBox
+      // 
+      this.passwordTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.passwordTextBox.Location = new System.Drawing.Point(71, 55);
+      this.passwordTextBox.Name = "passwordTextBox";
+      this.passwordTextBox.Size = new System.Drawing.Size(177, 20);
+      this.passwordTextBox.TabIndex = 4;
+      this.passwordTextBox.UseSystemPasswordChar = true;
+      // 
+      // applyButton
+      // 
+      this.applyButton.Location = new System.Drawing.Point(6, 104);
+      this.applyButton.Name = "applyButton";
+      this.applyButton.Size = new System.Drawing.Size(75, 23);
+      this.applyButton.TabIndex = 6;
+      this.applyButton.Text = "Apply";
+      this.applyButton.UseVisualStyleBackColor = true;
+      this.applyButton.Click += new System.EventHandler(this.applyButton_Click);
+      // 
+      // savePasswordCheckbox
+      // 
+      this.savePasswordCheckbox.AutoSize = true;
+      this.savePasswordCheckbox.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
+      this.savePasswordCheckbox.Location = new System.Drawing.Point(71, 81);
+      this.savePasswordCheckbox.Name = "savePasswordCheckbox";
+      this.savePasswordCheckbox.Size = new System.Drawing.Size(103, 17);
+      this.savePasswordCheckbox.TabIndex = 7;
+      this.savePasswordCheckbox.Text = "Save Password:";
+      this.savePasswordCheckbox.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Location = new System.Drawing.Point(87, 104);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 8;
+      this.cancelButton.Text = "Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // ConnectionSetupView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.savePasswordCheckbox);
+      this.Controls.Add(this.applyButton);
+      this.Controls.Add(this.passwordLabel);
+      this.Controls.Add(this.passwordTextBox);
+      this.Controls.Add(this.userLabel);
+      this.Controls.Add(this.userTextBox);
+      this.Controls.Add(this.urlLabel);
+      this.Controls.Add(this.urlTextBox);
+      this.Name = "ConnectionSetupView";
+      this.Size = new System.Drawing.Size(251, 132);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox urlTextBox;
+    private System.Windows.Forms.Label urlLabel;
+    private System.Windows.Forms.Label userLabel;
+    private System.Windows.Forms.TextBox userTextBox;
+    private System.Windows.Forms.Label passwordLabel;
+    private System.Windows.Forms.TextBox passwordTextBox;
+    private System.Windows.Forms.Button applyButton;
+    private System.Windows.Forms.CheckBox savePasswordCheckbox;
+    private System.Windows.Forms.Button cancelButton;
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.cs	(revision 3006)
@@ -0,0 +1,55 @@
+﻿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;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class ConnectionSetupView : InstallationManagerControl {
+    private Form form;
+    public ConnectionSetupView() {
+      InitializeComponent();
+
+      urlTextBox.Text = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocation;
+      userTextBox.Text = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName;
+      passwordTextBox.Text = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword;
+      savePasswordCheckbox.Checked = !string.IsNullOrEmpty(passwordTextBox.Text);
+    }
+
+    private void applyButton_Click(object sender, EventArgs e) {
+      HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocation = urlTextBox.Text;
+      if (!savePasswordCheckbox.Checked) {
+        // make sure we don't save username or password
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName = string.Empty;
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword = string.Empty;
+        // save
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.Save();
+        // set user name and password for current process
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName = userTextBox.Text;
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword = passwordTextBox.Text;
+      } else {
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName = userTextBox.Text;
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword = passwordTextBox.Text;
+        HeuristicLab.PluginInfrastructure.Properties.Settings.Default.Save();
+      }
+      form.Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      form.Close();
+    }
+
+    internal override void ShowInForm() {
+      if (this.form == null) {
+        form = new Form();
+        form.Name = this.Name;
+        this.Dock = DockStyle.Fill;
+        form.Controls.Add(this);
+      } 
+      form.Show();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.resx
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.resx	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/ConnectionSetupView.resx	(revision 3006)
@@ -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/DeploymentService/AdminClientFactory.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/AdminClientFactory.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/AdminClientFactory.cs	(revision 3006)
@@ -0,0 +1,29 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.ServiceModel;
+using System.Security.Cryptography.X509Certificates;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  public static class AdminClientFactory {
+    private static byte[] serverCrtData;
+
+    static AdminClientFactory() {
+      var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.servdev.cer");
+      serverCrtData = new byte[stream.Length];
+      stream.Read(serverCrtData, 0, serverCrtData.Length);
+    }
+
+    public static AdminClient CreateClient() {
+      var client = new AdminClient();
+      client.ClientCredentials.UserName.UserName = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName;
+      client.ClientCredentials.UserName.Password = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword;
+      client.Endpoint.Address = new EndpointAddress(HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationAdministrationAddress);
+      client.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(serverCrtData);
+      client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
+      return client;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/RegenerateServiceClasses.cmd
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/RegenerateServiceClasses.cmd	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/RegenerateServiceClasses.cmd	(revision 3006)
@@ -1,2 +1,2 @@
 ﻿#
-svcutil http://localhost:8731/Design_Time_Addresses/HeuristicLab.Services.Deployment/Update/mex http://localhost:8731/Design_Time_Addresses/HeuristicLab.Services.Deployment/Admin/mex  /language:C# /targetClientVersion:Version35 /out:DeploymentService /namespace:*,HeuristicLab.PluginInfrastructure.Advanced.DeploymentService /mergeConfig /config:../../app.config
+svcutil http://servdev.heuristiclab.com/Deployment/Update.svc/mex http://servdev.heuristiclab.com/Deployment/Admin.svc/mex  /language:C# /targetClientVersion:Version35 /out:DeploymentService /namespace:*,HeuristicLab.PluginInfrastructure.Advanced.DeploymentService /mergeConfig /config:../../app.config
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/UpdateClientFactory.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/UpdateClientFactory.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/DeploymentService/UpdateClientFactory.cs	(revision 3006)
@@ -0,0 +1,29 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.ServiceModel;
+using System.Security.Cryptography.X509Certificates;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  public static class UpdateClientFactory {
+    private static byte[] serverCrtData;
+
+    static UpdateClientFactory() {
+      var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.servdev.cer");
+      serverCrtData = new byte[stream.Length];
+      stream.Read(serverCrtData, 0, serverCrtData.Length);
+    }
+
+    public static UpdateClient CreateClient() {
+      var client = new UpdateClient();
+      client.ClientCredentials.UserName.UserName = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName;
+      client.ClientCredentials.UserName.Password = HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword;
+      client.Endpoint.Address = new EndpointAddress(HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocation);
+      client.ClientCredentials.ServiceCertificate.DefaultCertificate = new X509Certificate2(serverCrtData);
+      client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
+      return client;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 3006)
@@ -29,4 +29,5 @@
 using System.Reflection;
 using ICSharpCode.SharpZipLib.Zip;
+using System.ServiceModel;
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
@@ -129,7 +130,14 @@
     /// <param name="connectionString"></param>
     /// <returns></returns>
-    public IEnumerable<IPluginDescription> GetRemotePluginList(string connectionString) {
-      using (var client = new DeploymentService.UpdateClient()) {
-        return client.GetPlugins();
+    public IEnumerable<IPluginDescription> GetRemotePluginList() {
+      var client = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        List<IPluginDescription> plugins = new List<IPluginDescription>(client.GetPlugins());
+        client.Close();
+        return plugins;
+      }
+      catch (FaultException) {
+        client.Abort();
+        return new IPluginDescription[] { };
       }
     }
@@ -140,7 +148,14 @@
     /// <param name="connectionString"></param>
     /// <returns></returns>
-    public IEnumerable<DeploymentService.ProductDescription> GetRemoteProductList(string connectionString) {
-      using (var client = new DeploymentService.UpdateClient()) {
-        return client.GetProducts();
+    public IEnumerable<DeploymentService.ProductDescription> GetRemoteProductList() {
+      var client = DeploymentService.UpdateClientFactory.CreateClient();
+      try {
+        List<DeploymentService.ProductDescription> products = new List<DeploymentService.ProductDescription>(client.GetProducts());
+        client.Close();
+        return products;
+      }
+      catch (FaultException) {
+        client.Abort();
+        return new DeploymentService.ProductDescription[] { };
       }
     }
@@ -151,12 +166,19 @@
     /// <param name="connectionString"></param>
     /// <param name="pluginNames"></param>
-    public void Install(string connectionString, IEnumerable<IPluginDescription> plugins) {
-      using (var client = new DeploymentService.UpdateClient()) {
-        var args = new PluginInfrastructureCancelEventArgs(plugins.Select(x => x.Name + " " + x.Version));
-        OnPreInstall(args);
-        foreach (DeploymentService.PluginDescription plugin in plugins) {
-          byte[] zippedPackage = client.GetPlugin(plugin);
-          Unpack(zippedPackage);
-          OnInstalled(new PluginInfrastructureEventArgs(plugin));
+    public void Install(IEnumerable<IPluginDescription> plugins) {
+      var args = new PluginInfrastructureCancelEventArgs(plugins);
+      OnPreInstall(args);
+      if (!args.Cancel) {
+        var client = DeploymentService.UpdateClientFactory.CreateClient();
+        try {
+          foreach (DeploymentService.PluginDescription plugin in plugins) {
+            byte[] zippedPackage = client.GetPlugin(plugin);
+            Unpack(zippedPackage);
+            OnInstalled(new PluginInfrastructureEventArgs(plugin));
+          }
+          client.Close();
+        }
+        catch (FaultException) {
+          client.Abort();
         }
       }
@@ -167,9 +189,10 @@
     /// </summary>
     /// <param name="pluginNames"></param>
-    public void Update(string connectionString, IEnumerable<IPluginDescription> plugins) {
-      PluginInfrastructureCancelEventArgs args = new PluginInfrastructureCancelEventArgs(plugins.Select(x => x.Name + " " + x.Version));
+    public void Update(IEnumerable<IPluginDescription> plugins) {
+      PluginInfrastructureCancelEventArgs args = new PluginInfrastructureCancelEventArgs(plugins);
       OnPreUpdate(args);
       if (!args.Cancel) {
-        using (var client = new DeploymentService.UpdateClient()) {
+        var client = DeploymentService.UpdateClientFactory.CreateClient();
+        try {
           foreach (DeploymentService.PluginDescription plugin in plugins) {
             byte[] zippedPackage = client.GetPlugin(plugin);
@@ -177,4 +200,8 @@
             OnUpdated(new PluginInfrastructureEventArgs(plugin));
           }
+          client.Close();
+        }
+        catch (FaultException) {
+          client.Abort();
         }
       }
@@ -189,5 +216,5 @@
                       from file in pluginToDelete.Files
                       select Path.Combine(pluginDir, file.Name);
-      var args = new PluginInfrastructureCancelEventArgs(fileNames);
+      var args = new PluginInfrastructureCancelEventArgs(plugins);
       OnPreDelete(args);
       if (!args.Cancel) {
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerConsole.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerConsole.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerConsole.cs	(revision 3006)
@@ -52,5 +52,5 @@
     void installManager_PreUpdatePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
       Console.WriteLine("Following plugins are updated:");
-      foreach (var info in e.Entities) {
+      foreach (var info in e.Plugins) {
         Console.WriteLine(e);
       }
@@ -67,6 +67,7 @@
     void installManager_PreRemovePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
       Console.WriteLine("Following files are deleted:");
-      foreach (string fileName in e.Entities) {
-        Console.WriteLine(fileName);
+      foreach (var plugin in e.Plugins) {
+        foreach (var file in plugin.Files)
+          Console.WriteLine(file);
       }
       if (GetUserConfirmation()) e.Cancel = false;
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.Designer.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.Designer.cs	(revision 3006)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class InstallationManagerControl {
+    /// <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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerControl.cs	(revision 3006)
@@ -0,0 +1,25 @@
+﻿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;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class InstallationManagerControl : UserControl {
+    public InstallationManagerControl() {
+      InitializeComponent();
+    }
+
+    internal virtual void ShowInForm() {
+      Form form = new Form();
+      form.Size = this.Size;
+      form.Text = this.Name;
+      this.Dock = DockStyle.Fill;
+      form.Controls.Add(this);
+      form.Show();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3006)
@@ -28,7 +28,4 @@
       this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
       this.removeButton = new System.Windows.Forms.Button();
-      this.serverUrlLabel = new System.Windows.Forms.Label();
-      this.serverUrlTextBox = new System.Windows.Forms.TextBox();
-      this.refreshButton = new System.Windows.Forms.Button();
       this.installButton = new System.Windows.Forms.Button();
       this.tabControl = new System.Windows.Forms.TabControl();
@@ -39,4 +36,6 @@
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logTextBox = new System.Windows.Forms.TextBox();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.editConnectionButton = new System.Windows.Forms.Button();
       this.statusStrip.SuspendLayout();
       this.tabControl.SuspendLayout();
@@ -81,30 +80,4 @@
       this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
       // 
-      // serverUrlLabel
-      // 
-      this.serverUrlLabel.AutoSize = true;
-      this.serverUrlLabel.Location = new System.Drawing.Point(9, 11);
-      this.serverUrlLabel.Name = "serverUrlLabel";
-      this.serverUrlLabel.Size = new System.Drawing.Size(73, 13);
-      this.serverUrlLabel.TabIndex = 13;
-      this.serverUrlLabel.Text = "Plugin Server:";
-      // 
-      // serverUrlTextBox
-      // 
-      this.serverUrlTextBox.Location = new System.Drawing.Point(88, 8);
-      this.serverUrlTextBox.Name = "serverUrlTextBox";
-      this.serverUrlTextBox.Size = new System.Drawing.Size(264, 20);
-      this.serverUrlTextBox.TabIndex = 12;
-      // 
-      // refreshButton
-      // 
-      this.refreshButton.Location = new System.Drawing.Point(358, 6);
-      this.refreshButton.Name = "refreshButton";
-      this.refreshButton.Size = new System.Drawing.Size(75, 23);
-      this.refreshButton.TabIndex = 11;
-      this.refreshButton.Text = "Refresh";
-      this.refreshButton.UseVisualStyleBackColor = true;
-      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
-      // 
       // installButton
       // 
@@ -157,7 +130,6 @@
       // remotePluginsTabPage
       // 
-      this.remotePluginsTabPage.Controls.Add(this.serverUrlLabel);
+      this.remotePluginsTabPage.Controls.Add(this.editConnectionButton);
       this.remotePluginsTabPage.Controls.Add(this.remotePluginInstaller);
-      this.remotePluginsTabPage.Controls.Add(this.serverUrlTextBox);
       this.remotePluginsTabPage.Controls.Add(this.refreshButton);
       this.remotePluginsTabPage.Controls.Add(this.installButton);
@@ -204,4 +176,24 @@
       this.logTextBox.Size = new System.Drawing.Size(598, 586);
       this.logTextBox.TabIndex = 0;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Location = new System.Drawing.Point(8, 6);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(75, 23);
+      this.refreshButton.TabIndex = 11;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // editConnectionButton
+      // 
+      this.editConnectionButton.Location = new System.Drawing.Point(89, 6);
+      this.editConnectionButton.Name = "editConnectionButton";
+      this.editConnectionButton.Size = new System.Drawing.Size(108, 23);
+      this.editConnectionButton.TabIndex = 16;
+      this.editConnectionButton.Text = "Edit Connection...";
+      this.editConnectionButton.UseVisualStyleBackColor = true;
+      this.editConnectionButton.Click += new System.EventHandler(this.editConnectionButton_Click);
       // 
       // InstallationManagerForm
@@ -219,5 +211,4 @@
       this.localPluginsTabPage.ResumeLayout(false);
       this.remotePluginsTabPage.ResumeLayout(false);
-      this.remotePluginsTabPage.PerformLayout();
       this.logTabPage.ResumeLayout(false);
       this.logTabPage.PerformLayout();
@@ -232,7 +223,4 @@
     private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar;
     private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
-    private System.Windows.Forms.Label serverUrlLabel;
-    private System.Windows.Forms.TextBox serverUrlTextBox;
-    private System.Windows.Forms.Button refreshButton;
     private LocalPluginManager localPluginManager;
     private RemotePluginInstaller remotePluginInstaller;
@@ -244,4 +232,6 @@
     private System.Windows.Forms.TabPage logTabPage;
     private System.Windows.Forms.TextBox logTextBox;
+    private System.Windows.Forms.Button editConnectionButton;
+    private System.Windows.Forms.Button refreshButton;
   }
 }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.cs	(revision 3006)
@@ -13,5 +13,4 @@
   public partial class InstallationManagerForm : Form {
     private class UpdateOrInstallPluginsBackgroundWorkerArgument {
-      public string ConnectionString { get; set; }
       public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
       public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
@@ -56,9 +55,4 @@
       refreshLocalPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshLocalPluginsBackgroundWorker_RunWorkerCompleted);
       #endregion
-
-      // get default connection string
-      using (var client = new DeploymentService.UpdateClient()) {
-        serverUrlTextBox.Text = client.Endpoint.Address.ToString();
-      }
 
       installationManager = new InstallationManager(pluginDir);
@@ -130,6 +124,6 @@
     void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
       UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
-      installationManager.Install(info.ConnectionString, info.PluginsToInstall);
-      installationManager.Update(info.ConnectionString, info.PluginsToUpdate);
+      installationManager.Install(info.PluginsToInstall);
+      installationManager.Update(info.PluginsToUpdate);
     }
     #endregion
@@ -147,9 +141,7 @@
 
     void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
-      string connectionString = (string)e.Argument;
-
       RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
-      result.RemotePlugins = installationManager.GetRemotePluginList(connectionString);
-      result.RemoteProducts = installationManager.GetRemoteProductList(connectionString);
+      result.RemotePlugins = installationManager.GetRemotePluginList();
+      result.RemoteProducts = installationManager.GetRemoteProductList();
       e.Cancel = false;
       e.Result = result;
@@ -180,16 +172,24 @@
     #region installation manager event handlers
     void installationManager_PreUpdatePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
-      if (ConfirmUpdateAction(e.Entities) == true) e.Cancel = false;
-      else e.Cancel = true;
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = ConfirmUpdateAction(e.Plugins) == false;
+      }
     }
 
     void installationManager_PreRemovePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
-      if (ConfirmRemoveAction(e.Entities) == true) e.Cancel = false;
-      else e.Cancel = true;
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = ConfirmRemoveAction(e.Plugins) == false;
+      }
     }
 
     void installationManager_PreInstallPlugin(object sender, PluginInfrastructureCancelEventArgs e) {
-      if (e.Entities.Count() > 0)
-        SetStatusStrip("Installing " + e.Entities.Aggregate((a, b) => a + Environment.NewLine + b));
+      if (e.Plugins.Count() > 0)
+        if (ConfirmInstallAction(e.Plugins) == true) {
+          SetStatusStrip("Installing " + e.Plugins.Aggregate("", (a, b) => a.ToString() + "; " + b.ToString()));
+          e.Cancel = false;
+        } else {
+          e.Cancel = true;
+          SetStatusStrip("Install canceled");
+        }
     }
 
@@ -239,5 +239,4 @@
       var pluginsToInstall = remotePluginInstaller.CheckedPlugins.Except(pluginsToUpdate);
 
-      updateOrInstallInfo.ConnectionString = serverUrlTextBox.Text;
       updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
       updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
@@ -255,21 +254,35 @@
 
     #region confirmation dialogs
-    private bool ConfirmRemoveAction(IEnumerable<string> fileNames) {
+    private bool ConfirmRemoveAction(IEnumerable<IPluginDescription> plugins) {
       StringBuilder strBuilder = new StringBuilder();
       strBuilder.AppendLine("Delete files:");
-      foreach (var fileName in fileNames) {
-        strBuilder.AppendLine(fileName);
+      foreach (var plugin in plugins) {
+        foreach (var file in plugin.Files) {
+          strBuilder.AppendLine(file.ToString());
+        }
       }
       return MessageBox.Show(strBuilder.ToString(), "Confirm Delete", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK;
     }
 
-    private bool ConfirmUpdateAction(IEnumerable<string> plugins) {
+    private bool ConfirmUpdateAction(IEnumerable<IPluginDescription> plugins) {
       StringBuilder strBuilder = new StringBuilder();
       strBuilder.AppendLine("Update plugins:");
       foreach (var plugin in plugins) {
-        strBuilder.AppendLine(plugin);
+        strBuilder.AppendLine(plugin.ToString());
       }
       return MessageBox.Show(strBuilder.ToString(), "Confirm Update", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK;
     }
+
+    private bool ConfirmInstallAction(IEnumerable<IPluginDescription> plugins) {
+      foreach (var plugin in plugins) {
+        if (!string.IsNullOrEmpty(plugin.LicenseText)) {
+          var licenseConfirmationBox = new LicenseConfirmationBox(plugin);
+          if (licenseConfirmationBox.ShowDialog() != DialogResult.OK)
+            return false;
+        }
+      }
+      return true;
+    }
+
 
     #endregion
@@ -306,5 +319,5 @@
       toolStripProgressBar.Visible = true;
       DisableControls();
-      refreshServerPluginsBackgroundWorker.RunWorkerAsync(serverUrlTextBox.Text);
+      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
     }
 
@@ -320,5 +333,4 @@
       //ClearPluginsList(remotePluginsListView);
       refreshButton.Enabled = true;
-      serverUrlTextBox.Enabled = true;
       toolStripProgressBar.Visible = false;
       Cursor = Cursors.Default;
@@ -327,5 +339,4 @@
     private void UpdateControlsConnected() {
       refreshButton.Enabled = true;
-      serverUrlTextBox.Enabled = true;
       toolStripProgressBar.Visible = false;
       Cursor = Cursors.Default;
@@ -345,4 +356,8 @@
       installButton.Enabled = remotePluginInstaller.CheckedPlugins.Count() > 0;
     }
+
+    private void editConnectionButton_Click(object sender, EventArgs e) {
+      (new ConnectionSetupView()).ShowInForm();
+    }
   }
 }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.Designer.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.Designer.cs	(revision 3006)
@@ -0,0 +1,98 @@
+﻿namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class LicenseConfirmationBox {
+    /// <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 Windows Form 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.richTextBox = new System.Windows.Forms.RichTextBox();
+      this.acceptButton = new System.Windows.Forms.Button();
+      this.rejectButton = new System.Windows.Forms.Button();
+      this.licenseLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // richTextBox
+      // 
+      this.richTextBox.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.richTextBox.Location = new System.Drawing.Point(12, 37);
+      this.richTextBox.Name = "richTextBox";
+      this.richTextBox.ReadOnly = true;
+      this.richTextBox.Size = new System.Drawing.Size(494, 351);
+      this.richTextBox.TabIndex = 0;
+      this.richTextBox.Text = "";
+      // 
+      // acceptButton
+      // 
+      this.acceptButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.acceptButton.Location = new System.Drawing.Point(298, 394);
+      this.acceptButton.Name = "acceptButton";
+      this.acceptButton.Size = new System.Drawing.Size(75, 23);
+      this.acceptButton.TabIndex = 1;
+      this.acceptButton.Text = "I Accept ";
+      this.acceptButton.UseVisualStyleBackColor = true;
+      this.acceptButton.Click += new System.EventHandler(this.acceptButton_Click);
+      // 
+      // rejectButton
+      // 
+      this.rejectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.rejectButton.Location = new System.Drawing.Point(379, 394);
+      this.rejectButton.Name = "rejectButton";
+      this.rejectButton.Size = new System.Drawing.Size(127, 23);
+      this.rejectButton.TabIndex = 2;
+      this.rejectButton.Text = "Cancel Installation";
+      this.rejectButton.UseVisualStyleBackColor = true;
+      this.rejectButton.Click += new System.EventHandler(this.rejectButton_Click);
+      // 
+      // licenseLabel
+      // 
+      this.licenseLabel.AutoSize = true;
+      this.licenseLabel.Location = new System.Drawing.Point(13, 13);
+      this.licenseLabel.Name = "licenseLabel";
+      this.licenseLabel.Size = new System.Drawing.Size(177, 13);
+      this.licenseLabel.TabIndex = 3;
+      this.licenseLabel.Text = "Please confirm license agreement of";
+      // 
+      // LicenseConfirmationBox
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(518, 429);
+      this.Controls.Add(this.licenseLabel);
+      this.Controls.Add(this.rejectButton);
+      this.Controls.Add(this.acceptButton);
+      this.Controls.Add(this.richTextBox);
+      this.Name = "LicenseConfirmationBox";
+      this.Text = "License Agreement";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.RichTextBox richTextBox;
+    private System.Windows.Forms.Button acceptButton;
+    private System.Windows.Forms.Button rejectButton;
+    private System.Windows.Forms.Label licenseLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.cs	(revision 3006)
@@ -0,0 +1,33 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  public partial class LicenseConfirmationBox : Form {
+    public LicenseConfirmationBox() {
+      InitializeComponent();
+    }
+
+    public LicenseConfirmationBox(IPluginDescription plugin) {
+      InitializeComponent();
+      richTextBox.Text = plugin.LicenseText;
+      licenseLabel.Text = plugin.ToString() + " " + licenseLabel.Text;
+      this.DialogResult = DialogResult.Cancel;
+    }
+
+    private void acceptButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void rejectButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      this.Close();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.resx
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.resx	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseConfirmationBox.resx	(revision 3006)
@@ -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/LicenseView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.Designer.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.Designer.cs	(revision 3006)
@@ -0,0 +1,57 @@
+﻿namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class LicenseView {
+    /// <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.richTextBox = new System.Windows.Forms.RichTextBox();
+      this.SuspendLayout();
+      // 
+      // richTextBox
+      // 
+      this.richTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.richTextBox.Location = new System.Drawing.Point(0, 0);
+      this.richTextBox.Name = "richTextBox";
+      this.richTextBox.ReadOnly = true;
+      this.richTextBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
+      this.richTextBox.Size = new System.Drawing.Size(426, 481);
+      this.richTextBox.TabIndex = 1;
+      this.richTextBox.Text = "";
+      // 
+      // LicenseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.richTextBox);
+      this.Name = "LicenseView";
+      this.Size = new System.Drawing.Size(426, 481);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.RichTextBox richTextBox;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.cs	(revision 3006)
@@ -0,0 +1,25 @@
+﻿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;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class LicenseView : InstallationManagerControl {
+
+    public LicenseView() {
+      InitializeComponent();
+      Name = "License";
+    }
+
+    public LicenseView(IPluginDescription plugin) {
+      InitializeComponent();
+      Name = "License of: " + plugin;
+      richTextBox.Text = plugin.LicenseText;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.resx
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.resx	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LicenseView.resx	(revision 3006)
@@ -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/LocalPluginManager.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.Designer.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.Designer.cs	(revision 3006)
@@ -57,4 +57,5 @@
       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);
       // 
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/LocalPluginManager.cs	(revision 3006)
@@ -92,4 +92,12 @@
       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.ShowInForm();
+      }
+    }
   }
 }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.Designer.cs	(revision 3006)
@@ -0,0 +1,314 @@
+﻿namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class PluginView {
+    /// <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.components = new System.ComponentModel.Container();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.versionLabel = new System.Windows.Forms.Label();
+      this.contactTextBox = new System.Windows.Forms.TextBox();
+      this.contactInfoLabel = new System.Windows.Forms.Label();
+      this.licenseButton = new System.Windows.Forms.Button();
+      this.dependenciesGroupBox = new System.Windows.Forms.GroupBox();
+      this.dependenciesListView = new System.Windows.Forms.ListView();
+      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.filesListView = new System.Windows.Forms.ListView();
+      this.fileNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.fileTypeHeader = new System.Windows.Forms.ColumnHeader();
+      this.filesGroupBox = new System.Windows.Forms.GroupBox();
+      this.stateTextBox = new System.Windows.Forms.TextBox();
+      this.stateLabel = new System.Windows.Forms.Label();
+      this.errorLabel = new System.Windows.Forms.Label();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.errorTextBox = new System.Windows.Forms.RichTextBox();
+      this.descriptionTextBox = new System.Windows.Forms.RichTextBox();
+      this.dependenciesGroupBox.SuspendLayout();
+      this.filesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 6);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 0;
+      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.Location = new System.Drawing.Point(74, 3);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.ReadOnly = true;
+      this.nameTextBox.Size = new System.Drawing.Size(269, 20);
+      this.nameTextBox.TabIndex = 1;
+      // 
+      // 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.Location = new System.Drawing.Point(74, 29);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.ReadOnly = true;
+      this.versionTextBox.Size = new System.Drawing.Size(269, 20);
+      this.versionTextBox.TabIndex = 3;
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.AutoSize = true;
+      this.versionLabel.Location = new System.Drawing.Point(3, 32);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(45, 13);
+      this.versionLabel.TabIndex = 2;
+      this.versionLabel.Text = "Version:";
+      // 
+      // contactTextBox
+      // 
+      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.Name = "contactTextBox";
+      this.contactTextBox.ReadOnly = true;
+      this.contactTextBox.Size = new System.Drawing.Size(269, 20);
+      this.contactTextBox.TabIndex = 5;
+      // 
+      // contactInfoLabel
+      // 
+      this.contactInfoLabel.AutoSize = true;
+      this.contactInfoLabel.Location = new System.Drawing.Point(3, 58);
+      this.contactInfoLabel.Name = "contactInfoLabel";
+      this.contactInfoLabel.Size = new System.Drawing.Size(47, 13);
+      this.contactInfoLabel.TabIndex = 4;
+      this.contactInfoLabel.Text = "Contact:";
+      // 
+      // licenseButton
+      // 
+      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.Name = "licenseButton";
+      this.licenseButton.Size = new System.Drawing.Size(103, 23);
+      this.licenseButton.TabIndex = 10;
+      this.licenseButton.Text = "Show license";
+      this.licenseButton.UseVisualStyleBackColor = true;
+      this.licenseButton.Click += new System.EventHandler(this.licenseButton_Click);
+      // 
+      // dependenciesGroupBox
+      // 
+      this.dependenciesGroupBox.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.dependenciesGroupBox.Controls.Add(this.dependenciesListView);
+      this.dependenciesGroupBox.Location = new System.Drawing.Point(6, 408);
+      this.dependenciesGroupBox.Name = "dependenciesGroupBox";
+      this.dependenciesGroupBox.Size = new System.Drawing.Size(340, 172);
+      this.dependenciesGroupBox.TabIndex = 1;
+      this.dependenciesGroupBox.TabStop = false;
+      this.dependenciesGroupBox.Text = "Dependencies";
+      // 
+      // dependenciesListView
+      // 
+      this.dependenciesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameHeader,
+            this.pluginVersionHeader});
+      this.dependenciesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.dependenciesListView.Location = new System.Drawing.Point(3, 16);
+      this.dependenciesListView.Name = "dependenciesListView";
+      this.dependenciesListView.Size = new System.Drawing.Size(334, 153);
+      this.dependenciesListView.SmallImageList = this.imageList;
+      this.dependenciesListView.TabIndex = 0;
+      this.dependenciesListView.UseCompatibleStateImageBehavior = false;
+      this.dependenciesListView.View = System.Windows.Forms.View.Details;
+      this.dependenciesListView.ItemActivate += new System.EventHandler(this.dependenciesListView_ItemActivate);
+      // 
+      // pluginNameHeader
+      // 
+      this.pluginNameHeader.Text = "Name";
+      this.pluginNameHeader.Width = 200;
+      // 
+      // pluginVersionHeader
+      // 
+      this.pluginVersionHeader.Text = "Version";
+      this.pluginVersionHeader.Width = 120;
+      // 
+      // imageList
+      // 
+      this.imageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.imageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // filesListView
+      // 
+      this.filesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.fileNameHeader,
+            this.fileTypeHeader});
+      this.filesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.filesListView.Location = new System.Drawing.Point(3, 16);
+      this.filesListView.Name = "filesListView";
+      this.filesListView.Size = new System.Drawing.Size(331, 140);
+      this.filesListView.SmallImageList = this.imageList;
+      this.filesListView.TabIndex = 0;
+      this.filesListView.UseCompatibleStateImageBehavior = false;
+      this.filesListView.View = System.Windows.Forms.View.Details;
+      // 
+      // fileNameHeader
+      // 
+      this.fileNameHeader.Text = "Name";
+      this.fileNameHeader.Width = 200;
+      // 
+      // fileTypeHeader
+      // 
+      this.fileTypeHeader.Text = "Type";
+      this.fileTypeHeader.Width = 120;
+      // 
+      // filesGroupBox
+      // 
+      this.filesGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.filesGroupBox.Controls.Add(this.filesListView);
+      this.filesGroupBox.Location = new System.Drawing.Point(9, 243);
+      this.filesGroupBox.Name = "filesGroupBox";
+      this.filesGroupBox.Size = new System.Drawing.Size(337, 159);
+      this.filesGroupBox.TabIndex = 11;
+      this.filesGroupBox.TabStop = false;
+      this.filesGroupBox.Text = "Files";
+      // 
+      // stateTextBox
+      // 
+      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.Name = "stateTextBox";
+      this.stateTextBox.ReadOnly = true;
+      this.stateTextBox.Size = new System.Drawing.Size(269, 20);
+      this.stateTextBox.TabIndex = 13;
+      // 
+      // stateLabel
+      // 
+      this.stateLabel.AutoSize = true;
+      this.stateLabel.Location = new System.Drawing.Point(3, 148);
+      this.stateLabel.Name = "stateLabel";
+      this.stateLabel.Size = new System.Drawing.Size(35, 13);
+      this.stateLabel.TabIndex = 12;
+      this.stateLabel.Text = "State:";
+      // 
+      // errorLabel
+      // 
+      this.errorLabel.AutoSize = true;
+      this.errorLabel.Location = new System.Drawing.Point(3, 174);
+      this.errorLabel.Name = "errorLabel";
+      this.errorLabel.Size = new System.Drawing.Size(32, 13);
+      this.errorLabel.TabIndex = 15;
+      this.errorLabel.Text = "Error:";
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(3, 84);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 17;
+      this.descriptionLabel.Text = "Description:";
+      // 
+      // errorTextBox
+      // 
+      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.Name = "errorTextBox";
+      this.errorTextBox.ReadOnly = true;
+      this.errorTextBox.Size = new System.Drawing.Size(269, 66);
+      this.errorTextBox.TabIndex = 18;
+      this.errorTextBox.Text = "";
+      // 
+      // descriptionTextBox
+      // 
+      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.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.Size = new System.Drawing.Size(269, 58);
+      this.descriptionTextBox.TabIndex = 19;
+      this.descriptionTextBox.Text = "";
+      // 
+      // PluginView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.errorTextBox);
+      this.Controls.Add(this.errorLabel);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.stateTextBox);
+      this.Controls.Add(this.stateLabel);
+      this.Controls.Add(this.dependenciesGroupBox);
+      this.Controls.Add(this.filesGroupBox);
+      this.Controls.Add(this.licenseButton);
+      this.Controls.Add(this.contactTextBox);
+      this.Controls.Add(this.contactInfoLabel);
+      this.Controls.Add(this.versionTextBox);
+      this.Controls.Add(this.versionLabel);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.nameLabel);
+      this.Name = "PluginView";
+      this.Size = new System.Drawing.Size(346, 612);
+      this.dependenciesGroupBox.ResumeLayout(false);
+      this.filesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label nameLabel;
+    protected System.Windows.Forms.TextBox nameTextBox;
+    protected System.Windows.Forms.TextBox versionTextBox;
+    protected System.Windows.Forms.Label versionLabel;
+    protected System.Windows.Forms.TextBox contactTextBox;
+    protected System.Windows.Forms.Label contactInfoLabel;
+    protected System.Windows.Forms.Button licenseButton;
+    protected System.Windows.Forms.GroupBox dependenciesGroupBox;
+    private System.Windows.Forms.ColumnHeader pluginNameHeader;
+    private System.Windows.Forms.ColumnHeader pluginVersionHeader;
+    protected System.Windows.Forms.ListView dependenciesListView;
+    private System.Windows.Forms.ListView filesListView;
+    private System.Windows.Forms.GroupBox filesGroupBox;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ColumnHeader fileNameHeader;
+    private System.Windows.Forms.ColumnHeader fileTypeHeader;
+    protected System.Windows.Forms.TextBox stateTextBox;
+    protected System.Windows.Forms.Label stateLabel;
+    protected System.Windows.Forms.Label errorLabel;
+    protected System.Windows.Forms.Label descriptionLabel;
+    private System.Windows.Forms.RichTextBox errorTextBox;
+    private System.Windows.Forms.RichTextBox descriptionTextBox;
+
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3006)
@@ -0,0 +1,93 @@
+﻿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;
+using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class PluginView : InstallationManagerControl {
+    private const string IMAGE_KEY_ASSEMBLY = "Assembly";
+    private const string IMAGE_KEY_FILE = "File";
+    private const string IMAGE_KEY_DOCUMENT = "Document";
+
+    private PluginDescription plugin;
+
+    public PluginView() {
+      InitializeComponent();
+      PopulateImageList();
+    }
+
+    public PluginView(PluginDescription plugin) {
+      InitializeComponent();
+      PopulateImageList();
+
+      this.plugin = plugin;
+      this.Name = "Plugin Details: " + plugin.ToString();
+      UpdateControls();
+    }
+
+    private void PopulateImageList() {
+      imageList.Images.Add(IMAGE_KEY_ASSEMBLY, HeuristicLab.PluginInfrastructure.Resources.Resources.Assembly);
+      imageList.Images.Add(IMAGE_KEY_FILE, HeuristicLab.PluginInfrastructure.Resources.Resources.File);
+      imageList.Images.Add(IMAGE_KEY_DOCUMENT, HeuristicLab.PluginInfrastructure.Resources.Resources.Document);
+    }
+
+    public void UpdateControls() {
+      string appDir = Path.GetDirectoryName(Application.ExecutablePath);
+      nameTextBox.Text = plugin.Name;
+      versionTextBox.Text = plugin.Version.ToString();
+      contactTextBox.Text = CombineStrings(plugin.ContactName, plugin.ContactEmail);
+      descriptionTextBox.Text = plugin.Description;
+      stateTextBox.Text = plugin.PluginState.ToString();
+      errorTextBox.Text = plugin.LoadingErrorInformation;
+      foreach (PluginDescription dependency in plugin.Dependencies) {
+        var depItem = new ListViewItem(new string[] { dependency.Name, dependency.Version.ToString() });
+        depItem.Tag = dependency;
+        depItem.ImageKey = IMAGE_KEY_ASSEMBLY;
+        dependenciesListView.Items.Add(depItem);
+      }
+      foreach (var file in plugin.Files) {
+        string displayedFileName = file.Name.Replace(appDir, string.Empty);
+        displayedFileName = displayedFileName.TrimStart(Path.DirectorySeparatorChar);
+        var fileItem = new ListViewItem(new string[] { displayedFileName, file.Type.ToString() });
+        if (file.Type == PluginFileType.Assembly) {
+          fileItem.ImageKey = IMAGE_KEY_ASSEMBLY;
+        } else if (file.Type == PluginFileType.License) {
+          fileItem.ImageKey = IMAGE_KEY_DOCUMENT;
+        } else fileItem.ImageKey = IMAGE_KEY_FILE;
+        filesListView.Items.Add(fileItem);
+      }
+      licenseButton.Enabled = !string.IsNullOrEmpty(plugin.LicenseText);
+    }
+
+    private string CombineStrings(string a, string b) {
+      if (string.IsNullOrEmpty(a))
+        // a is empty
+        if (!string.IsNullOrEmpty(b)) return CombineStrings(b, string.Empty);
+        else return string.Empty;
+      // a is not empty
+      else if (string.IsNullOrEmpty(b)) return a;
+      // and b are not empty
+      else return a + ", " + b;
+    }
+
+    private void licenseButton_Click(object sender, EventArgs e) {
+      LicenseView view = new LicenseView(plugin);
+      view.ShowInForm();
+    }
+
+    private void dependenciesListView_ItemActivate(object sender, EventArgs e) {
+      if (dependenciesListView.SelectedItems.Count > 0) {
+        var dep = (PluginDescription)dependenciesListView.SelectedItems[0].Tag;
+        PluginView view = new PluginView(dep);
+        view.ShowInForm();
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx	(revision 3006)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.resx	(revision 3006)
@@ -0,0 +1,123 @@
+<?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>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3006)
@@ -93,5 +93,13 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Advanced\ConnectionSetupView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\ConnectionSetupView.Designer.cs">
+      <DependentUpon>ConnectionSetupView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\DeploymentService\AdminClientFactory.cs" />
     <Compile Include="Advanced\DeploymentService\DeploymentService.cs" />
+    <Compile Include="Advanced\DeploymentService\UpdateClientFactory.cs" />
     <Compile Include="Advanced\InstallationManagerConsole.cs" />
     <Compile Include="Advanced\InstallationManager.cs" />
@@ -108,4 +116,16 @@
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Advanced\LicenseConfirmationBox.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\LicenseConfirmationBox.Designer.cs">
+      <DependentUpon>LicenseConfirmationBox.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\LicenseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\LicenseView.Designer.cs">
+      <DependentUpon>LicenseView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Advanced\LocalPluginManager.cs">
       <SubType>UserControl</SubType>
@@ -113,4 +133,16 @@
     <Compile Include="Advanced\LocalPluginManager.Designer.cs">
       <DependentUpon>LocalPluginManager.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\PluginView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\PluginView.Designer.cs">
+      <DependentUpon>PluginView.cs</DependentUpon>
     </Compile>
     <Compile Include="Advanced\RemotePluginInstaller.cs">
@@ -221,7 +253,22 @@
     <Content Include="Resources\List.gif" />
     <Content Include="Resources\Logo_white.gif" />
+    <EmbeddedResource Include="Advanced\ConnectionSetupView.resx">
+      <DependentUpon>ConnectionSetupView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\DeploymentService\servdev.cer" />
+    <EmbeddedResource Include="Advanced\LicenseConfirmationBox.resx">
+      <DependentUpon>LicenseConfirmationBox.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\LicenseView.resx">
+      <DependentUpon>LicenseView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\PluginView.resx">
+      <DependentUpon>PluginView.cs</DependentUpon>
+    </EmbeddedResource>
     <None Include="Resources\VS2008ImageLibrary_Actions_Delete.png" />
     <None Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Remove.png" />
     <Content Include="Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Down.png" />
+    <None Include="Resources\VS2008ImageLibrary_Objects_File.png" />
+    <None Include="Resources\VS2008ImageLibrary_Objects_Document.png" />
     <None Include="Resources\VS2008ImageLibrary_Objects_Internet.png" />
     <None Include="Resources\VS2008ImageLibrary_Objects_Install.png" />
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs	(revision 3006)
@@ -47,4 +47,8 @@
       this.type = type;
     }
+
+    public override string ToString() {
+      return name;
+    }
   }
 }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginInfrastructureCancelEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginInfrastructureCancelEventArgs.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginInfrastructureCancelEventArgs.cs	(revision 3006)
@@ -29,8 +29,8 @@
   [Serializable]
   internal sealed class PluginInfrastructureCancelEventArgs : CancelEventArgs {
-    internal IEnumerable<string> Entities { get; private set; }
-    internal PluginInfrastructureCancelEventArgs(IEnumerable<string> entities)
+    internal IEnumerable<IPluginDescription> Plugins { get; private set; }
+    internal PluginInfrastructureCancelEventArgs(IEnumerable<IPluginDescription> plugins)
       : base() {
-      this.Entities = entities;
+      this.Plugins = plugins;
     }
   }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.Designer.cs	(revision 3006)
@@ -42,12 +42,49 @@
         }
         
-        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Configuration.UserScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +
-            "org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <s" +
-            "tring>http://localhost:59253/UpdateLocation.svc</string>\r\n</ArrayOfString>")]
-        public global::System.Collections.Specialized.StringCollection UpdateLocations {
+        [global::System.Configuration.DefaultSettingValueAttribute("http://servdev.heuristiclab.com/Deployment/Update.svc")]
+        public string UpdateLocation {
             get {
-                return ((global::System.Collections.Specialized.StringCollection)(this["UpdateLocations"]));
+                return ((string)(this["UpdateLocation"]));
+            }
+            set {
+                this["UpdateLocation"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string UpdateLocationUserName {
+            get {
+                return ((string)(this["UpdateLocationUserName"]));
+            }
+            set {
+                this["UpdateLocationUserName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("")]
+        public string UpdateLocationPassword {
+            get {
+                return ((string)(this["UpdateLocationPassword"]));
+            }
+            set {
+                this["UpdateLocationPassword"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("http://servdev.heuristiclab.com/Deployment/Admin.svc")]
+        public string UpdateLocationAdministrationAddress {
+            get {
+                return ((string)(this["UpdateLocationAdministrationAddress"]));
+            }
+            set {
+                this["UpdateLocationAdministrationAddress"] = value;
             }
         }
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Properties/Settings.settings	(revision 3006)
@@ -9,9 +9,15 @@
       <Value Profile="(Default)">-</Value>
     </Setting>
-    <Setting Name="UpdateLocations" Type="System.Collections.Specialized.StringCollection" Scope="Application">
-      <Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
-&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
-  &lt;string&gt;http://localhost:59253/UpdateLocation.svc&lt;/string&gt;
-&lt;/ArrayOfString&gt;</Value>
+    <Setting Name="UpdateLocation" Type="System.String" Scope="User">
+      <Value Profile="(Default)">http://servdev.heuristiclab.com/Deployment/Update.svc</Value>
+    </Setting>
+    <Setting Name="UpdateLocationUserName" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="UpdateLocationPassword" Type="System.String" Scope="User">
+      <Value Profile="(Default)" />
+    </Setting>
+    <Setting Name="UpdateLocationAdministrationAddress" Type="System.String" Scope="User">
+      <Value Profile="(Default)">http://servdev.heuristiclab.com/Deployment/Admin.svc</Value>
     </Setting>
   </Settings>
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.Designer.cs	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.Designer.cs	(revision 3006)
@@ -75,4 +75,18 @@
         }
         
+        internal static System.Drawing.Bitmap Document {
+            get {
+                object obj = ResourceManager.GetObject("Document", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap File {
+            get {
+                object obj = ResourceManager.GetObject("File", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
         internal static System.Drawing.Bitmap Install {
             get {
Index: trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.resx
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.resx	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/Resources/Resources.resx	(revision 3006)
@@ -125,4 +125,10 @@
     <value>vs2008imagelibrary_objects_assembly.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
+  <data name="Document" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>VS2008ImageLibrary_Objects_Document.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="File" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>VS2008ImageLibrary_Objects_File.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
   <data name="Install" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>vs2008imagelibrary_objects_install.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
Index: trunk/sources/HeuristicLab.PluginInfrastructure/app.config
===================================================================
--- trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 3005)
+++ trunk/sources/HeuristicLab.PluginInfrastructure/app.config	(revision 3006)
@@ -4,4 +4,7 @@
         <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
             <section name="HeuristicLab.PluginInfrastructure.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+        </sectionGroup>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="HeuristicLab.PluginInfrastructure.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
         </sectionGroup>
     </configSections>
@@ -13,12 +16,4 @@
             <setting name="Organization" serializeAs="String">
                 <value>-</value>
-            </setting>
-            <setting name="UpdateLocations" serializeAs="Xml">
-                <value>
-                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-                        <string>http://localhost:59253/UpdateLocation.svc</string>
-                    </ArrayOfString>
-                </value>
             </setting>
         </HeuristicLab.PluginInfrastructure.Properties.Settings>
@@ -40,5 +35,5 @@
                         <transport clientCredentialType="Windows" proxyCredentialType="None"
                             realm="" />
-                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
+                        <message clientCredentialType="UserName" negotiateServiceCredential="true"
                             algorithmSuite="Default" establishSecurityContext="true" />
                     </security>
@@ -57,5 +52,5 @@
                         <transport clientCredentialType="Windows" proxyCredentialType="None"
                             realm="" />
-                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
+                        <message clientCredentialType="UserName" negotiateServiceCredential="true"
                             algorithmSuite="Default" establishSecurityContext="true" />
                     </security>
@@ -64,21 +59,37 @@
         </bindings>
         <client>
-            <endpoint address="http://localhost:8731/Design_Time_Addresses/HeuristicLab.Services.Deployment/Update/"
+            <endpoint address="http://servdev.heuristiclab.com/Deployment/Update.svc"
                 binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUpdate"
                 contract="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdate"
                 name="WSHttpBinding_IUpdate">
                 <identity>
-                    <dns value="localhost" />
+                    <certificate encodedValue="AwAAAAEAAAAUAAAAFhNc5P5CrrUsDAETV1gq2wDRXQ0gAAAAAQAAACcCAAAwggIjMIIBjKADAgECAhCnTkk2TwtajEKLiJLyjCpwMA0GCSqGSIb3DQEBBAUAMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbTAeFw0xMDAzMTAxNTI4MTJaFw0zOTEyMzEyMzU5NTlaMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJSMi2lAXj/Z9sMiLjiUmqUfNSfozaio/mjR6PxbDPBWZp6xTFdDLnBx+kHMBp+gc75hMI6wCFHB8PYud8tHMgJFDssGBUZkEN2vFZ0h41efyXo9U0o90KVFWFBQWOz+Opnalqohh8qHnOczo1zabeLFf79pC81Y6QGNkSyQcikCAwEAAaNYMFYwVAYDVR0BBE0wS4AQ1x+ArbPOrv0XwUivnGidCKElMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbYIQp05JNk8LWoxCi4iS8owqcDANBgkqhkiG9w0BAQQFAAOBgQBU8cGNgEnkWLs3v433WBC2Sl6BiPk6IchsqfxECp1Q4j/gqsIe9xRNnjxD5YEj0HGdqjrKBwF8XrOXPgyXQXfM4ju3INGLSJ1WH/oODbgbKnqQ/7TSJ++y1x0lnDgh+ibqjchsrBrqzKfkBNOa4B3g1M9q1eNVDOyGWu7GiZAUTA==" />
                 </identity>
             </endpoint>
-            <endpoint address="http://localhost:8731/Design_Time_Addresses/HeuristicLab.Services.Deployment/Admin/"
+            <endpoint address="http://servdev.heuristiclab.com/Deployment/Admin.svc"
                 binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAdmin"
                 contract="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdmin"
                 name="WSHttpBinding_IAdmin">
                 <identity>
-                    <dns value="localhost" />
+                    <certificate encodedValue="AwAAAAEAAAAUAAAAFhNc5P5CrrUsDAETV1gq2wDRXQ0gAAAAAQAAACcCAAAwggIjMIIBjKADAgECAhCnTkk2TwtajEKLiJLyjCpwMA0GCSqGSIb3DQEBBAUAMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbTAeFw0xMDAzMTAxNTI4MTJaFw0zOTEyMzEyMzU5NTlaMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJSMi2lAXj/Z9sMiLjiUmqUfNSfozaio/mjR6PxbDPBWZp6xTFdDLnBx+kHMBp+gc75hMI6wCFHB8PYud8tHMgJFDssGBUZkEN2vFZ0h41efyXo9U0o90KVFWFBQWOz+Opnalqohh8qHnOczo1zabeLFf79pC81Y6QGNkSyQcikCAwEAAaNYMFYwVAYDVR0BBE0wS4AQ1x+ArbPOrv0XwUivnGidCKElMCMxITAfBgNVBAMTGHNlcnZkZXYuaGV1cmlzdGljbGFiLmNvbYIQp05JNk8LWoxCi4iS8owqcDANBgkqhkiG9w0BAQQFAAOBgQBU8cGNgEnkWLs3v433WBC2Sl6BiPk6IchsqfxECp1Q4j/gqsIe9xRNnjxD5YEj0HGdqjrKBwF8XrOXPgyXQXfM4ju3INGLSJ1WH/oODbgbKnqQ/7TSJ++y1x0lnDgh+ibqjchsrBrqzKfkBNOa4B3g1M9q1eNVDOyGWu7GiZAUTA==" />
                 </identity>
             </endpoint>
         </client>
     </system.serviceModel>
+    <userSettings>
+        <HeuristicLab.PluginInfrastructure.Properties.Settings>
+            <setting name="UpdateLocation" serializeAs="String">
+                <value>http://servdev.heuristiclab.com/Deployment/Update.svc</value>
+            </setting>
+            <setting name="UpdateLocationUserName" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="UpdateLocationPassword" serializeAs="String">
+                <value />
+            </setting>
+            <setting name="UpdateLocationAdministrationAddress" serializeAs="String">
+                <value>http://servdev.heuristiclab.com/Deployment/Admin.svc</value>
+            </setting>
+        </HeuristicLab.PluginInfrastructure.Properties.Settings>
+    </userSettings>
 </configuration>
