Index: branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs
===================================================================
--- branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 604)
+++ branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.cs	(revision 605)
@@ -34,7 +34,4 @@
 namespace HeuristicLab.PluginInfrastructure.GUI {
   public partial class ManagerForm : Form {
-    private TreeNode installedPlugins;
-    private TreeNode availablePlugins;
-    private TreeNode disabledPlugins;
     private List<PluginTag> allTags = new List<PluginTag>();
     private Dictionary<PluginTag, PluginAction> actions = new Dictionary<PluginTag, PluginAction>();
@@ -44,4 +41,7 @@
     private string backupDir = Application.StartupPath + "/" + HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.BackupDir;
     private string tempDir = Application.StartupPath + "/" + HeuristicLab.PluginInfrastructure.GUI.Properties.Settings.Default.TempDir;
+    private const string AVAILABLE_PLUGINS = "Available plugins";
+    private const string DISABLED_PLUGINS = "Disabled plugins";
+    private const string INSTALLED_PLUGINS = "Installed plugins";
 
     public ManagerForm() {
@@ -51,5 +51,7 @@
 
     private void InitializePlugins() {
-      pluginTreeView.Nodes.Clear();
+      listView.View = View.Details;
+      listView.FullRowSelect = true;
+      listView.Items.Clear();
       allTags.Clear();
       actions.Clear();
@@ -66,37 +68,25 @@
       deleteMenuItem.Checked = false;
 
-      installedPlugins = new TreeNode("Installed plugins");
-      installedPlugins.ImageIndex = 1;
-      installedPlugins.SelectedImageIndex = 1;
-      availablePlugins = new TreeNode("Available plugins");
-      availablePlugins.ImageIndex = 1;
-      availablePlugins.SelectedImageIndex = 1;
-      disabledPlugins = new TreeNode("Disabled plugins");
-      disabledPlugins.ImageIndex = 1;
-      disabledPlugins.SelectedImageIndex = 1;
-
-      pluginTreeView.Nodes.Add(installedPlugins);
-      pluginTreeView.Nodes.Add(availablePlugins);
-      pluginTreeView.Nodes.Add(disabledPlugins);
-
       foreach(PluginInfo pluginInfo in PluginManager.Manager.ActivePlugins) {
         // create a new PluginAction tag for the plugin
         PluginTag tag = new PluginTag(allTags, pluginInfo, PluginState.Installed);
         allTags.Add(tag);
-        // add to "installed plugins" node
-        TreeNode installedPluginsNode = new TreeNode(pluginInfo.Name);
-        installedPluginsNode.ContextMenuStrip = pluginContextMenuStrip;
-        installedPluginsNode.Tag = tag;
-        installedPluginsNode.ImageIndex = 0;
-        installedPlugins.Nodes.Add(installedPluginsNode);
+        // add to "installed plugins" item
+        ListViewItem installedPluginsItem = new ListViewItem(pluginInfo.Name);
+        installedPluginsItem.Tag = tag;
+        installedPluginsItem.ImageIndex = 0;
+        installedPluginsItem.Group = listView.Groups[INSTALLED_PLUGINS];
+        installedPluginsItem.SubItems.Add(pluginInfo.Version.ToString());
+        listView.Items.Add(installedPluginsItem);
       }
       foreach(PluginInfo pluginInfo in PluginManager.Manager.DisabledPlugins) {
         PluginTag tag = new PluginTag(allTags, pluginInfo, PluginState.Disabled);
         allTags.Add(tag);
-        TreeNode disabledPluginsNode = new TreeNode(pluginInfo.Name);
-        disabledPluginsNode.ContextMenuStrip = pluginContextMenuStrip;
-        disabledPluginsNode.Tag = tag;
-        disabledPluginsNode.ImageIndex = 0;
-        disabledPlugins.Nodes.Add(disabledPluginsNode);
+        ListViewItem disabledPluginsItem = new ListViewItem(pluginInfo.Name);
+        disabledPluginsItem.Tag = tag;
+        disabledPluginsItem.ImageIndex = 0;
+        disabledPluginsItem.Group = listView.Groups[DISABLED_PLUGINS];
+        disabledPluginsItem.SubItems.Add(pluginInfo.Version.ToString());
+        listView.Items.Add(disabledPluginsItem);
       }
 
@@ -111,9 +101,10 @@
         PluginTag tag = new PluginTag(allTags, plugin, PluginState.Available);
         allTags.Add(tag);
-        TreeNode availableNode = new TreeNode(plugin.Name);
-        availableNode.ContextMenuStrip = pluginContextMenuStrip;
-        availableNode.Tag = tag;
-        availableNode.ImageIndex = 0;
-        availablePlugins.Nodes.Add(availableNode);
+        ListViewItem availableItem = new ListViewItem(plugin.Name);
+        availableItem.Tag = tag;
+        availableItem.ImageIndex = 0;
+        availableItem.Group = listView.Groups[AVAILABLE_PLUGINS];
+        availableItem.SubItems.Add(plugin.Version.ToString());
+        listView.Items.Add(availableItem);
       });
       upgrades.ForEach(delegate(PluginDescription upgrade) {
@@ -135,7 +126,9 @@
         currentPlugin.PluginDescription = overridingPlugin;
       });
-      toolStripStatusLabel.Text = "Installed: " + installedPlugins.Nodes.Count + " Updates: " + upgrades.Count + " Available: " + availablePlugins.Nodes.Count;
+      toolStripStatusLabel.Text = "Installed: " + listView.Groups[INSTALLED_PLUGINS].Items.Count +
+        " Updates: " + upgrades.Count + " Available: " + listView.Groups[AVAILABLE_PLUGINS].Items.Count;
       RebuildActionHulls();
-      pluginTreeView.Sort();
+
+      listView.Sort();
     }
 
@@ -146,33 +139,44 @@
 
     private void publishButton_Click(object sender, EventArgs args) {
-      PluginInfo plugin = ((PluginTag)pluginTreeView.SelectedNode.Tag).Plugin;
-      publishPlugin(plugin);
-    }
-
-    private void publishPlugin(PluginInfo plugin) {
+      if(listView.SelectedItems.Count == 0) return;
+      List<PluginInfo> plugins = new List<PluginInfo>();
+      foreach(ListViewItem item in listView.SelectedItems) {
+        plugins.Add(((PluginTag)item.Tag).Plugin);
+      }
+      PublishPlugin(plugins);
+    }
+
+    private void PublishPlugin(List<PluginInfo> plugins) {
+      StringBuilder xmlEntries = new StringBuilder();
       try {
-        string packageFileName = plugin.Name + "-" + plugin.Version + ".zip";
-        ZipFile zipFile = ZipFile.Create(packageFileName);
-        zipFile.NameTransform = new PluginNameTransform();
-        zipFile.BeginUpdate();
-
-        infoTextBox.Text = "Publishing plugin:\nCreating " + packageFileName + "...\n";
-        foreach(string filename in plugin.Files) {
-          infoTextBox.Text += "Adding " + filename + "\n";
-          zipFile.Add(filename);
-        }
-
-        zipFile.CommitUpdate();
-        zipFile.Close();
-        FileInfo fileInfo = new FileInfo(packageFileName);
-        infoTextBox.Text += "\nCreated " + packageFileName + " (" + fileInfo.Length + " bytes)\n";
-        infoTextBox.Text += "Upload this file to your plugin source and add the following entry to" +
+        infoTextBox.Text = "Publishing plugin:\n";
+        foreach(PluginInfo plugin in plugins) {
+          string packageFileName = plugin.Name + "-" + plugin.Version + ".zip";
+          ZipFile zipFile = ZipFile.Create(packageFileName);
+          zipFile.NameTransform = new PluginNameTransform();
+          zipFile.BeginUpdate();
+
+          infoTextBox.Text+="Creating " + packageFileName + "...\n";
+          foreach(string filename in plugin.Files) {
+            infoTextBox.Text += "Adding " + filename + "\n";
+            zipFile.Add(filename);
+          }
+
+          zipFile.CommitUpdate();
+          zipFile.Close();
+          FileInfo fileInfo = new FileInfo(packageFileName);
+          infoTextBox.Text += "Created " + packageFileName + " (" + fileInfo.Length + " bytes)\n";
+          xmlEntries.Append("  <Plugin Name=\"").Append(plugin.Name).Append("\" Version=\"").Append(plugin.Version)
+            .Append("\" Build=\"").Append(plugin.BuildDate.ToUniversalTime().ToString(System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat))
+            .Append("\">").AppendLine();
+          foreach(PluginInfo dependency in plugin.Dependencies) {
+            xmlEntries.Append("    <Dependency Name=\"").Append(dependency.Name).Append("\" />").AppendLine();
+          }
+          xmlEntries.Append("  </Plugin>").AppendLine();
+        }
+
+        infoTextBox.Text += "Upload the zip files to your plugin source and add the following to" +
 " the file plugins.xml residing in the base directory of your plugin source.\n\n";
-        infoTextBox.Text += "  <Plugin Name=\"" + plugin.Name + "\" Version=\""
-          + plugin.Version + "\" Build=\"" + plugin.BuildDate.ToUniversalTime().ToString(System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat) + "\">\n";
-        foreach(PluginInfo dependency in plugin.Dependencies) {
-          infoTextBox.Text += "    <Dependency Name=\"" + dependency.Name + "\" />\n";
-        }
-        infoTextBox.Text += "  </Plugin>";
+        infoTextBox.Text += xmlEntries.ToString();
       } catch(Exception exception) {
         infoTextBox.Text += "\nThere was an error!\n" + exception;
@@ -337,11 +341,9 @@
 
       // update the GUI to represent new state of the selected plugin
-      if(pluginTreeView.SelectedNode != null && pluginTreeView.SelectedNode.Tag is PluginTag) {
-        UpdateActionButtons((PluginTag)pluginTreeView.SelectedNode.Tag);
-        DisplayPluginInfo(((PluginTag)pluginTreeView.SelectedNode.Tag).GetPluginDetails());
-      }
-    }
-
-
+      if(listView.SelectedItems.Count>0 && listView.SelectedItems[0].Tag is PluginTag) {
+        UpdateActionButtons((PluginTag)listView.SelectedItems[0].Tag);
+        DisplayPluginInfo(((PluginTag)listView.SelectedItems[0].Tag).GetPluginDetails());
+      }
+    }
 
     private void MarkInstall(PluginTag actionTag) {
@@ -421,6 +423,4 @@
       newAction.Hull = hull;
       newAction.Hull.Add(actionTag);
-
-
       actions[actionTag] = newAction;
       UpdateTreeNodes(newAction.Hull);
@@ -542,23 +542,19 @@
     private void UpdateTreeNodes(List<PluginTag> hull) {
       hull.ForEach(delegate(PluginTag tag) {
-        FindPluginNodes(tag).ForEach(delegate(TreeNode node) {
+        FindPluginItems(tag).ForEach(delegate(ListViewItem item) {
           ManagerAction action = GetAction(tag);
           if(action != ManagerAction.None) {
-            node.Text = tag.PluginName + " - Action: " + action;
+            item.Text = tag.PluginName + " - Action: " + action;
             if(action == ManagerAction.Remove) {
-              node.ImageIndex = 3;
-              node.SelectedImageIndex = 3;
+              item.ImageIndex = 3;
             } else if(action == ManagerAction.Install) {
-              node.ImageIndex = 2;
-              node.SelectedImageIndex = 2;
+              item.ImageIndex = 2;
             }
           } else if(tag.State == PluginState.Upgradeable) {
-            node.Text = tag.PluginName + " - Upgrade: " + tag.PluginVersion + " -> " + tag.UpgradePluginDescription.Version;
-            node.ImageIndex = 2;
-            node.SelectedImageIndex = 2;
+            item.Text = tag.PluginName + " - Upgrade: " + tag.PluginVersion + " -> " + tag.UpgradePluginDescription.Version;
+            item.ImageIndex = 2;
           } else {
-            node.Text = tag.PluginName;
-            node.ImageIndex = 0;
-            node.SelectedImageIndex = 0;
+            item.Text = tag.PluginName;
+            item.ImageIndex = 0;
           }
         });
@@ -604,14 +600,14 @@
     }
 
-    private List<TreeNode> FindPluginNodes(PluginTag pluginTag) {
-      List<TreeNode> nodes = new List<TreeNode>();
-      foreach(TreeNode rootNode in new TreeNode[] { installedPlugins, availablePlugins, disabledPlugins }) {
-        foreach(TreeNode node in rootNode.Nodes) {
-          if(pluginTag.Equals(node.Tag)) {
-            nodes.Add(node);
-          }
-        }
-      }
-      return nodes;
+    private List<ListViewItem> FindPluginItems(PluginTag pluginTag) {
+      List<ListViewItem> items = new List<ListViewItem>();
+      foreach(ListViewGroup group in listView.Groups) {
+        foreach(ListViewItem item in group.Items) {
+          if(pluginTag.Equals(item.Tag)) {
+            items.Add(item);
+          }
+        }
+      }
+      return items;
     }
     private void DisplayPluginInfo(string pluginInformation) {
@@ -889,6 +885,6 @@
 
     private void removeButton_Clicked(object sender, EventArgs e) {
-      // get the tag of the selected treeNode
-      PluginTag actionTag = (PluginTag)pluginTreeView.SelectedNode.Tag;
+      // get the tag of the selected listViewItem
+      PluginTag actionTag = (PluginTag)listView.SelectedItems[0].Tag;
       List<PluginAction> rootActions = GetActionsInvolving(actionTag);
       if(rootActions.Count > 0) {
@@ -905,6 +901,6 @@
 
     private void installButton_Clicked(object sender, EventArgs e) {
-      // get the tag of the selected treeNode
-      PluginTag actionTag = (PluginTag)pluginTreeView.SelectedNode.Tag;
+      // get the tag of the selected listViewItem
+      PluginTag actionTag = (PluginTag)listView.SelectedItems[0].Tag;
       List<PluginAction> rootActions = GetActionsInvolving(actionTag);
 
@@ -936,27 +932,4 @@
 
       InitializePlugins();
-    }
-
-    private void pluginTreeView_BeforeSelect(object sender, TreeViewCancelEventArgs e) {
-      if(e.Node.Tag != null) {
-
-        UpdateActionButtons((PluginTag)e.Node.Tag);
-        // display the plugin details in the lower pane
-        DisplayPluginInfo(((PluginTag)e.Node.Tag).GetPluginDetails());
-
-      } else {
-        // when a node was selected that doesn't represent a plugin (root node) then install and remove are not possible
-        publishButton.Enabled = false;
-        installButton.Enabled = false;
-        deleteButton.Enabled = false;
-      }
-    }
-
-    private void pluginTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
-      // dumb solution to automatically select the node on right clicks which opens the context menu because 
-      // per default the treeview doesn't select nodes on right click
-      if(e.Button == MouseButtons.Right) {
-        pluginTreeView.SelectedNode = e.Node;
-      }
     }
 
@@ -1002,10 +975,34 @@
     }
 
-    private void pluginTreeView_KeyPress(object sender, KeyPressEventArgs e) {
-      e.Handled = true;
-      if(e.KeyChar == 'i' && installButton.Enabled) {
+    private void pluginTreeView_KeyDown(object sender, KeyEventArgs e) {
+      if(e.KeyData == Keys.I && installButton.Enabled) {
+        e.Handled = true;
+        e.SuppressKeyPress = true;
         installButton_Clicked(sender, e);
-      } else if(e.KeyChar == 'd' && deleteButton.Enabled) {
+      } else if((e.KeyData == Keys.D || e.KeyData == Keys.Delete) && deleteButton.Enabled) {
+        e.Handled = true;
+        e.SuppressKeyPress = true;
         removeButton_Clicked(sender, e);
+      }
+    }
+
+    private void listView_MouseDown(object sender, MouseEventArgs e) {
+      // dumb solution to automatically select the node on right clicks which opens the context menu because 
+      // per default the treeview doesn't select nodes on right click
+      if(e.Button == MouseButtons.Right) {
+        listView.GetItemAt(e.X, e.Y).Selected = true;
+      }
+    }
+
+    private void listView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
+      if(e.Item.Tag != null && e.IsSelected) {
+        UpdateActionButtons((PluginTag)e.Item.Tag);
+        // display the plugin details in the lower pane
+        DisplayPluginInfo(((PluginTag)e.Item.Tag).GetPluginDetails());
+      } else {
+        // when an item was 'unselected' or was selected but doesn't represent a plugin then install and remove are not possible
+        publishButton.Enabled = false;
+        installButton.Enabled = false;
+        deleteButton.Enabled = false;
       }
     }
Index: branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs
===================================================================
--- branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs	(revision 604)
+++ branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.designer.cs	(revision 605)
@@ -46,4 +46,7 @@
     private void InitializeComponent() {
       this.components = new System.ComponentModel.Container();
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Available plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Disabled plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup("Installed plugins", System.Windows.Forms.HorizontalAlignment.Left);
       System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ManagerForm));
       this.menuStrip = new System.Windows.Forms.MenuStrip();
@@ -60,7 +63,9 @@
       this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.pluginTreeView = new System.Windows.Forms.TreeView();
+      this.listView = new System.Windows.Forms.ListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.infoTextBox = new System.Windows.Forms.RichTextBox();
       this.pluginIcons = new System.Windows.Forms.ImageList(this.components);
-      this.infoTextBox = new System.Windows.Forms.RichTextBox();
       this.toolStrip = new System.Windows.Forms.ToolStrip();
       this.updateButton = new System.Windows.Forms.ToolStripButton();
@@ -115,5 +120,5 @@
       // 
       this.managePluginSourcesToolStripMenuItem.Name = "managePluginSourcesToolStripMenuItem";
-      this.managePluginSourcesToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.managePluginSourcesToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.managePluginSourcesToolStripMenuItem.Text = "Edit plugin sources...";
       this.managePluginSourcesToolStripMenuItem.Click += new System.EventHandler(this.managePluginSourcesToolStripMenuItem_Click);
@@ -122,5 +127,5 @@
       // 
       this.installPluginFromFileToolStripMenuItem.Name = "installPluginFromFileToolStripMenuItem";
-      this.installPluginFromFileToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.installPluginFromFileToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.installPluginFromFileToolStripMenuItem.Text = "Install plugin from file...";
       this.installPluginFromFileToolStripMenuItem.Click += new System.EventHandler(this.installPluginFromFileToolStripMenuItem_Click);
@@ -129,10 +134,10 @@
       // 
       this.toolStripSeparator2.Name = "toolStripSeparator2";
-      this.toolStripSeparator2.Size = new System.Drawing.Size(192, 6);
+      this.toolStripSeparator2.Size = new System.Drawing.Size(203, 6);
       // 
       // installedPluginsToolStripMenuItem
       // 
       this.installedPluginsToolStripMenuItem.Name = "installedPluginsToolStripMenuItem";
-      this.installedPluginsToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.installedPluginsToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.installedPluginsToolStripMenuItem.Text = "Update";
       this.installedPluginsToolStripMenuItem.Click += new System.EventHandler(this.updateButton_Click);
@@ -141,5 +146,5 @@
       // 
       this.installNewPluginsToolStripMenuItem.Name = "installNewPluginsToolStripMenuItem";
-      this.installNewPluginsToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.installNewPluginsToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.installNewPluginsToolStripMenuItem.Text = "Delete/Upgrade/Install...";
       this.installNewPluginsToolStripMenuItem.Click += new System.EventHandler(this.upgradeButton_Click);
@@ -148,10 +153,10 @@
       // 
       this.toolStripSeparator3.Name = "toolStripSeparator3";
-      this.toolStripSeparator3.Size = new System.Drawing.Size(192, 6);
+      this.toolStripSeparator3.Size = new System.Drawing.Size(203, 6);
       // 
       // refreshPluginListToolStripMenuItem
       // 
       this.refreshPluginListToolStripMenuItem.Name = "refreshPluginListToolStripMenuItem";
-      this.refreshPluginListToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.refreshPluginListToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.refreshPluginListToolStripMenuItem.Text = "Refresh plugin list";
       this.refreshPluginListToolStripMenuItem.Click += new System.EventHandler(this.refreshPluginListToolStripMenuItem_Click);
@@ -160,5 +165,5 @@
       // 
       this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
-      this.exitToolStripMenuItem.Size = new System.Drawing.Size(195, 22);
+      this.exitToolStripMenuItem.Size = new System.Drawing.Size(206, 22);
       this.exitToolStripMenuItem.Text = "Close";
       this.exitToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click);
@@ -175,5 +180,5 @@
       // 
       this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
-      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(115, 22);
+      this.aboutToolStripMenuItem.Size = new System.Drawing.Size(126, 22);
       this.aboutToolStripMenuItem.Text = "About...";
       this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
@@ -190,5 +195,5 @@
       // splitContainer.Panel1
       // 
-      this.splitContainer.Panel1.Controls.Add(this.pluginTreeView);
+      this.splitContainer.Panel1.Controls.Add(this.listView);
       // 
       // splitContainer.Panel2
@@ -199,17 +204,48 @@
       this.splitContainer.TabIndex = 1;
       // 
-      // pluginTreeView
-      // 
-      this.pluginTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.pluginTreeView.ImageIndex = 0;
-      this.pluginTreeView.ImageList = this.pluginIcons;
-      this.pluginTreeView.Location = new System.Drawing.Point(0, 0);
-      this.pluginTreeView.Name = "pluginTreeView";
-      this.pluginTreeView.SelectedImageIndex = 0;
-      this.pluginTreeView.Size = new System.Drawing.Size(828, 220);
-      this.pluginTreeView.TabIndex = 0;
-      this.pluginTreeView.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.pluginTreeView_KeyPress);
-      this.pluginTreeView.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.pluginTreeView_NodeMouseClick);
-      this.pluginTreeView.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.pluginTreeView_BeforeSelect);
+      // listView
+      // 
+      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader});
+      this.listView.ContextMenuStrip = this.pluginContextMenuStrip;
+      this.listView.Dock = System.Windows.Forms.DockStyle.Fill;
+      listViewGroup1.Header = "Available plugins";
+      listViewGroup1.Name = "Available plugins";
+      listViewGroup2.Header = "Disabled plugins";
+      listViewGroup2.Name = "Disabled plugins";
+      listViewGroup3.Header = "Installed plugins";
+      listViewGroup3.Name = "Installed plugins";
+      this.listView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2,
+            listViewGroup3});
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(828, 220);
+      this.listView.SmallImageList = this.pluginIcons;
+      this.listView.TabIndex = 0;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listView_MouseDown);
+      this.listView.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.listView_ItemSelectionChanged);
+      this.listView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.pluginTreeView_KeyDown);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 400;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      // 
+      // infoTextBox
+      // 
+      this.infoTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.infoTextBox.Location = new System.Drawing.Point(0, 0);
+      this.infoTextBox.Name = "infoTextBox";
+      this.infoTextBox.Size = new System.Drawing.Size(828, 249);
+      this.infoTextBox.TabIndex = 0;
+      this.infoTextBox.Text = "";
       // 
       // pluginIcons
