Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3508)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManagerForm.Designer.cs	(revision 3509)
@@ -53,8 +53,8 @@
       this.localPluginsTabPage = new System.Windows.Forms.TabPage();
       this.updateButton = new System.Windows.Forms.Button();
-      this.localPluginManagerView = new HeuristicLab.PluginInfrastructure.Advanced.LocalPluginManagerView();
       this.availablePluginsTabPage = new System.Windows.Forms.TabPage();
-      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.RemotePluginInstallerView();
       this.refreshButton = new System.Windows.Forms.Button();
+      this.uploadPluginsTabPage = new System.Windows.Forms.TabPage();
+      this.manageProductsTabPage = new System.Windows.Forms.TabPage();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logTextBox = new System.Windows.Forms.TextBox();
@@ -65,10 +65,14 @@
       this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.connectionSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-      this.uploadPluginsTabPage = new System.Windows.Forms.TabPage();
-      this.manageProductsTabPage = new System.Windows.Forms.TabPage();
+      this.localPluginManagerView = new HeuristicLab.PluginInfrastructure.Advanced.LocalPluginManagerView();
+      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.RemotePluginInstallerView();
+      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.PluginEditor();
+      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.ProductEditor();
       this.statusStrip.SuspendLayout();
       this.tabControl.SuspendLayout();
       this.localPluginsTabPage.SuspendLayout();
       this.availablePluginsTabPage.SuspendLayout();
+      this.uploadPluginsTabPage.SuspendLayout();
+      this.manageProductsTabPage.SuspendLayout();
       this.logTabPage.SuspendLayout();
       this.menuStrip.SuspendLayout();
@@ -170,16 +174,4 @@
       this.updateButton.Click += new System.EventHandler(this.updateAllButton_Click);
       // 
-      // localPluginManagerView
-      // 
-      this.localPluginManagerView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.localPluginManagerView.Location = new System.Drawing.Point(6, 6);
-      this.localPluginManagerView.Name = "localPluginManagerView";
-      this.localPluginManagerView.Plugins = null;
-      this.localPluginManagerView.Size = new System.Drawing.Size(569, 293);
-      this.localPluginManagerView.TabIndex = 0;
-      this.localPluginManagerView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.localPluginManager_ItemChecked);
-      // 
       // availablePluginsTabPage
       // 
@@ -195,19 +187,4 @@
       this.availablePluginsTabPage.UseVisualStyleBackColor = true;
       // 
-      // remotePluginInstaller
-      // 
-      this.remotePluginInstaller.AllPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
-      this.remotePluginInstaller.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.remotePluginInstaller.Location = new System.Drawing.Point(6, 6);
-      this.remotePluginInstaller.Name = "remotePluginInstaller";
-      this.remotePluginInstaller.NewPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
-      this.remotePluginInstaller.Products = new HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[0];
-      this.remotePluginInstaller.ShowAllPlugins = false;
-      this.remotePluginInstaller.Size = new System.Drawing.Size(571, 293);
-      this.remotePluginInstaller.TabIndex = 14;
-      this.remotePluginInstaller.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginInstaller_ItemChecked);
-      // 
       // refreshButton
       // 
@@ -223,4 +200,26 @@
       this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
       // 
+      // uploadPluginsTabPage
+      // 
+      this.uploadPluginsTabPage.Controls.Add(this.pluginEditor);
+      this.uploadPluginsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.uploadPluginsTabPage.Name = "uploadPluginsTabPage";
+      this.uploadPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.uploadPluginsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.uploadPluginsTabPage.TabIndex = 3;
+      this.uploadPluginsTabPage.Text = "Upload Plugins";
+      this.uploadPluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // manageProductsTabPage
+      // 
+      this.manageProductsTabPage.Controls.Add(this.productEditor);
+      this.manageProductsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.manageProductsTabPage.Name = "manageProductsTabPage";
+      this.manageProductsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.manageProductsTabPage.Size = new System.Drawing.Size(583, 342);
+      this.manageProductsTabPage.TabIndex = 4;
+      this.manageProductsTabPage.Text = "Manage Products";
+      this.manageProductsTabPage.UseVisualStyleBackColor = true;
+      // 
       // logTabPage
       // 
@@ -301,23 +300,50 @@
       this.connectionSettingsToolStripMenuItem.Click += new System.EventHandler(this.connectionSettingsToolStripMenuItem_Click);
       // 
-      // uploadPluginsTabPage
-      // 
-      this.uploadPluginsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.uploadPluginsTabPage.Name = "uploadPluginsTabPage";
-      this.uploadPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.uploadPluginsTabPage.Size = new System.Drawing.Size(583, 342);
-      this.uploadPluginsTabPage.TabIndex = 3;
-      this.uploadPluginsTabPage.Text = "Upload Plugins";
-      this.uploadPluginsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // manageProductsTabPage
-      // 
-      this.manageProductsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.manageProductsTabPage.Name = "manageProductsTabPage";
-      this.manageProductsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.manageProductsTabPage.Size = new System.Drawing.Size(583, 342);
-      this.manageProductsTabPage.TabIndex = 4;
-      this.manageProductsTabPage.Text = "Manage Products";
-      this.manageProductsTabPage.UseVisualStyleBackColor = true;
+      // localPluginManagerView
+      // 
+      this.localPluginManagerView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginManagerView.Location = new System.Drawing.Point(6, 6);
+      this.localPluginManagerView.Name = "localPluginManagerView";
+      this.localPluginManagerView.Plugins = null;
+      this.localPluginManagerView.Size = new System.Drawing.Size(569, 293);
+      this.localPluginManagerView.TabIndex = 0;
+      this.localPluginManagerView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.localPluginManager_ItemChecked);
+      // 
+      // remotePluginInstaller
+      // 
+      this.remotePluginInstaller.AllPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
+      this.remotePluginInstaller.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.remotePluginInstaller.Location = new System.Drawing.Point(6, 6);
+      this.remotePluginInstaller.Name = "remotePluginInstaller";
+      this.remotePluginInstaller.NewPlugins = new HeuristicLab.PluginInfrastructure.IPluginDescription[0];
+      this.remotePluginInstaller.Products = new HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[0];
+      this.remotePluginInstaller.ShowAllPlugins = false;
+      this.remotePluginInstaller.Size = new System.Drawing.Size(571, 293);
+      this.remotePluginInstaller.TabIndex = 14;
+      this.remotePluginInstaller.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginInstaller_ItemChecked);
+      // 
+      // pluginEditor
+      // 
+      this.pluginEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginEditor.Location = new System.Drawing.Point(6, 6);
+      this.pluginEditor.Name = "pluginEditor";
+      this.pluginEditor.Size = new System.Drawing.Size(571, 330);
+      this.pluginEditor.TabIndex = 0;
+      // 
+      // productEditor
+      // 
+      this.productEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productEditor.Location = new System.Drawing.Point(6, 6);
+      this.productEditor.Name = "productEditor";
+      this.productEditor.Size = new System.Drawing.Size(571, 330);
+      this.productEditor.TabIndex = 0;
       // 
       // InstallationManagerForm
@@ -338,4 +364,6 @@
       this.localPluginsTabPage.ResumeLayout(false);
       this.availablePluginsTabPage.ResumeLayout(false);
+      this.uploadPluginsTabPage.ResumeLayout(false);
+      this.manageProductsTabPage.ResumeLayout(false);
       this.logTabPage.ResumeLayout(false);
       this.logTabPage.PerformLayout();
@@ -371,4 +399,6 @@
     private System.Windows.Forms.TabPage uploadPluginsTabPage;
     private System.Windows.Forms.TabPage manageProductsTabPage;