@@ -222,13 +258,4 @@
       this.pluginIcons.Images.SetKeyName(3, "delete.bmp");
       this.pluginIcons.Images.SetKeyName(4, "genericInternet.bmp");
-      // 
-      // infoTextBox
-      // 
-      this.infoTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.infoTextBox.Location = new System.Drawing.Point(0, 0);
-      this.infoTextBox.Name = "infoTextBox";
-      this.infoTextBox.Size = new System.Drawing.Size(828, 249);
-      this.infoTextBox.TabIndex = 0;
-      this.infoTextBox.Text = "";
       // 
       // toolStrip
@@ -317,10 +344,10 @@
             this.publishMenuItem});
       this.pluginContextMenuStrip.Name = "pluginContextMenuStrip";
-      this.pluginContextMenuStrip.Size = new System.Drawing.Size(108, 70);
+      this.pluginContextMenuStrip.Size = new System.Drawing.Size(119, 70);
       // 
       // installMenuItem
       // 
       this.installMenuItem.Name = "installMenuItem";
-      this.installMenuItem.Size = new System.Drawing.Size(107, 22);
+      this.installMenuItem.Size = new System.Drawing.Size(118, 22);
       this.installMenuItem.Text = "Install";
       this.installMenuItem.Click += new System.EventHandler(this.installButton_Clicked);