+    private PluginEditor pluginEditor;
+    private ProductEditor productEditor;
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.cs	(revision 3508)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginComparisonView.cs	(revision 3509)
@@ -36,5 +36,5 @@
   internal partial class PluginComparisonView : Form {
 
-    public PluginComparisonView(PluginDescription localPlugin, PluginDescription serverPlugin) {
+    public PluginComparisonView(IPluginDescription localPlugin, IPluginDescription serverPlugin) {
       InitializeComponent();
       //Caption = "Compare plugins";
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs	(revision 3508)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginEditor.cs	(revision 3509)
@@ -31,8 +31,9 @@
 using ICSharpCode.SharpZipLib.Zip;
 using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
-  internal partial class PluginEditor : InstallationManagerControl {
-    private Dictionary<IPluginDescription, DeploymentService.PluginDescription> localAndServerPlugins;
+  internal partial class PluginEditor : UserControl {
+    private Dictionary<IPluginDescription, IPluginDescription> localAndServerPlugins;
     private BackgroundWorker pluginUploadWorker;
     private BackgroundWorker updateServerPluginsWorker;
@@ -42,5 +43,5 @@
       // Caption = "Upload Plugins";
 
-      localAndServerPlugins = new Dictionary<IPluginDescription, DeploymentService.PluginDescription>();
+      localAndServerPlugins = new Dictionary<IPluginDescription, IPluginDescription>();
 
       #region initialize backgroundworkers
@@ -64,5 +65,5 @@
         }
         // refresh server plugins (find matching local plugins)
-        var plugins = (DeploymentService.PluginDescription[])e.Result;
+        var plugins = (IPluginDescription[])e.Result;
         foreach (var plugin in plugins) {
           var matchingLocalPlugin = (from localPlugin in localAndServerPlugins.Keys
@@ -168,5 +169,5 @@
     private void listView_ItemActivate(object sender, EventArgs e) {
       foreach (var item in listView.SelectedItems) {
-        var plugin = (IPluginDescription)((ListViewItem)item).Tag;
+        var plugin = (PluginDescription)((ListViewItem)item).Tag;
         var compView = new PluginComparisonView(plugin, localAndServerPlugins[plugin]);
         compView.Show();
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3508)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/PluginView.cs	(revision 3509)
@@ -37,5 +37,5 @@
     private const string IMAGE_KEY_DOCUMENT = "Document";
 
-    private PluginDescription plugin;
+    private IPluginDescription plugin;
 
     public PluginView() {
@@ -44,5 +44,5 @@
     }
 
-    public PluginView(PluginDescription plugin) {
+    public PluginView(IPluginDescription plugin) {
       InitializeComponent();
       PopulateImageList();
@@ -65,6 +65,9 @@
       contactTextBox.Text = CombineStrings(plugin.ContactName, plugin.ContactEmail);
       descriptionTextBox.Text = plugin.Description;
-      stateTextBox.Text = plugin.PluginState.ToString();
-      errorTextBox.Text = plugin.LoadingErrorInformation;
+      var localPlugin = plugin as PluginDescription;
+      if (localPlugin != null) {
+        stateTextBox.Text = localPlugin.PluginState.ToString();
+        errorTextBox.Text = localPlugin.LoadingErrorInformation;
+      }
       foreach (PluginDescription dependency in plugin.Dependencies) {
         var depItem = new ListViewItem(new string[] { dependency.Name, dependency.Version.ToString() });
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3508)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 3509)
@@ -147,4 +147,16 @@
       <DependentUpon>MultiSelectListView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Advanced\PluginComparisonView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\PluginComparisonView.Designer.cs">
+      <DependentUpon>PluginComparisonView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\PluginEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\PluginEditor.Designer.cs">
+      <DependentUpon>PluginEditor.cs</DependentUpon>
+    </Compile>
     <Compile Include="Advanced\PluginListView.cs">
       <SubType>UserControl</SubType>
@@ -158,4 +170,10 @@
     <Compile Include="Advanced\PluginView.Designer.cs">
       <DependentUpon>PluginView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\ProductEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\ProductEditor.Designer.cs">
+      <DependentUpon>ProductEditor.cs</DependentUpon>
     </Compile>
     <Compile Include="Advanced\RemotePluginInstaller.cs">
@@ -281,4 +299,10 @@
       <DependentUpon>LicenseView.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\PluginComparisonView.resx">
+      <DependentUpon>PluginComparisonView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\PluginEditor.resx">
+      <DependentUpon>PluginEditor.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Advanced\PluginListView.resx">
       <DependentUpon>PluginListView.cs</DependentUpon>
@@ -286,4 +310,7 @@
     <EmbeddedResource Include="Advanced\PluginView.resx">
       <DependentUpon>PluginView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Advanced\ProductEditor.resx">
+      <DependentUpon>ProductEditor.cs</DependentUpon>
     </EmbeddedResource>
     <None Include="Resources\VS2008ImageLibrary_Actions_Delete.png" />