@@ -329,5 +356,5 @@
       // 
       this.deleteMenuItem.Name = "deleteMenuItem";
-      this.deleteMenuItem.Size = new System.Drawing.Size(107, 22);
+      this.deleteMenuItem.Size = new System.Drawing.Size(118, 22);
       this.deleteMenuItem.Text = "Delete";
       this.deleteMenuItem.Click += new System.EventHandler(this.removeButton_Clicked);
@@ -336,5 +363,5 @@
       // 
       this.publishMenuItem.Name = "publishMenuItem";
-      this.publishMenuItem.Size = new System.Drawing.Size(107, 22);
+      this.publishMenuItem.Size = new System.Drawing.Size(118, 22);
       this.publishMenuItem.Text = "Publish";
       this.publishMenuItem.Click += new System.EventHandler(this.publishButton_Click);
@@ -394,5 +421,4 @@
     private System.Windows.Forms.ToolStripMenuItem managePluginSourcesToolStripMenuItem;
     private System.Windows.Forms.SplitContainer splitContainer;
-    private System.Windows.Forms.TreeView pluginTreeView;
     private System.Windows.Forms.RichTextBox infoTextBox;
     private System.Windows.Forms.ToolStripMenuItem refreshPluginListToolStripMenuItem;
@@ -416,4 +442,7 @@
     private System.Windows.Forms.StatusStrip statusStrip1;
     private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
+    private System.Windows.Forms.ListView listView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
   }
 }
Index: branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx
===================================================================
--- branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx	(revision 604)
+++ branches/3.0/sources/HeuristicLab.PluginInfrastructure.GUI/ManagerForm.resx	(revision 605)
@@ -120,4 +120,7 @@
   <metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
+  </metadata>
+  <metadata name="pluginContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>212, 17</value>
   </metadata>
   <metadata name="pluginIcons.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -287,7 +290,4 @@
 </value>
   </data>
-  <metadata name="pluginContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>212, 17</value>
-  </metadata>
   <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>490, 17</value>
Index: branches/3.0/sources/HeuristicLab/MainForm.cs
===================================================================
--- branches/3.0/sources/HeuristicLab/MainForm.cs	(revision 604)
+++ branches/3.0/sources/HeuristicLab/MainForm.cs	(revision 605)
@@ -57,5 +57,5 @@
 
     private void RefreshApplicationsList() {
-      applicationsListView.Clear();
+      applicationsListView.Items.Clear();
 
       pluginManagerListViewItem = new ListViewItem("Plugin Manager", 0);
