Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.Designer.cs	(revision 9512)
@@ -0,0 +1,317 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class AvailablePluginsView {
+    /// <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.pluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginsImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productsListView = new System.Windows.Forms.ListView();
+      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.productLargeImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productImageList = new System.Windows.Forms.ImageList(this.components);
+      this.productsGroupBox = new System.Windows.Forms.GroupBox();
+      this.showDetailsButton = new System.Windows.Forms.RadioButton();
+      this.showLargeIconsButton = new System.Windows.Forms.RadioButton();
+      this.installProductsButton = new System.Windows.Forms.Button();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
+      this.installPluginsButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.productsGroupBox.SuspendLayout();
+      this.pluginsGroupBox.SuspendLayout();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // pluginsListView
+      // 
+      this.pluginsListView.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.pluginsListView.CheckBoxes = true;
+      this.pluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader,
+            this.descriptionHeader});
+      this.pluginsListView.Location = new System.Drawing.Point(6, 19);
+      this.pluginsListView.Name = "pluginsListView";
+      this.pluginsListView.ShowGroups = false;
+      this.pluginsListView.Size = new System.Drawing.Size(266, 502);
+      this.pluginsListView.SmallImageList = this.pluginsImageList;
+      this.pluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginsListView.SuppressItemCheckedEvents = false;
+      this.pluginsListView.TabIndex = 0;
+      this.pluginsListView.UseCompatibleStateImageBehavior = false;
+      this.pluginsListView.View = System.Windows.Forms.View.Details;
+      this.pluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.remotePluginsListView_ItemChecked);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 185;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      this.versionHeader.Width = 93;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 250;
+      // 
+      // pluginsImageList
+      // 
+      this.pluginsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginsImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginsImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productsListView
+      // 
+      this.productsListView.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.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.productNameHeader,
+            this.productVersionHeader});
+      this.productsListView.HideSelection = false;
+      this.productsListView.LargeImageList = this.productLargeImageList;
+      this.productsListView.Location = new System.Drawing.Point(6, 50);
+      this.productsListView.MultiSelect = false;
+      this.productsListView.Name = "productsListView";
+      this.productsListView.ShowGroups = false;
+      this.productsListView.Size = new System.Drawing.Size(240, 471);
+      this.productsListView.SmallImageList = this.productImageList;
+      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.productsListView.TabIndex = 18;
+      this.productsListView.UseCompatibleStateImageBehavior = false;
+      this.productsListView.View = System.Windows.Forms.View.Details;
+      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListView_SelectedIndexChanged);
+      // 
+      // productNameHeader
+      // 
+      this.productNameHeader.Text = "Name";
+      // 
+      // productVersionHeader
+      // 
+      this.productVersionHeader.Text = "Version";
+      // 
+      // productLargeImageList
+      // 
+      this.productLargeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productLargeImageList.ImageSize = new System.Drawing.Size(32, 32);
+      this.productLargeImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productImageList
+      // 
+      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // productsGroupBox
+      // 
+      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsGroupBox.Controls.Add(this.showDetailsButton);
+      this.productsGroupBox.Controls.Add(this.showLargeIconsButton);
+      this.productsGroupBox.Controls.Add(this.installProductsButton);
+      this.productsGroupBox.Controls.Add(this.refreshButton);
+      this.productsGroupBox.Controls.Add(this.productsListView);
+      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.productsGroupBox.Name = "productsGroupBox";
+      this.productsGroupBox.Size = new System.Drawing.Size(252, 558);
+      this.productsGroupBox.TabIndex = 19;
+      this.productsGroupBox.TabStop = false;
+      this.productsGroupBox.Text = "Products";
+      // 
+      // showDetailsButton
+      // 
+      this.showDetailsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.showDetailsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsButton.Checked = true;
+      this.showDetailsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.ShowDetails;
+      this.showDetailsButton.Location = new System.Drawing.Point(221, 19);
+      this.showDetailsButton.Name = "showDetailsButton";
+      this.showDetailsButton.Size = new System.Drawing.Size(25, 25);
+      this.showDetailsButton.TabIndex = 22;
+      this.showDetailsButton.TabStop = true;
+      this.toolTip.SetToolTip(this.showDetailsButton, "Show Details");
+      this.showDetailsButton.UseVisualStyleBackColor = true;
+      this.showDetailsButton.CheckedChanged += new System.EventHandler(this.showDetailsButton_CheckedChanged);
+      // 
+      // showLargeIconsButton
+      // 
+      this.showLargeIconsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.showLargeIconsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showLargeIconsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.ShowIcons;
+      this.showLargeIconsButton.Location = new System.Drawing.Point(190, 19);
+      this.showLargeIconsButton.Name = "showLargeIconsButton";
+      this.showLargeIconsButton.Size = new System.Drawing.Size(25, 25);
+      this.showLargeIconsButton.TabIndex = 21;
+      this.toolTip.SetToolTip(this.showLargeIconsButton, "Show Large Icons");
+      this.showLargeIconsButton.UseVisualStyleBackColor = true;
+      this.showLargeIconsButton.CheckedChanged += new System.EventHandler(this.showLargeIconsButton_CheckedChanged);
+      // 
+      // installProductsButton
+      // 
+      this.installProductsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.installProductsButton.Enabled = false;
+      this.installProductsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Install;
+      this.installProductsButton.Location = new System.Drawing.Point(6, 527);
+      this.installProductsButton.Name = "installProductsButton";
+      this.installProductsButton.Size = new System.Drawing.Size(146, 25);
+      this.installProductsButton.TabIndex = 20;
+      this.installProductsButton.Text = "Install Selected Product";
+      this.installProductsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.installProductsButton, "Install all plugins for the selected product");
+      this.installProductsButton.UseVisualStyleBackColor = true;
+      this.installProductsButton.Click += new System.EventHandler(this.installProductsButton_Click);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Internet;
+      this.refreshButton.Location = new System.Drawing.Point(6, 19);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 25);
+      this.refreshButton.TabIndex = 16;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh available products from HeuristicLab deployment service");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshRemoteButton_Click);
+      // 
+      // pluginsGroupBox
+      // 
+      this.pluginsGroupBox.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.pluginsGroupBox.Controls.Add(this.pluginsListView);
+      this.pluginsGroupBox.Controls.Add(this.installPluginsButton);
+      this.pluginsGroupBox.Location = new System.Drawing.Point(-1, 0);
+      this.pluginsGroupBox.Name = "pluginsGroupBox";
+      this.pluginsGroupBox.Size = new System.Drawing.Size(278, 558);
+      this.pluginsGroupBox.TabIndex = 20;
+      this.pluginsGroupBox.TabStop = false;
+      this.pluginsGroupBox.Text = "Plugins";
+      // 
+      // installPluginsButton
+      // 
+      this.installPluginsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.installPluginsButton.Enabled = false;
+      this.installPluginsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Install;
+      this.installPluginsButton.Location = new System.Drawing.Point(6, 527);
+      this.installPluginsButton.Name = "installPluginsButton";
+      this.installPluginsButton.Size = new System.Drawing.Size(140, 25);
+      this.installPluginsButton.TabIndex = 17;
+      this.installPluginsButton.Text = "Install Selected Plugins";
+      this.installPluginsButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.installPluginsButton, "Install only checked plugins");
+      this.installPluginsButton.UseVisualStyleBackColor = true;
+      this.installPluginsButton.Click += new System.EventHandler(this.installPluginsButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.pluginsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(533, 558);
+      this.splitContainer.SplitterDistance = 252;
+      this.splitContainer.TabIndex = 21;
+      // 
+      // RemotePluginInstallerView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "RemotePluginInstallerView";
+      this.Size = new System.Drawing.Size(533, 558);
+      this.productsGroupBox.ResumeLayout(false);
+      this.pluginsGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private MultiSelectListView pluginsListView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button installPluginsButton;
+    private System.Windows.Forms.ListView productsListView;
+    private System.Windows.Forms.GroupBox productsGroupBox;
+    private System.Windows.Forms.GroupBox pluginsGroupBox;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.Button installProductsButton;
+    private System.Windows.Forms.ColumnHeader productNameHeader;
+    private System.Windows.Forms.ColumnHeader productVersionHeader;
+    private System.Windows.Forms.ImageList productImageList;
+    private System.Windows.Forms.ImageList pluginsImageList;
+    private System.Windows.Forms.RadioButton showDetailsButton;
+    private System.Windows.Forms.RadioButton showLargeIconsButton;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList productLargeImageList;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/AvailablePluginsView.cs	(revision 9512)
@@ -0,0 +1,329 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class AvailablePluginsView : InstallationManagerControl {
+    private class RefreshBackgroundWorkerResult {
+      public IEnumerable<IPluginDescription> RemotePlugins { get; set; }
+      public IEnumerable<DeploymentService.ProductDescription> RemoteProducts { get; set; }
+    }
+    private class UpdateOrInstallPluginsBackgroundWorkerArgument {
+      public IEnumerable<IPluginDescription> PluginsToUpdate { get; set; }
+      public IEnumerable<IPluginDescription> PluginsToInstall { get; set; }
+    }
+    private const string PluginDiscoveryMessage = "Looking for new plugins...";
+    private BackgroundWorker refreshServerPluginsBackgroundWorker;
+    private BackgroundWorker updateOrInstallPluginsBackgroundWorker;
+
+    private IEnumerable<DeploymentService.ProductDescription> products;
+    private IEnumerable<IPluginDescription> plugins;
+
+    private IEnumerable<IPluginDescription> CheckedPlugins {
+      get {
+        return (from item in pluginsListView.Items.OfType<ListViewItem>()
+                where item.Checked
+                let plugin = item.Tag as IPluginDescription
+                where plugin != null
+                select plugin).ToList();
+      }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+    public AvailablePluginsView() {
+      InitializeComponent();
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Setup_Install);
+      productLargeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Setup_Install);
+      pluginsImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Plugin);
+      refreshServerPluginsBackgroundWorker = new BackgroundWorker();
+      refreshServerPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(refreshServerPluginsBackgroundWorker_DoWork);
+      refreshServerPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshServerPluginsBackgroundWorker_RunWorkerCompleted);
+
+      updateOrInstallPluginsBackgroundWorker = new BackgroundWorker();
+      updateOrInstallPluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updateOrInstallPluginsBackgroundWorker_DoWork);
+      updateOrInstallPluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted);
+    }
+
+
+    #region event handlers for refresh server plugins background worker
+    void refreshServerPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        RefreshBackgroundWorkerResult refreshResult = (RefreshBackgroundWorkerResult)e.Result;
+        products = refreshResult.RemoteProducts;
+        plugins = refreshResult.RemotePlugins;
+        UpdateControl();
+      }
+      StatusView.UnlockUI();
+      StatusView.RemoveMessage(PluginDiscoveryMessage);
+      StatusView.HideProgressIndicator();
+    }
+
+    void refreshServerPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      RefreshBackgroundWorkerResult result = new RefreshBackgroundWorkerResult();
+      result.RemotePlugins = installationManager.GetRemotePluginList();
+      result.RemoteProducts = installationManager.GetRemoteProductList();
+      e.Result = result;
+    }
+    #endregion
+    #region event handlers for plugin update background worker
+    void updateOrInstallPluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+          "Please check your connection settings and user credentials.");
+      } else {
+        UpdateControl();
+      }
+      StatusView.UnlockUI();
+      StatusView.HideProgressIndicator();
+    }
+
+    void updateOrInstallPluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      UpdateOrInstallPluginsBackgroundWorkerArgument info = (UpdateOrInstallPluginsBackgroundWorkerArgument)e.Argument;
+      bool cancelled = false;
+      if (info.PluginsToInstall.Count() > 0)
+        installationManager.Install(info.PluginsToInstall, out cancelled);
+      if (info.PluginsToUpdate.Count() > 0)
+        installationManager.Update(info.PluginsToUpdate, out cancelled);
+
+      if (!cancelled && (info.PluginsToInstall.Count() > 0 || info.PluginsToUpdate.Count() > 0))
+        pluginManager.DiscoverAndCheckPlugins();
+    }
+    #endregion
+
+
+    #region button events
+    private void refreshRemoteButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(PluginDiscoveryMessage);
+      refreshServerPluginsBackgroundWorker.RunWorkerAsync();
+    }
+    private void installPluginsButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in CheckedPlugins
+                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
+                                                       where localPlugin.Name == remotePlugin.Name
+                                                       where localPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where localPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, localPlugin)
+                                                       select localPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+
+      // otherwise install a new plugin
+      var pluginsToInstall = CheckedPlugins.Except(pluginsToUpdate);
+
+      updateOrInstallInfo.PluginsToInstall = pluginsToInstall;
+      updateOrInstallInfo.PluginsToUpdate = pluginsToUpdate;
+      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
+    }
+    private void installProductsButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var updateOrInstallInfo = new UpdateOrInstallPluginsBackgroundWorkerArgument();
+      var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from plugin in selectedProduct.Plugins
+                            let matchingLocalPlugins = from localPlugin in pluginManager.Plugins
+                                                       where localPlugin.Name == plugin.Name
+                                                       where localPlugin.Version.Major == plugin.Version.Major
+                                                       where localPlugin.Version.Minor == plugin.Version.Minor
+                                                       where IsNewerThan(plugin, localPlugin)
+                                                       select localPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select plugin;
+
+      // otherwise install a new plugin
+      var pluginsToInstall = selectedProduct.Plugins.Except(pluginsToUpdate);
+
+      updateOrInstallInfo.PluginsToInstall =
+        pluginsToInstall
+        .Cast<IPluginDescription>()
+        .ToList();
+      updateOrInstallInfo.PluginsToUpdate =
+        pluginsToUpdate
+        .Cast<IPluginDescription>()
+        .ToList();
+      updateOrInstallPluginsBackgroundWorker.RunWorkerAsync(updateOrInstallInfo);
+    }
+
+    private void showLargeIconsButton_CheckedChanged(object sender, EventArgs e) {
+      productsListView.View = View.LargeIcon;
+    }
+
+    private void showDetailsButton_CheckedChanged(object sender, EventArgs e) {
+      productsListView.View = View.Details;
+    }
+
+    #endregion
+
+    private void UpdateControl() {
+      // clear products view
+      List<ListViewItem> productItemsToDelete = new List<ListViewItem>(productsListView.Items.OfType<ListViewItem>());
+      productItemsToDelete.ForEach(item => productsListView.Items.Remove(item));
+
+      // populate products list view
+      foreach (var product in products) {
+        var item = CreateListViewItem(product);
+        productsListView.Items.Add(item);
+      }
+      var allPluginsListViewItem = new ListViewItem();
+      allPluginsListViewItem.Text = "All Plugins";
+      allPluginsListViewItem.ImageIndex = 0;
+      productsListView.Items.Add(allPluginsListViewItem);
+      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void UpdatePluginsList() {
+      pluginsListView.Items.Clear();
+
+      // populate plugins list
+      if (productsListView.SelectedItems.Count > 0) {
+        pluginsListView.SuppressItemCheckedEvents = true;
+
+        var selectedItem = productsListView.SelectedItems[0];
+        if (selectedItem.Text == "All Plugins") {
+          foreach (var plugin in plugins) {
+            var item = CreateListViewItem(plugin);
+            pluginsListView.Items.Add(item);
+          }
+        } else {
+          var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+          foreach (var plugin in selectedProduct.Plugins) {
+            var item = CreateListViewItem(plugin);
+            pluginsListView.Items.Add(item);
+          }
+        }
+
+        Util.ResizeColumns(pluginsListView.Columns.OfType<ColumnHeader>());
+        pluginsListView.SuppressItemCheckedEvents = false;
+      }
+    }
+
+    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription product) {
+      ListViewItem item = new ListViewItem(new string[] { product.Name, product.Version.ToString() });
+      item.Tag = product;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    #region products list view events
+    private void productsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      UpdatePluginsList();
+      installProductsButton.Enabled = (productsListView.SelectedItems.Count > 0 &&
+        productsListView.SelectedItems[0].Text != "All Plugins");
+    }
+    #endregion
+
+    #region item checked event handler
+    private void remotePluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      foreach (ListViewItem item in pluginsListView.SelectedItems) {
+        IPluginDescription plugin = (IPluginDescription)item.Tag;
+        if (e.Item.Checked)
+          HandlePluginChecked(plugin);
+        else
+          HandlePluginUnchecked(plugin);
+      }
+      installPluginsButton.Enabled = pluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void HandlePluginUnchecked(IPluginDescription plugin) {
+      // also uncheck all dependent plugins
+      List<ListViewItem> modifiedItems = new List<ListViewItem>();
+      modifiedItems.AddRange(FindItemsForPlugin(plugin));
+      var dependentPlugins = Util.GetAllDependents(plugin, plugins);
+      foreach (var dependentPlugin in dependentPlugins) {
+        // there can be multiple entries for a single plugin in different groups
+        foreach (var item in FindItemsForPlugin(dependentPlugin)) {
+          if (item != null && item.Checked) {
+            if (!modifiedItems.Contains(item))
+              modifiedItems.Add(item);
+          }
+        }
+      }
+      pluginsListView.UncheckItems(modifiedItems);
+    }
+
+    private void HandlePluginChecked(IPluginDescription plugin) {
+      // also check all dependencies
+      List<ListViewItem> modifiedItems = new List<ListViewItem>();
+      modifiedItems.AddRange(FindItemsForPlugin(plugin));
+      foreach (var dep in Util.GetAllDependencies(plugin)) {
+        // there can be multiple entries for a single plugin in different groups
+        foreach (ListViewItem item in FindItemsForPlugin(dep)) {
+          if (item != null && !item.Checked) {
+            if (!modifiedItems.Contains(item))
+              modifiedItems.Add(item);
+          }
+        }
+      }
+      pluginsListView.CheckItems(modifiedItems);
+    }
+
+    #endregion
+
+    #region helper methods
+    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
+      return (from item in pluginsListView.Items.OfType<ListViewItem>()
+              let otherPlugin = item.Tag as IPluginDescription
+              where otherPlugin != null && otherPlugin.Name == plugin.Name && otherPlugin.Version == plugin.Version
+              select item);
+    }
+
+    // compares for two plugins with same major and minor version if plugin1 is newer than plugin2
+    private static bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      return plugin1.Version.Build > plugin2.Version.Build ||
+        (plugin1.Version.Build == plugin2.Version.Build && plugin1.Version.Revision > plugin2.Version.Revision);
+    }
+    #endregion
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.Designer.cs	(revision 9512)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class BasicUpdateView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.updateAndInstallButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // updateAndInstallButton
+      // 
+      this.updateAndInstallButton.Anchor = System.Windows.Forms.AnchorStyles.None;
+      this.updateAndInstallButton.Image = HeuristicLab.PluginInfrastructure.Resources.Internet;
+      this.updateAndInstallButton.Location = new System.Drawing.Point(3, 2);
+      this.updateAndInstallButton.Name = "updateAndInstallButton";
+      this.updateAndInstallButton.Size = new System.Drawing.Size(155, 50);
+      this.updateAndInstallButton.TabIndex = 0;
+      this.updateAndInstallButton.Text = "Find and Install Updates";
+      this.updateAndInstallButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
+      this.toolTip.SetToolTip(this.updateAndInstallButton, "Find, download and install updates for all installed plugins.");
+      this.updateAndInstallButton.UseVisualStyleBackColor = true;
+      this.updateAndInstallButton.Click += new System.EventHandler(this.updateAndInstallButton_Click);
+      // 
+      // BasicUpdateView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.updateAndInstallButton);
+      this.Name = "BasicUpdateView";
+      this.Size = new System.Drawing.Size(163, 55);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button updateAndInstallButton;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/BasicUpdateView.cs	(revision 9512)
@@ -0,0 +1,108 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class BasicUpdateView : InstallationManagerControl {
+    private BackgroundWorker updatePluginsBackgroundWorker;
+    private const string CheckingPluginsMessage = "Checking for updated plugins...";
+    private const string NoUpdatesAvailableMessage = "No updates available.";
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+
+    public BasicUpdateView() {
+      InitializeComponent();
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+    }
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      } else if (e.Cancelled) {
+        StatusView.ShowMessage(NoUpdatesAvailableMessage);
+      }
+      StatusView.RemoveMessage(CheckingPluginsMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> installedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      var remotePlugins = installationManager.GetRemotePluginList();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in remotePlugins
+                            let matchingLocalPlugins = from installedPlugin in installedPlugins
+                                                       where installedPlugin.Name == remotePlugin.Name
+                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        bool cancelled;
+        installationManager.Update(pluginsToUpdate, out cancelled);
+        if (!cancelled)
+          pluginManager.DiscoverAndCheckPlugins();
+        e.Cancel = false;
+      } else {
+        e.Cancel = true;
+      }
+    }
+
+    // compares for two plugins with same major and minor version if plugin1 is newer than plugin2
+    private static bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      return plugin1.Version.Build > plugin2.Version.Build ||
+        (plugin1.Version.Build == plugin2.Version.Build && plugin1.Version.Revision > plugin2.Version.Revision);
+    }
+
+    #endregion
+    private void updateAndInstallButton_Click(object sender, EventArgs e) {
+      var installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>().ToList();
+      updatePluginsBackgroundWorker.RunWorkerAsync(installedPlugins);
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
+      StatusView.ShowMessage(CheckingPluginsMessage);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.Designer.cs	(revision 9512)
@@ -0,0 +1,163 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class ConfirmationDialog {
+    /// <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.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConfirmationDialog));
+      this.informationTextBox = new System.Windows.Forms.RichTextBox();
+      this.messageLabel = new System.Windows.Forms.Label();
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.icon = new System.Windows.Forms.PictureBox();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.icon)).BeginInit();
+      this.panel1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // informationTextBox
+      // 
+      this.informationTextBox.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.informationTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.informationTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.informationTextBox.Location = new System.Drawing.Point(105, 46);
+      this.informationTextBox.Name = "informationTextBox";
+      this.informationTextBox.ReadOnly = true;
+      this.informationTextBox.Size = new System.Drawing.Size(301, 181);
+      this.informationTextBox.TabIndex = 0;
+      this.informationTextBox.Text = "";
+      // 
+      // messageLabel
+      // 
+      this.messageLabel.AutoSize = true;
+      this.messageLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.messageLabel.Location = new System.Drawing.Point(13, 13);
+      this.messageLabel.Name = "messageLabel";
+      this.messageLabel.Size = new System.Drawing.Size(0, 13);
+      this.messageLabel.TabIndex = 1;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(250, 14);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 2;
+      this.okButton.Text = "&OK";
+      this.toolTip.SetToolTip(this.okButton, "Confirm Action");
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(331, 14);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 3;
+      this.cancelButton.Text = "&Cancel";
+      this.toolTip.SetToolTip(this.cancelButton, "Cancel Action");
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // icon
+      // 
+      this.icon.Location = new System.Drawing.Point(31, 66);
+      this.icon.Name = "icon";
+      this.icon.Size = new System.Drawing.Size(47, 50);
+      this.icon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.icon.TabIndex = 4;
+      this.icon.TabStop = false;
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.BackColor = System.Drawing.SystemColors.Control;
+      this.panel1.Controls.Add(this.okButton);
+      this.panel1.Controls.Add(this.cancelButton);
+      this.panel1.Location = new System.Drawing.Point(0, 233);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(418, 50);
+      this.panel1.TabIndex = 6;
+      // 
+      // ConfirmationDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(418, 282);
+      this.Controls.Add(this.panel1);
+      this.Controls.Add(this.icon);
+      this.Controls.Add(this.messageLabel);
+      this.Controls.Add(this.informationTextBox);
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ConfirmationDialog";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "ConfirmationDialog";
+      ((System.ComponentModel.ISupportInitialize)(this.icon)).EndInit();
+      this.panel1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.RichTextBox informationTextBox;
+    private System.Windows.Forms.Label messageLabel;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.PictureBox icon;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConfirmationDialog.cs	(revision 9512)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class ConfirmationDialog : Form {
+    public ConfirmationDialog()
+      : base() {
+      InitializeComponent();
+      icon.Image = System.Drawing.SystemIcons.Exclamation.ToBitmap();
+      DialogResult = DialogResult.Cancel;
+    }
+
+    public ConfirmationDialog(string caption, string message, string text)
+      : this() {
+      this.Text = caption;
+      messageLabel.Text = message;
+      informationTextBox.Text = text;
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      this.Close();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.Designer.cs	(revision 9512)
@@ -0,0 +1,212 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class 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.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ConnectionSetupView));
+      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.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.groupBox1.SuspendLayout();
+      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(66, 15);
+      this.urlTextBox.Name = "urlTextBox";
+      this.urlTextBox.Size = new System.Drawing.Size(410, 20);
+      this.urlTextBox.TabIndex = 0;
+      this.toolTip.SetToolTip(this.urlTextBox, "URL of HeuristicLab Plugin Deployment Service");
+      // 
+      // urlLabel
+      // 
+      this.urlLabel.AutoSize = true;
+      this.urlLabel.Location = new System.Drawing.Point(12, 18);
+      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(6, 22);
+      this.userLabel.Name = "userLabel";
+      this.userLabel.Size = new System.Drawing.Size(58, 13);
+      this.userLabel.TabIndex = 3;
+      this.userLabel.Text = "&Username:";
+      // 
+      // 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(94, 19);
+      this.userTextBox.Name = "userTextBox";
+      this.userTextBox.Size = new System.Drawing.Size(155, 20);
+      this.userTextBox.TabIndex = 0;
+      this.toolTip.SetToolTip(this.userTextBox, "Username used to connect to the HeuristicLab plugin deployment service");
+      // 
+      // passwordLabel
+      // 
+      this.passwordLabel.AutoSize = true;
+      this.passwordLabel.Location = new System.Drawing.Point(6, 48);
+      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(94, 45);
+      this.passwordTextBox.Name = "passwordTextBox";
+      this.passwordTextBox.Size = new System.Drawing.Size(155, 20);
+      this.passwordTextBox.TabIndex = 1;
+      this.toolTip.SetToolTip(this.passwordTextBox, "Passwort used to connect to the HeuristicLab plugin deployment service");
+      this.passwordTextBox.UseSystemPasswordChar = true;
+      // 
+      // applyButton
+      // 
+      this.applyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.applyButton.Location = new System.Drawing.Point(320, 148);
+      this.applyButton.Name = "applyButton";
+      this.applyButton.Size = new System.Drawing.Size(75, 23);
+      this.applyButton.TabIndex = 2;
+      this.applyButton.Text = "&OK";
+      this.toolTip.SetToolTip(this.applyButton, "Apply and save changes");
+      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(6, 71);
+      this.savePasswordCheckbox.Name = "savePasswordCheckbox";
+      this.savePasswordCheckbox.Size = new System.Drawing.Size(103, 17);
+      this.savePasswordCheckbox.TabIndex = 2;
+      this.savePasswordCheckbox.Text = "&Save Password:";
+      this.toolTip.SetToolTip(this.savePasswordCheckbox, "Check to save the user credentials to disk");
+      this.savePasswordCheckbox.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(401, 148);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 3;
+      this.cancelButton.Text = "&Cancel";
+      this.toolTip.SetToolTip(this.cancelButton, "Cancel and revert changes");
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.userTextBox);
+      this.groupBox1.Controls.Add(this.userLabel);
+      this.groupBox1.Controls.Add(this.savePasswordCheckbox);
+      this.groupBox1.Controls.Add(this.passwordTextBox);
+      this.groupBox1.Controls.Add(this.passwordLabel);
+      this.groupBox1.Location = new System.Drawing.Point(12, 41);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(255, 96);
+      this.groupBox1.TabIndex = 1;
+      this.groupBox1.TabStop = false;
+      this.groupBox1.Text = "User Credentials";
+      // 
+      // ConnectionSetupView
+      // 
+      this.AcceptButton = this.applyButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(488, 183);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.applyButton);
+      this.Controls.Add(this.urlLabel);
+      this.Controls.Add(this.urlTextBox);
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ConnectionSetupView";
+      this.ShowInTaskbar = false;
+      this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Edit Connection Settings";
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
+      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;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/ConnectionSetupView.cs	(revision 9512)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class ConnectionSetupView : 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();
+      }
+      Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/AdminServiceClientFactory.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/AdminServiceClientFactory.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/AdminServiceClientFactory.cs	(revision 9512)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Security.Cryptography.X509Certificates;
+using System.ServiceModel;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  /// <summary>
+  /// Factory class to generate administration service client instances for the deployment service.
+  /// </summary>
+  public static class AdminServiceClientFactory {
+    private static byte[] serverCrtData;
+
+    /// <summary>
+    /// static constructor loads the embedded service certificate 
+    /// </summary>
+    static AdminServiceClientFactory() {
+      var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.services.heuristiclab.com.cer");
+      serverCrtData = new byte[stream.Length];
+      stream.Read(serverCrtData, 0, serverCrtData.Length);
+    }
+
+    /// <summary>
+    /// Factory method to create new administration service clients for the deployment service.
+    /// Sets the connection string and user credentials from values provided in settings.
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationnAdministrationAddress
+    /// 
+    /// </summary>
+    /// <returns>A new instance of an adimistration service client</returns>
+    public static AdminServiceClient CreateClient() {
+      var client = new AdminServiceClient();
+      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.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.Custom;
+      client.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator =
+          new DeploymentServerCertificateValidator(new X509Certificate2(serverCrtData));
+
+      return client;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/DeploymentServerCertificateValidator.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/DeploymentServerCertificateValidator.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/DeploymentServerCertificateValidator.cs	(revision 9512)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.IdentityModel.Selectors;
+using System.IdentityModel.Tokens;
+using System.Security.Cryptography.X509Certificates;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  internal class DeploymentServerCertificateValidator : X509CertificateValidator {
+    private X509Certificate2 allowedCertificate;
+    public DeploymentServerCertificateValidator(X509Certificate2 allowedCertificate) {
+      if (allowedCertificate == null) {
+        throw new ArgumentNullException("allowedCertificate");
+      }
+
+      this.allowedCertificate = allowedCertificate;
+    }
+    public override void Validate(X509Certificate2 certificate) {
+      // Check that there is a certificate.
+      if (certificate == null) {
+        throw new ArgumentNullException("certificate");
+      }
+
+      // Check that the certificate issuer matches the configured issuer
+      if (!allowedCertificate.Equals(certificate)) {
+        throw new SecurityTokenValidationException("Server certificate doesn't match.");
+      }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/GenerateServiceClients.cmd
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/GenerateServiceClients.cmd	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/GenerateServiceClients.cmd	(revision 9512)
@@ -0,0 +1,22 @@
+echo off
+
+echo.
+echo *******************************************************************************************
+echo Generating DeploymentService clients
+echo.
+
+svcutil.exe ^
+  http://services.heuristiclab.com/Deployment-3.3/UpdateService.svc/mex ^
+  http://services.heuristiclab.com/Deployment-3.3/AdminService.svc/mex ^
+  /out:ServiceClients ^
+  /namespace:*,HeuristicLab.PluginInfrastructure.Advanced.DeploymentService ^
+  /targetClientVersion:Version35 ^
+  /mergeConfig ^
+  /config:..\..\app.config
+
+echo.
+echo Generation of DeploymentService clients finished.
+echo *******************************************************************************************
+echo.
+
+pause
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/PluginDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/PluginDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/PluginDescription.cs	(revision 9512)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  // extension of auto-generated DataContract class PluginDescription
+  public partial class PluginDescription : IPluginDescription {
+    /// <summary>
+    /// Initializes an new instance of <see cref="PluginDescription" />
+    /// with no dependencies, empty contact details and empty license text.
+    /// </summary>
+    /// <param name="name">Name of the plugin</param>
+    /// <param name="version">Version of the plugin</param>
+    public PluginDescription(string name, Version version) : this(name, version, new List<PluginDescription>()) { }
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginDescription" /> 
+    /// with empty contact details and empty license text.
+    /// </summary>
+    /// <param name="name">Name of the plugin</param>
+    /// <param name="version">Version of the plugin</param>
+    /// <param name="dependencies">Enumerable of dependencies of the plugin</param>
+    public PluginDescription(string name, Version version, IEnumerable<PluginDescription> dependencies)
+      : this(name, version, dependencies, string.Empty, string.Empty, string.Empty) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginDescription" />.
+    /// </summary>
+    /// <param name="name">Name of the plugin</param>
+    /// <param name="version">Version of the plugin</param>
+    /// <param name="dependencies">Enumerable of dependencies of the plugin</param>
+    /// <param name="contactName">Name of the contact person for the plugin</param>
+    /// <param name="contactEmail">E-mail of the contact person for the plugin</param>
+    /// <param name="licenseText">License text for the plugin</param>
+    public PluginDescription(string name, Version version, IEnumerable<PluginDescription> dependencies, string contactName, string contactEmail, string licenseText) {
+      this.Name = name;
+      this.Version = version;
+      this.Dependencies = dependencies.ToArray();
+      this.LicenseText = licenseText;
+    }
+
+    #region IPluginDescription Members
+    /// <summary>
+    /// Gets the description of the plugin. Always string.Empty.
+    /// </summary>
+    public string Description {
+      get { return string.Empty; }
+    }
+
+    /// <summary>
+    /// Gets an enumerable of dependencies of the plugin
+    /// </summary>
+    IEnumerable<IPluginDescription> IPluginDescription.Dependencies {
+      get {
+        return Dependencies;
+      }
+    }
+
+    /// <summary>
+    /// Gets and enumerable of files that are part of this pluing. Always empty.
+    /// </summary>
+    public IEnumerable<IPluginFile> Files {
+      get { return Enumerable.Empty<IPluginFile>(); }
+    }
+
+    #endregion
+
+    /// <summary>
+    /// ToString override
+    /// </summary>
+    /// <returns>String representation of the PluginDescription (name + version)</returns>
+    public override string ToString() {
+      return Name + " " + Version;
+    }
+
+    public override bool Equals(object obj) {
+      PluginDescription other = obj as PluginDescription;
+      if (other == null) return false;
+      else return other.Name == this.Name && other.Version == this.Version;
+    }
+
+    public override int GetHashCode() {
+      return Name.GetHashCode() + Version.GetHashCode();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ProductDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ProductDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ProductDescription.cs	(revision 9512)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  // extension of auto-generated DataContract class ProductDescription
+  /// <summary>
+  /// Product description as provided by the deployment service.
+  /// A product has a name, a version and a list of plugins that are part of the product.
+  /// </summary>
+  public partial class ProductDescription {
+    /// <summary>
+    /// Initializes a new instance of <see cref="ProductDescription" />
+    /// </summary>
+    /// <param name="name">Name of the product</param>
+    /// <param name="version">Version of the product</param>
+    public ProductDescription(string name, Version version)
+      : this(name, version, new List<PluginDescription>()) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ProductDescription" />
+    /// </summary>
+    /// <param name="name">Name of the product</param>
+    /// <param name="version">Version of the product</param>
+    /// <param name="plugins">Enumerable of plugins of the product</param>
+    public ProductDescription(string name, Version version, IEnumerable<PluginDescription> plugins) {
+      this.Name = name;
+      this.Version = version;
+      this.Plugins = plugins.ToArray();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ServiceClients.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ServiceClients.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/ServiceClients.cs	(revision 9512)
@@ -0,0 +1,322 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.225
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService
+{
+    using System.Runtime.Serialization;
+    
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+    [System.Runtime.Serialization.DataContractAttribute(Name="PluginDescription", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Deployment", IsReference=true)]
+    public partial class PluginDescription : object, System.Runtime.Serialization.IExtensibleDataObject
+    {
+        
+        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+        
+        private string ContactEmailField;
+        
+        private string ContactNameField;
+        
+        private HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] DependenciesField;
+        
+        private string LicenseTextField;
+        
+        private string NameField;
+        
+        private System.Version VersionField;
+        
+        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+        {
+            get
+            {
+                return this.extensionDataField;
+            }
+            set
+            {
+                this.extensionDataField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public string ContactEmail
+        {
+            get
+            {
+                return this.ContactEmailField;
+            }
+            set
+            {
+                this.ContactEmailField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public string ContactName
+        {
+            get
+            {
+                return this.ContactNameField;
+            }
+            set
+            {
+                this.ContactNameField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] Dependencies
+        {
+            get
+            {
+                return this.DependenciesField;
+            }
+            set
+            {
+                this.DependenciesField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public string LicenseText
+        {
+            get
+            {
+                return this.LicenseTextField;
+            }
+            set
+            {
+                this.LicenseTextField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public string Name
+        {
+            get
+            {
+                return this.NameField;
+            }
+            set
+            {
+                this.NameField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public System.Version Version
+        {
+            get
+            {
+                return this.VersionField;
+            }
+            set
+            {
+                this.VersionField = value;
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
+    [System.Runtime.Serialization.DataContractAttribute(Name="ProductDescription", Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Services.Deployment")]
+    public partial class ProductDescription : object, System.Runtime.Serialization.IExtensibleDataObject
+    {
+        
+        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
+        
+        private string NameField;
+        
+        private HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] PluginsField;
+        
+        private System.Version VersionField;
+        
+        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
+        {
+            get
+            {
+                return this.extensionDataField;
+            }
+            set
+            {
+                this.extensionDataField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public string Name
+        {
+            get
+            {
+                return this.NameField;
+            }
+            set
+            {
+                this.NameField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] Plugins
+        {
+            get
+            {
+                return this.PluginsField;
+            }
+            set
+            {
+                this.PluginsField = value;
+            }
+        }
+        
+        [System.Runtime.Serialization.DataMemberAttribute()]
+        public System.Version Version
+        {
+            get
+            {
+                return this.VersionField;
+            }
+            set
+            {
+                this.VersionField = value;
+            }
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdateService")]
+    public interface IUpdateService
+    {
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IUpdateService/GetPlugin", ReplyAction="http://tempuri.org/IUpdateService/GetPluginResponse")]
+        byte[] GetPlugin(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription description);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IUpdateService/GetProducts", ReplyAction="http://tempuri.org/IUpdateService/GetProductsResponse")]
+        HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[] GetProducts();
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IUpdateService/GetPlugins", ReplyAction="http://tempuri.org/IUpdateService/GetPluginsResponse")]
+        HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] GetPlugins();
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public interface IUpdateServiceChannel : HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdateService, System.ServiceModel.IClientChannel
+    {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class UpdateServiceClient : System.ServiceModel.ClientBase<HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdateService>, HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdateService
+    {
+        
+        public UpdateServiceClient()
+        {
+        }
+        
+        public UpdateServiceClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName)
+        {
+        }
+        
+        public UpdateServiceClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress)
+        {
+        }
+        
+        public UpdateServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress)
+        {
+        }
+        
+        public UpdateServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress)
+        {
+        }
+        
+        public byte[] GetPlugin(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription description)
+        {
+            return base.Channel.GetPlugin(description);
+        }
+        
+        public HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription[] GetProducts()
+        {
+            return base.Channel.GetProducts();
+        }
+        
+        public HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription[] GetPlugins()
+        {
+            return base.Channel.GetPlugins();
+        }
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdminService")]
+    public interface IAdminService
+    {
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdminService/DeployProduct", ReplyAction="http://tempuri.org/IAdminService/DeployProductResponse")]
+        void DeployProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdminService/DeleteProduct", ReplyAction="http://tempuri.org/IAdminService/DeleteProductResponse")]
+        void DeleteProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IAdminService/DeployPlugin", ReplyAction="http://tempuri.org/IAdminService/DeployPluginResponse")]
+        void DeployPlugin(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription plugin, byte[] zipFile);
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public interface IAdminServiceChannel : HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdminService, System.ServiceModel.IClientChannel
+    {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class AdminServiceClient : System.ServiceModel.ClientBase<HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdminService>, HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdminService
+    {
+        
+        public AdminServiceClient()
+        {
+        }
+        
+        public AdminServiceClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName)
+        {
+        }
+        
+        public AdminServiceClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress)
+        {
+        }
+        
+        public AdminServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress)
+        {
+        }
+        
+        public AdminServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress)
+        {
+        }
+        
+        public void DeployProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product)
+        {
+            base.Channel.DeployProduct(product);
+        }
+        
+        public void DeleteProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription product)
+        {
+            base.Channel.DeleteProduct(product);
+        }
+        
+        public void DeployPlugin(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.PluginDescription plugin, byte[] zipFile)
+        {
+            base.Channel.DeployPlugin(plugin, zipFile);
+        }
+    }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/UpdateServiceClientFactory.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/UpdateServiceClientFactory.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/DeploymentService/UpdateServiceClientFactory.cs	(revision 9512)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Security.Cryptography.X509Certificates;
+using System.ServiceModel;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced.DeploymentService {
+  /// <summary>
+  /// Factory class to generate update service client instances for the deployment service.
+  /// </summary>
+  public static class UpdateServiceClientFactory {
+    private static byte[] serverCrtData;
+
+    /// <summary>
+    /// static constructor loads the embedded service certificate 
+    /// </summary>
+    static UpdateServiceClientFactory() {
+      var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.services.heuristiclab.com.cer");
+      serverCrtData = new byte[stream.Length];
+      stream.Read(serverCrtData, 0, serverCrtData.Length);
+    }
+
+    /// <summary>
+    /// Factory method to create new update service clients for the deployment service.
+    /// Sets the connection string and user credentials from values provided in settings.
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationUserName
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocationPassword
+    /// HeuristicLab.PluginInfrastructure.Properties.Settings.Default.UpdateLocation
+    /// 
+    /// </summary>
+    /// <returns>A new instance of an update service client</returns>
+    public static UpdateServiceClient CreateClient() {
+      var client = new UpdateServiceClient();
+      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.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.Custom;
+      client.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator =
+          new DeploymentServerCertificateValidator(new X509Certificate2(serverCrtData));
+      return client;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.Designer.cs	(revision 9512)
@@ -0,0 +1,367 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class EditProductsView {
+    /// <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.refreshButton = new System.Windows.Forms.Button();
+      this.uploadButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.productsGroupBox = new System.Windows.Forms.GroupBox();
+      this.deleteProductButton = new System.Windows.Forms.Button();
+      this.newProductButton = new System.Windows.Forms.Button();
+      this.productsListView = new System.Windows.Forms.ListView();
+      this.productNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.productVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.productImageList = new System.Windows.Forms.ImageList(this.components);
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
+      this.pluginListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginDescriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.versionLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.productsGroupBox.SuspendLayout();
+      this.detailsGroupBox.SuspendLayout();
+      this.pluginsGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Internet;
+      this.refreshButton.Location = new System.Drawing.Point(6, 394);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(73, 26);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh list of plugins and products from server");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // uploadButton
+      // 
+      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.uploadButton.Enabled = false;
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.PublishToWeb;
+      this.uploadButton.Location = new System.Drawing.Point(85, 394);
+      this.uploadButton.Name = "uploadButton";
+      this.uploadButton.Size = new System.Drawing.Size(120, 26);
+      this.uploadButton.TabIndex = 2;
+      this.uploadButton.Text = "Upload Products";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.uploadButton, "Upload changed products to server");
+      this.uploadButton.UseVisualStyleBackColor = true;
+      this.uploadButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.productsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(665, 426);
+      this.splitContainer.SplitterDistance = 321;
+      this.splitContainer.TabIndex = 4;
+      // 
+      // productsGroupBox
+      // 
+      this.productsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productsGroupBox.Controls.Add(this.deleteProductButton);
+      this.productsGroupBox.Controls.Add(this.uploadButton);
+      this.productsGroupBox.Controls.Add(this.newProductButton);
+      this.productsGroupBox.Controls.Add(this.productsListView);
+      this.productsGroupBox.Controls.Add(this.refreshButton);
+      this.productsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.productsGroupBox.Name = "productsGroupBox";
+      this.productsGroupBox.Size = new System.Drawing.Size(321, 426);
+      this.productsGroupBox.TabIndex = 5;
+      this.productsGroupBox.TabStop = false;
+      this.productsGroupBox.Text = "Products";
+      // 
+      // deleteProductButton
+      // 
+      this.deleteProductButton.Enabled = false;
+      this.deleteProductButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Remove;
+      this.deleteProductButton.Location = new System.Drawing.Point(116, 19);
+      this.deleteProductButton.Name = "deleteProductButton";
+      this.deleteProductButton.Size = new System.Drawing.Size(104, 26);
+      this.deleteProductButton.TabIndex = 5;
+      this.deleteProductButton.Text = "Delete Product";
+      this.deleteProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.deleteProductButton, "Deletes the selected product");
+      this.deleteProductButton.UseVisualStyleBackColor = true;
+      this.deleteProductButton.Click += new System.EventHandler(this.deleteProductButton_Click);
+      // 
+      // newProductButton
+      // 
+      this.newProductButton.Enabled = false;
+      this.newProductButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Add;
+      this.newProductButton.Location = new System.Drawing.Point(6, 19);
+      this.newProductButton.Name = "newProductButton";
+      this.newProductButton.Size = new System.Drawing.Size(104, 26);
+      this.newProductButton.TabIndex = 3;
+      this.newProductButton.Text = "Create Product";
+      this.newProductButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.newProductButton, "Create a new product");
+      this.newProductButton.UseVisualStyleBackColor = true;
+      this.newProductButton.Click += new System.EventHandler(this.newProductButton_Click);
+      // 
+      // productsListView
+      // 
+      this.productsListView.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.productsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.productNameHeader,
+            this.productVersionHeader});
+      this.productsListView.Enabled = false;
+      this.productsListView.FullRowSelect = true;
+      this.productsListView.HideSelection = false;
+      this.productsListView.Location = new System.Drawing.Point(6, 51);
+      this.productsListView.MultiSelect = false;
+      this.productsListView.Name = "productsListView";
+      this.productsListView.Size = new System.Drawing.Size(309, 337);
+      this.productsListView.SmallImageList = this.productImageList;
+      this.productsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.productsListView.TabIndex = 4;
+      this.productsListView.UseCompatibleStateImageBehavior = false;
+      this.productsListView.View = System.Windows.Forms.View.Details;
+      this.productsListView.SelectedIndexChanged += new System.EventHandler(this.productsListBox_SelectedIndexChanged);
+      // 
+      // productNameHeader
+      // 
+      this.productNameHeader.Text = "Name";
+      this.productNameHeader.Width = 40;
+      // 
+      // productVersionHeader
+      // 
+      this.productVersionHeader.Text = "Version";
+      this.productVersionHeader.Width = 265;
+      // 
+      // productImageList
+      // 
+      this.productImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.productImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.productImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.detailsGroupBox.Controls.Add(this.pluginsGroupBox);
+      this.detailsGroupBox.Controls.Add(this.versionTextBox);
+      this.detailsGroupBox.Controls.Add(this.nameLabel);
+      this.detailsGroupBox.Controls.Add(this.nameTextBox);
+      this.detailsGroupBox.Controls.Add(this.versionLabel);
+      this.detailsGroupBox.Enabled = false;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(340, 426);
+      this.detailsGroupBox.TabIndex = 8;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // pluginsGroupBox
+      // 
+      this.pluginsGroupBox.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.pluginsGroupBox.Controls.Add(this.pluginListView);
+      this.pluginsGroupBox.Location = new System.Drawing.Point(6, 71);
+      this.pluginsGroupBox.Name = "pluginsGroupBox";
+      this.pluginsGroupBox.Size = new System.Drawing.Size(328, 349);
+      this.pluginsGroupBox.TabIndex = 6;
+      this.pluginsGroupBox.TabStop = false;
+      this.pluginsGroupBox.Text = "Plugins";
+      // 
+      // pluginListView
+      // 
+      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginListView.CheckBoxes = true;
+      this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameHeader,
+            this.pluginVersionHeader,
+            this.pluginDescriptionHeader});
+      this.pluginListView.Location = new System.Drawing.Point(3, 16);
+      this.pluginListView.Name = "pluginListView";
+      this.pluginListView.Size = new System.Drawing.Size(322, 330);
+      this.pluginListView.SmallImageList = this.pluginImageList;
+      this.pluginListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginListView.SuppressItemCheckedEvents = false;
+      this.pluginListView.TabIndex = 7;
+      this.pluginListView.UseCompatibleStateImageBehavior = false;
+      this.pluginListView.View = System.Windows.Forms.View.Details;
+      this.pluginListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
+      // 
+      // pluginNameHeader
+      // 
+      this.pluginNameHeader.Text = "Name";
+      // 
+      // pluginVersionHeader
+      // 
+      this.pluginVersionHeader.Text = "Version";
+      // 
+      // pluginDescriptionHeader
+      // 
+      this.pluginDescriptionHeader.Text = "Description";
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // 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(57, 45);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.Size = new System.Drawing.Size(243, 20);
+      this.versionTextBox.TabIndex = 5;
+      this.versionTextBox.TextChanged += new System.EventHandler(this.versionTextBox_TextChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(13, 22);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 2;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(57, 19);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(243, 20);
+      this.nameTextBox.TabIndex = 3;
+      this.nameTextBox.TextChanged += new System.EventHandler(this.nameTextBox_TextChanged);
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.AutoSize = true;
+      this.versionLabel.Location = new System.Drawing.Point(6, 48);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(45, 13);
+      this.versionLabel.TabIndex = 4;
+      this.versionLabel.Text = "Version:";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // ProductEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ProductEditor";
+      this.Size = new System.Drawing.Size(665, 426);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.productsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.PerformLayout();
+      this.pluginsGroupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button uploadButton;
+    private System.Windows.Forms.Button newProductButton;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.TextBox versionTextBox;
+    private System.Windows.Forms.Label versionLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.ListView productsListView;
+    private System.Windows.Forms.ColumnHeader productNameHeader;
+    private System.Windows.Forms.ColumnHeader productVersionHeader;
+    private System.Windows.Forms.ImageList productImageList;
+    private System.Windows.Forms.ImageList pluginImageList;
+    private MultiSelectListView pluginListView;
+    private System.Windows.Forms.GroupBox productsGroupBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.GroupBox pluginsGroupBox;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button deleteProductButton;
+    private System.Windows.Forms.ColumnHeader pluginNameHeader;
+    private System.Windows.Forms.ColumnHeader pluginVersionHeader;
+    private System.Windows.Forms.ColumnHeader pluginDescriptionHeader;
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/EditProductsView.cs	(revision 9512)
@@ -0,0 +1,455 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.ServiceModel;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class EditProductsView : InstallationManagerControl {
+    private const string RefreshMessage = "Downloading product and plugin information...";
+    private const string UploadMessage = "Uploading product and plugin information...";
+    private const string DeleteProductMessage = "Deleting product...";
+
+    private BackgroundWorker refreshProductsWorker;
+    private BackgroundWorker uploadChangedProductsWorker;
+    private BackgroundWorker deleteProductWorker;
+
+    private List<DeploymentService.ProductDescription> products;
+    private List<DeploymentService.PluginDescription> plugins;
+    private HashSet<DeploymentService.ProductDescription> dirtyProducts;
+
+    public EditProductsView() {
+      InitializeComponent();
+
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Setup_Install);
+      productImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.ArrowUp);
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Plugin);
+
+      dirtyProducts = new HashSet<DeploymentService.ProductDescription>();
+      refreshProductsWorker = new BackgroundWorker();
+      refreshProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshProductsWorker_RunWorkerCompleted);
+      refreshProductsWorker.DoWork += new DoWorkEventHandler(refreshProductsWorker_DoWork);
+
+      uploadChangedProductsWorker = new BackgroundWorker();
+      uploadChangedProductsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(uploadChangedProductsWorker_RunWorkerCompleted);
+      uploadChangedProductsWorker.DoWork += new DoWorkEventHandler(uploadChangedProductsWorker_DoWork);
+
+      deleteProductWorker = new BackgroundWorker();
+      deleteProductWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(deleteProductWorker_RunWorkerCompleted);
+      deleteProductWorker.DoWork += new DoWorkEventHandler(deleteProductWorker_DoWork);
+    }
+
+    #region event handlers for delete product background worker
+    void deleteProductWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
+      var adminClient = DeploymentService.AdminServiceClientFactory.CreateClient();
+      // upload
+      try {
+        foreach (var product in products) {
+          adminClient.DeleteProduct(product);
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh      
+      var updateClient = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    void deleteProductWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+        "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+
+        EnableControls();
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(DeleteProductMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    #region event handlers for upload products background worker
+    private void uploadChangedProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var products = (IEnumerable<DeploymentService.ProductDescription>)e.Argument;
+      var adminClient = DeploymentService.AdminServiceClientFactory.CreateClient();
+      // upload
+      try {
+        foreach (var product in products) {
+          adminClient.DeployProduct(product);
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh      
+      var updateClient = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    private void uploadChangedProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+        "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+  (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      EnableControls();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(UploadMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    #region event handlers for refresh products background worker
+    private void refreshProductsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      var updateClient = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        e.Result = new object[] { updateClient.GetProducts(), updateClient.GetPlugins() };
+        updateClient.Close();
+      }
+      catch (TimeoutException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        updateClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        updateClient.Abort();
+        throw;
+      }
+    }
+
+    private void refreshProductsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+        this.products.Clear();
+        this.plugins.Clear();
+
+      } else {
+        this.products = new List<DeploymentService.ProductDescription>(
+          (DeploymentService.ProductDescription[])((object[])e.Result)[0]);
+        this.plugins = new List<DeploymentService.PluginDescription>(
+          (DeploymentService.PluginDescription[])((object[])e.Result)[1]);
+      }
+      UpdateProductsList();
+      dirtyProducts.Clear();
+      EnableControls();
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(RefreshMessage);
+      StatusView.UnlockUI();
+    }
+    #endregion
+
+    private void UpdateProductsList() {
+      productsListView.SelectedItems.Clear();
+      productsListView.Items.Clear();
+      foreach (var prodDesc in products) {
+        productsListView.Items.Add(CreateListViewItem(prodDesc));
+      }
+      Util.ResizeColumns(productsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void productsListBox_SelectedIndexChanged(object sender, EventArgs e) {
+      bool productSelected = productsListView.SelectedItems.Count > 0;
+      detailsGroupBox.Enabled = productSelected;
+      UpdateProductButtons();
+      if (productSelected) {
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)((ListViewItem)productsListView.SelectedItems[0]).Tag;
+        nameTextBox.Text = activeProduct.Name;
+        versionTextBox.Text = activeProduct.Version.ToString();
+
+        // populate plugins list view
+        pluginListView.SuppressItemCheckedEvents = true;
+        foreach (var plugin in plugins.OfType<IPluginDescription>()) {
+          pluginListView.Items.Add(CreateListViewItem(plugin));
+        }
+        pluginListView.SuppressItemCheckedEvents = false;
+        foreach (var plugin in activeProduct.Plugins) {
+          pluginListView.CheckItems(FindItemsForPlugin(plugin));
+        }
+      } else {
+        nameTextBox.Text = string.Empty;
+        versionTextBox.Text = string.Empty;
+        pluginListView.Items.Clear();
+      }
+      Util.ResizeColumns(pluginListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void UpdateProductButtons() {
+      uploadButton.Enabled = dirtyProducts.Count > 0;
+      if (productsListView.SelectedItems.Count > 0) {
+        var selectedProduct = (DeploymentService.ProductDescription)productsListView.SelectedItems[0].Tag;
+        deleteProductButton.Enabled = !dirtyProducts.Contains(selectedProduct);
+      } else {
+        deleteProductButton.Enabled = false;
+      }
+    }
+
+
+    #region button event handlers
+    private void newProductButton_Click(object sender, EventArgs e) {
+      var newProduct = new DeploymentService.ProductDescription("New product", new Version("0.0.0.0"));
+      products.Add(newProduct);
+      UpdateProductsList();
+      MarkProductDirty(newProduct);
+    }
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(UploadMessage);
+      uploadChangedProductsWorker.RunWorkerAsync(dirtyProducts);
+    }
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(RefreshMessage);
+      refreshProductsWorker.RunWorkerAsync();
+    }
+    private void deleteProductButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(DeleteProductMessage);
+      var selectedProducts = from item in productsListView.SelectedItems.OfType<ListViewItem>()
+                             select (DeploymentService.ProductDescription)item.Tag;
+      deleteProductWorker.RunWorkerAsync(selectedProducts.ToList());
+    }
+
+    #endregion
+
+    #region textbox changed event handlers
+    private void nameTextBox_TextChanged(object sender, EventArgs e) {
+      if (productsListView.SelectedItems.Count > 0) {
+        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+        if (string.IsNullOrEmpty(nameTextBox.Name)) {
+          errorProvider.SetError(nameTextBox, "Invalid value");
+        } else {
+          if (activeProduct.Name != nameTextBox.Text) {
+            activeProduct.Name = nameTextBox.Text;
+            activeItem.SubItems[0].Text = activeProduct.Name;
+            errorProvider.SetError(nameTextBox, string.Empty);
+            MarkProductDirty(activeProduct);
+          }
+        }
+      }
+    }
+
+
+    private void versionTextBox_TextChanged(object sender, EventArgs e) {
+      if (productsListView.SelectedItems.Count > 0) {
+        ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+        DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+        try {
+          var newVersion = new Version(versionTextBox.Text);
+          if (activeProduct.Version != newVersion) {
+            activeProduct.Version = newVersion;
+            activeItem.SubItems[1].Text = versionTextBox.Text;
+            errorProvider.SetError(versionTextBox, string.Empty);
+            MarkProductDirty(activeProduct);
+          }
+        }
+        catch (OverflowException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+
+        catch (ArgumentException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+        catch (FormatException) {
+          errorProvider.SetError(versionTextBox, "Invalid value");
+        }
+      }
+    }
+    #endregion
+
+
+    #region plugin list view
+    private void OnItemChecked(ItemCheckedEventArgs e) {
+      ListViewItem activeItem = (ListViewItem)productsListView.SelectedItems[0];
+      DeploymentService.ProductDescription activeProduct = (DeploymentService.ProductDescription)activeItem.Tag;
+      activeProduct.Plugins = (from item in pluginListView.CheckedItems.OfType<ListViewItem>()
+                               select (DeploymentService.PluginDescription)item.Tag).ToArray();
+      MarkProductDirty(activeProduct);
+    }
+
+    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
+      if (e.Item.Checked) {
+        foreach (ListViewItem item in pluginListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also check all dependencies
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependencies(plugin)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        pluginListView.CheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
+        OnItemChecked(e);
+      } else {
+        foreach (ListViewItem item in pluginListView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also uncheck all dependent plugins
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependents(plugin, plugins.Cast<IPluginDescription>())) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+
+        }
+        pluginListView.UncheckItems(modifiedPlugins.Select(x => FindItemsForPlugin(x).Single()));
+        OnItemChecked(e);
+      }
+    }
+
+
+    #endregion
+
+    #region helper
+    private void MarkProductDirty(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
+      if (!dirtyProducts.Contains(activeProduct)) {
+        dirtyProducts.Add(activeProduct);
+        var item = FindItemForProduct(activeProduct);
+        item.ImageIndex = 1;
+        UpdateProductButtons();
+      }
+    }
+    private ListViewItem CreateListViewItem(DeploymentService.ProductDescription productDescription) {
+      ListViewItem item = new ListViewItem(new string[] { productDescription.Name, productDescription.Version.ToString() });
+      item.Tag = productDescription;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          string.Empty, plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      item.Checked = false;
+      return item;
+    }
+
+    private ListViewItem FindItemForProduct(HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.ProductDescription activeProduct) {
+      return (from item in productsListView.Items.OfType<ListViewItem>()
+              let product = item.Tag as DeploymentService.ProductDescription
+              where product != null
+              where product == activeProduct
+              select item).Single();
+    }
+    private IEnumerable<ListViewItem> FindItemsForPlugin(IPluginDescription plugin) {
+      return from item in pluginListView.Items.OfType<ListViewItem>()
+             let p = item.Tag as IPluginDescription
+             where p.Name == plugin.Name
+             where p.Version == plugin.Version
+             select item;
+    }
+
+    private void EnableControls() {
+      newProductButton.Enabled = true;
+      productsListView.Enabled = true;
+    }
+    #endregion
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/IStatusDisplay.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/IStatusDisplay.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/IStatusDisplay.cs	(revision 9512)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal interface IStatusView {
+    void ShowProgressIndicator(double percentProgress);
+    void ShowProgressIndicator();
+    void HideProgressIndicator();
+    void ShowMessage(string message);
+    void RemoveMessage(string message);
+    void LockUI();
+    void UnlockUI();
+    void ShowError(string shortMessage, string description);
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManager.cs	(revision 9512)
@@ -0,0 +1,240 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.PluginInfrastructure.Manager;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal class InstallationManager {
+
+    internal event EventHandler<PluginInfrastructureCancelEventArgs> PreUpdatePlugin;
+    internal event EventHandler<PluginInfrastructureCancelEventArgs> PreRemovePlugin;
+    internal event EventHandler<PluginInfrastructureCancelEventArgs> PreInstallPlugin;
+
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginUpdated;
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginRemoved;
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginInstalled;
+
+    private string pluginDir;
+    public InstallationManager(string pluginDir) {
+      this.pluginDir = pluginDir;
+    }
+
+    /// <summary>
+    /// Retrieves a list of plugins available at the remote server
+    /// </summary>
+    /// <returns></returns>
+    public IEnumerable<IPluginDescription> GetRemotePluginList() {
+      var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        List<IPluginDescription> plugins = new List<IPluginDescription>(client.GetPlugins());
+        client.Close();
+        return plugins;
+      }
+      catch (TimeoutException e) {
+        client.Abort();
+        throw new InstallationManagerException("Time out while connecting to server.", e);
+      }
+      catch (FaultException e) {
+        client.Abort();
+        throw new InstallationManagerException("Fault in connection to server.", e);
+      }
+      catch (CommunicationException e) {
+        client.Abort();
+        throw new InstallationManagerException("General communication exception in connection to server.", e);
+      }
+    }
+
+    /// <summary>
+    /// Retrieves the list of products available at the remote server
+    /// </summary>
+    /// <returns></returns>
+    public IEnumerable<DeploymentService.ProductDescription> GetRemoteProductList() {
+      var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        List<DeploymentService.ProductDescription> products = new List<DeploymentService.ProductDescription>(client.GetProducts());
+        client.Close();
+        return products;
+      }
+      catch (TimeoutException e) {
+        client.Abort();
+        throw new InstallationManagerException("Time out while connecting to server.", e);
+      }
+      catch (FaultException e) {
+        client.Abort();
+        throw new InstallationManagerException("Fault in connection to server.", e);
+      }
+      catch (CommunicationException e) {
+        client.Abort();
+        throw new InstallationManagerException("General communication exception in connection to server.", e);
+      }
+    }
+
+    /// <summary>
+    ///  Installs plugins from remote server
+    /// </summary>
+    /// <param name="plugins"></param>
+    public void Install(IEnumerable<IPluginDescription> plugins, out bool cancelled) {
+      var args = new PluginInfrastructureCancelEventArgs(plugins);
+      OnPreInstall(args);
+      if (!args.Cancel) {
+        cancelled = false;
+        var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+        try {
+          foreach (DeploymentService.PluginDescription plugin in plugins) {
+            byte[] zippedPackage = client.GetPlugin(plugin);
+            Unpack(zippedPackage);
+            OnInstalled(new PluginInfrastructureEventArgs(plugin));
+          }
+          client.Close();
+        }
+        catch (TimeoutException e) {
+          client.Abort();
+          throw new InstallationManagerException("Time out while connecting to server.", e);
+        }
+        catch (FaultException e) {
+          client.Abort();
+          throw new InstallationManagerException("Fault in connection to server.", e);
+        }
+        catch (CommunicationException e) {
+          client.Abort();
+          throw new InstallationManagerException("General communication exception in connection to server.", e);
+        }
+      } else {
+        cancelled = true;
+      }
+    }
+
+    /// <summary>
+    /// Updates plugins from remote server
+    /// </summary>
+    /// <param name="plugins"></param>
+    public void Update(IEnumerable<IPluginDescription> plugins, out bool cancelled) {
+      PluginInfrastructureCancelEventArgs args = new PluginInfrastructureCancelEventArgs(plugins);
+      OnPreUpdate(args);
+      if (!args.Cancel) {
+        cancelled = false;
+        var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+        try {
+          foreach (DeploymentService.PluginDescription plugin in plugins) {
+            byte[] zippedPackage = client.GetPlugin(plugin);
+            Unpack(zippedPackage);
+            OnUpdated(new PluginInfrastructureEventArgs(plugin));
+          }
+          client.Close();
+        }
+        catch (TimeoutException e) {
+          client.Abort();
+          throw new InstallationManagerException("Time out while connecting to server.", e);
+        }
+        catch (FaultException e) {
+          client.Abort();
+          throw new InstallationManagerException("Fault in connection to server.", e);
+        }
+        catch (CommunicationException e) {
+          client.Abort();
+          throw new InstallationManagerException("General communication exception in connection to server.", e);
+        }
+      } else {
+        cancelled = true;
+      }
+    }
+
+    /// <summary>
+    /// Deletes all plugin files from local installation
+    /// </summary>
+    /// <param name="plugins"></param>
+    public void Remove(IEnumerable<IPluginDescription> plugins) {
+      var fileNames = from pluginToDelete in plugins
+                      from file in pluginToDelete.Files
+                      select Path.Combine(pluginDir, file.Name);
+      var args = new PluginInfrastructureCancelEventArgs(plugins);
+      OnPreDelete(args);
+      if (!args.Cancel) {
+        foreach (string fileName in fileNames) {
+          File.Delete(fileName);
+          OnDeleted(new PluginInfrastructureEventArgs(fileName));
+        }
+      }
+    }
+
+    private void Unpack(byte[] zippedPackage) {
+      using (ZipInputStream s = new ZipInputStream(new MemoryStream(zippedPackage))) {
+        ZipEntry theEntry;
+        while ((theEntry = s.GetNextEntry()) != null) {
+          string directoryName = pluginDir;
+          string fileName = Path.GetFileName(theEntry.Name);
+          // create directory 
+          if (!string.IsNullOrEmpty(directoryName)) {
+            Directory.CreateDirectory(directoryName);
+          }
+          if (!string.IsNullOrEmpty(fileName)) {
+            string fullPath = Path.Combine(directoryName, fileName);
+            string fullDirPath = Path.GetDirectoryName(fullPath);
+            if (!Directory.Exists(fullDirPath)) Directory.CreateDirectory(fullDirPath);
+            using (FileStream streamWriter = File.Create(fullPath)) {
+              int size = 2048;
+              byte[] data = new byte[2048];
+              while (true) {
+                size = s.Read(data, 0, data.Length);
+                if (size > 0) {
+                  streamWriter.Write(data, 0, size);
+                } else {
+                  break;
+                }
+              }
+              streamWriter.Close();
+            }
+          }
+        }
+      }
+    }
+
+    private void OnPreUpdate(PluginInfrastructureCancelEventArgs args) {
+      if (PreUpdatePlugin != null) PreUpdatePlugin(this, args);
+    }
+
+    private void OnUpdated(PluginInfrastructureEventArgs args) {
+      if (PluginUpdated != null) PluginUpdated(this, args);
+    }
+
+    private void OnPreDelete(PluginInfrastructureCancelEventArgs args) {
+      if (PreRemovePlugin != null) PreRemovePlugin(this, args);
+    }
+
+    private void OnDeleted(PluginInfrastructureEventArgs args) {
+      if (PluginRemoved != null) PluginRemoved(this, args);
+    }
+
+    private void OnPreInstall(PluginInfrastructureCancelEventArgs args) {
+      if (PreInstallPlugin != null) PreInstallPlugin(this, args);
+    }
+
+    private void OnInstalled(PluginInfrastructureEventArgs args) {
+      if (PluginInstalled != null) PluginInstalled(this, args);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.Designer.cs	(revision 9512)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class 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.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerControl.cs	(revision 9512)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class InstallationManagerControl : UserControl {
+    private IStatusView statusView;
+    public IStatusView StatusView {
+      get { return statusView; }
+      set { statusView = value; }
+    }
+
+    public InstallationManagerControl()
+      : base() {
+      InitializeComponent();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerException.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerException.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerException.cs	(revision 9512)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  [Serializable]
+  public class InstallationManagerException : Exception {
+    public InstallationManagerException() : base() { }
+    public InstallationManagerException(string msg) : base(msg) { }
+    public InstallationManagerException(string msg, Exception e) : base(msg, e) { }
+    protected InstallationManagerException(SerializationInfo info, StreamingContext context) : base(info, context) { }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.Designer.cs	(revision 9512)
@@ -0,0 +1,311 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class InstallationManagerForm {
+    /// <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.components = new System.ComponentModel.Container();
+      this.statusStrip = new System.Windows.Forms.StatusStrip();
+      this.toolStripProgressBar = new System.Windows.Forms.ToolStripProgressBar();
+      this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.localPluginsTabPage = new System.Windows.Forms.TabPage();
+      this.localPluginsView = new HeuristicLab.PluginInfrastructure.Advanced.InstalledPluginsView();
+      this.availablePluginsTabPage = new System.Windows.Forms.TabPage();
+      this.remotePluginInstaller = new HeuristicLab.PluginInfrastructure.Advanced.AvailablePluginsView();
+      this.uploadPluginsTabPage = new System.Windows.Forms.TabPage();
+      this.pluginEditor = new HeuristicLab.PluginInfrastructure.Advanced.UploadPluginsView();
+      this.manageProductsTabPage = new System.Windows.Forms.TabPage();
+      this.productEditor = new HeuristicLab.PluginInfrastructure.Advanced.EditProductsView();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.logTextBox = new System.Windows.Forms.TextBox();
+      this.menuStrip = new System.Windows.Forms.MenuStrip();
+      this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.connectionSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.statusStrip.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.localPluginsTabPage.SuspendLayout();
+      this.availablePluginsTabPage.SuspendLayout();
+      this.uploadPluginsTabPage.SuspendLayout();
+      this.manageProductsTabPage.SuspendLayout();
+      this.logTabPage.SuspendLayout();
+      this.menuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // statusStrip
+      // 
+      this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripProgressBar,
+            this.toolStripStatusLabel});
+      this.statusStrip.Location = new System.Drawing.Point(0, 422);
+      this.statusStrip.Name = "statusStrip";
+      this.statusStrip.Size = new System.Drawing.Size(622, 22);
+      this.statusStrip.TabIndex = 0;
+      // 
+      // toolStripProgressBar
+      // 
+      this.toolStripProgressBar.MarqueeAnimationSpeed = 30;
+      this.toolStripProgressBar.Name = "toolStripProgressBar";
+      this.toolStripProgressBar.Size = new System.Drawing.Size(100, 16);
+      this.toolStripProgressBar.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
+      this.toolStripProgressBar.Visible = false;
+      // 
+      // toolStripStatusLabel
+      // 
+      this.toolStripStatusLabel.Name = "toolStripStatusLabel";
+      this.toolStripStatusLabel.Size = new System.Drawing.Size(0, 17);
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.localPluginsTabPage);
+      this.tabControl.Controls.Add(this.availablePluginsTabPage);
+      this.tabControl.Controls.Add(this.uploadPluginsTabPage);
+      this.tabControl.Controls.Add(this.manageProductsTabPage);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(12, 27);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(598, 392);
+      this.tabControl.TabIndex = 16;
+      this.tabControl.SelectedIndexChanged += new System.EventHandler(this.tabControl_SelectedIndexChanged);
+      // 
+      // localPluginsTabPage
+      // 
+      this.localPluginsTabPage.Controls.Add(this.localPluginsView);
+      this.localPluginsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.localPluginsTabPage.Name = "localPluginsTabPage";
+      this.localPluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.localPluginsTabPage.Size = new System.Drawing.Size(590, 366);
+      this.localPluginsTabPage.TabIndex = 0;
+      this.localPluginsTabPage.Text = "Installed Plugins";
+      this.toolTip.SetToolTip(this.localPluginsTabPage, "Delete or update installed plugins");
+      this.localPluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // localPluginsView
+      // 
+      this.localPluginsView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginsView.InstallationManager = null;
+      this.localPluginsView.Location = new System.Drawing.Point(6, 6);
+      this.localPluginsView.Name = "localPluginsView";
+      this.localPluginsView.PluginManager = null;
+      this.localPluginsView.Size = new System.Drawing.Size(578, 354);
+      this.localPluginsView.StatusView = null;
+      this.localPluginsView.TabIndex = 0;
+      // 
+      // availablePluginsTabPage
+      // 
+      this.availablePluginsTabPage.Controls.Add(this.remotePluginInstaller);
+      this.availablePluginsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.availablePluginsTabPage.Name = "availablePluginsTabPage";
+      this.availablePluginsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.availablePluginsTabPage.Size = new System.Drawing.Size(590, 366);
+      this.availablePluginsTabPage.TabIndex = 1;
+      this.availablePluginsTabPage.Text = "Available Plugins";
+      this.toolTip.SetToolTip(this.availablePluginsTabPage, "Download and install new plugins");
+      this.availablePluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // remotePluginInstaller
+      // 
+      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.InstallationManager = null;
+      this.remotePluginInstaller.Location = new System.Drawing.Point(6, 6);
+      this.remotePluginInstaller.Name = "remotePluginInstaller";
+      this.remotePluginInstaller.PluginManager = null;
+      this.remotePluginInstaller.Size = new System.Drawing.Size(578, 354);
+      this.remotePluginInstaller.StatusView = null;
+      this.remotePluginInstaller.TabIndex = 14;
+      // 
+      // 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(590, 366);
+      this.uploadPluginsTabPage.TabIndex = 3;
+      this.uploadPluginsTabPage.Text = "Upload Plugins";
+      this.toolTip.SetToolTip(this.uploadPluginsTabPage, "Upload plugins");
+      this.uploadPluginsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // pluginEditor
+      // 
+      this.pluginEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginEditor.Location = new System.Drawing.Point(6, 6);
+      this.pluginEditor.Name = "pluginEditor";
+      this.pluginEditor.PluginManager = null;
+      this.pluginEditor.Size = new System.Drawing.Size(578, 354);
+      this.pluginEditor.StatusView = null;
+      this.pluginEditor.TabIndex = 0;
+      // 
+      // 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(590, 366);
+      this.manageProductsTabPage.TabIndex = 4;
+      this.manageProductsTabPage.Text = "Manage Products";
+      this.toolTip.SetToolTip(this.manageProductsTabPage, "Create and manage products");
+      this.manageProductsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // productEditor
+      // 
+      this.productEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.productEditor.Location = new System.Drawing.Point(6, 6);
+      this.productEditor.Name = "productEditor";
+      this.productEditor.Size = new System.Drawing.Size(578, 354);
+      this.productEditor.StatusView = null;
+      this.productEditor.TabIndex = 0;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Controls.Add(this.logTextBox);
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Size = new System.Drawing.Size(590, 366);
+      this.logTabPage.TabIndex = 2;
+      this.logTabPage.Text = "Log";
+      this.toolTip.SetToolTip(this.logTabPage, "Show Log Messages");
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logTextBox
+      // 
+      this.logTextBox.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.logTextBox.Location = new System.Drawing.Point(3, 3);
+      this.logTextBox.Multiline = true;
+      this.logTextBox.Name = "logTextBox";
+      this.logTextBox.ReadOnly = true;
+      this.logTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.logTextBox.Size = new System.Drawing.Size(584, 360);
+      this.logTextBox.TabIndex = 0;
+      // 
+      // menuStrip
+      // 
+      this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.optionsToolStripMenuItem});
+      this.menuStrip.Location = new System.Drawing.Point(0, 0);
+      this.menuStrip.Name = "menuStrip";
+      this.menuStrip.Size = new System.Drawing.Size(622, 24);
+      this.menuStrip.TabIndex = 17;
+      this.menuStrip.Text = "menuStrip1";
+      // 
+      // optionsToolStripMenuItem
+      // 
+      this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.connectionSettingsToolStripMenuItem});
+      this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
+      this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
+      this.optionsToolStripMenuItem.Text = "Options";
+      // 
+      // connectionSettingsToolStripMenuItem
+      // 
+      this.connectionSettingsToolStripMenuItem.Image = global::HeuristicLab.PluginInfrastructure.Resources.NetworkConnections;
+      this.connectionSettingsToolStripMenuItem.Name = "connectionSettingsToolStripMenuItem";
+      this.connectionSettingsToolStripMenuItem.Size = new System.Drawing.Size(190, 22);
+      this.connectionSettingsToolStripMenuItem.Text = "Connection Settings...";
+      this.connectionSettingsToolStripMenuItem.Click += new System.EventHandler(this.connectionSettingsToolStripMenuItem_Click);
+      // 
+      // InstallationManagerForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(622, 444);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.statusStrip);
+      this.Controls.Add(this.menuStrip);
+      this.Icon = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MainMenuStrip = this.menuStrip;
+      this.Name = "InstallationManagerForm";
+      this.Text = "Plugin Manager";
+      this.statusStrip.ResumeLayout(false);
+      this.statusStrip.PerformLayout();
+      this.tabControl.ResumeLayout(false);
+      this.localPluginsTabPage.ResumeLayout(false);
+      this.availablePluginsTabPage.ResumeLayout(false);
+      this.uploadPluginsTabPage.ResumeLayout(false);
+      this.manageProductsTabPage.ResumeLayout(false);
+      this.logTabPage.ResumeLayout(false);
+      this.logTabPage.PerformLayout();
+      this.menuStrip.ResumeLayout(false);
+      this.menuStrip.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.StatusStrip statusStrip;
+    private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar;
+    private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
+    private AvailablePluginsView remotePluginInstaller;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage localPluginsTabPage;
+    private System.Windows.Forms.TabPage availablePluginsTabPage;
+    private System.Windows.Forms.TabPage logTabPage;
+    private System.Windows.Forms.TextBox logTextBox;
+    private System.Windows.Forms.MenuStrip menuStrip;
+    private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem connectionSettingsToolStripMenuItem;
+    private System.Windows.Forms.TabPage uploadPluginsTabPage;
+    private System.Windows.Forms.TabPage manageProductsTabPage;
+    private UploadPluginsView pluginEditor;
+    private EditProductsView productEditor;
+    private InstalledPluginsView localPluginsView;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs	(revision 9512)
@@ -0,0 +1,254 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class InstallationManagerForm : Form, IStatusView {
+    private InstallationManager installationManager;
+    private string pluginDir;
+
+    public InstallationManagerForm(PluginManager pluginManager)
+      : base() {
+      InitializeComponent();
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      Text = "HeuristicLab Plugin Manager " + pluginInfrastructureVersion.FileVersion;
+
+      pluginManager.PluginLoaded += pluginManager_PluginLoaded;
+      pluginManager.PluginUnloaded += pluginManager_PluginUnloaded;
+      pluginManager.Initializing += pluginManager_Initializing;
+      pluginManager.Initialized += pluginManager_Initialized;
+
+      pluginDir = Application.StartupPath;
+
+      installationManager = new InstallationManager(pluginDir);
+      installationManager.PluginInstalled += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginInstalled);
+      installationManager.PluginRemoved += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginRemoved);
+      installationManager.PluginUpdated += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginUpdated);
+      installationManager.PreInstallPlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreInstallPlugin);
+      installationManager.PreRemovePlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreRemovePlugin);
+      installationManager.PreUpdatePlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreUpdatePlugin);
+
+      // show or hide controls for uploading plugins based on setting
+      if (!HeuristicLab.PluginInfrastructure.Properties.Settings.Default.ShowPluginUploadControls) {
+        tabControl.Controls.Remove(uploadPluginsTabPage);
+        tabControl.Controls.Remove(manageProductsTabPage);
+      } else {
+        pluginEditor.PluginManager = pluginManager;
+      }
+
+      localPluginsView.StatusView = this;
+      localPluginsView.PluginManager = pluginManager;
+      localPluginsView.InstallationManager = installationManager;
+
+      remotePluginInstaller.StatusView = this;
+      remotePluginInstaller.InstallationManager = installationManager;
+      remotePluginInstaller.PluginManager = pluginManager;
+
+      pluginEditor.StatusView = this;
+      pluginEditor.PluginManager = pluginManager;
+
+      productEditor.StatusView = this;
+    }
+
+
+    #region plugin manager event handlers
+    private void pluginManager_Initialized(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Initialized PluginInfrastructure");
+    }
+
+    private void pluginManager_Initializing(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Initializing PluginInfrastructure");
+    }
+
+    private void pluginManager_PluginUnloaded(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Unloaded " + e.Entity);
+    }
+
+    private void pluginManager_PluginLoaded(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Loaded " + e.Entity);
+    }
+    #endregion
+
+    #region installation manager event handlers
+    private void installationManager_PreUpdatePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = (bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)ConfirmUpdateAction, e.Plugins) == false;
+      }
+    }
+
+    private void installationManager_PreRemovePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = (bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)ConfirmRemoveAction, e.Plugins) == false;
+      }
+    }
+
+    private void installationManager_PreInstallPlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0)
+        if ((bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)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");
+        }
+    }
+
+    private void installationManager_PluginUpdated(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Updated " + e.Entity);
+    }
+
+    private void installationManager_PluginRemoved(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Removed " + e.Entity);
+    }
+
+    private void installationManager_PluginInstalled(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Installed " + e.Entity);
+    }
+    #endregion
+
+    #region button events
+    private void connectionSettingsToolStripMenuItem_Click(object sender, EventArgs e) {
+      using (var conSetupView = new ConnectionSetupView()) {
+        conSetupView.ShowDialog(this);
+      }
+    }
+    private void tabControl_SelectedIndexChanged(object sender, EventArgs e) {
+      toolStripStatusLabel.Text = string.Empty;
+    }
+    #endregion
+
+    #region confirmation dialogs
+    private bool ConfirmRemoveAction(IEnumerable<IPluginDescription> plugins) {
+      StringBuilder strBuilder = new StringBuilder();
+      foreach (var plugin in plugins) {
+        foreach (var file in plugin.Files) {
+          strBuilder.AppendLine(Path.GetFileName(file.Name));
+        }
+      }
+      using (var confirmationDialog = new ConfirmationDialog("Confirm Delete", "Do you want to delete following files?", strBuilder.ToString())) {
+        return (confirmationDialog.ShowDialog(this)) == DialogResult.OK;
+      }
+    }
+
+    private bool ConfirmUpdateAction(IEnumerable<IPluginDescription> plugins) {
+      StringBuilder strBuilder = new StringBuilder();
+      foreach (var plugin in plugins) {
+        strBuilder.AppendLine(plugin.ToString());
+      }
+      using (var confirmationDialog = new ConfirmationDialog("Confirm Update", "Do you want to update following plugins?", strBuilder.ToString())) {
+        return (confirmationDialog.ShowDialog(this)) == DialogResult.OK;
+      }
+    }
+
+    private bool ConfirmInstallAction(IEnumerable<IPluginDescription> plugins) {
+      foreach (var plugin in plugins) {
+        if (!string.IsNullOrEmpty(plugin.LicenseText)) {
+          using (var licenseConfirmationBox = new LicenseConfirmationDialog(plugin)) {
+            if (licenseConfirmationBox.ShowDialog(this) != DialogResult.OK)
+              return false;
+          }
+        }
+      }
+      return true;
+    }
+
+
+    #endregion
+
+    #region helper methods
+    private void SetStatusStrip(string msg) {
+      if (InvokeRequired) Invoke((Action<string>)SetStatusStrip, msg);
+      else {
+        toolStripStatusLabel.Text = msg;
+        logTextBox.Text += DateTime.Now + ": " + msg + Environment.NewLine;
+      }
+    }
+
+    #endregion
+
+
+    protected override void OnClosing(CancelEventArgs e) {
+      installationManager.PluginInstalled -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginInstalled);
+      installationManager.PluginRemoved -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginRemoved);
+      installationManager.PluginUpdated -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginUpdated);
+      installationManager.PreInstallPlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreInstallPlugin);
+      installationManager.PreRemovePlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreRemovePlugin);
+      installationManager.PreUpdatePlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreUpdatePlugin);
+      base.OnClosing(e);
+    }
+
+    #region IStatusView Members
+
+    public void ShowProgressIndicator(double percentProgress) {
+      if (percentProgress < 0.0 || percentProgress > 1.0) throw new ArgumentException("percentProgress");
+      toolStripProgressBar.Visible = true;
+      toolStripProgressBar.Style = ProgressBarStyle.Continuous;
+      int range = toolStripProgressBar.Maximum - toolStripProgressBar.Minimum;
+      toolStripProgressBar.Value = (int)(percentProgress * range + toolStripProgressBar.Minimum);
+    }
+
+    public void ShowProgressIndicator() {
+      toolStripProgressBar.Visible = true;
+      toolStripProgressBar.Style = ProgressBarStyle.Marquee;
+    }
+
+    public void HideProgressIndicator() {
+      toolStripProgressBar.Visible = false;
+    }
+
+    public void ShowMessage(string message) {
+      if (string.IsNullOrEmpty(toolStripStatusLabel.Text))
+        toolStripStatusLabel.Text = message;
+      else
+        toolStripStatusLabel.Text += "; " + message;
+    }
+
+    public void RemoveMessage(string message) {
+      if (toolStripStatusLabel.Text.IndexOf("; " + message) > 0) {
+        toolStripStatusLabel.Text = toolStripStatusLabel.Text.Replace("; " + message, "");
+      }
+      toolStripStatusLabel.Text = toolStripStatusLabel.Text.Replace(message, "");
+      toolStripStatusLabel.Text = toolStripStatusLabel.Text.TrimStart(' ', ';');
+    }
+    public void LockUI() {
+      Cursor = Cursors.AppStarting;
+      tabControl.Enabled = false;
+    }
+    public void UnlockUI() {
+      tabControl.Enabled = true;
+      Cursor = Cursors.Default;
+    }
+    public void ShowError(string shortMessage, string description) {
+      logTextBox.Text += DateTime.Now + ": " + shortMessage + Environment.NewLine + description + Environment.NewLine;
+      MessageBox.Show(description, shortMessage);
+    }
+    #endregion
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.Designer.cs	(revision 9512)
@@ -0,0 +1,182 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class InstalledPluginsView {
+    /// <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();
+      System.Windows.Forms.ListViewGroup listViewGroup3 = new System.Windows.Forms.ListViewGroup("Active Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup4 = new System.Windows.Forms.ListViewGroup("Disabled Plugins", System.Windows.Forms.HorizontalAlignment.Left);
+      this.localPluginsListView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.nameHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.updateSelectedButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // localPluginsListView
+      // 
+      this.localPluginsListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.localPluginsListView.CheckBoxes = true;
+      this.localPluginsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameHeader,
+            this.versionHeader,
+            this.descriptionHeader});
+      listViewGroup3.Header = "Active Plugins";
+      listViewGroup3.Name = "activePluginsGroup";
+      listViewGroup4.Header = "Disabled Plugins";
+      listViewGroup4.Name = "disabledPluginsGroup";
+      this.localPluginsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup3,
+            listViewGroup4});
+      this.localPluginsListView.Location = new System.Drawing.Point(0, 0);
+      this.localPluginsListView.Name = "localPluginsListView";
+      this.localPluginsListView.Size = new System.Drawing.Size(539, 477);
+      this.localPluginsListView.SmallImageList = this.pluginImageList;
+      this.localPluginsListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.localPluginsListView.SuppressItemCheckedEvents = false;
+      this.localPluginsListView.TabIndex = 13;
+      this.localPluginsListView.UseCompatibleStateImageBehavior = false;
+      this.localPluginsListView.View = System.Windows.Forms.View.Details;
+      this.localPluginsListView.ItemActivate += new System.EventHandler(this.localPluginsListView_ItemActivate);
+      this.localPluginsListView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.pluginsListView_ItemChecked);
+      // 
+      // nameHeader
+      // 
+      this.nameHeader.Text = "Name";
+      this.nameHeader.Width = 199;
+      // 
+      // versionHeader
+      // 
+      this.versionHeader.Text = "Version";
+      this.versionHeader.Width = 84;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 245;
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Repeat;
+      this.refreshButton.Location = new System.Drawing.Point(0, 483);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(96, 25);
+      this.refreshButton.TabIndex = 14;
+      this.refreshButton.Text = "Refresh List";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh List of Installed Plugins");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Enabled = false;
+      this.removeButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Remove;
+      this.removeButton.Location = new System.Drawing.Point(222, 483);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(110, 25);
+      this.removeButton.TabIndex = 12;
+      this.removeButton.Text = "Delete Selected";
+      this.removeButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.removeButton, "Delete all selected plugins from disk");
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // updateSelectedButton
+      // 
+      this.updateSelectedButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.updateSelectedButton.Enabled = false;
+      this.updateSelectedButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Internet;
+      this.updateSelectedButton.Location = new System.Drawing.Point(102, 483);
+      this.updateSelectedButton.Name = "updateSelectedButton";
+      this.updateSelectedButton.Size = new System.Drawing.Size(114, 25);
+      this.updateSelectedButton.TabIndex = 6;
+      this.updateSelectedButton.Text = "Update Selected";
+      this.updateSelectedButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.updateSelectedButton, "Update all selected plugins");
+      this.updateSelectedButton.UseVisualStyleBackColor = true;
+      this.updateSelectedButton.Click += new System.EventHandler(this.updateSelectedButton_Click);
+      // 
+      // LocalPluginsView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.localPluginsListView);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.updateSelectedButton);
+      this.Name = "LocalPluginsView";
+      this.Size = new System.Drawing.Size(539, 508);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button updateSelectedButton;
+    private System.Windows.Forms.Button removeButton;
+    private MultiSelectListView localPluginsListView;
+    private System.Windows.Forms.ColumnHeader nameHeader;
+    private System.Windows.Forms.ColumnHeader versionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList pluginImageList;
+    private System.Windows.Forms.Button refreshButton;
+    // private LocalPluginManagerView localPluginManagerView;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstalledPluginsView.cs	(revision 9512)
@@ -0,0 +1,243 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class InstalledPluginsView : InstallationManagerControl {
+    private const string CheckingPluginsMessage = "Checking for updated plugins...";
+    private const string NoUpdatesAvailableMessage = "No updates available.";
+    private BackgroundWorker removePluginsBackgroundWorker;
+    private BackgroundWorker updatePluginsBackgroundWorker;
+
+    private ListViewGroup enabledPluginsGroup;
+    private ListViewGroup disabledPluginsGroup;
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set {
+        pluginManager = value;
+        UpdateControl();
+      }
+    }
+
+    private InstallationManager installationManager;
+    public InstallationManager InstallationManager {
+      get { return installationManager; }
+      set { installationManager = value; }
+    }
+
+    public InstalledPluginsView()
+      : base() {
+      InitializeComponent();
+      enabledPluginsGroup = localPluginsListView.Groups["activePluginsGroup"];
+      disabledPluginsGroup = localPluginsListView.Groups["disabledPluginsGroup"];
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Plugin);
+      removePluginsBackgroundWorker = new BackgroundWorker();
+      removePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(removePluginsBackgroundWorker_DoWork);
+      removePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(removePluginsBackgroundWorker_RunWorkerCompleted);
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+
+      UpdateControl();
+    }
+
+
+
+    #region event handlers for plugin removal background worker
+    void removePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("File Deletion Error", "There was problem while deleting files." + Environment.NewLine + e.Error.Message);
+      }
+      UpdateControl();
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void removePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> pluginsToRemove = (IEnumerable<IPluginDescription>)e.Argument;
+      if (pluginsToRemove.Count() > 0) {
+        installationManager.Remove(pluginsToRemove);
+        pluginManager.DiscoverAndCheckPlugins();
+      }
+    }
+    #endregion
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+           "Please check your connection settings and user credentials.");
+      }
+      StatusView.RemoveMessage(CheckingPluginsMessage);
+      StatusView.HideProgressIndicator();
+      UpdateControl();
+      StatusView.UnlockUI();
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      var remotePlugins = installationManager.GetRemotePluginList();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in remotePlugins
+                            let matchingLocalPlugins = from installedPlugin in selectedPlugins
+                                                       where installedPlugin.Name == remotePlugin.Name
+                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        bool cancelled;
+        installationManager.Update(pluginsToUpdate, out cancelled);
+        if (!cancelled) pluginManager.DiscoverAndCheckPlugins();
+      }
+    }
+
+    // compares for two plugins with same major and minor version if plugin1 is newer than plugin2
+    private static bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      return plugin1.Version.Build > plugin2.Version.Build ||
+        (plugin1.Version.Build == plugin2.Version.Build && plugin1.Version.Revision > plugin2.Version.Revision);
+    }
+    #endregion
+
+    private void UpdateControl() {
+      ClearPluginList();
+      if (pluginManager != null) {
+        localPluginsListView.SuppressItemCheckedEvents = true;
+        foreach (var plugin in pluginManager.Plugins) {
+          var item = CreateListViewItem(plugin);
+          if (plugin.PluginState == PluginState.Enabled) {
+            item.Group = enabledPluginsGroup;
+          } else if (plugin.PluginState == PluginState.Disabled) {
+            item.Group = disabledPluginsGroup;
+          }
+          localPluginsListView.Items.Add(item);
+        }
+        localPluginsListView.SuppressItemCheckedEvents = false;
+      }
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      Util.ResizeColumns(localPluginsListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private void ClearPluginList() {
+      List<ListViewItem> itemsToRemove = new List<ListViewItem>(localPluginsListView.Items.OfType<ListViewItem>());
+      itemsToRemove.ForEach(item => localPluginsListView.Items.Remove(item));
+    }
+
+    private static ListViewItem CreateListViewItem(PluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private void pluginsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      // checked items are marked for removal
+      if (e.Item.Checked) {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          modifiedItems.Add(item);
+          int oldItemsCount = 0;
+          while (oldItemsCount < modifiedItems.Count) {
+            oldItemsCount = modifiedItems.Count;
+            var oldModifiedItems = new List<ListViewItem>(modifiedItems);
+            foreach (var modifiedItem in oldModifiedItems) {
+              var plugin = (IPluginDescription)modifiedItem.Tag;
+              // also check all dependent plugins
+              foreach (ListViewItem dependentItem in localPluginsListView.Items) {
+                var dependent = (IPluginDescription)dependentItem.Tag;
+                if (!modifiedItems.Contains(dependentItem) &&
+                  !dependentItem.Checked && (from dep in dependent.Dependencies
+                                             where dep.Name == plugin.Name
+                                             where dep.Version == plugin.Version
+                                             select dep).Any()) {
+                  modifiedItems.Add(dependentItem);
+                }
+              }
+            }
+          }
+        }
+        localPluginsListView.CheckItems(modifiedItems);
+      } else {
+        List<ListViewItem> modifiedItems = new List<ListViewItem>();
+        foreach (ListViewItem item in localPluginsListView.SelectedItems) {
+          modifiedItems.Add(item);
+        }
+        localPluginsListView.UncheckItems(modifiedItems);
+      }
+      OnItemsCheckedChanged(EventArgs.Empty);
+    }
+
+    private void localPluginsListView_ItemActivate(object sender, EventArgs e) {
+      if (localPluginsListView.SelectedItems.Count > 0) {
+        var plugin = (PluginDescription)localPluginsListView.SelectedItems[0].Tag;
+        PluginView pluginView = new PluginView(plugin);
+        pluginView.Show(this);
+      }
+    }
+
+    private void OnItemsCheckedChanged(EventArgs eventArgs) {
+      removeButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+      updateSelectedButton.Enabled = localPluginsListView.CheckedItems.Count > 0;
+    }
+
+    private void updateSelectedButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.RemoveMessage(NoUpdatesAvailableMessage);
+      StatusView.ShowMessage(CheckingPluginsMessage);
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      updatePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+
+    private void removeButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      var checkedPlugins = localPluginsListView.CheckedItems.OfType<ListViewItem>()
+        .Select(item => item.Tag)
+        .OfType<IPluginDescription>()
+        .ToList();
+      removePluginsBackgroundWorker.RunWorkerAsync(checkedPlugins);
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      // refresh = update empty list of plugins (plugins are reloaded)
+      updatePluginsBackgroundWorker.RunWorkerAsync(new IPluginDescription[0]);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.Designer.cs	(revision 9512)
@@ -0,0 +1,205 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class LicenseConfirmationDialog {
+    /// <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.components = new System.ComponentModel.Container();
+      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.label1 = new System.Windows.Forms.Label();
+      this.radioButtonGroupBox = new System.Windows.Forms.GroupBox();
+      this.rejectRadioButton = new System.Windows.Forms.RadioButton();
+      this.acceptRadioButton = new System.Windows.Forms.RadioButton();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.radioButtonGroupBox.SuspendLayout();
+      this.panel1.SuspendLayout();
+      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.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.richTextBox.Location = new System.Drawing.Point(12, 48);
+      this.richTextBox.Name = "richTextBox";
+      this.richTextBox.ReadOnly = true;
+      this.richTextBox.Size = new System.Drawing.Size(494, 287);
+      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.Enabled = false;
+      this.acceptButton.Location = new System.Drawing.Point(347, 53);
+      this.acceptButton.Name = "acceptButton";
+      this.acceptButton.Size = new System.Drawing.Size(75, 23);
+      this.acceptButton.TabIndex = 1;
+      this.acceptButton.Text = "Next >";
+      this.toolTip.SetToolTip(this.acceptButton, "Accept license agreement and continue installation");
+      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.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.rejectButton.Location = new System.Drawing.Point(428, 53);
+      this.rejectButton.Name = "rejectButton";
+      this.rejectButton.Size = new System.Drawing.Size(79, 23);
+      this.rejectButton.TabIndex = 2;
+      this.rejectButton.Text = "Cancel";
+      this.toolTip.SetToolTip(this.rejectButton, "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(12, 32);
+      this.licenseLabel.Name = "licenseLabel";
+      this.licenseLabel.Size = new System.Drawing.Size(241, 13);
+      this.licenseLabel.TabIndex = 3;
+      this.licenseLabel.Text = "Please read following license agreement carefully.";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.label1.Location = new System.Drawing.Point(12, 9);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(115, 13);
+      this.label1.TabIndex = 4;
+      this.label1.Text = "License Agreement";
+      // 
+      // radioButtonGroupBox
+      // 
+      this.radioButtonGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.radioButtonGroupBox.Controls.Add(this.rejectRadioButton);
+      this.radioButtonGroupBox.Controls.Add(this.acceptRadioButton);
+      this.radioButtonGroupBox.Location = new System.Drawing.Point(13, 5);
+      this.radioButtonGroupBox.Name = "radioButtonGroupBox";
+      this.radioButtonGroupBox.Size = new System.Drawing.Size(281, 71);
+      this.radioButtonGroupBox.TabIndex = 5;
+      this.radioButtonGroupBox.TabStop = false;
+      // 
+      // rejectRadioButton
+      // 
+      this.rejectRadioButton.AutoSize = true;
+      this.rejectRadioButton.Location = new System.Drawing.Point(6, 42);
+      this.rejectRadioButton.Name = "rejectRadioButton";
+      this.rejectRadioButton.Size = new System.Drawing.Size(264, 17);
+      this.rejectRadioButton.TabIndex = 1;
+      this.rejectRadioButton.TabStop = true;
+      this.rejectRadioButton.Text = "I do not accept the terms in the license agreement.";
+      this.rejectRadioButton.UseVisualStyleBackColor = true;
+      this.rejectRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
+      // 
+      // acceptRadioButton
+      // 
+      this.acceptRadioButton.AutoSize = true;
+      this.acceptRadioButton.Location = new System.Drawing.Point(6, 19);
+      this.acceptRadioButton.Name = "acceptRadioButton";
+      this.acceptRadioButton.Size = new System.Drawing.Size(231, 17);
+      this.acceptRadioButton.TabIndex = 0;
+      this.acceptRadioButton.TabStop = true;
+      this.acceptRadioButton.Text = "I accept the terms in the license agreement.";
+      this.acceptRadioButton.UseVisualStyleBackColor = true;
+      this.acceptRadioButton.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.BackColor = System.Drawing.SystemColors.Control;
+      this.panel1.Controls.Add(this.acceptButton);
+      this.panel1.Controls.Add(this.radioButtonGroupBox);
+      this.panel1.Controls.Add(this.rejectButton);
+      this.panel1.Location = new System.Drawing.Point(-1, 341);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(520, 88);
+      this.panel1.TabIndex = 6;
+      // 
+      // LicenseConfirmationDialog
+      // 
+      this.AcceptButton = this.acceptButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.CancelButton = this.rejectButton;
+      this.ClientSize = new System.Drawing.Size(518, 429);
+      this.Controls.Add(this.panel1);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.licenseLabel);
+      this.Controls.Add(this.richTextBox);
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "LicenseConfirmationDialog";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.radioButtonGroupBox.ResumeLayout(false);
+      this.radioButtonGroupBox.PerformLayout();
+      this.panel1.ResumeLayout(false);
+      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;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.GroupBox radioButtonGroupBox;
+    private System.Windows.Forms.RadioButton rejectRadioButton;
+    private System.Windows.Forms.RadioButton acceptRadioButton;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseConfirmationDialog.cs	(revision 9512)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class LicenseConfirmationDialog : Form {
+    public LicenseConfirmationDialog()
+      : base() {
+      InitializeComponent();
+    }
+
+    public LicenseConfirmationDialog(IPluginDescription plugin)
+      : base() {
+      InitializeComponent();
+      richTextBox.Text = plugin.LicenseText;
+      this.Text = plugin.ToString();
+      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();
+    }
+
+    private void radioButton1_CheckedChanged(object sender, EventArgs e) {
+      acceptButton.Enabled = acceptRadioButton.Checked;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.Designer.cs	(revision 9512)
@@ -0,0 +1,81 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class 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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LicenseView));
+      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(410, 445);
+      this.richTextBox.TabIndex = 1;
+      this.richTextBox.Text = "";
+      // 
+      // LicenseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(410, 445);
+      this.Controls.Add(this.richTextBox);
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.Name = "LicenseView";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "License Agreement";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.RichTextBox richTextBox;
+
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/LicenseView.cs	(revision 9512)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class LicenseView : Form {
+
+    public LicenseView()
+      : base() {
+      InitializeComponent();
+      Name = "License";
+    }
+
+    public LicenseView(IPluginDescription plugin)
+      : base() {
+      InitializeComponent();
+      Name = "License of: " + plugin;
+      richTextBox.Text = plugin.LicenseText;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.Designer.cs	(revision 9512)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class MultiSelectListView {
+    /// <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();
+    }
+
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/MultiSelectListView.cs	(revision 9512)
@@ -0,0 +1,95 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class MultiSelectListView : ListView {
+    public MultiSelectListView() {
+      InitializeComponent();
+    }
+
+    private bool inhibitAutoCheck;
+    protected override void OnMouseDown(MouseEventArgs e) {
+      inhibitAutoCheck = true;
+      base.OnMouseDown(e);
+    }
+
+    protected override void OnMouseUp(MouseEventArgs e) {
+      base.OnMouseUp(e);
+      inhibitAutoCheck = false;
+    }
+
+    // item check is raised for each selected item that was not directly clicked (those should be ignored)
+    // and then one the item whose checkbox was clicked
+    protected override void OnItemCheck(ItemCheckEventArgs ice) {
+      if (ice == null) throw new ArgumentNullException("ice");
+      // don't change the checked state of items that were not clicked directly
+      if (inhibitAutoCheck) {
+        ice.NewValue = ice.CurrentValue;
+      }
+      // if this item was directly clicked then check if it is selected as well
+      var item = Items[ice.Index];
+      if (!item.Selected) {
+        // when the item was not selected previously 
+        // clear any selection 
+        List<ListViewItem> selectedItems = new List<ListViewItem>(SelectedItems.OfType<ListViewItem>());
+        selectedItems.ForEach(x => x.Selected = false);
+        // select only the clicked item
+        item.Selected = true;
+      }
+      base.OnItemCheck(ice);
+    }
+
+    private bool suppressItemCheckedEvents;
+    public bool SuppressItemCheckedEvents {
+      get {
+        return suppressItemCheckedEvents;
+      }
+      set {
+        suppressItemCheckedEvents = value;
+      }
+    }
+    protected override void OnItemChecked(ItemCheckedEventArgs e) {
+      if (!suppressItemCheckedEvents)
+        base.OnItemChecked(e);
+    }
+
+    public void CheckItems(IEnumerable<ListViewItem> items) {
+      suppressItemCheckedEvents = true;
+
+      foreach (var item in items)
+        item.Checked = true;
+      suppressItemCheckedEvents = false;
+    }
+
+    public void UncheckItems(IEnumerable<ListViewItem> items) {
+      suppressItemCheckedEvents = true;
+
+      foreach (var item in items)
+        item.Checked = false;
+      suppressItemCheckedEvents = false;
+    }
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.Designer.cs	(revision 9512)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class PluginUpdaterForm {
+    /// <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.components = new System.ComponentModel.Container();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.progressBar = new System.Windows.Forms.ProgressBar();
+      this.statusLabel = new System.Windows.Forms.Label();
+      this.okButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // progressBar
+      // 
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Location = new System.Drawing.Point(12, 73);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(350, 23);
+      this.progressBar.TabIndex = 1;
+      this.progressBar.UseWaitCursor = true;
+      // 
+      // statusLabel
+      // 
+      this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statusLabel.AutoSize = true;
+      this.statusLabel.Location = new System.Drawing.Point(13, 13);
+      this.statusLabel.Name = "statusLabel";
+      this.statusLabel.Size = new System.Drawing.Size(61, 13);
+      this.statusLabel.TabIndex = 2;
+      this.statusLabel.Text = "statusLabel";
+      this.statusLabel.UseWaitCursor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(12, 73);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(78, 23);
+      this.okButton.TabIndex = 3;
+      this.okButton.Text = "Ok";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.UseWaitCursor = true;
+      this.okButton.Visible = false;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // PluginUpdaterForm
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(374, 108);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.statusLabel);
+      this.Controls.Add(this.progressBar);
+      this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+      this.Icon = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "PluginUpdaterForm";
+      this.ShowInTaskbar = false;
+      this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Plugin Updater";
+      this.UseWaitCursor = true;
+      this.Load += new System.EventHandler(this.PluginUpdaterForm_Load);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ProgressBar progressBar;
+    private System.Windows.Forms.Label statusLabel;
+    private System.Windows.Forms.Button okButton;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs	(revision 9512)
@@ -0,0 +1,263 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class PluginUpdaterForm : Form, IStatusView {
+    private InstallationManager installationManager;
+    private PluginManager pluginManager;
+    private string pluginDir;
+    private BackgroundWorker updatePluginsBackgroundWorker;
+
+    public PluginUpdaterForm(PluginManager pluginManager)
+      : base() {
+      InitializeComponent();
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      Text = "HeuristicLab Plugin Manager " + pluginInfrastructureVersion.FileVersion;
+      pluginManager.PluginLoaded += pluginManager_PluginLoaded;
+      pluginManager.PluginUnloaded += pluginManager_PluginUnloaded;
+      pluginManager.Initializing += pluginManager_Initializing;
+      pluginManager.Initialized += pluginManager_Initialized;
+
+      pluginDir = Application.StartupPath;
+
+      installationManager = new InstallationManager(pluginDir);
+      installationManager.PluginInstalled += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginInstalled);
+      installationManager.PluginRemoved += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginRemoved);
+      installationManager.PluginUpdated += new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginUpdated);
+      installationManager.PreInstallPlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreInstallPlugin);
+      installationManager.PreRemovePlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreRemovePlugin);
+      installationManager.PreUpdatePlugin += new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreUpdatePlugin);
+
+      this.pluginManager = pluginManager;
+
+      updatePluginsBackgroundWorker = new BackgroundWorker();
+      updatePluginsBackgroundWorker.DoWork += new DoWorkEventHandler(updatePluginsBackgroundWorker_DoWork);
+      updatePluginsBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(updatePluginsBackgroundWorker_RunWorkerCompleted);
+    }
+
+
+    private void PluginUpdaterForm_Load(object sender, EventArgs e) {
+      updatePluginsBackgroundWorker.RunWorkerAsync();
+      ShowProgressIndicator();
+      ShowMessage("Downloading and installing plugins...");
+    }
+
+    #region event handlers for update plugins backgroundworker
+    void updatePluginsBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        ShowError("Installation Error", "There was a problem while downloading and installing updates." + Environment.NewLine + "Please check your connection settings.");
+      } else {
+        Close();
+      }
+    }
+
+    void updatePluginsBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
+      IEnumerable<IPluginDescription> installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>().ToList();
+      var remotePlugins = installationManager.GetRemotePluginList();
+      // if there is a local plugin with same name and same major and minor version then it's an update
+      var pluginsToUpdate = from remotePlugin in remotePlugins
+                            let matchingLocalPlugins = from installedPlugin in installedPlugins
+                                                       where installedPlugin.Name == remotePlugin.Name
+                                                       where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                       where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                       where Util.IsNewerThan(remotePlugin, installedPlugin)
+                                                       select installedPlugin
+                            where matchingLocalPlugins.Count() > 0
+                            select remotePlugin;
+      if (pluginsToUpdate.Count() > 0) {
+        bool canceled;
+        installationManager.Update(pluginsToUpdate, out canceled);
+        if (!canceled)
+          pluginManager.DiscoverAndCheckPlugins();
+        e.Cancel = false;
+      }
+    }
+    #endregion
+
+    #region plugin manager event handlers
+    private void pluginManager_Initialized(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Initialized PluginInfrastructure");
+    }
+
+    private void pluginManager_Initializing(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Initializing PluginInfrastructure");
+    }
+
+    private void pluginManager_PluginUnloaded(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Unloaded " + e.Entity);
+    }
+
+    private void pluginManager_PluginLoaded(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Loaded " + e.Entity);
+    }
+    #endregion
+
+    #region installation manager event handlers
+    private void installationManager_PreUpdatePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = (bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)ConfirmUpdateAction, e.Plugins) == false;
+      }
+    }
+
+    private void installationManager_PreRemovePlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0) {
+        e.Cancel = (bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)ConfirmRemoveAction, e.Plugins) == false;
+      }
+    }
+
+    private void installationManager_PreInstallPlugin(object sender, PluginInfrastructureCancelEventArgs e) {
+      if (e.Plugins.Count() > 0)
+        if ((bool)Invoke((Func<IEnumerable<IPluginDescription>, bool>)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");
+        }
+    }
+
+    private void installationManager_PluginUpdated(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Updated " + e.Entity);
+    }
+
+    private void installationManager_PluginRemoved(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Removed " + e.Entity);
+    }
+
+    private void installationManager_PluginInstalled(object sender, PluginInfrastructureEventArgs e) {
+      SetStatusStrip("Installed " + e.Entity);
+    }
+    #endregion
+
+    #region confirmation dialogs
+    private bool ConfirmRemoveAction(IEnumerable<IPluginDescription> plugins) {
+      StringBuilder strBuilder = new StringBuilder();
+      foreach (var plugin in plugins) {
+        foreach (var file in plugin.Files) {
+          strBuilder.AppendLine(Path.GetFileName(file.Name));
+        }
+      }
+      using (var confirmationDialog = new ConfirmationDialog("Confirm Delete", "Do you want to delete following files?", strBuilder.ToString())) {
+        return (confirmationDialog.ShowDialog(this)) == DialogResult.OK;
+      }
+    }
+
+    private bool ConfirmUpdateAction(IEnumerable<IPluginDescription> plugins) {
+      StringBuilder strBuilder = new StringBuilder();
+      foreach (var plugin in plugins) {
+        strBuilder.AppendLine(plugin.ToString());
+      }
+      using (var confirmationDialog = new ConfirmationDialog("Confirm Update", "Do you want to update following plugins?", strBuilder.ToString())) {
+        return (confirmationDialog.ShowDialog(this)) == DialogResult.OK;
+      }
+    }
+
+    private bool ConfirmInstallAction(IEnumerable<IPluginDescription> plugins) {
+      foreach (var plugin in plugins) {
+        if (!string.IsNullOrEmpty(plugin.LicenseText)) {
+          using (var licenseConfirmationBox = new LicenseConfirmationDialog(plugin)) {
+            if (licenseConfirmationBox.ShowDialog(this) != DialogResult.OK)
+              return false;
+          }
+        }
+      }
+      return true;
+    }
+
+
+    #endregion
+
+    #region helper methods
+    private void SetStatusStrip(string msg) {
+      if (InvokeRequired) Invoke((Action<string>)SetStatusStrip, msg);
+      else {
+        statusLabel.Text = msg;
+      }
+    }
+
+    #endregion
+
+
+    protected override void OnClosing(CancelEventArgs e) {
+      installationManager.PluginInstalled -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginInstalled);
+      installationManager.PluginRemoved -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginRemoved);
+      installationManager.PluginUpdated -= new EventHandler<PluginInfrastructureEventArgs>(installationManager_PluginUpdated);
+      installationManager.PreInstallPlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreInstallPlugin);
+      installationManager.PreRemovePlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreRemovePlugin);
+      installationManager.PreUpdatePlugin -= new EventHandler<PluginInfrastructureCancelEventArgs>(installationManager_PreUpdatePlugin);
+      base.OnClosing(e);
+    }
+
+    #region IStatusView Members
+
+    public void ShowProgressIndicator(double percentProgress) {
+      if (percentProgress < 0.0 || percentProgress > 1.0) throw new ArgumentException("percentProgress");
+      progressBar.Visible = true;
+      progressBar.Style = ProgressBarStyle.Continuous;
+      int range = progressBar.Maximum - progressBar.Minimum;
+      progressBar.Value = (int)(percentProgress * range + progressBar.Minimum);
+    }
+
+    public void ShowProgressIndicator() {
+      progressBar.Visible = true;
+      progressBar.Style = ProgressBarStyle.Marquee;
+    }
+
+    public void HideProgressIndicator() {
+      progressBar.Visible = false;
+    }
+
+    public void ShowMessage(string message) {
+      statusLabel.Text = message;
+    }
+
+    public void RemoveMessage(string message) {
+      statusLabel.Text = string.Empty;
+    }
+
+    public void LockUI() {
+      Cursor = Cursors.AppStarting;
+    }
+    public void UnlockUI() {
+      Cursor = Cursors.Default;
+    }
+    public void ShowError(string shortMessage, string description) {
+      progressBar.Visible = false;
+      okButton.Visible = true;
+      statusLabel.Text = shortMessage + Environment.NewLine + description;
+      this.Cursor = Cursors.Default;
+    }
+    #endregion
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.Designer.cs	(revision 9512)
@@ -0,0 +1,356 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class 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.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.pluginDescriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginsImageList = 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.filesImageList = new System.Windows.Forms.ImageList(this.components);
+      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.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.errorTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showLicenseButton = new System.Windows.Forms.Button();
+      this.dependenciesGroupBox.SuspendLayout();
+      this.filesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(9, 15);
+      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(78, 12);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.ReadOnly = true;
+      this.nameTextBox.Size = new System.Drawing.Size(594, 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(78, 38);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.ReadOnly = true;
+      this.versionTextBox.Size = new System.Drawing.Size(594, 20);
+      this.versionTextBox.TabIndex = 3;
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.AutoSize = true;
+      this.versionLabel.Location = new System.Drawing.Point(9, 41);
+      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(78, 64);
+      this.contactTextBox.Name = "contactTextBox";
+      this.contactTextBox.ReadOnly = true;
+      this.contactTextBox.Size = new System.Drawing.Size(594, 20);
+      this.contactTextBox.TabIndex = 5;
+      // 
+      // contactInfoLabel
+      // 
+      this.contactInfoLabel.AutoSize = true;
+      this.contactInfoLabel.Location = new System.Drawing.Point(9, 67);
+      this.contactInfoLabel.Name = "contactInfoLabel";
+      this.contactInfoLabel.Size = new System.Drawing.Size(47, 13);
+      this.contactInfoLabel.TabIndex = 4;
+      this.contactInfoLabel.Text = "Contact:";
+      // 
+      // 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(12, 324);
+      this.dependenciesGroupBox.Name = "dependenciesGroupBox";
+      this.dependenciesGroupBox.Size = new System.Drawing.Size(663, 198);
+      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.pluginDescriptionHeader});
+      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(657, 179);
+      this.dependenciesListView.SmallImageList = this.pluginsImageList;
+      this.dependenciesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      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;
+      // 
+      // pluginDescriptionHeader
+      // 
+      this.pluginDescriptionHeader.Text = "Description";
+      this.pluginDescriptionHeader.Width = 325;
+      // 
+      // pluginsImageList
+      // 
+      this.pluginsImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginsImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginsImageList.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(657, 131);
+      this.filesListView.SmallImageList = this.filesImageList;
+      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;
+      // 
+      // filesImageList
+      // 
+      this.filesImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.filesImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.filesImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // 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(12, 168);
+      this.filesGroupBox.Name = "filesGroupBox";
+      this.filesGroupBox.Size = new System.Drawing.Size(663, 150);
+      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(78, 116);
+      this.stateTextBox.Name = "stateTextBox";
+      this.stateTextBox.ReadOnly = true;
+      this.stateTextBox.Size = new System.Drawing.Size(594, 20);
+      this.stateTextBox.TabIndex = 13;
+      // 
+      // stateLabel
+      // 
+      this.stateLabel.AutoSize = true;
+      this.stateLabel.Location = new System.Drawing.Point(9, 119);
+      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(9, 145);
+      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(9, 93);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 17;
+      this.descriptionLabel.Text = "Description:";
+      // 
+      // 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(78, 90);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.Size = new System.Drawing.Size(594, 20);
+      this.descriptionTextBox.TabIndex = 20;
+      // 
+      // 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(78, 142);
+      this.errorTextBox.Multiline = true;
+      this.errorTextBox.Name = "errorTextBox";
+      this.errorTextBox.ReadOnly = true;
+      this.errorTextBox.Size = new System.Drawing.Size(594, 20);
+      this.errorTextBox.TabIndex = 21;
+      // 
+      // showLicenseButton
+      // 
+      this.showLicenseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.showLicenseButton.Location = new System.Drawing.Point(12, 528);
+      this.showLicenseButton.Name = "showLicenseButton";
+      this.showLicenseButton.Size = new System.Drawing.Size(87, 23);
+      this.showLicenseButton.TabIndex = 22;
+      this.showLicenseButton.Text = "Show License";
+      this.toolTip.SetToolTip(this.showLicenseButton, "Show Plugin License");
+      this.showLicenseButton.UseVisualStyleBackColor = true;
+      this.showLicenseButton.Click += new System.EventHandler(this.showLicenseButton_Click);
+      // 
+      // PluginView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(687, 565);
+      this.Controls.Add(this.showLicenseButton);
+      this.Controls.Add(this.errorTextBox);
+      this.Controls.Add(this.descriptionTextBox);
+      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.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.Icon = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.Name = "PluginView";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      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.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 pluginsImageList;
+    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;
+    protected System.Windows.Forms.TextBox descriptionTextBox;
+    protected System.Windows.Forms.TextBox errorTextBox;
+    private System.Windows.Forms.ImageList filesImageList;
+    private System.Windows.Forms.ColumnHeader pluginDescriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button showLicenseButton;
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginView.cs	(revision 9512)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class PluginView : Form {
+    private const string IMAGE_KEY_PLUGIN = "Plugin";
+    private const string IMAGE_KEY_ASSEMBLY = "Assembly";
+    private const string IMAGE_KEY_FILE = "File";
+    private const string IMAGE_KEY_DOCUMENT = "Document";
+
+    private IPluginDescription plugin;
+
+    public PluginView()
+      : base() {
+      InitializeComponent();
+      PopulateImageList();
+    }
+
+    public PluginView(IPluginDescription plugin)
+      : base() {
+      InitializeComponent();
+      PopulateImageList();
+
+      this.plugin = plugin;
+      this.Text = "Plugin Details: " + plugin.ToString();
+      UpdateControls();
+    }
+
+    private void PopulateImageList() {
+      pluginsImageList.Images.Add(IMAGE_KEY_PLUGIN, HeuristicLab.PluginInfrastructure.Resources.Plugin);
+      filesImageList.Images.Add(IMAGE_KEY_ASSEMBLY, HeuristicLab.PluginInfrastructure.Resources.Assembly);
+      filesImageList.Images.Add(IMAGE_KEY_FILE, HeuristicLab.PluginInfrastructure.Resources.File);
+      filesImageList.Images.Add(IMAGE_KEY_DOCUMENT, HeuristicLab.PluginInfrastructure.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);
+      toolTip.SetToolTip(contactTextBox, contactTextBox.Text);
+      descriptionTextBox.Text = plugin.Description;
+      toolTip.SetToolTip(descriptionTextBox, plugin.Description);
+      var localPlugin = plugin as PluginDescription;
+      if (localPlugin != null) {
+        stateTextBox.Text = localPlugin.PluginState.ToString();
+        if (!string.IsNullOrEmpty(localPlugin.LoadingErrorInformation))
+          errorTextBox.Text = localPlugin.LoadingErrorInformation.Replace(Environment.NewLine, " ");
+        toolTip.SetToolTip(stateTextBox, stateTextBox.Text + Environment.NewLine + errorTextBox.Text);
+        toolTip.SetToolTip(errorTextBox, errorTextBox.Text);
+      }
+      foreach (PluginDescription dependency in plugin.Dependencies) {
+        var depItem = new ListViewItem(new string[] { dependency.Name, dependency.Version.ToString(), dependency.Description });
+        depItem.Tag = dependency;
+        depItem.ImageKey = IMAGE_KEY_PLUGIN;
+        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);
+      }
+      Util.ResizeColumns(dependenciesListView.Columns.OfType<ColumnHeader>());
+      Util.ResizeColumns(filesListView.Columns.OfType<ColumnHeader>());
+
+      showLicenseButton.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 dependenciesListView_ItemActivate(object sender, EventArgs e) {
+      if (dependenciesListView.SelectedItems.Count > 0) {
+        var dep = (PluginDescription)dependenciesListView.SelectedItems[0].Tag;
+        PluginView view = new PluginView(dep);
+        view.Show(this);
+      }
+    }
+
+    private void showLicenseButton_Click(object sender, EventArgs e) {
+      LicenseView view = new LicenseView(plugin);
+      view.Show(this);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.Designer.cs	(revision 9512)
@@ -0,0 +1,161 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  partial class UploadPluginsView {
+    /// <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.uploadButton = new System.Windows.Forms.Button();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.listView = new HeuristicLab.PluginInfrastructure.Advanced.MultiSelectListView();
+      this.pluginNameHeader = new System.Windows.Forms.ColumnHeader();
+      this.localVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.serverVersionHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginImageList = new System.Windows.Forms.ImageList(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // uploadButton
+      // 
+      this.uploadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.uploadButton.Enabled = false;
+      this.uploadButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.PublishToWeb;
+      this.uploadButton.Location = new System.Drawing.Point(78, 482);
+      this.uploadButton.Name = "uploadButton";
+      this.uploadButton.Size = new System.Drawing.Size(114, 26);
+      this.uploadButton.TabIndex = 7;
+      this.uploadButton.Text = "Upload Selected";
+      this.uploadButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.uploadButton, "Upload selected plugins to the server");
+      this.uploadButton.UseVisualStyleBackColor = true;
+      this.uploadButton.Click += new System.EventHandler(this.uploadButton_Click);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.refreshButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.Internet;
+      this.refreshButton.Location = new System.Drawing.Point(0, 482);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(72, 26);
+      this.refreshButton.TabIndex = 6;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.toolTip.SetToolTip(this.refreshButton, "Update list of plugins from the server");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // listView
+      // 
+      this.listView.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.listView.CheckBoxes = true;
+      this.listView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameHeader,
+            this.localVersionHeader,
+            this.serverVersionHeader,
+            this.descriptionHeader});
+      this.listView.Location = new System.Drawing.Point(0, 0);
+      this.listView.Name = "listView";
+      this.listView.Size = new System.Drawing.Size(539, 476);
+      this.listView.SmallImageList = this.pluginImageList;
+      this.listView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.listView.SuppressItemCheckedEvents = false;
+      this.listView.TabIndex = 8;
+      this.listView.UseCompatibleStateImageBehavior = false;
+      this.listView.View = System.Windows.Forms.View.Details;
+      this.listView.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.listView_ItemChecked);
+      // 
+      // pluginNameHeader
+      // 
+      this.pluginNameHeader.Text = "Name";
+      this.pluginNameHeader.Width = 40;
+      // 
+      // localVersionHeader
+      // 
+      this.localVersionHeader.Text = "Local Version";
+      this.localVersionHeader.Width = 76;
+      // 
+      // serverVersionHeader
+      // 
+      this.serverVersionHeader.Text = "Server Version";
+      this.serverVersionHeader.Width = 81;
+      // 
+      // descriptionHeader
+      // 
+      this.descriptionHeader.Text = "Description";
+      this.descriptionHeader.Width = 335;
+      // 
+      // pluginImageList
+      // 
+      this.pluginImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.pluginImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.pluginImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // PluginEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.listView);
+      this.Controls.Add(this.uploadButton);
+      this.Controls.Add(this.refreshButton);
+      this.Name = "PluginEditor";
+      this.Size = new System.Drawing.Size(539, 508);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.Button uploadButton;
+    private MultiSelectListView listView;
+    private System.Windows.Forms.ColumnHeader pluginNameHeader;
+    private System.Windows.Forms.ColumnHeader localVersionHeader;
+    private System.Windows.Forms.ColumnHeader serverVersionHeader;
+    private System.Windows.Forms.ColumnHeader descriptionHeader;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.ImageList pluginImageList;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/UploadPluginsView.cs	(revision 9512)
@@ -0,0 +1,310 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.ServiceModel;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+using ICSharpCode.SharpZipLib.Zip;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal partial class UploadPluginsView : InstallationManagerControl {
+    private const string UploadMessage = "Uploading plugins...";
+    private const string RefreshMessage = "Downloading plugin information from deployment service...";
+
+    private Dictionary<IPluginDescription, IPluginDescription> localAndServerPlugins;
+    private BackgroundWorker pluginUploadWorker;
+    private BackgroundWorker refreshPluginsWorker;
+
+    private PluginManager pluginManager;
+    public PluginManager PluginManager {
+      get { return pluginManager; }
+      set { pluginManager = value; }
+    }
+
+    public UploadPluginsView() {
+      InitializeComponent();
+      pluginImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Plugin);
+      localAndServerPlugins = new Dictionary<IPluginDescription, IPluginDescription>();
+
+      #region initialize backgroundworkers
+      pluginUploadWorker = new BackgroundWorker();
+      pluginUploadWorker.DoWork += new DoWorkEventHandler(pluginUploadWorker_DoWork);
+      pluginUploadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(pluginUploadWorker_RunWorkerCompleted);
+
+      refreshPluginsWorker = new BackgroundWorker();
+      refreshPluginsWorker.DoWork += new DoWorkEventHandler(refreshPluginsWorker_DoWork);
+      refreshPluginsWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(refreshPluginsWorker_RunWorkerCompleted);
+      #endregion
+    }
+
+    #region refresh plugins from server backgroundworker
+    void refreshPluginsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+      } else {
+        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
+      }
+      StatusView.HideProgressIndicator();
+      StatusView.RemoveMessage(RefreshMessage);
+      StatusView.UnlockUI();
+    }
+
+    void refreshPluginsWorker_DoWork(object sender, DoWorkEventArgs e) {
+      // refresh available plugins
+      var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        e.Result = client.GetPlugins();
+        client.Close();
+      }
+      catch (TimeoutException) {
+        client.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        client.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        client.Abort();
+        throw;
+      }
+    }
+    #endregion
+
+    #region upload plugins to server backgroundworker
+    void pluginUploadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
+      if (e.Error != null) {
+        StatusView.ShowError("Connection Error",
+          "There was an error while connecting to the server." + Environment.NewLine +
+                   "Please check your connection settings and user credentials.");
+      } else {
+        UpdatePluginListView((IEnumerable<IPluginDescription>)e.Result);
+      }
+      StatusView.RemoveMessage(UploadMessage);
+      StatusView.HideProgressIndicator();
+      StatusView.UnlockUI();
+    }
+
+    void pluginUploadWorker_DoWork(object sender, DoWorkEventArgs e) {
+      // upload plugins
+      var selectedPlugins = (IEnumerable<IPluginDescription>)e.Argument;
+      DeploymentService.AdminServiceClient adminClient = DeploymentService.AdminServiceClientFactory.CreateClient();
+      Dictionary<IPluginDescription, DeploymentService.PluginDescription> cachedPluginDescriptions =
+        new Dictionary<IPluginDescription, DeploymentService.PluginDescription>();
+      try {
+        foreach (var plugin in IteratePlugins(selectedPlugins)) {
+          adminClient.DeployPlugin(MakePluginDescription(plugin, cachedPluginDescriptions), CreateZipPackage(plugin));
+        }
+        adminClient.Close();
+      }
+      catch (TimeoutException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        adminClient.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        adminClient.Abort();
+        throw;
+      }
+      // refresh available plugins
+      var client = DeploymentService.UpdateServiceClientFactory.CreateClient();
+      try {
+        e.Result = client.GetPlugins();
+        client.Close();
+      }
+      catch (TimeoutException) {
+        client.Abort();
+        throw;
+      }
+      catch (FaultException) {
+        client.Abort();
+        throw;
+      }
+      catch (CommunicationException) {
+        client.Abort();
+        throw;
+      }
+    }
+    #endregion
+
+
+    #region button events
+    private void uploadButton_Click(object sender, EventArgs e) {
+      var selectedPlugins = from item in listView.Items.Cast<ListViewItem>()
+                            where item.Checked
+                            where item.Tag is IPluginDescription
+                            select item.Tag as IPluginDescription;
+      if (selectedPlugins.Count() > 0) {
+        StatusView.LockUI();
+        StatusView.ShowProgressIndicator();
+        StatusView.ShowMessage(UploadMessage);
+        pluginUploadWorker.RunWorkerAsync(selectedPlugins.ToList());
+      }
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      StatusView.LockUI();
+      StatusView.ShowProgressIndicator();
+      StatusView.ShowMessage(RefreshMessage);
+      refreshPluginsWorker.RunWorkerAsync();
+    }
+
+    #endregion
+
+    #region item list events
+    private bool ignoreItemCheckedEvents = false;
+    private void listView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      if (ignoreItemCheckedEvents) return;
+      List<IPluginDescription> modifiedPlugins = new List<IPluginDescription>();
+      if (e.Item.Checked) {
+        foreach (ListViewItem item in listView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also check all dependencies
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependencies(plugin)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        listView.CheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
+      } else {
+        foreach (ListViewItem item in listView.SelectedItems) {
+          var plugin = (IPluginDescription)item.Tag;
+          // also uncheck all dependent plugins
+          if (!modifiedPlugins.Contains(plugin))
+            modifiedPlugins.Add(plugin);
+          foreach (var dep in Util.GetAllDependents(plugin, localAndServerPlugins.Keys)) {
+            if (!modifiedPlugins.Contains(dep))
+              modifiedPlugins.Add(dep);
+          }
+        }
+        listView.UncheckItems(modifiedPlugins.Select(x => FindItemForPlugin(x)));
+      }
+      uploadButton.Enabled = (from i in listView.Items.OfType<ListViewItem>()
+                              where i.Checked
+                              select i).Any();
+    }
+    #endregion
+
+    #region helper methods
+    private void UpdatePluginListView(IEnumerable<IPluginDescription> remotePlugins) {
+      // refresh local plugins
+      localAndServerPlugins.Clear();
+      foreach (var plugin in pluginManager.Plugins) {
+        localAndServerPlugins.Add(plugin, null);
+      }
+      foreach (var plugin in remotePlugins) {
+        var matchingLocalPlugin = (from localPlugin in localAndServerPlugins.Keys
+                                   where localPlugin.Name == plugin.Name
+                                   where localPlugin.Version == plugin.Version
+                                   select localPlugin).SingleOrDefault();
+        if (matchingLocalPlugin != null) {
+          localAndServerPlugins[matchingLocalPlugin] = plugin;
+        }
+      }
+      // refresh the list view with plugins
+      listView.Items.Clear();
+      ignoreItemCheckedEvents = true;
+      foreach (var pair in localAndServerPlugins) {
+        var item = MakeListViewItem(pair.Key);
+        listView.Items.Add(item);
+      }
+      Util.ResizeColumns(listView.Columns.OfType<ColumnHeader>());
+      ignoreItemCheckedEvents = false;
+    }
+
+    private IEnumerable<IPluginDescription> IteratePlugins(IEnumerable<IPluginDescription> plugins) {
+      HashSet<IPluginDescription> yieldedItems = new HashSet<IPluginDescription>();
+      foreach (var plugin in plugins) {
+        foreach (var dependency in IteratePlugins(plugin.Dependencies)) {
+          if (!yieldedItems.Contains(dependency)) {
+            yieldedItems.Add(dependency);
+            yield return dependency;
+          }
+        }
+        if (!yieldedItems.Contains(plugin)) {
+          yieldedItems.Add(plugin);
+          yield return plugin;
+        }
+      }
+    }
+
+    private static byte[] CreateZipPackage(IPluginDescription plugin) {
+      using (MemoryStream stream = new MemoryStream()) {
+        ZipFile zipFile = new ZipFile(stream);
+        zipFile.BeginUpdate();
+        foreach (var file in plugin.Files) {
+          zipFile.Add(file.Name);
+        }
+        zipFile.CommitUpdate();
+        stream.Seek(0, SeekOrigin.Begin);
+        return stream.GetBuffer();
+      }
+    }
+
+    private ListViewItem MakeListViewItem(IPluginDescription plugin) {
+      ListViewItem item;
+      if (localAndServerPlugins[plugin] != null) {
+        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          localAndServerPlugins[plugin].Version.ToString(), localAndServerPlugins[plugin].Description });
+        if (plugin.Version <= localAndServerPlugins[plugin].Version)
+          item.ForeColor = Color.Gray;
+      } else {
+        item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), 
+          string.Empty, plugin.Description });
+      }
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      item.Checked = false;
+      return item;
+    }
+
+    private ListViewItem FindItemForPlugin(IPluginDescription dep) {
+      return (from i in listView.Items.Cast<ListViewItem>()
+              where i.Tag == dep
+              select i).Single();
+    }
+
+    private DeploymentService.PluginDescription MakePluginDescription(IPluginDescription plugin, Dictionary<IPluginDescription, DeploymentService.PluginDescription> cachedPluginDescriptions) {
+      if (!cachedPluginDescriptions.ContainsKey(plugin)) {
+        var dependencies = (from dep in plugin.Dependencies
+                            select MakePluginDescription(dep, cachedPluginDescriptions))
+                           .ToList();
+        cachedPluginDescriptions.Add(plugin,
+          new DeploymentService.PluginDescription(plugin.Name, plugin.Version, dependencies, plugin.ContactName, plugin.ContactEmail, plugin.LicenseText));
+      }
+      return cachedPluginDescriptions[plugin];
+    }
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/Util.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/Util.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Advanced/Util.cs	(revision 9512)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure.Advanced {
+  internal static class Util {
+    internal static void ResizeColumn(ColumnHeader columnHeader) {
+      columnHeader.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
+      int headerSize = columnHeader.Width;
+      columnHeader.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+      int contentSize = columnHeader.Width;
+      columnHeader.Width = Math.Max(headerSize, contentSize);
+    }
+
+    internal static void ResizeColumns(IEnumerable<ColumnHeader> columnHeaders) {
+      foreach (var columnHeader in columnHeaders)
+        ResizeColumn(columnHeader);
+    }
+
+    internal static IEnumerable<IPluginDescription> GetAllDependents(IPluginDescription plugin, IEnumerable<IPluginDescription> availablePlugins) {
+      return from p in availablePlugins
+             let matchingEntries = from dep in GetAllDependencies(p)
+                                   where dep.Name == plugin.Name
+                                   where dep.Version == plugin.Version
+                                   select dep
+             where matchingEntries.Any()
+             select p as IPluginDescription;
+    }
+
+    internal static IEnumerable<IPluginDescription> GetAllDependencies(IPluginDescription plugin) {
+      HashSet<IPluginDescription> yieldedPlugins = new HashSet<IPluginDescription>();
+      foreach (var dep in plugin.Dependencies) {
+        foreach (var recDep in GetAllDependencies(dep)) {
+          if (!yieldedPlugins.Contains(recDep)) {
+            yieldedPlugins.Add(recDep);
+            yield return recDep;
+          }
+        }
+        if (!yieldedPlugins.Contains(dep)) {
+          yieldedPlugins.Add(dep);
+          yield return dep;
+        }
+      }
+    }
+
+    // compares for two plugins with same major and minor version if plugin1 is newer than plugin2
+    internal static bool IsNewerThan(IPluginDescription plugin1, IPluginDescription plugin2) {
+      // newer: build version is higher, or if build version is the same revision is higher
+      return plugin1.Version.Build > plugin2.Version.Build ||
+        (plugin1.Version.Build == plugin2.Version.Build && plugin1.Version.Revision > plugin2.Version.Revision);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ApplicationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ApplicationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ApplicationManager.cs	(revision 9512)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  /// <summary>
+  /// The ApplicationManager has a reference to the application manager singleton.
+  /// </summary>
+  public static class ApplicationManager {
+    // the singleton instance is initialized to LightweightApplicationManager as long as no other application manager is registered    
+    private static IApplicationManager appManager;
+
+    /// <summary>
+    /// Gets the application manager singleton.
+    /// </summary>
+    public static IApplicationManager Manager {
+      get {
+        if (appManager == null)
+          appManager = new LightweightApplicationManager();
+        return appManager;
+      }
+    }
+
+    /// <summary>
+    /// Registers a new application manager.
+    /// </summary>
+    /// <param name="manager"></param>
+    internal static void RegisterApplicationManager(IApplicationManager manager) {
+      if (appManager != null && !(appManager is LightweightApplicationManager)) throw new InvalidOperationException("The application manager has already been set.");
+      else {
+        appManager = manager;
+      }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ApplicationAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ApplicationAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ApplicationAttribute.cs	(revision 9512)
@@ -0,0 +1,86 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to specify meta data for applications. 
+  /// For example to specify name and description of applications.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class)]
+  public sealed class ApplicationAttribute : System.Attribute {
+    private string name;
+    /// <summary>
+    /// Gets the name of the application.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+
+    private string description;
+    /// <summary>
+    /// Gets the description of the application.
+    /// </summary>
+    public string Description {
+      get { return description; }
+    }
+
+    private bool restartOnErrors;
+    /// <summary>
+    /// Gets whether the plugin should be automatically restarted when it is closed because of an exception (for services).
+    /// </summary>
+    public bool RestartOnErrors {
+      get { return restartOnErrors; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
+    /// <param name="name">Name of the application</param>
+    /// </summary>
+    public ApplicationAttribute(string name)
+      : this(name, String.Empty) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
+    /// <param name="name">Name of the application</param>
+    /// <param name="description">Description of the application</param>
+    /// </summary>
+    public ApplicationAttribute(string name, string description)
+      : this(name, description, false) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ApplicationAttribute"/>.
+    /// <param name="name">Name of the application</param>
+    /// <param name="description">Description of the application</param>
+    /// <param name="restartOnErrors">Flag that indicates if the application should be restarted on exceptions (for services)</param>
+    /// </summary>
+    public ApplicationAttribute(string name, string description, bool restartOnErrors) {
+      if (name == null) throw new ArgumentNullException("name", "Application name is null.");
+      if (description == null) throw new ArgumentNullException("description", "Application description is null.");
+      this.name = name;
+      this.description = description;
+      this.restartOnErrors = restartOnErrors;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ContactInformationAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ContactInformationAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/ContactInformationAttribute.cs	(revision 9512)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// ContactInformationAttribute can be used to declare contact information (name, e-mail) for a plugin.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
+  public sealed class ContactInformationAttribute : System.Attribute {
+    private string name;
+
+    /// <summary>
+    /// Gets the name of the contact person.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+
+    private string email;
+    /// <summary>
+    /// Gets the e-mail address of the contact person.
+    /// </summary>
+    public string EMail {
+      get { return email; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ContactInformationAttribute"/>.
+    /// <param name="name">Name of the contact person</param>
+    /// <param name="email">E-mail address of the person</param>
+    /// </summary>
+    public ContactInformationAttribute(string name, string email) {
+      if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(email)) throw new ArgumentException("Empty name or e-mail address.");
+      this.name = name;
+      this.email = email;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/NonDiscoverableTypeAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/NonDiscoverableTypeAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/NonDiscoverableTypeAttribute.cs	(revision 9512)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to specify that a class is excluded from type discovery
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class)]
+  public sealed class NonDiscoverableTypeAttribute : System.Attribute {
+    /// <summary>
+    /// Initializes a new instance of <see cref="NonDiscoverableTypeAttribute"/>.
+    /// </summary>
+    public NonDiscoverableTypeAttribute()
+      : base() {
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginAttribute.cs	(revision 9512)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to specify meta data for plugins. 
+  /// For example to specify name and description of plugins.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class)]
+  public sealed class PluginAttribute : System.Attribute {
+    private string name;
+    /// <summary>
+    /// Gets the name of the plugin.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+
+    private string description;
+    /// <summary>
+    /// Gets the description of the plugin.
+    /// </summary>
+    public string Description {
+      get { return description; }
+    }
+
+    private Version version;
+    /// <summary>
+    /// Gets the version of the plugin.
+    /// </summary>
+    public Version Version {
+      get { return version; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginAttribute"/>.
+    /// <param name="name">Name of the plugin</param>
+    /// <param name="version">Version of the plugin</param>
+    /// </summary>
+    public PluginAttribute(string name, string version)
+      : this(name, string.Empty, version) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginAttribute"/>.
+    /// </summary>
+    /// <param name="name">Name of the plugin</param>
+    /// <param name="description">Description of the plugin</param>
+    /// <param name="version">Version of the plugin</param>
+    public PluginAttribute(string name, string description, string version) {
+      if (string.IsNullOrEmpty(name)) throw new ArgumentException("Plugin name is null or empty.");
+      if (description == null) throw new ArgumentNullException("description");
+      if (string.IsNullOrEmpty(version)) throw new ArgumentException("Version string is null or empty.");
+      this.name = name;
+      this.description = description;
+      this.version = new Version(version); // throws format exception if the version string can't be parsed
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginDependencyAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginDependencyAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginDependencyAttribute.cs	(revision 9512)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// This attribute can be used to declare that a plugin depends on a another plugin.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
+  public sealed class PluginDependencyAttribute : System.Attribute {
+    private string dependency;
+
+    /// <summary>
+    /// Gets the name of the plugin that is needed to load a plugin.
+    /// </summary>
+    public string Dependency {
+      get { return dependency; }
+    }
+
+    private Version version;
+    /// <summary>
+    /// Gets the version of the plugin dependency.
+    /// </summary>
+    public Version Version {
+      get { return version; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginDependencyAttribute" />.
+    /// </summary>
+    /// <param name="dependency">Name of the plugin dependency.</param>
+    /// <param name="version">Version of the plugin dependency.</param>
+    public PluginDependencyAttribute(string dependency, string version) {
+      if (string.IsNullOrEmpty(dependency)) throw new ArgumentException("Dependency name is null or empty.", "dependency");
+      if (string.IsNullOrEmpty(version)) throw new ArgumentException("Dependency version is null or empty.", "version");
+      this.dependency = dependency;
+      this.version = new Version(version); // throws format exception if the version string can't be parsed
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginFileAttribute.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginFileAttribute.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Attributes/PluginFileAttribute.cs	(revision 9512)
@@ -0,0 +1,83 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Enumerator of available file types for a plugin.
+  /// </summary>
+  public enum PluginFileType {
+    /// <summary>
+    /// CLR assembly files are loaded by the plugin infrastructure.
+    /// </summary>
+    Assembly,
+    /// <summary>
+    /// Native DLL files are ignored by the plugin infrastructure.
+    /// </summary>
+    NativeDll,
+    /// <summary>
+    /// Data files are any kind of support file for your plugin.
+    /// </summary>
+    Data,
+    /// <summary>
+    /// License files contain the license text of the plugin (ASCII encoding).
+    /// </summary>
+    License
+  };
+
+  /// <summary>
+  /// PluginFileAttribute can be used to declare which files make up an plugin.
+  /// Multiple files can be associated to an plugin. Each file should be associated to only one plugin.
+  /// </summary>
+  [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
+  public sealed class PluginFileAttribute : System.Attribute {
+    private string fileName;
+
+    /// <summary>
+    /// Gets the file name of the plugin.
+    /// </summary>
+    public string FileName {
+      get { return fileName; }
+    }
+
+    private PluginFileType fileType = PluginFileType.Data;
+
+    /// <summary>
+    /// Gets the file type of the plugin file.
+    /// </summary>
+    public PluginFileType FileType {
+      get { return fileType; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginFileAttribute"/>.
+    /// <param name="fileName">Name of the file</param>
+    /// <param name="fileType">Type of the file (Assembly, NativeDll, Data, License)</param>
+    /// </summary>
+    public PluginFileAttribute(string fileName, PluginFileType fileType) {
+      if (string.IsNullOrEmpty(fileName)) throw new ArgumentException("File name is empty.", "fileName");
+      // NB: doesn't check if the file actually exists
+      this.fileName = fileName;
+      this.fileType = fileType;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/ApplicationBase.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/ApplicationBase.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/ApplicationBase.cs	(revision 9512)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Abstract base implementation for the IApplication interface.
+  /// </summary>
+  public abstract class ApplicationBase : IApplication {
+    /// <summary>
+    /// Initializes a new instance of <see cref="ApplicationBase"/>.
+    /// </summary>
+    protected ApplicationBase() { }
+
+    private ApplicationAttribute ApplicationAttribute {
+      get {
+        object[] appAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationAttribute), false);
+
+        // exactly one attribute of the type ClassInfoAttribute must be given
+        if (appAttributes.Length == 0) {
+          throw new InvalidPluginException("ApplicationAttribute on type " + this.GetType() + " is missing.");
+        } else if (appAttributes.Length > 1) {
+          throw new InvalidPluginException("Found multiple ApplicationAttributes on type " + this.GetType());
+        }
+
+        return (ApplicationAttribute)appAttributes[0];
+      }
+    }
+
+    #region IApplication Members
+
+    /// <summary>
+    /// Gets the name of the application.
+    /// </summary>
+    public string Name {
+      get { return ApplicationAttribute.Name; }
+    }
+
+    /// <summary>
+    /// Gets the description of the application.
+    /// </summary>
+    public string Description {
+      get {
+        return ApplicationAttribute.Description;
+      }
+    }
+
+    /// <summary>
+    /// Runs the application.
+    /// </summary>
+    public abstract void Run(ICommandLineArgument[] args);
+
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/PluginBase.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/PluginBase.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/BaseClasses/PluginBase.cs	(revision 9512)
@@ -0,0 +1,61 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Abstract base implementation of the IPlugin interface.
+  /// </summary>
+  public abstract class PluginBase : IPlugin {
+    /// <summary>
+    /// Initializes a new instance of <see cref="PluginBase"/>.
+    /// </summary>
+    protected PluginBase() { }
+
+    private PluginAttribute PluginAttribute {
+      get {
+        object[] pluginAttributes = this.GetType().GetCustomAttributes(typeof(PluginAttribute), false);
+        // exactly one attribute of the type PluginDescriptionAttribute must be given
+        if (pluginAttributes.Length == 0) {
+          throw new InvalidPluginException("PluginAttribute on type " + this.GetType() + " is missing.");
+        } else if (pluginAttributes.Length > 1) {
+          throw new InvalidPluginException("Found multiple PluginAttributes on type " + this.GetType());
+        }
+        return (PluginAttribute)pluginAttributes[0];
+      }
+    }
+
+    #region IPlugin Members
+    /// <inheritdoc />
+    public string Name {
+      get {
+        return PluginAttribute.Name;
+      }
+    }
+
+    /// <inhertitdoc />
+    public virtual void OnLoad() { }
+    /// <inhertitdoc />
+    public virtual void OnUnload() { }
+    #endregion
+
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/HideStarterArgument.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/HideStarterArgument.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/HideStarterArgument.cs	(revision 9512)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  [Serializable]
+  public class HideStarterArgument : CommandLineArgument<bool> {
+    public const string TOKEN = "hideStarter";
+
+    public HideStarterArgument(string value)
+      : base(string.IsNullOrEmpty(value)) {
+    }
+
+    protected override bool CheckValidity() {
+      return Value;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/OpenArgument.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/OpenArgument.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/OpenArgument.cs	(revision 9512)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.IO;
+
+namespace HeuristicLab.PluginInfrastructure {
+  [Serializable]
+  public class OpenArgument : CommandLineArgument<string> {
+    public OpenArgument(string value)
+      : base(value) {
+    }
+
+    protected override bool CheckValidity() {
+      return File.Exists(Value);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/StartArgument.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/StartArgument.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/Arguments/StartArgument.cs	(revision 9512)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  [Serializable]
+  public class StartArgument : CommandLineArgument<string> {
+    public const string TOKEN = "start";
+
+    public StartArgument(string value)
+      : base(value) {
+    }
+
+    protected override bool CheckValidity() {
+      return !string.IsNullOrEmpty(Value) && !string.IsNullOrWhiteSpace(Value);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgument.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgument.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgument.cs	(revision 9512)
@@ -0,0 +1,47 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  [Serializable]
+  public abstract class CommandLineArgument<T> : ICommandLineArgument<T> {
+    object ICommandLineArgument.Value { get { return Value; } }
+    public T Value { get; private set; }
+    public bool Valid { get { return CheckValidity(); } }
+
+    protected CommandLineArgument(T value) {
+      Value = value;
+    }
+
+    public override bool Equals(object obj) {
+      if (obj == null || this.GetType() != obj.GetType()) return false;
+      var other = (ICommandLineArgument<T>)obj;
+      return this.Value.Equals(other.Value);
+    }
+
+    public override int GetHashCode() {
+      return GetType().GetHashCode() ^ Value.GetHashCode();
+    }
+
+    protected abstract bool CheckValidity();
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgumentHandling.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgumentHandling.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/CommandLineArgumentHandling.cs	(revision 9512)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public static class CommandLineArgumentHandling {
+    public static ICommandLineArgument[] GetArguments(string[] args) {
+      var arguments = new HashSet<ICommandLineArgument>();
+      var exceptions = new List<Exception>();
+
+      foreach (var entry in args) {
+        var argument = ParseArgument(entry);
+        if (argument != null && argument.Valid) arguments.Add(argument);
+        else exceptions.Add(new ArgumentException(string.Format("The argument \"{0}\" is invalid.", entry)));
+      }
+
+      if (exceptions.Any()) throw new AggregateException("One or more arguments are invalid.", exceptions);
+      return arguments.ToArray();
+    }
+
+    private static ICommandLineArgument ParseArgument(string entry) {
+      var regex = new Regex(@"^/[A-Za-z]+(:[A-Za-z0-9\s]+)?$");
+      bool isFile = File.Exists(entry);
+      if (!regex.IsMatch(entry) && !isFile) return null;
+      if (!isFile) {
+        entry = entry.Remove(0, 1);
+        var parts = entry.Split(':');
+        string key = parts[0].Trim();
+        string value = parts.Length == 2 ? parts[1].Trim() : string.Empty;
+        switch (key) {
+          case StartArgument.TOKEN: return new StartArgument(value);
+          case HideStarterArgument.TOKEN: return new HideStarterArgument(value);
+          default: return null;
+        }
+      } else return new OpenArgument(entry);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/ICommandLineArgument.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/ICommandLineArgument.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/CommandLineArgumentHandling/ICommandLineArgument.cs	(revision 9512)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure {
+  public interface ICommandLineArgument {
+    object Value { get; }
+    bool Valid { get; }
+  }
+
+  public interface ICommandLineArgument<T> : ICommandLineArgument {
+    new T Value { get; }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ControlManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ControlManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ControlManager.cs	(revision 9512)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Singleton class for the ControlManager (needed by HeuristicLab 3.2)
+  /// </summary>
+  public static class ControlManager {
+    // singleton: only one control manager allowed in each application (i.e. AppDomain)
+    private static IControlManager controlManager;
+    /// <summary>
+    /// Gets the control manager (is a singleton).
+    /// </summary>
+    public static IControlManager Manager {
+      get { return controlManager; }
+    }
+
+    /// <summary>
+    /// Set the current control manager. 
+    /// </summary>
+    /// <param name="manager">The control manager</param>
+    /// <exception cref="InvalidOperationException">Throws exception when a control manager has previously been set.</exception>
+    public static void RegisterManager(IControlManager manager) {
+      if (controlManager != null) throw new InvalidOperationException("An control manager has already been set.");
+      controlManager = manager;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/DefaultApplicationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/DefaultApplicationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/DefaultApplicationManager.cs	(revision 9512)
@@ -0,0 +1,51 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  /// <summary>  
+  /// The DefaultApplicationManager is registered as ApplicationManager.Manager singleton for each HL application
+  /// started via the plugin infrastructure.
+  /// </summary>
+  internal sealed class DefaultApplicationManager : SandboxApplicationManager {
+
+    internal DefaultApplicationManager()
+      : base() {
+      AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
+        if (loadedAssemblies.ContainsKey(args.Name)) {
+          return loadedAssemblies[args.Name];
+        }
+        return null;
+      };
+    }
+
+    /// infinite lease time
+    /// <summary>
+    /// Initializes the life time service with infinite lease time.
+    /// </summary>
+    /// <returns><c>null</c>.</returns>
+    public override object InitializeLifetimeService() {
+      return null;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.Designer.cs	(revision 9512)
@@ -0,0 +1,182 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure {
+  partial class ErrorDialog {
+    /// <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.okButton = new System.Windows.Forms.Button();
+      this.iconLabel = new System.Windows.Forms.Label();
+      this.messageTextBox = new System.Windows.Forms.TextBox();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.detailsTextBox = new System.Windows.Forms.TextBox();
+      this.supportLabel = new System.Windows.Forms.Label();
+      this.supportLinkLabel = new System.Windows.Forms.LinkLabel();
+      this.detailsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(497, 327);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // iconLabel
+      // 
+      this.iconLabel.Image = global::HeuristicLab.PluginInfrastructure.Resources.Error;
+      this.iconLabel.Location = new System.Drawing.Point(12, 9);
+      this.iconLabel.Name = "iconLabel";
+      this.iconLabel.Size = new System.Drawing.Size(50, 60);
+      this.iconLabel.TabIndex = 1;
+      // 
+      // messageTextBox
+      // 
+      this.messageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.messageTextBox.BackColor = System.Drawing.SystemColors.Control;
+      this.messageTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.messageTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.messageTextBox.Location = new System.Drawing.Point(68, 12);
+      this.messageTextBox.Multiline = true;
+      this.messageTextBox.Name = "messageTextBox";
+      this.messageTextBox.ReadOnly = true;
+      this.messageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.messageTextBox.Size = new System.Drawing.Size(504, 57);
+      this.messageTextBox.TabIndex = 2;
+      this.messageTextBox.Text = "Error Message";
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.detailsGroupBox.Controls.Add(this.detailsTextBox);
+      this.detailsGroupBox.Location = new System.Drawing.Point(12, 75);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(560, 246);
+      this.detailsGroupBox.TabIndex = 3;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "Details";
+      // 
+      // detailsTextBox
+      // 
+      this.detailsTextBox.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.detailsTextBox.BackColor = System.Drawing.SystemColors.Control;
+      this.detailsTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.detailsTextBox.Location = new System.Drawing.Point(6, 19);
+      this.detailsTextBox.Multiline = true;
+      this.detailsTextBox.Name = "detailsTextBox";
+      this.detailsTextBox.ReadOnly = true;
+      this.detailsTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.detailsTextBox.Size = new System.Drawing.Size(548, 221);
+      this.detailsTextBox.TabIndex = 0;
+      this.detailsTextBox.Text = "Stack Trace";
+      this.detailsTextBox.WordWrap = false;
+      // 
+      // supportLabel
+      // 
+      this.supportLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.supportLabel.AutoSize = true;
+      this.supportLabel.Location = new System.Drawing.Point(12, 332);
+      this.supportLabel.Name = "supportLabel";
+      this.supportLabel.Size = new System.Drawing.Size(264, 13);
+      this.supportLabel.TabIndex = 4;
+      this.supportLabel.Text = "If you have any problems or questions, please contact:";
+      // 
+      // supportLinkLabel
+      // 
+      this.supportLinkLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.supportLinkLabel.AutoSize = true;
+      this.supportLinkLabel.Location = new System.Drawing.Point(298, 332);
+      this.supportLinkLabel.Name = "supportLinkLabel";
+      this.supportLinkLabel.Size = new System.Drawing.Size(129, 13);
+      this.supportLinkLabel.TabIndex = 5;
+      this.supportLinkLabel.TabStop = true;
+      this.supportLinkLabel.Text = "support@heuristiclab.com";
+      this.supportLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.supportLinkLabel_LinkClicked);
+      // 
+      // ErrorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.okButton;
+      this.ClientSize = new System.Drawing.Size(584, 362);
+      this.Controls.Add(this.supportLinkLabel);
+      this.Controls.Add(this.supportLabel);
+      this.Controls.Add(this.detailsGroupBox);
+      this.Controls.Add(this.messageTextBox);
+      this.Controls.Add(this.iconLabel);
+      this.Controls.Add(this.okButton);
+      this.Icon = global::HeuristicLab.PluginInfrastructure.Resources.ErrorIcon;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ErrorDialog";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Error";
+      this.TopMost = true;
+      this.detailsGroupBox.ResumeLayout(false);
+      this.detailsGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Label iconLabel;
+    private System.Windows.Forms.TextBox messageTextBox;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.TextBox detailsTextBox;
+    private System.Windows.Forms.Label supportLabel;
+    private System.Windows.Forms.LinkLabel supportLinkLabel;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorDialog.cs	(revision 9512)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public partial class ErrorDialog : Form {
+    public ErrorDialog() {
+      InitializeComponent();
+      Initialize(null, null);
+    }
+    public ErrorDialog(Exception exception)
+      : this() {
+      Initialize(null, exception);
+    }
+    public ErrorDialog(string message, Exception exception)
+      : this() {
+      Initialize(message, exception);
+    }
+
+    private void Initialize(string message, Exception exception) {
+      Text = "Error";
+      if (exception != null) Text += "  -  " + exception.GetType().Name;
+
+      if (!string.IsNullOrEmpty(message))
+        messageTextBox.Text = message;
+      else if (exception != null)
+        messageTextBox.Text = exception.Message;
+      else
+        messageTextBox.Text = "Sorry, but something went wrong.";
+      messageTextBox.Enabled = !string.IsNullOrEmpty(messageTextBox.Text);
+
+      detailsTextBox.Text = ErrorHandling.BuildErrorMessage(exception);
+      detailsGroupBox.Enabled = !string.IsNullOrEmpty(detailsTextBox.Text);
+    }
+
+    private void supportLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      try {
+        System.Diagnostics.Process.Start("mailto:" + supportLinkLabel.Text);
+        supportLinkLabel.LinkVisited = true;
+      }
+      catch (Exception) { }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs	(revision 9512)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Diagnostics;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public static class ErrorHandling {
+    public static string BuildErrorMessage(Exception exception) {
+      if (exception == null) {
+        return string.Empty;
+      } else {
+        string message =
+          "HeuristicLab version: " + FileVersionInfo.GetVersionInfo(typeof(ErrorHandling).Assembly.Location).FileVersion + Environment.NewLine +
+          exception.GetType().Name + ": " + exception.Message + Environment.NewLine +
+                         exception.StackTrace;
+
+        while (exception.InnerException != null) {
+          exception = exception.InnerException;
+          message += Environment.NewLine +
+                     "-----" + Environment.NewLine +
+                     exception.GetType().Name + ": " + exception.Message + Environment.NewLine +
+                     exception.StackTrace;
+        }
+        return message;
+      }
+    }
+
+    public static void ShowErrorDialog(Exception exception) {
+      ShowErrorDialog(string.Empty, exception);
+    }
+    public static void ShowErrorDialog(Control owner, Exception exception) {
+      ShowErrorDialog(owner, string.Empty, exception);
+    }
+    public static void ShowErrorDialog(string message, Exception exception) {
+      using (ErrorDialog dialog = new ErrorDialog(message, exception)) {
+        dialog.StartPosition = FormStartPosition.CenterScreen;
+        dialog.ShowDialog();
+      }
+    }
+    public static void ShowErrorDialog(Control owner, string message, Exception exception) {
+      if (owner == null) throw new ArgumentNullException("owner");
+      if (owner.InvokeRequired) {
+        owner.Invoke(new Action<Control, string, Exception>(ShowErrorDialog), owner, message, exception);
+      } else {
+        using (ErrorDialog dialog = new ErrorDialog(message, exception)) {
+          dialog.ShowDialog(owner);
+        }
+      }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.Designer.cs	(revision 9512)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+* Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+*
+* This file is part of HeuristicLab.
+*
+* HeuristicLab is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure {
+  partial class FrameworkVersionErrorDialog {
+    /// <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.iconLabel = new System.Windows.Forms.Label();
+      this.closeButton = new System.Windows.Forms.Button();
+      this.linkLabel = new System.Windows.Forms.LinkLabel();
+      this.label = new System.Windows.Forms.Label();
+      this.linkLabelMono = new System.Windows.Forms.LinkLabel();
+      this.SuspendLayout();
+      // 
+      // iconLabel
+      // 
+      this.iconLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.iconLabel.Image = global::HeuristicLab.PluginInfrastructure.Resources.Error;
+      this.iconLabel.ImageAlign = System.Drawing.ContentAlignment.TopLeft;
+      this.iconLabel.Location = new System.Drawing.Point(12, 9);
+      this.iconLabel.Name = "iconLabel";
+      this.iconLabel.Size = new System.Drawing.Size(50, 121);
+      this.iconLabel.TabIndex = 0;
+      // 
+      // closeButton
+      // 
+      this.closeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.closeButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.closeButton.Location = new System.Drawing.Point(294, 104);
+      this.closeButton.Name = "closeButton";
+      this.closeButton.Size = new System.Drawing.Size(75, 23);
+      this.closeButton.TabIndex = 3;
+      this.closeButton.Text = "&Close";
+      this.closeButton.UseVisualStyleBackColor = true;
+      this.closeButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // linkLabel
+      // 
+      this.linkLabel.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.linkLabel.Location = new System.Drawing.Point(68, 52);
+      this.linkLabel.Name = "linkLabel";
+      this.linkLabel.Size = new System.Drawing.Size(301, 49);
+      this.linkLabel.TabIndex = 2;
+      this.linkLabel.TabStop = true;
+      this.linkLabel.Text = "Download Microsoft .NET Framework 4 (Full Profile)";
+      this.linkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel_LinkClicked);
+      // 
+      // label
+      // 
+      this.label.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.label.Location = new System.Drawing.Point(68, 9);
+      this.label.Name = "label";
+      this.label.Size = new System.Drawing.Size(301, 43);
+      this.label.TabIndex = 1;
+      this.label.Text = "To run HeuristicLab you need at least the Microsoft .NET Framework 4 (Full Profil" +
+    "e) or Mono version 2.11.4 or higher. Please download and install it.";
+      // 
+      // linkLabelMono
+      // 
+      this.linkLabelMono.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.linkLabelMono.Location = new System.Drawing.Point(68, 72);
+      this.linkLabelMono.Name = "linkLabelMono";
+      this.linkLabelMono.Size = new System.Drawing.Size(301, 16);
+      this.linkLabelMono.TabIndex = 4;
+      this.linkLabelMono.TabStop = true;
+      this.linkLabelMono.Text = "Download Mono";
+      this.linkLabelMono.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelMono_LinkClicked);
+      // 
+      // FrameworkVersionErrorDialog
+      // 
+      this.AcceptButton = this.closeButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.closeButton;
+      this.ClientSize = new System.Drawing.Size(381, 139);
+      this.Controls.Add(this.linkLabelMono);
+      this.Controls.Add(this.label);
+      this.Controls.Add(this.linkLabel);
+      this.Controls.Add(this.closeButton);
+      this.Controls.Add(this.iconLabel);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+      this.Icon = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "FrameworkVersionErrorDialog";
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+      this.Text = "Error";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label iconLabel;
+    private System.Windows.Forms.Button closeButton;
+    private System.Windows.Forms.LinkLabel linkLabel;
+    private System.Windows.Forms.Label label;
+    private System.Windows.Forms.LinkLabel linkLabelMono;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/FrameworkVersionErrorDialog.cs	(revision 9512)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+   * (at your option) any later version.
+   *
+   * HeuristicLab is distributed in the hope that it will be useful,
+   * but WITHOUT ANY WARRANTY; without even the implied warranty of
+   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   * GNU General Public License for more details.
+   *
+   * You should have received a copy of the GNU General Public License
+   * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+   */
+#endregion
+
+using System;
+using System.Reflection;
+using System.Windows.Forms;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public partial class FrameworkVersionErrorDialog : Form {
+    public static bool NET4FullProfileInstalled {
+      get {
+        try {
+          return Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full") != null;
+        }
+        catch (System.Security.SecurityException) {
+          return false;
+        }
+      }
+    }
+
+    public static bool MonoInstalled {
+      get { return Type.GetType("Mono.Runtime") != null; }
+    }
+
+    public static bool MonoCorrectVersionInstalled {
+      get {
+        var monoVersion = MonoVersion;
+        var minRequiredVersion = new Version(2, 11, 4);
+                                                                     
+        //we need at least mono version 2.11.4
+        if (monoVersion != null && monoVersion >= minRequiredVersion) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+    }
+
+    public static Version MonoVersion {
+      get {
+        Type type = Type.GetType("Mono.Runtime");
+        if (type != null) {
+          MethodInfo dispalayName = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
+          if (dispalayName != null) {
+            string versionString = dispalayName.Invoke(null, null) as string;
+            if (versionString != null) {
+              // the version string looks something like: 2.11.4 (master/99d5e54 Thu Sep  6 15:55:44 CEST 2012)
+              var subVerStrings = versionString.Split(' ');
+              if (subVerStrings.Length > 0) {
+                try {
+                  return Version.Parse(subVerStrings[0]);
+                }
+                catch { }
+              }
+            }
+          }
+        }
+        return null;
+      }
+    }
+
+    public FrameworkVersionErrorDialog() {
+      InitializeComponent();
+    }
+
+    private void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      try {
+        System.Diagnostics.Process.Start("http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7");
+        linkLabel.LinkVisited = true;
+      }
+      catch (Exception) { }
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      Application.Exit();
+    }
+
+    private void linkLabelMono_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      try {
+        System.Diagnostics.Process.Start("http://www.mono-project.org");
+        linkLabelMono.LinkVisited = true;
+      }
+      catch (Exception) { }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 9512)
@@ -0,0 +1,387 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{94186A6A-5176-4402-AE83-886557B53CCA}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.PluginInfrastructure</RootNamespace>
+    <AssemblyName>HeuristicLab.PluginInfrastructure-3.3</AssemblyName>
+    <StartupObject>
+    </StartupObject>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IdentityModel" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="ICSharpCode.SharpZipLib">
+      <HintPath>ICSharpCode.SharpZipLib.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Advanced\AvailablePluginsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\AvailablePluginsView.Designer.cs">
+      <DependentUpon>AvailablePluginsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\BasicUpdateView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\BasicUpdateView.Designer.cs">
+      <DependentUpon>BasicUpdateView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\ConfirmationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\ConfirmationDialog.Designer.cs">
+      <DependentUpon>ConfirmationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\ConnectionSetupView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\ConnectionSetupView.Designer.cs">
+      <DependentUpon>ConnectionSetupView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\PluginUpdaterForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\PluginUpdaterForm.Designer.cs">
+      <DependentUpon>PluginUpdaterForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\DeploymentService\AdminServiceClientFactory.cs" />
+    <Compile Include="Advanced\DeploymentService\DeploymentServerCertificateValidator.cs" />
+    <Compile Include="Advanced\DeploymentService\ServiceClients.cs" />
+    <Compile Include="Advanced\DeploymentService\UpdateServiceClientFactory.cs" />
+    <Compile Include="Advanced\EditProductsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\EditProductsView.Designer.cs">
+      <DependentUpon>EditProductsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\InstalledPluginsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\InstalledPluginsView.Designer.cs">
+      <DependentUpon>InstalledPluginsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\LicenseConfirmationDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\LicenseConfirmationDialog.Designer.cs">
+      <DependentUpon>LicenseConfirmationDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\UploadPluginsView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\UploadPluginsView.Designer.cs">
+      <DependentUpon>UploadPluginsView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\Util.cs" />
+    <Compile Include="Advanced\InstallationManagerControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Advanced\InstallationManagerControl.Designer.cs">
+      <DependentUpon>InstallationManagerControl.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\InstallationManagerException.cs" />
+    <Compile Include="Advanced\InstallationManager.cs" />
+    <Compile Include="Advanced\InstallationManagerForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\InstallationManagerForm.Designer.cs">
+      <DependentUpon>InstallationManagerForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\DeploymentService\PluginDescription.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Advanced\DeploymentService\ProductDescription.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Advanced\IStatusDisplay.cs" />
+    <Compile Include="Advanced\LicenseView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\LicenseView.Designer.cs">
+      <DependentUpon>LicenseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\MultiSelectListView.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="Advanced\MultiSelectListView.Designer.cs">
+      <DependentUpon>MultiSelectListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Advanced\PluginView.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Advanced\PluginView.Designer.cs">
+      <DependentUpon>PluginView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CommandLineArgumentHandling\Arguments\OpenArgument.cs" />
+    <Compile Include="CommandLineArgumentHandling\Arguments\HideStarterArgument.cs" />
+    <Compile Include="CommandLineArgumentHandling\Arguments\StartArgument.cs" />
+    <Compile Include="CommandLineArgumentHandling\CommandLineArgument.cs" />
+    <Compile Include="CommandLineArgumentHandling\CommandLineArgumentHandling.cs" />
+    <Compile Include="CommandLineArgumentHandling\ICommandLineArgument.cs" />
+    <Compile Include="Attributes\ApplicationAttribute.cs" />
+    <Compile Include="Attributes\ContactInformationAttribute.cs" />
+    <Compile Include="Attributes\NonDiscoverableTypeAttribute.cs" />
+    <Compile Include="Attributes\PluginAttribute.cs" />
+    <Compile Include="Attributes\PluginDependencyAttribute.cs" />
+    <Compile Include="Attributes\PluginFileAttribute.cs" />
+    <Compile Include="BaseClasses\ApplicationBase.cs" />
+    <Compile Include="BaseClasses\PluginBase.cs" />
+    <Compile Include="SandboxApplicationManager.cs" />
+    <Compile Include="DefaultApplicationManager.cs" />
+    <Compile Include="ErrorHandling\ErrorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ErrorHandling\ErrorDialog.Designer.cs">
+      <DependentUpon>ErrorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ErrorHandling\ErrorHandling.cs">
+    </Compile>
+    <Compile Include="ErrorHandling\FrameworkVersionErrorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ErrorHandling\FrameworkVersionErrorDialog.Designer.cs">
+      <DependentUpon>FrameworkVersionErrorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LightweightApplicationManager.cs" />
+    <Compile Include="Interfaces\IPluginFile.cs" />
+    <Compile Include="Interfaces\IApplicationManager.cs" />
+    <Compile Include="Interfaces\IApplicationDescription.cs" />
+    <Compile Include="Interfaces\IApplication.cs" />
+    <Compile Include="Interfaces\IControlManager.cs" />
+    <Compile Include="Interfaces\IPlugin.cs" />
+    <Compile Include="ControlManager.cs" />
+    <Compile Include="Interfaces\IPluginDescription.cs" />
+    <Compile Include="InvalidPluginException.cs" />
+    <Compile Include="Manager\ApplicationDescription.cs" />
+    <Compile Include="Manager\PluginFile.cs" />
+    <Compile Include="Manager\PluginInfrastructureCancelEventArgs.cs" />
+    <Compile Include="Manager\PluginDescription.cs" />
+    <Compile Include="Manager\PluginInfrastructureEventArgs.cs" />
+    <Compile Include="Manager\PluginManager.cs" />
+    <Compile Include="Manager\PluginValidator.cs" />
+    <Compile Include="PluginDescriptionIterator.cs" />
+    <Compile Include="ApplicationManager.cs" />
+    <Compile Include="PluginState.cs" />
+    <Compile Include="Main.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TypeExtensions.cs" />
+    <None Include="Advanced\DeploymentService\GenerateServiceClients.cmd" />
+    <None Include="app.config">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <None Include="Properties\Settings.settings">
+      <Generator>PublicSettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Sandboxing\SandboxManager.cs" />
+    <Compile Include="Starter\AboutDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Starter\AboutDialog.Designer.cs">
+      <DependentUpon>AboutDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Starter\SplashScreen.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Starter\SplashScreen.Designer.cs">
+      <DependentUpon>SplashScreen.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Starter\StarterForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Starter\StarterForm.Designer.cs">
+      <DependentUpon>StarterForm.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="ICSharpCode.SharpZipLib License.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <Content Include="ICSharpCode.SharpZipLib.dll">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Content>
+    <EmbeddedResource Include="Advanced\DeploymentService\services.heuristiclab.com.cer" />
+    <None Include="Resources\Error.ico" />
+    <Content Include="Resources\HeuristicLab.ico" />
+    <None Include="Resources\HeuristicLabLogo.png" />
+    <None Include="Resources\HeuristicLabBanner.png" />
+    <Content Include="Resources\UpdateAvailable.ico" />
+    <Content Include="Resources\VS2008ImageLibrary_Actions_PublishToWebHS.png" />
+    <Content Include="Resources\VS2008ImageLibrary_Actions_RepeatHS.png" />
+    <None Include="Resources\VS2008ImageLibrary_Annotations_Error.png" />
+    <Content Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Add.png" />
+    <Content Include="Resources\VS2008ImageLibrary_Objects_Plugin.png" />
+    <EmbeddedResource Include="Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <None Include="Resources\VS2008ImageLibrary_CommonElements_Actions_Remove.png" />
+    <None Include="Resources\show_icons.png" />
+    <None Include="Resources\show_details.png" />
+    <None Include="Resources\Setup_Install.ico" />
+    <None Include="Resources\VS2008ImageLibrary_Objects_NetworkConnections.png" />
+    <None Include="Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up.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" />
+    <None Include="Resources\VS2008ImageLibrary_Objects_Assembly.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Service References\" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ICSharpCode.SharpZipLib License.txt
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ICSharpCode.SharpZipLib License.txt	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/ICSharpCode.SharpZipLib License.txt	(revision 9512)
@@ -0,0 +1,13 @@
+#ziplib (SharpZipLib, formerly NZipLib) is a Zip, GZip, Tar and BZip2 library written entirely in C# for the .NET platform. It is implemented as an assembly (installable in the GAC), and thus can easily be incorporated into other projects (in any .NET language). The creator of #ziplib put it this way: "I've ported the zip library over to C# because I needed gzip/zip compression and I didn't want to use libzip.dll or something like this. I want all in pure C#."
+
+License
+
+The library is released under the GPL with the following exception:
+
+Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination.
+
+As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.
+
+Note: The exception is changed to reflect the latest GNU Classpath exception. Older versions of #ziplib did have another exception, but the new one is clearer and it doesn't break compatibility with the old one.
+
+Bottom line: In plain English this means you can use this library in commercial closed-source applications.
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplication.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplication.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplication.cs	(revision 9512)
@@ -0,0 +1,41 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Interface that must be implemented by HeuristicLab applications.
+  /// </summary>
+  public interface IApplication {
+    /// <summary>
+    /// Gets the name of the application.
+    /// </summary>
+    string Name { get; }
+    /// <summary>
+    /// Gets the description of the application.
+    /// </summary>
+    string Description { get; }
+    /// <summary>
+    /// Main entry point for the application.
+    /// </summary>
+    void Run(ICommandLineArgument[] args);
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationDescription.cs	(revision 9512)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents meta-data of an application.
+  /// </summary>
+  public interface IApplicationDescription {
+    /// <summary>
+    /// Gets the name of the application.
+    /// </summary>
+    string Name { get; }
+    /// <summary>
+    /// Gets the description of the application.
+    /// </summary>
+    string Description { get; }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs	(revision 9512)
@@ -0,0 +1,97 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Interface for application managers.
+  /// </summary>
+  public interface IApplicationManager {
+    /// <summary>
+    /// Gets all discovered plugins.
+    /// </summary>
+    IEnumerable<IPluginDescription> Plugins { get; }
+
+    /// <summary>
+    /// Gets all discovered applications.
+    /// </summary>
+    IEnumerable<IApplicationDescription> Applications { get; }
+
+    /// <summary>
+    /// Discovers and creates instances of <typeparamref name="T"/> and all types implementing or inheriting <typeparamref name="T"/> (directly and indirectly).
+    /// </summary>
+    /// <typeparam name="T">The type or super-type to discover.</typeparam>
+    /// <returns>An enumerable of instances of the discovered types.</returns>
+    IEnumerable<T> GetInstances<T>() where T : class;
+
+    /// <summary>
+    /// Discovers and creates instances of <paramref name="type"/> and all types implementing or inheriting <paramref name="type"/> (directly and indirectly).
+    /// </summary>
+    /// <param name="type">The type or super-type to discover.</param>
+    /// <returns>An enumerable of instances of the discovered types.</returns>
+    IEnumerable<object> GetInstances(Type type);
+
+    /// <summary>
+    /// Discovers all types implementing or inheriting <paramref name="type"/> (directly and indirectly).
+    /// </summary>
+    /// <param name="type">The type to discover.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable (instance, abstract... are not returned)</param>
+    /// <returns>An enumerable of discovered types.</returns>
+    IEnumerable<Type> GetTypes(Type type, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false);
+
+    /// <summary>
+    /// Discovers all types implementing or inheriting all or any type in <paramref name="types"/> (directly and indirectly).
+    /// </summary>
+    /// <param name="types">The types to discover.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable (instance, abstract... are not returned)</param>
+    /// <param name="assignableToAllTypes">Specifies if discovered types must implement or inherit all given <paramref name="types"/>.</param>
+    /// <returns>An enumerable of discovered types.</returns>
+    IEnumerable<Type> GetTypes(IEnumerable<Type> types, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false, bool assignableToAllTypes = true);
+
+    /// <summary>
+    /// Discovers all types implementing or inheriting <paramref name="type"/> (directly and indirectly) that are declaed in any assembly of <paramref name="plugin"/>.
+    /// </summary>
+    /// <param name="type">The type to discover.</param>
+    /// <param name="plugin">The declaring plugin.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable (instance, abstract... are not returned)</param>
+    /// <returns>An enumerable of discovered types.</returns>
+    IEnumerable<Type> GetTypes(Type type, IPluginDescription plugin, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false);
+
+    /// <summary>
+    /// Discovers all types implementing or inheriting all or any type in <paramref name="types"/> (directly and indirectly) that are declaed in any assembly of <paramref name="plugin"/>.
+    /// </summary>
+    /// <param name="types">The types to discover.</param>
+    /// <param name="plugin">The declaring plugin.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable (instance, abstract... are not returned)</param>
+    /// /// <param name="assignableToAllTypes">Specifies if discovered types must implement or inherit all given <paramref name="types"/>.</param>
+    /// <returns>An enumerable of discovered types.</returns>
+    IEnumerable<Type> GetTypes(IEnumerable<Type> types, IPluginDescription plugin, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false, bool assignableToAllTypes = true);
+
+    /// <summary>
+    /// Finds the plugin that declares the <paramref name="type">type</paramref>.
+    /// </summary>
+    /// <param name="type">The type of interest.</param>
+    /// <returns>The description of the plugin that declares the given type or null if the type has not been declared by a known plugin.</returns>
+    IPluginDescription GetDeclaringPlugin(Type type);
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IControlManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IControlManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IControlManager.cs	(revision 9512)
@@ -0,0 +1,34 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Interface for control managers.
+  /// </summary>
+  public interface IControlManager {
+    /// <summary>
+    /// Shows the given <paramref name="control"/>.
+    /// </summary>
+    /// <param name="control">The control to display.</param>
+    void ShowControl(object control);
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPlugin.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPlugin.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPlugin.cs	(revision 9512)
@@ -0,0 +1,48 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents a plugin.
+  /// Plugin developers have to include exactly one class that implements this interface in one of the
+  /// assemblies of the plugin. 
+  /// OnLoad() and OnUnLoad() are called by the framework when the plugin is loaded/unloaded.
+  /// </summary>
+  public interface IPlugin {
+    /// <summary>
+    /// Gets the name of the plugin.
+    /// </summary>
+    string Name { get; }
+
+    /// <summary>
+    /// Called by the framework whenever the plugin is loaded.
+    /// Plugins are loaded when a new application is started from the starter.
+    /// </summary>
+    void OnLoad();
+
+    /// <summary>
+    /// Called by the framework whenever the plugin is unloaded.
+    /// Plugins are unloaded when an application exits.
+    /// </summary>
+    void OnUnload();
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginDescription.cs	(revision 9512)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents meta-data of a plugin.
+  /// </summary>
+  public interface IPluginDescription {
+    /// <summary>
+    /// Gets the name of the plugin.
+    /// </summary>
+    string Name { get; }
+    /// <summary>
+    /// Gets the version of the plugin.
+    /// </summary>
+    Version Version { get; }
+    /// <summary>
+    /// Gets the description of the plugin.
+    /// </summary>
+    string Description { get; }
+    /// <summary>
+    /// Gets the dependencies of the plugin.
+    /// </summary>
+    IEnumerable<IPluginDescription> Dependencies { get; }
+    /// <summary>
+    /// Gets the file names of files that are part of the plugin.
+    /// </summary>
+    IEnumerable<IPluginFile> Files { get; }
+    /// <summary>
+    /// Gets the name of the contact person of the plugin.
+    /// </summary>
+    string ContactName { get; }
+    /// <summary>
+    /// Gets the e-mail address of the contact person of the plugin.
+    /// </summary>
+    string ContactEmail { get; }
+    /// <summary>
+    /// Gets the license text of the plugin.
+    /// </summary>
+    string LicenseText { get; }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginFile.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginFile.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IPluginFile.cs	(revision 9512)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents a file of a plugin (name and type).
+  /// </summary>
+  public interface IPluginFile {
+    /// <summary>
+    /// Gets the name of the file.
+    /// </summary>
+    string Name { get; }
+    /// <summary>
+    /// Gets the type of the file.
+    /// </summary>
+    PluginFileType Type { get; }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/InvalidPluginException.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/InvalidPluginException.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/InvalidPluginException.cs	(revision 9512)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Exception class for invalid plugins.
+  /// </summary>
+  [Serializable]
+  public sealed class InvalidPluginException : Exception {
+    /// <summary>
+    /// Initializes a new InvalidPluginException
+    /// </summary>
+    public InvalidPluginException() : base() { }
+    /// <summary>
+    /// Initializes a new InvalidPluginException with an error message.
+    /// </summary>
+    /// <param name="message">The exception message</param>
+    public InvalidPluginException(string message) : base(message) { }
+    /// <summary>
+    /// Initializes a new InvalidPluginException with an error message and an inner exception.
+    /// </summary>
+    /// <param name="message">The exception message.</param>
+    /// <param name="innerException">The original exception.</param>
+    public InvalidPluginException(string message, Exception innerException) : base(message, innerException) { }
+    /// <summary>
+    /// Constructor for serialization.
+    /// </summary>
+    /// <param name="info">The serialization info.</param>
+    /// <param name="contex">The serialization context.</param>
+    private InvalidPluginException(SerializationInfo info, StreamingContext contex) : base(info, contex) { }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 9512)
@@ -0,0 +1,198 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  /// <summary>
+  /// Lightweight application manager is set as the application manager as long as the plugin infrastructure is uninitialized.
+  /// The list of plugins and applications is empty. The default application manager is necessary to provide the type discovery
+  /// functionality in unit tests.
+  /// </summary>
+  internal sealed class LightweightApplicationManager : IApplicationManager {
+    internal LightweightApplicationManager() {
+      AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
+    }
+
+    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
+      return null;
+    }
+
+
+    #region IApplicationManager Members
+    /// <summary>
+    /// Gets an empty list of plugins. (LightweightApplicationManager doesn't support plugin discovery)
+    /// </summary>
+    public IEnumerable<IPluginDescription> Plugins {
+      get { return new IPluginDescription[0]; }
+    }
+
+    /// <summary>
+    /// Gets an empty list of applications. (LightweightApplicationManager doesn't support application discovery)
+    /// </summary>
+    public IEnumerable<IApplicationDescription> Applications {
+      get { return new IApplicationDescription[0]; }
+    }
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <returns>Enumerable of the created instances.</returns>
+    public IEnumerable<T> GetInstances<T>() where T : class {
+      return GetInstances(typeof(T)).Cast<T>();
+    }
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <param name="type">Most general type.</param>
+    /// <returns>Enumerable of the created instances.</returns>
+    public IEnumerable<object> GetInstances(Type type) {
+      List<object> instances = new List<object>();
+      foreach (Type t in GetTypes(type)) {
+        object instance = null;
+        try { instance = Activator.CreateInstance(t); }
+        catch { }
+        if (instance != null) instances.Add(instance);
+      }
+      return instances;
+    }
+
+    /// <summary>
+    /// Finds all instantiable types that are subtypes or equal to the specified types.
+    /// </summary>
+    /// <param name="types">Most general types for which to find matching types.</param>
+    /// <remarks>Return only types that are instantiable 
+    /// (interfaces, abstract classes... are not returned)</remarks>
+    /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    public IEnumerable<Type> GetTypes(IEnumerable<Type> types, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false, bool assignableToAllTypes = true) {
+      IEnumerable<Type> result = GetTypes(types.First(), onlyInstantiable, includeGenericTypeDefinitions);
+      foreach (Type type in types.Skip(1)) {
+        IEnumerable<Type> discoveredTypes = GetTypes(type, onlyInstantiable, includeGenericTypeDefinitions);
+        if (assignableToAllTypes) result = result.Intersect(discoveredTypes);
+        else result = result.Union(discoveredTypes);
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Finds all types that are subtypes or equal to the specified type.
+    /// </summary>
+    /// <param name="type">Most general type for which to find matching types.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable 
+    /// (interfaces, abstract classes... are not returned)</param>
+    /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    public IEnumerable<Type> GetTypes(Type type, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false) {
+      return from asm in AppDomain.CurrentDomain.GetAssemblies()
+             from t in GetTypes(type, asm, onlyInstantiable, includeGenericTypeDefinitions)
+             select t;
+    }
+
+    /// <summary>
+    /// Gets types that are assignable (same of subtype) to the specified type only from the given assembly.
+    /// </summary>
+    /// <param name="type">Most general type we want to find.</param>
+    /// <param name="assembly">Assembly that should be searched for types.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable 
+    /// (interfaces, abstract classes...  are not returned)</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    private static IEnumerable<Type> GetTypes(Type type, Assembly assembly, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false) {
+      try {
+        // necessary to make sure the exception is immediately thrown
+        // instead of later when the enumerable is iterated?
+        var assemblyTypes = assembly.GetTypes();
+
+        var matchingTypes = from assemblyType in assembly.GetTypes()
+                            let t = assemblyType.BuildType(type)
+                            where t != null
+                            where t.IsSubTypeOf(type)
+                            where !t.IsNonDiscoverableType()
+                            where onlyInstantiable == false || (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
+                            where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
+                            select t;
+
+        return matchingTypes;
+      }
+      catch (TypeLoadException) {
+        return Enumerable.Empty<Type>();
+      }
+      catch (ReflectionTypeLoadException) {
+        return Enumerable.Empty<Type>();
+      }
+    }
+
+    /// <summary>
+    /// Not supported by the LightweightApplicationManager
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="plugin"></param>
+    /// <returns></returns>
+    /// <throws>NotSupportedException</throws>
+    public IEnumerable<Type> GetTypes(Type type, IPluginDescription plugin) {
+      throw new NotSupportedException("LightweightApplicationManager doesn't support type discovery for plugins.");
+    }
+
+    /// <summary>
+    /// Not supported by the LightweightApplicationManager
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="plugin"></param>
+    /// <param name="onlyInstantiable"></param>
+    /// <param name="includeGenericTypeDefinitions"></param>
+    /// <returns></returns>
+    /// <throws>NotSupportedException</throws>
+    public IEnumerable<Type> GetTypes(Type type, IPluginDescription plugin, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false) {
+      throw new NotSupportedException("LightweightApplicationManager doesn't support type discovery for plugins.");
+    }
+
+    /// <summary>
+    /// Not supported by the LightweightApplicationManager
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="plugin"></param>
+    /// <param name="onlyInstantiable"></param>
+    /// <param name="includeGenericTypeDefinitions"></param>
+    /// <returns></returns>
+    /// <throws>NotSupportedException</throws>
+    public IEnumerable<Type> GetTypes(IEnumerable<Type> types, IPluginDescription plugin, bool onlyInstantiable = true, bool includeGenericTypeDefinitions = false, bool assignableToAllTypes = true) {
+      throw new NotSupportedException("LightweightApplicationManager doesn't support type discovery for plugins.");
+    }
+
+    /// <summary>
+    /// Not supported by the LightweightApplicationManager
+    /// </summary>
+    /// <param name="type"></param>
+    /// <returns></returns>
+    /// <throws>NotSupportedException</throws>
+    public IPluginDescription GetDeclaringPlugin(Type type) {
+      throw new NotSupportedException("LightweightApplicationManager doesn't support type discovery for plugins.");
+    }
+
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Main.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Main.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Main.cs	(revision 9512)
@@ -0,0 +1,53 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Starter;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Static class that contains the main entry point of the plugin infrastructure.
+  /// </summary>
+  public static class Main {
+    /// <summary>
+    /// Main entry point of the plugin infrastructure. Loads the starter form.
+    /// </summary>
+    /// <param name="args">Command line arguments</param>
+    public static void Run(string[] args) {
+      if ((!FrameworkVersionErrorDialog.NET4FullProfileInstalled && !FrameworkVersionErrorDialog.MonoInstalled)
+        || (FrameworkVersionErrorDialog.MonoInstalled && !FrameworkVersionErrorDialog.MonoCorrectVersionInstalled)) {
+        Application.EnableVisualStyles();
+        Application.SetCompatibleTextRenderingDefault(false);
+        Application.Run(new FrameworkVersionErrorDialog());
+      } else {
+        try {
+          Application.EnableVisualStyles();
+          Application.SetCompatibleTextRenderingDefault(false);
+          Application.Run(new StarterForm(args));
+        }
+        catch (Exception ex) {
+          ErrorHandling.ShowErrorDialog(ex);
+        }
+      }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/ApplicationDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/ApplicationDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/ApplicationDescription.cs	(revision 9512)
@@ -0,0 +1,89 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  /// <summary>
+  /// Class that provides information about an application.
+  /// </summary>
+  [Serializable]
+  public sealed class ApplicationDescription : IApplicationDescription {
+    private string name;
+
+    /// <summary>
+    /// Gets or sets the name of the application.
+    /// </summary>
+    public string Name {
+      get { return name; }
+      internal set { name = value; }
+    }
+    private Version version;
+
+    /// <summary>
+    /// Gets or sets the version of the application.
+    /// </summary>
+    internal Version Version {
+      get { return version; }
+      set { version = value; }
+    }
+    private string description;
+
+    /// <summary>
+    /// Gets or sets the description of the application.
+    /// </summary>
+    public string Description {
+      get { return description; }
+      internal set { description = value; }
+    }
+
+    private bool autoRestart;
+    /// <summary>
+    /// Gets or sets the boolean flag if the application should be automatically restarted.
+    /// </summary>
+    internal bool AutoRestart {
+      get { return autoRestart; }
+      set { autoRestart = value; }
+    }
+
+    private string declaringAssemblyName;
+    /// <summary>
+    /// Gets or sets the name of the assembly that contains the IApplication type.
+    /// </summary>
+    internal string DeclaringAssemblyName {
+      get { return declaringAssemblyName; }
+      set { declaringAssemblyName = value; }
+    }
+
+    private string declaringTypeName;
+    /// <summary>
+    /// Gets or sets the name of the type that implements the interface IApplication.
+    /// </summary>
+    internal string DeclaringTypeName {
+      get { return declaringTypeName; }
+      set { declaringTypeName = value; }
+    }
+
+    public override string ToString() {
+      return Name + " " + Version;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginDescription.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginDescription.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginDescription.cs	(revision 9512)
@@ -0,0 +1,213 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  /// <summary>
+  /// Holds information of loaded plugins that is needed for plugin management.
+  /// Used to represent plugins in AppDomains without loading the plugin assemblies.
+  /// </summary>
+  [Serializable]
+  public sealed class PluginDescription : IPluginDescription {
+    private int nTimesLoaded;
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the plugin.
+    /// </summary>
+    public string Name {
+      get { return name; }
+      internal set { name = value; }
+    }
+
+    private string description;
+    /// <summary>
+    /// Gets or sets the description of the plugin.
+    /// </summary>
+    public string Description {
+      get { return description; }
+      internal set { description = value; }
+    }
+    private Version version;
+    /// <summary>
+    /// Gets the version of the plugin.
+    /// </summary>
+    public Version Version {
+      get { return version; }
+      internal set { version = value; }
+    }
+
+    private string contactName;
+    /// <summary>
+    /// Gets or sets the name of the contact person for this plugin.
+    /// </summary>
+    public string ContactName {
+      get { return contactName; }
+      internal set { contactName = value; }
+    }
+
+    private string contactEmail;
+    /// <summary>
+    /// Gets or sets the e-mail address of the contact person for this plugin.
+    /// </summary>
+    public string ContactEmail {
+      get { return contactEmail; }
+      internal set { contactEmail = value; }
+    }
+    private string licenseText;
+    /// <summary>
+    /// Gets or sets the license text of the plugin.
+    /// </summary>
+    public string LicenseText {
+      get { return licenseText; }
+      internal set { licenseText = value; }
+    }
+
+    private PluginState pluginState;
+    /// <summary>
+    /// Gets or sets the plugin state.
+    /// </summary>
+    public PluginState PluginState {
+      get { return pluginState; }
+    }
+
+    private string loadingErrorInformation;
+    /// <summary>
+    /// Gets the error message why this plugin has been disabled.
+    /// </summary>
+    internal string LoadingErrorInformation {
+      get {
+        return loadingErrorInformation;
+      }
+    }
+
+    private List<PluginFile> files = new List<PluginFile>();
+    /// <summary>
+    /// Gets the names of all files that belong to this plugin.
+    /// These files are deleted when the plugin is removed or updated.
+    /// </summary>
+    public IEnumerable<IPluginFile> Files {
+      get { return files.Cast<IPluginFile>(); }
+    }
+
+    internal void AddFiles(IEnumerable<PluginFile> fileNames) {
+      files.AddRange(fileNames);
+    }
+
+    private List<PluginDescription> dependencies = new List<PluginDescription>();
+    internal IEnumerable<PluginDescription> Dependencies {
+      get { return dependencies; }
+    }
+    /// <summary>
+    /// Gets all dependencies of the plugin.
+    /// </summary>
+    IEnumerable<IPluginDescription> IPluginDescription.Dependencies {
+      get { return dependencies.Cast<IPluginDescription>(); }
+    }
+
+    internal void AddDependency(PluginDescription dependency) {
+      dependencies.Add(dependency);
+    }
+
+
+    /// <summary>
+    /// Gets the locations (file names) of the assemblies that belong to this plugin.
+    /// </summary>
+    public IEnumerable<string> AssemblyLocations {
+      get { return Files.Where(f => f.Type == PluginFileType.Assembly).Select(f => f.Name); }
+    }
+
+    /// <summary>
+    /// Gets and sets the list of assembly names for this plugin. Assembly names are only available after the plugin has been loaded.
+    /// </summary>
+    private List<string> assemblyNames;
+    public IEnumerable<string> AssemblyNames {
+      get { return assemblyNames; }
+      set { this.assemblyNames = new List<string>(value); }
+    }
+
+    internal PluginDescription() {
+      pluginState = PluginState.Undefined;
+    }
+
+    internal void Disable(string loadingErrorInformation) {
+      if (pluginState != PluginState.Undefined)
+        throw new InvalidOperationException("Cannot disable a plugin in state " + pluginState);
+      pluginState = PluginState.Disabled;
+      this.loadingErrorInformation = loadingErrorInformation;
+    }
+
+    internal void Enable() {
+      if (pluginState != PluginState.Undefined)
+        throw new InvalidOperationException("Cannot enable a plugin in state " + pluginState);
+      pluginState = PluginState.Enabled;
+    }
+
+    internal void Load() {
+      if (!(pluginState == PluginState.Enabled || pluginState == PluginState.Loaded))
+        throw new InvalidOperationException("Cannot load a plugin in state " + pluginState);
+      pluginState = PluginState.Loaded;
+      nTimesLoaded++;
+    }
+
+    internal void Unload() {
+      if (pluginState != PluginState.Loaded)
+        throw new InvalidOperationException("Cannot unload a plugin in state " + pluginState);
+      nTimesLoaded--;
+      if (nTimesLoaded == 0) pluginState = PluginState.Enabled;
+    }
+
+
+    /// <summary>
+    /// Gets the string representation of the plugin.
+    /// </summary>
+    /// <returns>The name of the plugin.</returns>
+    public override string ToString() {
+      return Name + " " + Version;
+    }
+
+    // equals and hashcode have to be implemented because we want to compare PluginDescriptions from 
+    // different AppDomains and serialization destroys reference equality
+    /// <summary>
+    /// Checks whether the given object is equal to the current plugin.
+    /// </summary>
+    /// <param name="obj">The object to compare.</param>
+    /// <returns><c>true</c> if it is equal, <c>false</c> otherwise.</returns>
+    public override bool Equals(object obj) {
+      PluginDescription other = obj as PluginDescription;
+      if (other == null) return false;
+
+      return other.Name == this.Name && other.Version == this.Version;
+    }
+    /// <summary>
+    /// Gets the hash code of the current plugin.
+    /// </summary>
+    /// <returns>The hash code of the plugin.</returns>
+    public override int GetHashCode() {
+      if (version != null) {
+        return name.GetHashCode() + version.GetHashCode();
+      } else return name.GetHashCode();
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginFile.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginFile.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginFile.cs	(revision 9512)
@@ -0,0 +1,68 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  /// <summary>
+  /// Plugin files have a name and a type.
+  /// </summary>
+  [Serializable]
+  public sealed class PluginFile : IPluginFile {
+    #region IPluginFile Members
+
+    private string name;
+    /// <summary>
+    /// Gets the name of the file.
+    /// </summary>
+    public string Name {
+      get { return name; }
+    }
+
+    private PluginFileType type;
+    /// <summary>
+    /// Gets the type of the file.
+    /// </summary>
+    public PluginFileType Type {
+      get { return type; }
+    }
+
+    #endregion
+
+    /// <summary>
+    /// Inizialize a new instance of <see cref="PluginFile" />
+    /// </summary>
+    /// <param name="name">File name</param>
+    /// <param name="type">File type</param>
+    public PluginFile(string name, PluginFileType type) {
+      this.name = name;
+      this.type = type;
+    }
+
+    /// <summary>
+    /// ToString override for <see cref="PluginFile" />
+    /// </summary>
+    /// <returns>Plugin file name</returns>
+    public override string ToString() {
+      return name;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureCancelEventArgs.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureCancelEventArgs.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureCancelEventArgs.cs	(revision 9512)
@@ -0,0 +1,36 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  // to be replaced by GenericEventArgs
+  [Serializable]
+  internal sealed class PluginInfrastructureCancelEventArgs : CancelEventArgs {
+    internal IEnumerable<IPluginDescription> Plugins { get; private set; }
+    internal PluginInfrastructureCancelEventArgs(IEnumerable<IPluginDescription> plugins)
+      : base() {
+      this.Plugins = plugins;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureEventArgs.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureEventArgs.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginInfrastructureEventArgs.cs	(revision 9512)
@@ -0,0 +1,37 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  [Serializable]
+  public sealed class PluginInfrastructureEventArgs : EventArgs {
+    public object Entity { get; private set; }
+    public PluginInfrastructureEventArgs(object entity) {
+      this.Entity = entity;
+    }
+
+    private static PluginInfrastructureEventArgs emptyArgs = new PluginInfrastructureEventArgs(string.Empty);
+    public new static PluginInfrastructureEventArgs Empty {
+      get { return emptyArgs; }
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginManager.cs	(revision 9512)
@@ -0,0 +1,212 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Security.Permissions;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+
+  // must extend MarshalByRefObject because of event passing between Loader and PluginManager (each in it's own AppDomain)
+  /// <summary>
+  /// Class to manage different plugins.
+  /// </summary>
+  public sealed class PluginManager : MarshalByRefObject {
+    public event EventHandler<PluginInfrastructureEventArgs> PluginLoaded;
+    public event EventHandler<PluginInfrastructureEventArgs> PluginUnloaded;
+    public event EventHandler<PluginInfrastructureEventArgs> Initializing;
+    public event EventHandler<PluginInfrastructureEventArgs> Initialized;
+    public event EventHandler<PluginInfrastructureEventArgs> ApplicationStarting;
+    public event EventHandler<PluginInfrastructureEventArgs> ApplicationStarted;
+
+    private string pluginDir;
+
+    private List<PluginDescription> plugins;
+    /// <summary>
+    /// Gets all installed plugins.
+    /// </summary>
+    public IEnumerable<PluginDescription> Plugins {
+      get { return plugins; }
+    }
+
+    private List<ApplicationDescription> applications;
+    /// <summary>
+    /// Gets all installed applications.
+    /// </summary>
+    public IEnumerable<ApplicationDescription> Applications {
+      get { return applications; }
+    }
+
+    private object locker = new object();
+    private bool initialized;
+
+    public PluginManager(string pluginDir) {
+      this.pluginDir = pluginDir;
+      plugins = new List<PluginDescription>();
+      applications = new List<ApplicationDescription>();
+      initialized = false;
+    }
+
+    /// <summary>
+    /// Determines installed plugins and checks if all plugins are loadable.
+    /// </summary>
+    public void DiscoverAndCheckPlugins() {
+      OnInitializing(PluginInfrastructureEventArgs.Empty);
+      AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
+      setup.ApplicationBase = pluginDir;
+      AppDomain pluginDomain = null;
+      try {
+        pluginDomain = AppDomain.CreateDomain("plugin domain", null, setup);
+        Type pluginValidatorType = typeof(PluginValidator);
+        PluginValidator remoteValidator = (PluginValidator)pluginDomain.CreateInstanceAndUnwrap(pluginValidatorType.Assembly.FullName, pluginValidatorType.FullName, true, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null, null);
+        remoteValidator.PluginDir = pluginDir;
+        // forward all events from the remoteValidator to listeners
+        remoteValidator.PluginLoaded +=
+          delegate(object sender, PluginInfrastructureEventArgs e) {
+            OnPluginLoaded(e);
+          };
+        // get list of plugins and applications from the validator
+        plugins.Clear(); applications.Clear();
+        plugins.AddRange(remoteValidator.Plugins);
+        applications.AddRange(remoteValidator.Applications);
+      }
+      finally {
+        // discard the AppDomain that was used for plugin discovery
+        AppDomain.Unload(pluginDomain);
+        // unload all plugins
+        foreach (var pluginDescription in plugins.Where(x => x.PluginState == PluginState.Loaded)) {
+          pluginDescription.Unload();
+          OnPluginUnloaded(new PluginInfrastructureEventArgs(pluginDescription));
+        }
+        initialized = true;
+        OnInitialized(PluginInfrastructureEventArgs.Empty);
+      }
+    }
+
+
+    /// <summary>
+    /// Starts an application in a separate AppDomain.
+    /// Loads all enabled plugins and starts the application via an ApplicationManager instance activated in the new AppDomain.
+    /// </summary>
+    /// <param name="appInfo">application to run</param>
+    public void Run(ApplicationDescription appInfo, ICommandLineArgument[] args) {
+      if (!initialized) throw new InvalidOperationException("PluginManager is not initialized. DiscoverAndCheckPlugins() must be called before Run()");
+      // create a separate AppDomain for the application
+      // initialize the static ApplicationManager in the AppDomain
+      // and remotely tell it to start the application
+
+      OnApplicationStarting(new PluginInfrastructureEventArgs(appInfo));
+      AppDomain applicationDomain = null;
+      try {
+        AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
+        setup.PrivateBinPath = pluginDir;
+        applicationDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName, null, setup);
+        Type applicationManagerType = typeof(DefaultApplicationManager);
+        DefaultApplicationManager applicationManager =
+          (DefaultApplicationManager)applicationDomain.CreateInstanceAndUnwrap(applicationManagerType.Assembly.FullName, applicationManagerType.FullName, true, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null, null);
+        applicationManager.PluginLoaded += applicationManager_PluginLoaded;
+        applicationManager.PluginUnloaded += applicationManager_PluginUnloaded;
+        applicationManager.PrepareApplicationDomain(applications, plugins);
+        OnApplicationStarted(new PluginInfrastructureEventArgs(appInfo));
+        applicationManager.Run(appInfo, args);
+      }
+      finally {
+        // make sure domain is unloaded in all cases
+        AppDomain.Unload(applicationDomain);
+      }
+    }
+
+    private void applicationManager_PluginUnloaded(object sender, PluginInfrastructureEventArgs e) {
+      // unload the matching plugin description (
+      PluginDescription desc = (PluginDescription)e.Entity;
+
+      // access to plugin descriptions has to be synchronized because multiple applications 
+      // can be started or stopped at the same time
+      lock (locker) {
+        // also unload the matching plugin description in this AppDomain
+        plugins.First(x => x.Equals(desc)).Unload();
+      }
+      OnPluginUnloaded(e);
+    }
+
+    private void applicationManager_PluginLoaded(object sender, PluginInfrastructureEventArgs e) {
+      // load the matching plugin description (
+      PluginDescription desc = (PluginDescription)e.Entity;
+      // access to plugin descriptions has to be synchronized because multiple applications 
+      // can be started or stopped at the same time
+      lock (locker) {
+        // also load the matching plugin description in this AppDomain
+        plugins.First(x => x.Equals(desc)).Load();
+      }
+      OnPluginLoaded(e);
+    }
+
+    #region event raising methods
+    private void OnPluginLoaded(PluginInfrastructureEventArgs e) {
+      if (PluginLoaded != null) {
+        PluginLoaded(this, e);
+      }
+    }
+
+    private void OnPluginUnloaded(PluginInfrastructureEventArgs e) {
+      if (PluginUnloaded != null) {
+        PluginUnloaded(this, e);
+      }
+    }
+
+    private void OnInitializing(PluginInfrastructureEventArgs e) {
+      if (Initializing != null) {
+        Initializing(this, e);
+      }
+    }
+
+    private void OnInitialized(PluginInfrastructureEventArgs e) {
+      if (Initialized != null) {
+        Initialized(this, e);
+      }
+    }
+
+    private void OnApplicationStarting(PluginInfrastructureEventArgs e) {
+      if (ApplicationStarting != null) {
+        ApplicationStarting(this, e);
+      }
+    }
+
+    private void OnApplicationStarted(PluginInfrastructureEventArgs e) {
+      if (ApplicationStarted != null) {
+        ApplicationStarted(this, e);
+      }
+    }
+    #endregion
+
+    // infinite lease time
+    /// <summary>
+    /// Make sure that the plugin manager is never disposed (necessary for cross-app-domain events)
+    /// </summary>
+    /// <returns><c>null</c>.</returns>
+    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
+    public override object InitializeLifetimeService() {
+      return null;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginValidator.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginValidator.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Manager/PluginValidator.cs	(revision 9512)
@@ -0,0 +1,634 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Security;
+using System.Text;
+
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  /// <summary>
+  /// Discovers all installed plugins in the plugin directory. Checks correctness of plugin meta-data and if
+  /// all plugin files are available and checks plugin dependencies. 
+  /// </summary>
+  internal sealed class PluginValidator : MarshalByRefObject {
+    // private class to store plugin dependency declarations while reflecting over plugins
+    private class PluginDependency {
+      public string Name { get; private set; }
+      public Version Version { get; private set; }
+
+      public PluginDependency(string name, Version version) {
+        this.Name = name;
+        this.Version = version;
+      }
+    }
+
+
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginLoaded;
+
+    private Dictionary<PluginDescription, IEnumerable<PluginDependency>> pluginDependencies;
+
+    private List<ApplicationDescription> applications;
+    internal IEnumerable<ApplicationDescription> Applications {
+      get {
+        if (string.IsNullOrEmpty(PluginDir)) throw new InvalidOperationException("PluginDir is not set.");
+        if (applications == null) DiscoverAndCheckPlugins();
+        return applications;
+      }
+    }
+
+    private IEnumerable<PluginDescription> plugins;
+    internal IEnumerable<PluginDescription> Plugins {
+      get {
+        if (string.IsNullOrEmpty(PluginDir)) throw new InvalidOperationException("PluginDir is not set.");
+        if (plugins == null) DiscoverAndCheckPlugins();
+        return plugins;
+      }
+    }
+
+    internal string PluginDir { get; set; }
+
+    internal PluginValidator() {
+      this.pluginDependencies = new Dictionary<PluginDescription, IEnumerable<PluginDependency>>();
+
+      // ReflectionOnlyAssemblyResolveEvent must be handled because we load assemblies from the plugin path 
+      // (which is not listed in the default assembly lookup locations)
+      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ReflectionOnlyAssemblyResolveEventHandler;
+    }
+
+    private Dictionary<string, Assembly> reflectionOnlyAssemblies = new Dictionary<string, Assembly>();
+    private Assembly ReflectionOnlyAssemblyResolveEventHandler(object sender, ResolveEventArgs args) {
+      if (reflectionOnlyAssemblies.ContainsKey(args.Name))
+        return reflectionOnlyAssemblies[args.Name];
+      else
+        return Assembly.ReflectionOnlyLoad(args.Name);
+    }
+
+
+    /// <summary>
+    /// Init first clears all internal datastructures (including plugin lists)
+    /// 1. All assemblies in the plugins directory are loaded into the reflection only context.
+    /// 2. The validator checks if all necessary files for each plugin are available.
+    /// 3. The validator checks if all declared plugin assemblies can be loaded.
+    /// 4. The validator builds the tree of plugin descriptions (dependencies)
+    /// 5. The validator checks if there are any cycles in the plugin dependency graph and disables plugin with circular dependencies
+    /// 6. The validator checks for each plugin if any dependency is disabled.
+    /// 7. All plugins that are not disabled are loaded into the execution context.
+    /// 8. Each loaded plugin (all assemblies) is searched for a types that implement IPlugin
+    ///    then one instance of each IPlugin type is activated and the OnLoad hook is called.
+    /// 9. All types implementing IApplication are discovered
+    /// </summary>
+    internal void DiscoverAndCheckPlugins() {
+      pluginDependencies.Clear();
+
+      IEnumerable<Assembly> reflectionOnlyAssemblies = ReflectionOnlyLoadDlls(PluginDir);
+      IEnumerable<PluginDescription> pluginDescriptions = GatherPluginDescriptions(reflectionOnlyAssemblies);
+      CheckPluginFiles(pluginDescriptions);
+
+      // check if all plugin assemblies can be loaded
+      CheckPluginAssemblies(pluginDescriptions);
+
+      // a full list of plugin descriptions is available now we can build the dependency tree
+      BuildDependencyTree(pluginDescriptions);
+
+      // check for dependency cycles
+      CheckPluginDependencyCycles(pluginDescriptions);
+
+      // 1st time recursively check if all necessary plugins are available and not disabled
+      // disable plugins with missing or disabled dependencies 
+      // to prevent that plugins with missing dependencies are loaded into the execution context
+      // in the next step
+      CheckPluginDependencies(pluginDescriptions);
+
+      // test full loading (in contrast to reflection only loading) of plugins
+      // disables plugins that are not loaded correctly
+      CheckExecutionContextLoad(pluginDescriptions);
+
+      // 2nd time recursively check if all necessary plugins have been loaded successfully and not disabled
+      // disable plugins with for which dependencies could not be loaded successfully
+      CheckPluginDependencies(pluginDescriptions);
+
+      // mark all plugins as enabled that were not disabled in CheckPluginFiles, CheckPluginAssemblies, 
+      // CheckCircularDependencies, CheckPluginDependencies and CheckExecutionContextLoad
+      foreach (var desc in pluginDescriptions)
+        if (desc.PluginState != PluginState.Disabled)
+          desc.Enable();
+
+      // load the enabled plugins
+      LoadPlugins(pluginDescriptions);
+
+      plugins = pluginDescriptions;
+      DiscoverApplications(pluginDescriptions);
+    }
+
+    private void DiscoverApplications(IEnumerable<PluginDescription> pluginDescriptions) {
+      applications = new List<ApplicationDescription>();
+      foreach (IApplication application in GetApplications(pluginDescriptions)) {
+        Type appType = application.GetType();
+        ApplicationAttribute attr = (from x in appType.GetCustomAttributes(typeof(ApplicationAttribute), false)
+                                     select (ApplicationAttribute)x).Single();
+        ApplicationDescription info = new ApplicationDescription();
+        PluginDescription declaringPlugin = GetDeclaringPlugin(appType, pluginDescriptions);
+        info.Name = application.Name;
+        info.Version = declaringPlugin.Version;
+        info.Description = application.Description;
+        info.AutoRestart = attr.RestartOnErrors;
+        info.DeclaringAssemblyName = appType.Assembly.GetName().Name;
+        info.DeclaringTypeName = appType.Namespace + "." + application.GetType().Name;
+
+        applications.Add(info);
+      }
+    }
+
+    private static IEnumerable<IApplication> GetApplications(IEnumerable<PluginDescription> pluginDescriptions) {
+      return from asm in AppDomain.CurrentDomain.GetAssemblies()
+             from t in asm.GetTypes()
+             where typeof(IApplication).IsAssignableFrom(t) &&
+               !t.IsAbstract && !t.IsInterface && !t.HasElementType
+             where GetDeclaringPlugin(t, pluginDescriptions).PluginState != PluginState.Disabled
+             select (IApplication)Activator.CreateInstance(t);
+    }
+
+    private IEnumerable<Assembly> ReflectionOnlyLoadDlls(string baseDir) {
+      List<Assembly> assemblies = new List<Assembly>();
+      // recursively load .dll files in subdirectories
+      foreach (string dirName in Directory.GetDirectories(baseDir)) {
+        assemblies.AddRange(ReflectionOnlyLoadDlls(dirName));
+      }
+      // try to load each .dll file in the plugin directory into the reflection only context
+      foreach (string filename in Directory.GetFiles(baseDir, "*.dll").Union(Directory.GetFiles(baseDir, "*.exe"))) {
+        try {
+          Assembly asm = Assembly.ReflectionOnlyLoadFrom(filename);
+          RegisterLoadedAssembly(asm);
+          assemblies.Add(asm);
+        }
+        catch (BadImageFormatException) { } // just ignore the case that the .dll file is not a CLR assembly (e.g. a native dll)
+        catch (FileLoadException) { }
+        catch (SecurityException) { }
+        catch (ReflectionTypeLoadException) { } // referenced assemblies are missing
+      }
+      return assemblies;
+    }
+
+    /// <summary>
+    /// Checks if all plugin assemblies can be loaded. If an assembly can't be loaded the plugin is disabled.
+    /// </summary>
+    /// <param name="pluginDescriptions"></param>
+    private void CheckPluginAssemblies(IEnumerable<PluginDescription> pluginDescriptions) {
+      foreach (var desc in pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled)) {
+        try {
+          var missingAssemblies = new List<string>();
+          foreach (var asmLocation in desc.AssemblyLocations) {
+            // the assembly must have been loaded in ReflectionOnlyDlls
+            // so we simply determine the name of the assembly and try to find it in the cache of loaded assemblies
+            var asmName = AssemblyName.GetAssemblyName(asmLocation);
+            if (!reflectionOnlyAssemblies.ContainsKey(asmName.FullName)) {
+              missingAssemblies.Add(asmName.FullName);
+            }
+          }
+          if (missingAssemblies.Count > 0) {
+            StringBuilder errorStrBuiler = new StringBuilder();
+            errorStrBuiler.AppendLine("Missing assemblies:");
+            foreach (string missingAsm in missingAssemblies) {
+              errorStrBuiler.AppendLine(missingAsm);
+            }
+            desc.Disable(errorStrBuiler.ToString());
+          }
+        }
+        catch (BadImageFormatException ex) {
+          // disable the plugin
+          desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "BadImageFormatException: " + ex.Message);
+        }
+        catch (FileNotFoundException ex) {
+          // disable the plugin
+          desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "FileNotFoundException: " + ex.Message);
+        }
+        catch (FileLoadException ex) {
+          // disable the plugin
+          desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "FileLoadException: " + ex.Message);
+        }
+        catch (ArgumentException ex) {
+          // disable the plugin
+          desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "ArgumentException: " + ex.Message);
+        }
+        catch (SecurityException ex) {
+          // disable the plugin
+          desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "SecurityException: " + ex.Message);
+        }
+      }
+    }
+
+
+    // find all types implementing IPlugin in the reflectionOnlyAssemblies and create a list of plugin descriptions
+    // the dependencies in the plugin descriptions are not yet set correctly because we need to create
+    // the full list of all plugin descriptions first
+    private IEnumerable<PluginDescription> GatherPluginDescriptions(IEnumerable<Assembly> assemblies) {
+      List<PluginDescription> pluginDescriptions = new List<PluginDescription>();
+      foreach (Assembly assembly in assemblies) {
+        // GetExportedTypes throws FileNotFoundException when a referenced assembly
+        // of the current assembly is missing.
+        try {
+          // if there is a type that implements IPlugin
+          // use AssemblyQualifiedName to compare the types because we can't directly 
+          // compare ReflectionOnly types and execution types
+          var assemblyPluginDescriptions = from t in assembly.GetExportedTypes()
+                                           where !t.IsAbstract && t.GetInterfaces().Any(x => x.AssemblyQualifiedName == typeof(IPlugin).AssemblyQualifiedName)
+                                           select GetPluginDescription(t);
+          pluginDescriptions.AddRange(assemblyPluginDescriptions);
+        }
+        // ignore exceptions. Just don't yield a plugin description when an exception is thrown
+        catch (FileNotFoundException) {
+        }
+        catch (FileLoadException) {
+        }
+        catch (InvalidPluginException) {
+        }
+        catch (TypeLoadException) {
+        }
+        catch (MissingMemberException) {
+        }
+      }
+      return pluginDescriptions;
+    }
+
+    /// <summary>
+    /// Extracts plugin information for this type.
+    /// Reads plugin name, list and type of files and dependencies of the plugin. This information is necessary for
+    /// plugin dependency checking before plugin activation.
+    /// </summary>
+    /// <param name="pluginType"></param>
+    private PluginDescription GetPluginDescription(Type pluginType) {
+
+      string pluginName, pluginDescription, pluginVersion;
+      string contactName, contactAddress;
+      GetPluginMetaData(pluginType, out pluginName, out pluginDescription, out pluginVersion);
+      GetPluginContactMetaData(pluginType, out contactName, out contactAddress);
+      var pluginFiles = GetPluginFilesMetaData(pluginType);
+      var pluginDependencies = GetPluginDependencyMetaData(pluginType);
+
+      // minimal sanity check of the attribute values
+      if (!string.IsNullOrEmpty(pluginName) &&
+          pluginFiles.Count() > 0 &&                                 // at least one file
+          pluginFiles.Any(f => f.Type == PluginFileType.Assembly)) { // at least one assembly
+        // create a temporary PluginDescription that contains the attribute values
+        PluginDescription info = new PluginDescription();
+        info.Name = pluginName;
+        info.Description = pluginDescription;
+        info.Version = new Version(pluginVersion);
+        info.ContactName = contactName;
+        info.ContactEmail = contactAddress;
+        info.LicenseText = ReadLicenseFiles(pluginFiles);
+        info.AddFiles(pluginFiles);
+
+        this.pluginDependencies[info] = pluginDependencies;
+        return info;
+      } else {
+        throw new InvalidPluginException("Invalid metadata in plugin " + pluginType.ToString());
+      }
+    }
+
+    private static string ReadLicenseFiles(IEnumerable<PluginFile> pluginFiles) {
+      // combine the contents of all plugin files 
+      var licenseFiles = from file in pluginFiles
+                         where file.Type == PluginFileType.License
+                         select file;
+      if (licenseFiles.Count() == 0) return string.Empty;
+      StringBuilder licenseTextBuilder = new StringBuilder();
+      licenseTextBuilder.AppendLine(File.ReadAllText(licenseFiles.First().Name));
+      foreach (var licenseFile in licenseFiles.Skip(1)) {
+        licenseTextBuilder.AppendLine().AppendLine(); // leave some empty space between multiple license files
+        licenseTextBuilder.AppendLine(File.ReadAllText(licenseFile.Name));
+      }
+      return licenseTextBuilder.ToString();
+    }
+
+    private static IEnumerable<PluginDependency> GetPluginDependencyMetaData(Type pluginType) {
+      // get all attributes of type PluginDependency
+      var dependencyAttributes = from attr in CustomAttributeData.GetCustomAttributes(pluginType)
+                                 where IsAttributeDataForType(attr, typeof(PluginDependencyAttribute))
+                                 select attr;
+
+      foreach (var dependencyAttr in dependencyAttributes) {
+        string name = (string)dependencyAttr.ConstructorArguments[0].Value;
+        Version version = new Version("0.0.0.0"); // default version
+        // check if version is given for now
+        // later when the constructor of PluginDependencyAttribute with only one argument has been removed
+        // this conditional can be removed as well
+        if (dependencyAttr.ConstructorArguments.Count > 1) {
+          try {
+            version = new Version((string)dependencyAttr.ConstructorArguments[1].Value); // might throw FormatException
+          }
+          catch (FormatException ex) {
+            throw new InvalidPluginException("Invalid version format of dependency " + name + " in plugin " + pluginType.ToString(), ex);
+          }
+        }
+        yield return new PluginDependency(name, version);
+      }
+    }
+
+    private static void GetPluginContactMetaData(Type pluginType, out string contactName, out string contactAddress) {
+      // get attribute of type ContactInformation if there is any
+      var contactInfoAttribute = (from attr in CustomAttributeData.GetCustomAttributes(pluginType)
+                                  where IsAttributeDataForType(attr, typeof(ContactInformationAttribute))
+                                  select attr).SingleOrDefault();
+
+      if (contactInfoAttribute != null) {
+        contactName = (string)contactInfoAttribute.ConstructorArguments[0].Value;
+        contactAddress = (string)contactInfoAttribute.ConstructorArguments[1].Value;
+      } else {
+        contactName = string.Empty;
+        contactAddress = string.Empty;
+      }
+    }
+
+    // not static because we need the PluginDir property
+    private IEnumerable<PluginFile> GetPluginFilesMetaData(Type pluginType) {
+      // get all attributes of type PluginFileAttribute
+      var pluginFileAttributes = from attr in CustomAttributeData.GetCustomAttributes(pluginType)
+                                 where IsAttributeDataForType(attr, typeof(PluginFileAttribute))
+                                 select attr;
+      foreach (var pluginFileAttribute in pluginFileAttributes) {
+        string pluginFileName = (string)pluginFileAttribute.ConstructorArguments[0].Value;
+        PluginFileType fileType = (PluginFileType)pluginFileAttribute.ConstructorArguments[1].Value;
+        yield return new PluginFile(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName)), fileType);
+      }
+    }
+
+    private static void GetPluginMetaData(Type pluginType, out string pluginName, out string pluginDescription, out string pluginVersion) {
+      // there must be a single attribute of type PluginAttribute
+      var pluginMetaDataAttr = (from attr in CustomAttributeData.GetCustomAttributes(pluginType)
+                                where IsAttributeDataForType(attr, typeof(PluginAttribute))
+                                select attr).Single();
+
+      pluginName = (string)pluginMetaDataAttr.ConstructorArguments[0].Value;
+
+      // default description and version
+      pluginVersion = "0.0.0.0";
+      pluginDescription = string.Empty;
+      if (pluginMetaDataAttr.ConstructorArguments.Count() == 2) {
+        // if two arguments are given the second argument is the version
+        pluginVersion = (string)pluginMetaDataAttr.ConstructorArguments[1].Value;
+      } else if (pluginMetaDataAttr.ConstructorArguments.Count() == 3) {
+        // if three arguments are given the second argument is the description and the third is the version
+        pluginDescription = (string)pluginMetaDataAttr.ConstructorArguments[1].Value;
+        pluginVersion = (string)pluginMetaDataAttr.ConstructorArguments[2].Value;
+      }
+    }
+
+    private static bool IsAttributeDataForType(CustomAttributeData attributeData, Type attributeType) {
+      return attributeData.Constructor.DeclaringType.AssemblyQualifiedName == attributeType.AssemblyQualifiedName;
+    }
+
+    // builds a dependency tree of all plugin descriptions
+    // searches matching plugin descriptions based on the list of dependency names for each plugin
+    // and sets the dependencies in the plugin descriptions
+    private void BuildDependencyTree(IEnumerable<PluginDescription> pluginDescriptions) {
+      foreach (var desc in pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled)) {
+        var missingDependencies = new List<PluginDependency>();
+        foreach (var dependency in pluginDependencies[desc]) {
+          var matchingDescriptions = from availablePlugin in pluginDescriptions
+                                     where availablePlugin.PluginState != PluginState.Disabled
+                                     where availablePlugin.Name == dependency.Name
+                                     where IsCompatiblePluginVersion(availablePlugin.Version, dependency.Version)
+                                     select availablePlugin;
+          if (matchingDescriptions.Count() > 0) {
+            desc.AddDependency(matchingDescriptions.Single());
+          } else {
+            missingDependencies.Add(dependency);
+          }
+        }
+        // no plugin description that matches the dependencies are available => plugin is disabled
+        if (missingDependencies.Count > 0) {
+          StringBuilder errorStrBuilder = new StringBuilder();
+          errorStrBuilder.AppendLine("Missing dependencies:");
+          foreach (var missingDep in missingDependencies) {
+            errorStrBuilder.AppendLine(missingDep.Name + " " + missingDep.Version);
+          }
+          desc.Disable(errorStrBuilder.ToString());
+        }
+      }
+    }
+
+    /// <summary>
+    /// Checks if version <paramref name="available"/> is compatible to version <paramref name="requested"/>.
+    /// Note: the compatibility relation is not bijective.
+    /// Compatibility rules:
+    ///  * major and minor number must be the same
+    ///  * build and revision number of <paramref name="available"/> must be larger or equal to <paramref name="requested"/>.
+    /// </summary>
+    /// <param name="available">The available version which should be compared to <paramref name="requested"/>.</param>
+    /// <param name="requested">The requested version that must be matched.</param>
+    /// <returns></returns>
+    private static bool IsCompatiblePluginVersion(Version available, Version requested) {
+      // this condition must be removed after all plugins have been updated to declare plugin and dependency versions
+      if (
+        (requested.Major == 0 && requested.Minor == 0) ||
+        (available.Major == 0 && available.Minor == 0)) return true;
+      return
+        available.Major == requested.Major &&
+        available.Minor == requested.Minor &&
+        available.Build >= requested.Build &&
+        available.Revision >= requested.Revision;
+    }
+
+    private void CheckPluginDependencyCycles(IEnumerable<PluginDescription> pluginDescriptions) {
+      foreach (var plugin in pluginDescriptions) {
+        // if the plugin is not disabled check if there are cycles
+        if (plugin.PluginState != PluginState.Disabled && HasCycleInDependencies(plugin, plugin.Dependencies)) {
+          plugin.Disable("Dependency graph has a cycle.");
+        }
+      }
+    }
+
+    private bool HasCycleInDependencies(PluginDescription plugin, IEnumerable<PluginDescription> pluginDependencies) {
+      foreach (var dep in pluginDependencies) {
+        // if one of the dependencies is the original plugin we found a cycle and can return
+        // if the dependency is already disabled we can ignore the cycle detection because we will disable the plugin anyway
+        // if following one of the dependencies recursively leads to a cycle then we also return
+        if (dep == plugin || dep.PluginState == PluginState.Disabled || HasCycleInDependencies(plugin, dep.Dependencies)) return true;
+      }
+      // no cycle found and none of the direct and indirect dependencies is disabled
+      return false;
+    }
+
+    private void CheckPluginDependencies(IEnumerable<PluginDescription> pluginDescriptions) {
+      foreach (PluginDescription pluginDescription in pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled)) {
+        List<PluginDescription> disabledPlugins = new List<PluginDescription>();
+        if (IsAnyDependencyDisabled(pluginDescription, disabledPlugins)) {
+          StringBuilder errorStrBuilder = new StringBuilder();
+          errorStrBuilder.AppendLine("Dependencies are disabled:");
+          foreach (var disabledPlugin in disabledPlugins) {
+            errorStrBuilder.AppendLine(disabledPlugin.Name + " " + disabledPlugin.Version);
+          }
+          pluginDescription.Disable(errorStrBuilder.ToString());
+        }
+      }
+    }
+
+
+    private bool IsAnyDependencyDisabled(PluginDescription descr, List<PluginDescription> disabledPlugins) {
+      if (descr.PluginState == PluginState.Disabled) {
+        disabledPlugins.Add(descr);
+        return true;
+      }
+      foreach (PluginDescription dependency in descr.Dependencies) {
+        IsAnyDependencyDisabled(dependency, disabledPlugins);
+      }
+      return disabledPlugins.Count > 0;
+    }
+
+    // tries to load all plugin assemblies into the execution context
+    // if an assembly of a plugin cannot be loaded the plugin is disabled
+    private void CheckExecutionContextLoad(IEnumerable<PluginDescription> pluginDescriptions) {
+      // load all loadable plugins (all dependencies available) into the execution context
+      foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(pluginDescriptions
+                                                                                .Where(x => x.PluginState != PluginState.Disabled))) {
+        // store the assembly names so that we can later retrieve the assemblies loaded in the appdomain by name
+        var assemblyNames = new List<string>();
+        foreach (string assemblyLocation in desc.AssemblyLocations) {
+          if (desc.PluginState != PluginState.Disabled) {
+            try {
+              string assemblyName = (from assembly in AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()
+                                     where string.Equals(Path.GetFullPath(assembly.Location), Path.GetFullPath(assemblyLocation), StringComparison.CurrentCultureIgnoreCase)
+                                     select assembly.FullName).Single();
+              // now load the assemblies into the execution context  
+              // this can still lead to an exception
+              // even when the assemby was successfully loaded into the reflection only context before 
+              // when loading the assembly using it's assemblyName it can be loaded from a different location than before (e.g. the GAC)
+              Assembly.Load(assemblyName);
+              assemblyNames.Add(assemblyName);
+            }
+            catch (BadImageFormatException) {
+              desc.Disable(Path.GetFileName(assemblyLocation) + " is not a valid assembly.");
+            }
+            catch (FileLoadException) {
+              desc.Disable("Can't load file " + Path.GetFileName(assemblyLocation));
+            }
+            catch (FileNotFoundException) {
+              desc.Disable("File " + Path.GetFileName(assemblyLocation) + " is missing.");
+            }
+            catch (SecurityException) {
+              desc.Disable("File " + Path.GetFileName(assemblyLocation) + " can't be loaded because of security constraints.");
+            }
+            catch (NotSupportedException ex) {
+              // disable the plugin
+              desc.Disable("Problem while loading plugin assemblies:" + Environment.NewLine + "NotSupportedException: " + ex.Message);
+            }
+          }
+        }
+        desc.AssemblyNames = assemblyNames;
+      }
+    }
+
+    // assumes that all plugin assemblies have been loaded into the execution context via CheckExecutionContextLoad
+    // for each enabled plugin:
+    // calls OnLoad method of the plugin 
+    // and raises the PluginLoaded event
+    private void LoadPlugins(IEnumerable<PluginDescription> pluginDescriptions) {
+      List<Assembly> assemblies = new List<Assembly>(AppDomain.CurrentDomain.GetAssemblies());
+      foreach (var desc in pluginDescriptions) {
+        if (desc.PluginState == PluginState.Enabled) {
+          // cannot use ApplicationManager to retrieve types because it is not yet instantiated
+          foreach (string assemblyName in desc.AssemblyNames) {
+            var asm = (from assembly in assemblies
+                       where assembly.FullName == assemblyName
+                       select assembly)
+                      .SingleOrDefault();
+            if (asm == null) throw new InvalidPluginException("Could not load assembly " + assemblyName + " for plugin " + desc.Name);
+            foreach (Type pluginType in asm.GetTypes()) {
+              if (typeof(IPlugin).IsAssignableFrom(pluginType) && !pluginType.IsAbstract && !pluginType.IsInterface && !pluginType.HasElementType) {
+                IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);
+                plugin.OnLoad();
+                OnPluginLoaded(new PluginInfrastructureEventArgs(desc));
+              }
+            }
+          } // end foreach assembly in plugin
+          desc.Load();
+        }
+      } // end foreach plugin description
+    }
+
+    // checks if all declared plugin files are actually available and disables plugins with missing files
+    private void CheckPluginFiles(IEnumerable<PluginDescription> pluginDescriptions) {
+      foreach (PluginDescription desc in pluginDescriptions) {
+        IEnumerable<string> missingFiles;
+        if (ArePluginFilesMissing(desc, out missingFiles)) {
+          StringBuilder errorStrBuilder = new StringBuilder();
+          errorStrBuilder.AppendLine("Missing files:");
+          foreach (string fileName in missingFiles) {
+            errorStrBuilder.AppendLine(fileName);
+          }
+          desc.Disable(errorStrBuilder.ToString());
+        }
+      }
+    }
+
+    private bool ArePluginFilesMissing(PluginDescription pluginDescription, out IEnumerable<string> missingFiles) {
+      List<string> missing = new List<string>();
+      foreach (string filename in pluginDescription.Files.Select(x => x.Name)) {
+        if (!FileLiesInDirectory(PluginDir, filename) ||
+          !File.Exists(filename)) {
+          missing.Add(filename);
+        }
+      }
+      missingFiles = missing;
+      return missing.Count > 0;
+    }
+
+    private static bool FileLiesInDirectory(string dir, string fileName) {
+      var basePath = Path.GetFullPath(dir);
+      return Path.GetFullPath(fileName).StartsWith(basePath);
+    }
+
+    private static PluginDescription GetDeclaringPlugin(Type appType, IEnumerable<PluginDescription> plugins) {
+      return (from p in plugins
+              from asmLocation in p.AssemblyLocations
+              where Path.GetFullPath(asmLocation).Equals(Path.GetFullPath(appType.Assembly.Location), StringComparison.CurrentCultureIgnoreCase)
+              select p).Single();
+    }
+
+    // register assembly in the assembly cache for the ReflectionOnlyAssemblyResolveEvent
+    private void RegisterLoadedAssembly(Assembly asm) {
+      if (reflectionOnlyAssemblies.ContainsKey(asm.FullName) || reflectionOnlyAssemblies.ContainsKey(asm.GetName().Name)) {
+        throw new ArgumentException("An assembly with the name " + asm.GetName().Name + " has been registered already.", "asm");
+      }
+      reflectionOnlyAssemblies.Add(asm.FullName, asm);
+      reflectionOnlyAssemblies.Add(asm.GetName().Name, asm); // add short name
+    }
+
+    private void OnPluginLoaded(PluginInfrastructureEventArgs e) {
+      if (PluginLoaded != null)
+        PluginLoaded(this, e);
+    }
+
+    /// <summary>
+    /// Initializes the life time service with an infinite lease time.
+    /// </summary>
+    /// <returns><c>null</c>.</returns>
+    public override object InitializeLifetimeService() {
+      return null;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginDescriptionIterator.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginDescriptionIterator.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginDescriptionIterator.cs	(revision 9512)
@@ -0,0 +1,66 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  internal static class PluginDescriptionIterator {
+    internal static IEnumerable<PluginDescription> IterateDependenciesBottomUp(IEnumerable<PluginDescription> pluginDescriptions) {
+      // list to make sure we yield each description only once
+      HashSet<PluginDescription> yieldedDescriptions = new HashSet<PluginDescription>();
+      foreach (var desc in pluginDescriptions) {
+        foreach (var dependency in IterateDependenciesBottomUp(desc.Dependencies)) {
+          if (!yieldedDescriptions.Contains(dependency)) {
+            yieldedDescriptions.Add(dependency);
+            yield return dependency;
+          }
+        }
+        if (!yieldedDescriptions.Contains(desc)) {
+          yieldedDescriptions.Add(desc);
+          yield return desc;
+        }
+      }
+    }
+
+    internal static IEnumerable<PluginDescription> IterateDependentsTopDown(IEnumerable<PluginDescription> pluginDescriptions, IEnumerable<PluginDescription> allPlugins) {
+      HashSet<PluginDescription> yieldedDescriptions = new HashSet<PluginDescription>();
+      foreach (var desc in pluginDescriptions) {
+        foreach (var dependent in IterateDependentsTopDown(GetDependentPlugins(desc, allPlugins), allPlugins)) {
+          if (!yieldedDescriptions.Contains(dependent)) {
+            yieldedDescriptions.Add(dependent);
+            yield return dependent;
+          }
+        }
+        if (!yieldedDescriptions.Contains(desc)) {
+          yieldedDescriptions.Add(desc);
+          yield return desc;
+        }
+      }
+    }
+
+    private static IEnumerable<PluginDescription> GetDependentPlugins(PluginDescription desc, IEnumerable<PluginDescription> allPlugins) {
+      return from plugin in allPlugins
+             where plugin.Dependencies.Contains(desc)
+             select plugin;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginState.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginState.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/PluginState.cs	(revision 9512)
@@ -0,0 +1,47 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Possible states that a plugin can have.
+  /// </summary>
+  [Serializable]
+  public enum PluginState {
+    /// <summary>
+    /// Undefined state is the default plugin state.
+    /// </summary>
+    Undefined,
+    /// <summary>
+    /// Enabled state means that the plugin has correct meta-data and can be loaded.
+    /// </summary>
+    Enabled,
+    /// <summary>
+    /// Disabled state means that the plugin has incorrect meta-data or missing dependencies and cannot be loaded.
+    /// </summary>
+    Disabled,
+    /// <summary>
+    /// Loaded means the plugin is currently loaded by an application.
+    /// </summary>
+    Loaded
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/AssemblyInfo.cs.frame	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/AssemblyInfo.cs.frame	(revision 9512)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Security;
+using System;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.PluginInfrastructure")]
+[assembly: AssemblyDescription("PluginInfrastructure to load and manage HeuristicLab plugins")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2013 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: CLSCompliant(true)]
+[assembly: InternalsVisibleTo("HeuristicLab.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e3d38bc66a0dd8dd36f57285e34632ec04b3049866ab1e64cf230e95ffcbfbb90c437b4d11dfe74ba981f746274290bb03f3e636e139e685b501031dc6e0bc8409153f0c842721eb9e8e2a703c9e4d102283f3ddbdfab4078c08de51869715992a694d2f608d0fa865c9d17c06b8d6a9135004e982fd862cdb2277e4ad15a4a6")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7f3dedcf-24cc-4176-977a-0baad7f16573")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.8.$WCREV$")]
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.Designer.cs	(revision 9512)
@@ -0,0 +1,86 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("anonymous")]
+        public string UpdateLocationUserName {
+            get {
+                return ((string)(this["UpdateLocationUserName"]));
+            }
+            set {
+                this["UpdateLocationUserName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("GetTheLab!")]
+        public string UpdateLocationPassword {
+            get {
+                return ((string)(this["UpdateLocationPassword"]));
+            }
+            set {
+                this["UpdateLocationPassword"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool ShowPluginUploadControls {
+            get {
+                return ((bool)(this["ShowPluginUploadControls"]));
+            }
+            set {
+                this["ShowPluginUploadControls"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("http://services.heuristiclab.com/Deployment-3.3/UpdateService.svc")]
+        public string UpdateLocation {
+            get {
+                return ((string)(this["UpdateLocation"]));
+            }
+            set {
+                this["UpdateLocation"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("http://services.heuristiclab.com/Deployment-3.3/AdminService.svc")]
+        public string UpdateLocationAdministrationAddress {
+            get {
+                return ((string)(this["UpdateLocationAdministrationAddress"]));
+            }
+            set {
+                this["UpdateLocationAdministrationAddress"] = value;
+            }
+        }
+    }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.settings
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.settings	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Properties/Settings.settings	(revision 9512)
@@ -0,0 +1,21 @@
+﻿<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="HeuristicLab.PluginInfrastructure.Properties" GeneratedClassName="Settings">
+  <Profiles />
+  <Settings>
+    <Setting Name="UpdateLocationUserName" Type="System.String" Scope="User">
+      <Value Profile="(Default)">anonymous</Value>
+    </Setting>
+    <Setting Name="UpdateLocationPassword" Type="System.String" Scope="User">
+      <Value Profile="(Default)">GetTheLab!</Value>
+    </Setting>
+    <Setting Name="ShowPluginUploadControls" Type="System.Boolean" Scope="User">
+      <Value Profile="(Default)">False</Value>
+    </Setting>
+    <Setting Name="UpdateLocation" Type="System.String" Scope="User">
+      <Value Profile="(Default)">http://services.heuristiclab.com/Deployment-3.3/UpdateService.svc</Value>
+    </Setting>
+    <Setting Name="UpdateLocationAdministrationAddress" Type="System.String" Scope="User">
+      <Value Profile="(Default)">http://services.heuristiclab.com/Deployment-3.3/AdminService.svc</Value>
+    </Setting>
+  </Settings>
+</SettingsFile>
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.Designer.cs	(revision 9512)
@@ -0,0 +1,229 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.225
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.PluginInfrastructure {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.PluginInfrastructure.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Add {
+            get {
+                object obj = ResourceManager.GetObject("Add", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ArrowUp {
+            get {
+                object obj = ResourceManager.GetObject("ArrowUp", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Assembly {
+            get {
+                object obj = ResourceManager.GetObject("Assembly", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Document {
+            get {
+                object obj = ResourceManager.GetObject("Document", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Error {
+            get {
+                object obj = ResourceManager.GetObject("Error", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon ErrorIcon {
+            get {
+                object obj = ResourceManager.GetObject("ErrorIcon", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap File {
+            get {
+                object obj = ResourceManager.GetObject("File", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon HeuristicLab {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLab", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap HeuristicLabBanner {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLabBanner", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap HeuristicLabLogo {
+            get {
+                object obj = ResourceManager.GetObject("HeuristicLabLogo", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Install {
+            get {
+                object obj = ResourceManager.GetObject("Install", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Internet {
+            get {
+                object obj = ResourceManager.GetObject("Internet", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to HeuristicLab is free software: you can redistribute it and/or modify
+        ///it under the terms of the GNU General Public License as published by
+        ///the Free Software Foundation, either version 3 of the License, or
+        ///(at your option) any later version.
+        ///
+        ///HeuristicLab is distributed in the hope that it will be useful,
+        ///but WITHOUT ANY WARRANTY; without even the implied warranty of
+        ///MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+        ///GNU General Public License for more details.
+        ///
+        ///You should have received a copy of t [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string LicenseText {
+            get {
+                return ResourceManager.GetString("LicenseText", resourceCulture);
+            }
+        }
+        
+        internal static System.Drawing.Bitmap NetworkConnections {
+            get {
+                object obj = ResourceManager.GetObject("NetworkConnections", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Plugin {
+            get {
+                object obj = ResourceManager.GetObject("Plugin", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap PublishToWeb {
+            get {
+                object obj = ResourceManager.GetObject("PublishToWeb", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Remove {
+            get {
+                object obj = ResourceManager.GetObject("Remove", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap Repeat {
+            get {
+                object obj = ResourceManager.GetObject("Repeat", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon Setup_Install {
+            get {
+                object obj = ResourceManager.GetObject("Setup_Install", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ShowDetails {
+            get {
+                object obj = ResourceManager.GetObject("ShowDetails", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ShowIcons {
+            get {
+                object obj = ResourceManager.GetObject("ShowIcons", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Icon UpdateAvailable {
+            get {
+                object obj = ResourceManager.GetObject("UpdateAvailable", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+    }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.resx
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.resx	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Resources.resx	(revision 9512)
@@ -0,0 +1,199 @@
+﻿<?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=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_CommonElements_Actions_Add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ArrowUp" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_CommonElements_Objects_Arrow_Up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Assembly" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\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>Resources\VS2008ImageLibrary_Objects_Document.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Error" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Annotations_Error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ErrorIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\Error.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="File" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Objects_File.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLab" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLab.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLabBanner" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLabBanner.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="HeuristicLabLogo" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\HeuristicLabLogo.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>Resources\VS2008ImageLibrary_Objects_Install.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Internet" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Objects_Internet.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="LicenseText" xml:space="preserve">
+    <value>HeuristicLab is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+HeuristicLab is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with HeuristicLab. If not, see http://www.gnu.org/licenses.</value>
+    <comment>Displayed in about dialog</comment>
+  </data>
+  <data name="NetworkConnections" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Objects_NetworkConnections.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Plugin" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Objects_Plugin.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="PublishToWeb" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Actions_PublishToWebHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Remove" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_CommonElements_Actions_Remove.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Repeat" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\VS2008ImageLibrary_Actions_RepeatHS.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="Setup_Install" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\Setup_Install.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ShowDetails" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\show_details.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ShowIcons" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\show_icons.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="UpdateAvailable" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>Resources\UpdateAvailable.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/SandboxApplicationManager.cs	(revision 9512)
@@ -0,0 +1,321 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  /// <summary>
+  /// The SandboxApplicationManager provides properties to retrieve the list of available plugins and applications.
+  /// It also provides methods for type discovery and instantiation for types declared in plugins.
+  /// The SandboxApplicationManager is used in sandboxed Application Domains where permissions are restricted and
+  /// only partially-trusted code can be executed. 
+  /// </summary>
+  internal class SandboxApplicationManager : MarshalByRefObject, IApplicationManager {
+    /// <summary>
+    /// Fired when a plugin is loaded.
+    /// </summary>
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginLoaded;
+    /// <summary>
+    /// Fired when a plugin is unloaded (when the application terminates).
+    /// </summary>
+    internal event EventHandler<PluginInfrastructureEventArgs> PluginUnloaded;
+
+    // cache for the AssemblyResolveEvent 
+    // which must be handled when assemblies are loaded dynamically after the application start
+    protected internal Dictionary<string, Assembly> loadedAssemblies;
+
+    private List<IPlugin> loadedPlugins;
+
+    private List<PluginDescription> plugins;
+    /// <summary>
+    /// Gets all plugins.
+    /// </summary>
+    public IEnumerable<IPluginDescription> Plugins {
+      get { return plugins.Cast<IPluginDescription>(); }
+    }
+
+    private List<ApplicationDescription> applications;
+    /// <summary>
+    /// Gets all installed applications.
+    /// </summary>
+    public IEnumerable<IApplicationDescription> Applications {
+      get { return applications.Cast<IApplicationDescription>(); }
+    }
+
+    internal SandboxApplicationManager()
+      : base() {
+      loadedAssemblies = new Dictionary<string, Assembly>();
+      loadedPlugins = new List<IPlugin>();
+    }
+
+    /// <summary>
+    /// Prepares the application domain for the execution of an HL application.
+    /// Pre-loads all <paramref name="plugins"/>.
+    /// </summary>
+    /// <param name="apps">Enumerable of available HL applications.</param>
+    /// <param name="plugins">Enumerable of plugins that should be pre-loaded.</param>  
+    internal void PrepareApplicationDomain(IEnumerable<ApplicationDescription> apps, IEnumerable<PluginDescription> plugins) {
+      this.plugins = new List<PluginDescription>(plugins);
+      this.applications = new List<ApplicationDescription>(apps);
+      ApplicationManager.RegisterApplicationManager(this);
+      LoadPlugins(plugins);
+    }
+
+    /// <summary>
+    /// Loads the <paramref name="plugins"/> into this application domain.
+    /// </summary>
+    /// <param name="plugins">Enumerable of plugins that should be loaded.</param>
+    private void LoadPlugins(IEnumerable<PluginDescription> plugins) {
+      // load all loadable plugins (all dependencies available) into the execution context
+      foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled))) {
+        foreach (string fileName in desc.AssemblyLocations) {
+          // load assembly reflection only first to get the full assembly name
+          var reflectionOnlyAssembly = Assembly.ReflectionOnlyLoadFrom(fileName);
+          // load the assembly into execution context using full assembly name
+          var asm = Assembly.Load(reflectionOnlyAssembly.FullName);
+          RegisterLoadedAssembly(asm);
+          // instantiate and load all plugins in this assembly
+          foreach (var plugin in GetInstances<IPlugin>(asm)) {
+            plugin.OnLoad();
+            loadedPlugins.Add(plugin);
+          }
+        }
+        OnPluginLoaded(new PluginInfrastructureEventArgs(desc));
+        desc.Load();
+      }
+    }
+
+    /// <summary>
+    /// Runs the application declared in <paramref name="appInfo"/>.
+    /// This is a synchronous call. When the application is terminated all plugins are unloaded.
+    /// </summary>
+    /// <param name="appInfo">Description of the application to run</param>
+    internal void Run(ApplicationDescription appInfo, ICommandLineArgument[] args) {
+      IApplication runnablePlugin = (IApplication)Activator.CreateInstance(appInfo.DeclaringAssemblyName, appInfo.DeclaringTypeName).Unwrap();
+      try {
+        runnablePlugin.Run(args);
+      }
+      finally {
+        // unload plugins in reverse order
+        foreach (var plugin in loadedPlugins.Reverse<IPlugin>()) {
+          plugin.OnUnload();
+        }
+        foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled))) {
+          desc.Unload();
+          OnPluginUnloaded(new PluginInfrastructureEventArgs(desc));
+        }
+      }
+    }
+
+    // register assembly in the assembly cache for the AssemblyResolveEvent
+    private void RegisterLoadedAssembly(Assembly asm) {
+      if (loadedAssemblies.ContainsKey(asm.FullName) || loadedAssemblies.ContainsKey(asm.GetName().Name)) {
+        throw new ArgumentException("An assembly with the name " + asm.GetName().Name + " has been registered already.", "asm");
+      }
+      loadedAssemblies.Add(asm.FullName, asm);
+      loadedAssemblies.Add(asm.GetName().Name, asm); // add short name
+    }
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type and declared in <paramref name="plugin"/>
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <returns>Enumerable of the created instances.</returns>
+    internal static IEnumerable<T> GetInstances<T>(IPluginDescription plugin) where T : class {
+      List<T> instances = new List<T>();
+      foreach (Type t in GetTypes(typeof(T), plugin, onlyInstantiable: true, includeGenericTypeDefinitions: false)) {
+        T instance = null;
+        try { instance = (T)Activator.CreateInstance(t); }
+        catch { }
+        if (instance != null) instances.Add(instance);
+      }
+      return instances;
+    }
+    /// <summary>
+    /// Creates an instance of all types declared in assembly <paramref name="asm"/> that are subtypes or the same type of the specified <typeparamref name="type"/>. 
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <param name="asm">Declaring assembly.</param>
+    /// <returns>Enumerable of the created instances.</returns>
+    private static IEnumerable<T> GetInstances<T>(Assembly asm) where T : class {
+      List<T> instances = new List<T>();
+      foreach (Type t in GetTypes(typeof(T), asm, onlyInstantiable: true, includeGenericTypeDefinitions: false)) {
+        T instance = null;
+        try { instance = (T)Activator.CreateInstance(t); }
+        catch { }
+        if (instance != null) instances.Add(instance);
+      }
+      return instances;
+    }
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <returns>Enumerable of the created instances.</returns>
+    internal static IEnumerable<T> GetInstances<T>() where T : class {
+      return from i in GetInstances(typeof(T))
+             select (T)i;
+    }
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <param name="type">Most general type.</param>
+    /// <returns>Enumerable of the created instances.</returns>
+    internal static IEnumerable<object> GetInstances(Type type) {
+      List<object> instances = new List<object>();
+      foreach (Type t in GetTypes(type, onlyInstantiable: true, includeGenericTypeDefinitions: false)) {
+        object instance = null;
+        try { instance = Activator.CreateInstance(t); }
+        catch { }
+        if (instance != null) instances.Add(instance);
+      }
+      return instances;
+    }
+
+    /// <summary>
+    /// Finds all types that are subtypes or equal to the specified type.
+    /// </summary>
+    /// <param name="type">Most general type for which to find matching types.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable 
+    /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
+    /// (interfaces, abstract classes... are not returned)</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    internal static IEnumerable<Type> GetTypes(Type type, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
+      return from asm in AppDomain.CurrentDomain.GetAssemblies()
+             from t in GetTypes(type, asm, onlyInstantiable, includeGenericTypeDefinitions)
+             select t;
+    }
+
+    internal static IEnumerable<Type> GetTypes(IEnumerable<Type> types, bool onlyInstantiable, bool includeGenericTypeDefinitions, bool assignableToAllTypes) {
+      IEnumerable<Type> result = GetTypes(types.First(), onlyInstantiable, includeGenericTypeDefinitions);
+      foreach (Type type in types.Skip(1)) {
+        IEnumerable<Type> discoveredTypes = GetTypes(type, onlyInstantiable, includeGenericTypeDefinitions);
+        if (assignableToAllTypes) result = result.Intersect(discoveredTypes);
+        else result = result.Union(discoveredTypes);
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Finds all types that are subtypes or equal to the specified type if they are part of the given
+    /// <paramref name="pluginDescription"/>.
+    /// </summary>
+    /// <param name="type">Most general type for which to find matching types.</param>
+    /// <param name="pluginDescription">The plugin the subtypes must be part of.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable 
+    /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
+    /// (interfaces, abstract classes... are not returned)</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    internal static IEnumerable<Type> GetTypes(Type type, IPluginDescription pluginDescription, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
+      PluginDescription pluginDesc = (PluginDescription)pluginDescription;
+      return from asm in AppDomain.CurrentDomain.GetAssemblies()
+             where !asm.IsDynamic && !string.IsNullOrEmpty(asm.Location)
+             where pluginDesc.AssemblyLocations.Any(location => location.Equals(Path.GetFullPath(asm.Location), StringComparison.CurrentCultureIgnoreCase))
+             from t in GetTypes(type, asm, onlyInstantiable, includeGenericTypeDefinitions)
+             select t;
+    }
+
+    internal static IEnumerable<Type> GetTypes(IEnumerable<Type> types, IPluginDescription pluginDescription, bool onlyInstantiable, bool includeGenericTypeDefinitions, bool assignableToAllTypes) {
+      IEnumerable<Type> result = GetTypes(types.First(), pluginDescription, onlyInstantiable, includeGenericTypeDefinitions);
+      foreach (Type type in types.Skip(1)) {
+        IEnumerable<Type> discoveredTypes = GetTypes(type, pluginDescription, onlyInstantiable, includeGenericTypeDefinitions);
+        if (assignableToAllTypes) result = result.Intersect(discoveredTypes);
+        else result = result.Union(discoveredTypes);
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Gets types that are assignable (same of subtype) to the specified type only from the given assembly.
+    /// </summary>
+    /// <param name="type">Most general type we want to find.</param>
+    /// <param name="assembly">Assembly that should be searched for types.</param>
+    /// <param name="onlyInstantiable">Return only types that are instantiable 
+    /// (interfaces, abstract classes...  are not returned)</param>
+    /// <param name="includeGenericTypeDefinitions">Specifies if generic type definitions shall be included</param>
+    /// <returns>Enumerable of the discovered types.</returns>
+    private static IEnumerable<Type> GetTypes(Type type, Assembly assembly, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
+      var matchingTypes = from assemblyType in assembly.GetTypes()
+                          let t = assemblyType.BuildType(type)
+                          where t != null
+                          where t.IsSubTypeOf(type)
+                          where !t.IsNonDiscoverableType()
+                          where onlyInstantiable == false || (!t.IsAbstract && !t.IsInterface && !t.HasElementType)
+                          where includeGenericTypeDefinitions || !t.IsGenericTypeDefinition
+                          select t;
+
+      return matchingTypes;
+    }
+
+    private void OnPluginLoaded(PluginInfrastructureEventArgs e) {
+      if (PluginLoaded != null) PluginLoaded(this, e);
+    }
+
+    private void OnPluginUnloaded(PluginInfrastructureEventArgs e) {
+      if (PluginUnloaded != null) PluginUnloaded(this, e);
+    }
+
+    #region IApplicationManager Members
+
+    IEnumerable<T> IApplicationManager.GetInstances<T>() {
+      return GetInstances<T>();
+    }
+
+    IEnumerable<object> IApplicationManager.GetInstances(Type type) {
+      return GetInstances(type);
+    }
+
+    IEnumerable<Type> IApplicationManager.GetTypes(Type type, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
+      return GetTypes(type, onlyInstantiable, includeGenericTypeDefinitions);
+    }
+    IEnumerable<Type> IApplicationManager.GetTypes(IEnumerable<Type> types, bool onlyInstantiable, bool includeGenericTypeDefinitions, bool assignableToAllTypes) {
+      return GetTypes(types, onlyInstantiable, includeGenericTypeDefinitions, assignableToAllTypes);
+    }
+
+    IEnumerable<Type> IApplicationManager.GetTypes(Type type, IPluginDescription plugin, bool onlyInstantiable, bool includeGenericTypeDefinitions) {
+      return GetTypes(type, plugin, onlyInstantiable, includeGenericTypeDefinitions);
+    }
+    IEnumerable<Type> IApplicationManager.GetTypes(IEnumerable<Type> types, IPluginDescription plugin, bool onlyInstantiable, bool includeGenericTypeDefinitions, bool assignableToAllTypes) {
+      return GetTypes(types, plugin, onlyInstantiable, includeGenericTypeDefinitions, assignableToAllTypes);
+    }
+
+    /// <summary>
+    /// Finds the plugin that declares the <paramref name="type">type</paramref>.
+    /// </summary>
+    /// <param name="type">The type of interest.</param>
+    /// <returns>The description of the plugin that declares the given type or null if the type has not been declared by a known plugin.</returns>
+    public IPluginDescription GetDeclaringPlugin(Type type) {
+      if (type == null) throw new ArgumentNullException("type");
+      foreach (PluginDescription info in Plugins) {
+        if (info.AssemblyLocations.Contains(Path.GetFullPath(type.Assembly.Location))) return info;
+      }
+      return null;
+    }
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Sandboxing/SandboxManager.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Sandboxing/SandboxManager.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Sandboxing/SandboxManager.cs	(revision 9512)
@@ -0,0 +1,97 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Reflection;
+using System.Security;
+using System.Security.Permissions;
+using HeuristicLab.PluginInfrastructure.Manager;
+using System.IO;
+
+namespace HeuristicLab.PluginInfrastructure.Sandboxing {
+  public static class SandboxManager {
+
+    /// <summary>
+    /// Creates an privileged sandbox, meaning that the executed code is fully trusted and permissions are not restricted.
+    /// This method is a fall back for trusted users in HeuristicLab Hive. 
+    /// </summary>    
+    public static AppDomain CreateAndInitPrivilegedSandbox(string appDomainName, string applicationBase, string configFilePath) {
+      PermissionSet pSet;
+      pSet = new PermissionSet(PermissionState.Unrestricted);
+
+      AppDomainSetup setup = new AppDomainSetup();
+      setup.PrivateBinPath = applicationBase;
+      setup.ApplicationBase = applicationBase;
+      setup.ConfigurationFile = configFilePath;
+
+      Type applicationManagerType = typeof(DefaultApplicationManager);
+      AppDomain applicationDomain = AppDomain.CreateDomain(appDomainName, null, setup, pSet, null);
+      DefaultApplicationManager applicationManager = (DefaultApplicationManager)applicationDomain.CreateInstanceAndUnwrap(applicationManagerType.Assembly.FullName, applicationManagerType.FullName, true, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null, null);
+
+      PluginManager pm = new PluginManager(applicationBase);
+      pm.DiscoverAndCheckPlugins();
+      applicationManager.PrepareApplicationDomain(pm.Applications, pm.Plugins);
+
+      return applicationDomain;
+    }
+
+    /// <summary>
+    /// Creates a sandbox with restricted permissions.
+    /// Code that is executed in such an AppDomain is partially-trusted and is not allowed to call or override
+    /// methods that require full trust. 
+    /// </summary>    
+    public static AppDomain CreateAndInitSandbox(string appDomainName, string applicationBase, string configFilePath) {
+      PermissionSet pSet;
+
+      pSet = new PermissionSet(PermissionState.None);
+      pSet.AddPermission(new SecurityPermission(PermissionState.None));
+      pSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
+      pSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Infrastructure));
+      pSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
+      pSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.SerializationFormatter));
+      //needed for HeuristicLab.Persistence, see DynamicMethod Constructor (String, Type, array<Type []()>[], Type, Boolean)
+      pSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.ControlEvidence));
+      pSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));
+
+      FileIOPermission ioPerm = new FileIOPermission(PermissionState.None);
+      //allow path discovery for system drive, needed by HeuristicLab.Persistence: Serializer.BuildTypeCache() -> Assembly.CodeBase
+      ioPerm.AddPathList(FileIOPermissionAccess.PathDiscovery, Path.GetPathRoot(Path.GetFullPath(Environment.SystemDirectory)));
+      //allow full access to the appdomain's base directory
+      ioPerm.AddPathList(FileIOPermissionAccess.AllAccess, applicationBase);
+      pSet.AddPermission(ioPerm);
+
+      AppDomainSetup setup = new AppDomainSetup();
+      setup.PrivateBinPath = applicationBase;
+      setup.ApplicationBase = applicationBase;
+      setup.ConfigurationFile = configFilePath;
+
+      Type applicationManagerType = typeof(SandboxApplicationManager);
+      AppDomain applicationDomain = AppDomain.CreateDomain(appDomainName, null, setup, pSet, null);
+      SandboxApplicationManager applicationManager = (SandboxApplicationManager)applicationDomain.CreateInstanceAndUnwrap(applicationManagerType.Assembly.FullName, applicationManagerType.FullName, true, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null, null);
+
+      PluginManager pm = new PluginManager(applicationBase);
+      pm.DiscoverAndCheckPlugins();
+      applicationManager.PrepareApplicationDomain(pm.Applications, pm.Plugins);
+
+      return applicationDomain;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.Designer.cs	(revision 9512)
@@ -0,0 +1,331 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  partial class AboutDialog {
+    /// <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.components = new System.ComponentModel.Container();
+      this.okButton = new System.Windows.Forms.Button();
+      this.pluginListView = new System.Windows.Forms.ListView();
+      this.pluginNameColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginVersionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.pluginDescriptionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      this.label = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.label3 = new System.Windows.Forms.Label();
+      this.productTextBox = new System.Windows.Forms.TextBox();
+      this.versionTextBox = new System.Windows.Forms.TextBox();
+      this.copyrightTextBox = new System.Windows.Forms.TextBox();
+      this.pluginsGroupBox = new System.Windows.Forms.GroupBox();
+      this.licenseTextBox = new System.Windows.Forms.RichTextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.panel1 = new System.Windows.Forms.Panel();
+      this.label4 = new System.Windows.Forms.Label();
+      this.webLinkLabel = new System.Windows.Forms.LinkLabel();
+      this.mailLinkLabel = new System.Windows.Forms.LinkLabel();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.pluginsGroupBox.SuspendLayout();
+      this.panel1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(538, 13);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&Close";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // pluginListView
+      // 
+      this.pluginListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.pluginNameColumnHeader,
+            this.pluginVersionColumnHeader,
+            this.pluginDescriptionColumnHeader});
+      this.pluginListView.Location = new System.Drawing.Point(6, 19);
+      this.pluginListView.Name = "pluginListView";
+      this.pluginListView.ShowGroups = false;
+      this.pluginListView.Size = new System.Drawing.Size(589, 201);
+      this.pluginListView.SmallImageList = this.imageList;
+      this.pluginListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.pluginListView.TabIndex = 0;
+      this.pluginListView.UseCompatibleStateImageBehavior = false;
+      this.pluginListView.View = System.Windows.Forms.View.Details;
+      this.pluginListView.ItemActivate += new System.EventHandler(this.pluginListView_ItemActivate);
+      // 
+      // pluginNameColumnHeader
+      // 
+      this.pluginNameColumnHeader.Text = "Name";
+      // 
+      // pluginVersionColumnHeader
+      // 
+      this.pluginVersionColumnHeader.Text = "Version";
+      // 
+      // pluginDescriptionColumnHeader
+      // 
+      this.pluginDescriptionColumnHeader.Text = "Description";
+      // 
+      // 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;
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Location = new System.Drawing.Point(12, 12);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(160, 180);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.pictureBox.TabIndex = 2;
+      this.pictureBox.TabStop = false;
+      // 
+      // label
+      // 
+      this.label.AutoSize = true;
+      this.label.Location = new System.Drawing.Point(183, 12);
+      this.label.Name = "label";
+      this.label.Size = new System.Drawing.Size(47, 13);
+      this.label.TabIndex = 1;
+      this.label.Text = "Product:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(183, 31);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(45, 13);
+      this.label1.TabIndex = 3;
+      this.label1.Text = "Version:";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(183, 50);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(54, 13);
+      this.label3.TabIndex = 5;
+      this.label3.Text = "Copyright:";
+      // 
+      // productTextBox
+      // 
+      this.productTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.productTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.productTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.productTextBox.Location = new System.Drawing.Point(258, 12);
+      this.productTextBox.Name = "productTextBox";
+      this.productTextBox.ReadOnly = true;
+      this.productTextBox.Size = new System.Drawing.Size(355, 13);
+      this.productTextBox.TabIndex = 2;
+      this.productTextBox.Text = "HeuristicLab";
+      // 
+      // versionTextBox
+      // 
+      this.versionTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.versionTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.versionTextBox.Location = new System.Drawing.Point(258, 31);
+      this.versionTextBox.Name = "versionTextBox";
+      this.versionTextBox.ReadOnly = true;
+      this.versionTextBox.Size = new System.Drawing.Size(355, 13);
+      this.versionTextBox.TabIndex = 4;
+      this.versionTextBox.Text = "1.0";
+      // 
+      // copyrightTextBox
+      // 
+      this.copyrightTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.copyrightTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.copyrightTextBox.Location = new System.Drawing.Point(258, 50);
+      this.copyrightTextBox.Name = "copyrightTextBox";
+      this.copyrightTextBox.ReadOnly = true;
+      this.copyrightTextBox.Size = new System.Drawing.Size(355, 13);
+      this.copyrightTextBox.TabIndex = 6;
+      this.copyrightTextBox.Text = "(C)";
+      // 
+      // pluginsGroupBox
+      // 
+      this.pluginsGroupBox.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.pluginsGroupBox.Controls.Add(this.pluginListView);
+      this.pluginsGroupBox.Location = new System.Drawing.Point(12, 306);
+      this.pluginsGroupBox.Name = "pluginsGroupBox";
+      this.pluginsGroupBox.Size = new System.Drawing.Size(601, 226);
+      this.pluginsGroupBox.TabIndex = 12;
+      this.pluginsGroupBox.TabStop = false;
+      this.pluginsGroupBox.Text = "Plugins";
+      // 
+      // licenseTextBox
+      // 
+      this.licenseTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.licenseTextBox.BackColor = System.Drawing.SystemColors.HighlightText;
+      this.licenseTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
+      this.licenseTextBox.Location = new System.Drawing.Point(186, 115);
+      this.licenseTextBox.Name = "licenseTextBox";
+      this.licenseTextBox.ReadOnly = true;
+      this.licenseTextBox.Size = new System.Drawing.Size(427, 185);
+      this.licenseTextBox.TabIndex = 11;
+      this.licenseTextBox.Text = "License Text";
+      this.licenseTextBox.WordWrap = false;
+      this.licenseTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.licenseTextBox_LinkClicked);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(183, 69);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(49, 13);
+      this.label2.TabIndex = 7;
+      this.label2.Text = "Website:";
+      // 
+      // panel1
+      // 
+      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel1.BackColor = System.Drawing.SystemColors.Control;
+      this.panel1.Controls.Add(this.okButton);
+      this.panel1.Location = new System.Drawing.Point(0, 538);
+      this.panel1.Name = "panel1";
+      this.panel1.Size = new System.Drawing.Size(626, 48);
+      this.panel1.TabIndex = 0;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(183, 88);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(47, 13);
+      this.label4.TabIndex = 9;
+      this.label4.Text = "Contact:";
+      // 
+      // webLinkLabel
+      // 
+      this.webLinkLabel.AutoSize = true;
+      this.webLinkLabel.Location = new System.Drawing.Point(255, 69);
+      this.webLinkLabel.Name = "webLinkLabel";
+      this.webLinkLabel.Size = new System.Drawing.Size(135, 13);
+      this.webLinkLabel.TabIndex = 8;
+      this.webLinkLabel.TabStop = true;
+      this.webLinkLabel.Text = "http://dev.heuristiclab.com";
+      this.webLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.webLinkLabel_LinkClicked);
+      // 
+      // mailLinkLabel
+      // 
+      this.mailLinkLabel.AutoSize = true;
+      this.mailLinkLabel.Location = new System.Drawing.Point(255, 88);
+      this.mailLinkLabel.Name = "mailLinkLabel";
+      this.mailLinkLabel.Size = new System.Drawing.Size(129, 13);
+      this.mailLinkLabel.TabIndex = 10;
+      this.mailLinkLabel.TabStop = true;
+      this.mailLinkLabel.Text = "support@heuristiclab.com";
+      this.mailLinkLabel.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.mailLinkLabel_LinkClicked);
+      // 
+      // AboutDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.SystemColors.Window;
+      this.CancelButton = this.okButton;
+      this.ClientSize = new System.Drawing.Size(625, 586);
+      this.Controls.Add(this.mailLinkLabel);
+      this.Controls.Add(this.webLinkLabel);
+      this.Controls.Add(this.label4);
+      this.Controls.Add(this.panel1);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.licenseTextBox);
+      this.Controls.Add(this.pluginsGroupBox);
+      this.Controls.Add(this.copyrightTextBox);
+      this.Controls.Add(this.versionTextBox);
+      this.Controls.Add(this.productTextBox);
+      this.Controls.Add(this.label3);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.label);
+      this.Controls.Add(this.pictureBox);
+      this.Icon = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "AboutDialog";
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "About HeuristicLab";
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.pluginsGroupBox.ResumeLayout(false);
+      this.panel1.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.ListView pluginListView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ColumnHeader pluginNameColumnHeader;
+    private System.Windows.Forms.ColumnHeader pluginVersionColumnHeader;
+    private System.Windows.Forms.ColumnHeader pluginDescriptionColumnHeader;
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.Label label;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.TextBox productTextBox;
+    private System.Windows.Forms.TextBox versionTextBox;
+    private System.Windows.Forms.TextBox copyrightTextBox;
+    private System.Windows.Forms.GroupBox pluginsGroupBox;
+    private System.Windows.Forms.RichTextBox licenseTextBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Panel panel1;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.LinkLabel webLinkLabel;
+    private System.Windows.Forms.LinkLabel mailLinkLabel;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs	(revision 9512)
@@ -0,0 +1,118 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Advanced;
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  /// <summary>
+  /// Shows product, version and copyright information for HeuristicLab and all plugins.
+  /// </summary>
+  public partial class AboutDialog : Form {
+    /// <summary>
+    /// Creates a new about dialog with all plugins loaded in the current application.
+    /// </summary>
+    public AboutDialog() {
+      InitializeComponent();
+      var curAssembly = this.GetType().Assembly;
+      productTextBox.Text = GetProduct(curAssembly);
+      versionTextBox.Text = GetVersion();
+      copyrightTextBox.Text = GetCopyright(curAssembly);
+      imageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.Plugin);
+      pictureBox.Image = HeuristicLab.PluginInfrastructure.Resources.HeuristicLabLogo;
+      licenseTextBox.Text = HeuristicLab.PluginInfrastructure.Resources.LicenseText;
+      UpdatePluginList(ApplicationManager.Manager.Plugins);
+      ActiveControl = okButton;
+    }
+
+    /// <summary>
+    /// Creates a new about dialog listing all plugins in the <paramref name="plugins"/> enumerable.
+    /// </summary>
+    /// <param name="plugins">Enumerable of plugins that should be listed.</param>
+    public AboutDialog(IEnumerable<IPluginDescription> plugins)
+      : this() {
+      UpdatePluginList(plugins);
+    }
+
+    private void UpdatePluginList(IEnumerable<IPluginDescription> plugins) {
+      pluginListView.Items.Clear();
+      foreach (var plugin in plugins) {
+        ListViewItem pluginItem = CreateListViewItem(plugin);
+        pluginListView.Items.Add(pluginItem);
+      }
+      Util.ResizeColumns(pluginListView.Columns.OfType<ColumnHeader>());
+    }
+
+    private ListViewItem CreateListViewItem(IPluginDescription plugin) {
+      ListViewItem item = new ListViewItem(new string[] { plugin.Name, plugin.Version.ToString(), plugin.Description });
+      item.Tag = plugin;
+      item.ImageIndex = 0;
+      return item;
+    }
+
+    private string GetCopyright(Assembly asm) {
+      AssemblyCopyrightAttribute attribute = GetAttribute<AssemblyCopyrightAttribute>(asm);
+      return attribute.Copyright;
+    }
+
+    private string GetVersion() {
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      return pluginInfrastructureVersion.FileVersion;
+    }
+
+    private string GetProduct(Assembly asm) {
+      AssemblyProductAttribute attribute = GetAttribute<AssemblyProductAttribute>(asm);
+      return attribute.Product;
+    }
+
+    private T GetAttribute<T>(Assembly asm) {
+      return (T)asm.GetCustomAttributes(typeof(T), false).Single();
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Close();
+    }
+
+    private void pluginListView_ItemActivate(object sender, EventArgs e) {
+      if (pluginListView.SelectedItems.Count > 0) {
+        PluginView view = new PluginView((IPluginDescription)pluginListView.SelectedItems[0].Tag);
+        view.Show(this);
+      }
+    }
+
+    private void licenseTextBox_LinkClicked(object sender, LinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(e.LinkText);
+    }
+
+    private void webLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start(webLinkLabel.Text);
+    }
+
+    private void mailLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
+      System.Diagnostics.Process.Start("mailto:" + mailLinkLabel.Text);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.Designer.cs	(revision 9512)
@@ -0,0 +1,134 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  partial class SplashScreen {
+    /// <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.versionLabel = new System.Windows.Forms.Label();
+      this.infoLabel = new System.Windows.Forms.Label();
+      this.copyrightLabel = new System.Windows.Forms.Label();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // versionLabel
+      // 
+      this.versionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.versionLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 6F);
+      this.versionLabel.Location = new System.Drawing.Point(436, 147);
+      this.versionLabel.Name = "versionLabel";
+      this.versionLabel.Size = new System.Drawing.Size(150, 9);
+      this.versionLabel.TabIndex = 1;
+      this.versionLabel.Text = "Version ";
+      this.versionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.infoLabel.ForeColor = System.Drawing.Color.DarkOrange;
+      this.infoLabel.Location = new System.Drawing.Point(12, 113);
+      this.infoLabel.Name = "infoLabel";
+      this.infoLabel.Size = new System.Drawing.Size(574, 30);
+      this.infoLabel.TabIndex = 6;
+      this.infoLabel.Text = "Startup Information";
+      this.infoLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // copyrightLabel
+      // 
+      this.copyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.copyrightLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 6F);
+      this.copyrightLabel.Location = new System.Drawing.Point(12, 147);
+      this.copyrightLabel.Name = "copyrightLabel";
+      this.copyrightLabel.Size = new System.Drawing.Size(150, 9);
+      this.copyrightLabel.TabIndex = 2;
+      this.copyrightLabel.Text = "Copyright";
+      this.copyrightLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.Image = global::HeuristicLab.PluginInfrastructure.Resources.HeuristicLabBanner;
+      this.pictureBox.Location = new System.Drawing.Point(0, 0);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(598, 110);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      // 
+      // SplashScreen
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.BackColor = System.Drawing.Color.White;
+      this.ClientSize = new System.Drawing.Size(598, 165);
+      this.ControlBox = false;
+      this.Controls.Add(this.pictureBox);
+      this.Controls.Add(this.versionLabel);
+      this.Controls.Add(this.copyrightLabel);
+      this.Controls.Add(this.infoLabel);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "SplashScreen";
+      this.Opacity = 0.99D;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.Label versionLabel;
+    private System.Windows.Forms.Label copyrightLabel;
+    private System.Windows.Forms.Label infoLabel;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs	(revision 9512)
@@ -0,0 +1,169 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  internal partial class SplashScreen : Form {
+    private const int FADE_INTERVAL = 50;
+    private Timer fadeTimer;
+    private int initialInterval;
+    private PluginManager pluginManager;
+
+    internal SplashScreen() {
+      InitializeComponent();
+    }
+
+    internal SplashScreen(PluginManager manager, int initialInterval)
+      : this() {
+      this.initialInterval = initialInterval;
+      this.pluginManager = manager;
+
+      RegisterPluginManagerEventHandlers();
+
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      versionLabel.Text = "Version " + pluginInfrastructureVersion.FileVersion;
+      infoLabel.Text = "";
+
+      var attr = (AssemblyCopyrightAttribute)this.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false).Single();
+      copyrightLabel.Text = "Copyright " + attr.Copyright;
+
+      fadeTimer = new Timer();
+      fadeTimer.Tick += fadeTimer_Elapsed;
+      fadeTimer.Interval = initialInterval;
+    }
+
+    #region events
+    private void RegisterPluginManagerEventHandlers() {
+      pluginManager.ApplicationStarted += new EventHandler<PluginInfrastructureEventArgs>(manager_ApplicationStarted);
+      pluginManager.ApplicationStarting += new EventHandler<PluginInfrastructureEventArgs>(manager_ApplicationStarting);
+      pluginManager.Initializing += new EventHandler<PluginInfrastructureEventArgs>(manager_Initializing);
+      pluginManager.Initialized += new EventHandler<PluginInfrastructureEventArgs>(manager_Initialized);
+      pluginManager.PluginLoaded += new EventHandler<PluginInfrastructureEventArgs>(manager_PluginLoaded);
+      pluginManager.PluginUnloaded += new EventHandler<PluginInfrastructureEventArgs>(manager_PluginUnloaded);
+    }
+
+    private void DeregisterPluginManagerEventHandlers() {
+      pluginManager.ApplicationStarted -= new EventHandler<PluginInfrastructureEventArgs>(manager_ApplicationStarted);
+      pluginManager.ApplicationStarting -= new EventHandler<PluginInfrastructureEventArgs>(manager_ApplicationStarting);
+      pluginManager.Initializing -= new EventHandler<PluginInfrastructureEventArgs>(manager_Initializing);
+      pluginManager.Initialized -= new EventHandler<PluginInfrastructureEventArgs>(manager_Initialized);
+      pluginManager.PluginLoaded -= new EventHandler<PluginInfrastructureEventArgs>(manager_PluginLoaded);
+      pluginManager.PluginUnloaded -= new EventHandler<PluginInfrastructureEventArgs>(manager_PluginUnloaded);
+    }
+
+    private void manager_PluginUnloaded(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Unloaded " + e.Entity);
+    }
+
+    private void manager_PluginLoaded(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Loaded " + e.Entity);
+    }
+
+    private void manager_Initialized(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Initialized");
+    }
+
+    private void manager_Initializing(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Initializing");
+    }
+
+    private void manager_ApplicationStarting(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Starting " + e.Entity);
+    }
+
+    private void manager_ApplicationStarted(object sender, PluginInfrastructureEventArgs e) {
+      SafeUpdateMessage("Started " + e.Entity);
+    }
+    // called from event handlers
+    private void SafeUpdateMessage(string msg) {
+      try {
+        Invoke((Action<string>)UpdateMessage, msg);
+      }
+      catch (ObjectDisposedException) { }
+    }
+
+    // each tick of the timer reduce opacity and restart timer
+    private void fadeTimer_Elapsed(object sender, EventArgs e) {
+      // only called from local timer: no need to invoke here
+      FadeOut();
+    }
+    #endregion
+
+    public void Show(string initialText) {
+      if (InvokeRequired) Invoke((Action<string>)Show, initialText);
+      else {
+        Opacity = 1;
+        infoLabel.Text = initialText;
+        ResetFadeTimer();
+        Show();
+      }
+    }
+
+    public void Show(IWin32Window owner, string initialText) {
+      if (InvokeRequired) Invoke((Action<IWin32Window, string>)Show, owner, initialText);
+      else {
+        Opacity = 1;
+        infoLabel.Text = initialText;
+        ResetFadeTimer();
+        Show(owner);
+      }
+    }
+
+    private void ResetFadeTimer() {
+      // wait initialInterval again for the first tick
+      fadeTimer.Stop();
+      fadeTimer.Interval = initialInterval;
+      fadeTimer.Start();
+    }
+
+    private void UpdateMessage(string msg) {
+      ResetFadeTimer();
+      infoLabel.Text = msg;
+      Application.DoEvents(); // force immediate update of splash screen control
+    }
+
+    // reduces opacity of the splashscreen one step and restarts the fade-timer
+    private void FadeOut() {
+      fadeTimer.Stop();
+      fadeTimer.Interval = FADE_INTERVAL;
+      if (this.Opacity > 0) {
+        Opacity -= 0.1;
+        fadeTimer.Start();
+      } else {
+        Opacity = 0;
+        fadeTimer.Stop();
+        Hide();
+      }
+    }
+
+    protected override void OnClosing(System.ComponentModel.CancelEventArgs e) {
+      // deregister events when form is closing
+      DeregisterPluginManagerEventHandlers();
+      base.OnClosing(e);
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.Designer.cs	(revision 9512)
@@ -0,0 +1,203 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  partial class StarterForm {
+    /// <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.components = new System.ComponentModel.Container();
+      System.Windows.Forms.ListViewGroup listViewGroup1 = new System.Windows.Forms.ListViewGroup("Applications", System.Windows.Forms.HorizontalAlignment.Left);
+      System.Windows.Forms.ListViewGroup listViewGroup2 = new System.Windows.Forms.ListViewGroup("Plugin Management", System.Windows.Forms.HorizontalAlignment.Left);
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StarterForm));
+      this.startButton = new System.Windows.Forms.Button();
+      this.largeImageList = new System.Windows.Forms.ImageList(this.components);
+      this.applicationsListView = new System.Windows.Forms.ListView();
+      this.nameColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.versionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.descriptionColumnHeader = new System.Windows.Forms.ColumnHeader();
+      this.smallImageList = new System.Windows.Forms.ImageList(this.components);
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.showLargeIconsButton = new System.Windows.Forms.RadioButton();
+      this.showDetailsButton = new System.Windows.Forms.RadioButton();
+      this.aboutButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.startButton.Enabled = false;
+      this.startButton.Location = new System.Drawing.Point(498, 511);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(75, 23);
+      this.startButton.TabIndex = 1;
+      this.startButton.Text = "&Start";
+      this.toolTip.SetToolTip(this.startButton, "Start Selected Application");
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.applicationsListView_ItemActivate);
+      // 
+      // largeImageList
+      // 
+      this.largeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.largeImageList.ImageSize = new System.Drawing.Size(32, 32);
+      this.largeImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // applicationsListView
+      // 
+      this.applicationsListView.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.applicationsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.nameColumnHeader,
+            this.versionColumnHeader,
+            this.descriptionColumnHeader});
+      listViewGroup1.Header = "Applications";
+      listViewGroup1.Name = "Applications";
+      listViewGroup2.Header = "Plugin Management";
+      listViewGroup2.Name = "Plugin Management";
+      this.applicationsListView.Groups.AddRange(new System.Windows.Forms.ListViewGroup[] {
+            listViewGroup1,
+            listViewGroup2});
+      this.applicationsListView.LargeImageList = this.largeImageList;
+      this.applicationsListView.Location = new System.Drawing.Point(12, 12);
+      this.applicationsListView.MultiSelect = false;
+      this.applicationsListView.Name = "applicationsListView";
+      this.applicationsListView.ShowItemToolTips = true;
+      this.applicationsListView.Size = new System.Drawing.Size(642, 493);
+      this.applicationsListView.SmallImageList = this.smallImageList;
+      this.applicationsListView.TabIndex = 0;
+      this.applicationsListView.UseCompatibleStateImageBehavior = false;
+      this.applicationsListView.ItemActivate += new System.EventHandler(this.applicationsListView_ItemActivate);
+      this.applicationsListView.SelectedIndexChanged += new System.EventHandler(this.applicationsListView_SelectedIndexChanged);
+      // 
+      // nameColumnHeader
+      // 
+      this.nameColumnHeader.Text = "Name";
+      this.nameColumnHeader.Width = 125;
+      // 
+      // versionColumnHeader
+      // 
+      this.versionColumnHeader.Text = "Version";
+      // 
+      // descriptionColumnHeader
+      // 
+      this.descriptionColumnHeader.Text = "Description";
+      this.descriptionColumnHeader.Width = 453;
+      // 
+      // smallImageList
+      // 
+      this.smallImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
+      this.smallImageList.ImageSize = new System.Drawing.Size(16, 16);
+      this.smallImageList.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // showLargeIconsButton
+      // 
+      this.showLargeIconsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.showLargeIconsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showLargeIconsButton.Checked = true;
+      this.showLargeIconsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.ShowIcons;
+      this.showLargeIconsButton.Location = new System.Drawing.Point(12, 511);
+      this.showLargeIconsButton.Name = "showLargeIconsButton";
+      this.showLargeIconsButton.Size = new System.Drawing.Size(23, 23);
+      this.showLargeIconsButton.TabIndex = 2;
+      this.showLargeIconsButton.TabStop = true;
+      this.toolTip.SetToolTip(this.showLargeIconsButton, "Show Large Icons");
+      this.showLargeIconsButton.UseVisualStyleBackColor = false;
+      this.showLargeIconsButton.Click += new System.EventHandler(this.largeIconsButton_Click);
+      // 
+      // showDetailsButton
+      // 
+      this.showDetailsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.showDetailsButton.Appearance = System.Windows.Forms.Appearance.Button;
+      this.showDetailsButton.Image = global::HeuristicLab.PluginInfrastructure.Resources.ShowDetails;
+      this.showDetailsButton.Location = new System.Drawing.Point(41, 511);
+      this.showDetailsButton.Name = "showDetailsButton";
+      this.showDetailsButton.Size = new System.Drawing.Size(23, 23);
+      this.showDetailsButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.showDetailsButton, "Show Details");
+      this.showDetailsButton.UseVisualStyleBackColor = false;
+      this.showDetailsButton.Click += new System.EventHandler(this.detailsButton_Click);
+      // 
+      // aboutButton
+      // 
+      this.aboutButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.aboutButton.Location = new System.Drawing.Point(579, 511);
+      this.aboutButton.Name = "aboutButton";
+      this.aboutButton.Size = new System.Drawing.Size(75, 23);
+      this.aboutButton.TabIndex = 4;
+      this.aboutButton.Text = "&About...";
+      this.aboutButton.UseVisualStyleBackColor = true;
+      this.aboutButton.Click += new System.EventHandler(this.aboutButton_Click);
+      // 
+      // StarterForm
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.ClientSize = new System.Drawing.Size(666, 546);
+      this.Controls.Add(this.aboutButton);
+      this.Controls.Add(this.showDetailsButton);
+      this.Controls.Add(this.showLargeIconsButton);
+      this.Controls.Add(this.applicationsListView);
+      this.Controls.Add(this.startButton);
+      this.Icon = HeuristicLab.PluginInfrastructure.Resources.HeuristicLab;
+      this.Name = "StarterForm";
+      this.Text = "HeuristicLab Starter";
+      this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.StarterForm_FormClosing);
+      this.Load += new System.EventHandler(this.StarterForm_Load);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.ImageList largeImageList;
+    private System.Windows.Forms.ListView applicationsListView;
+    private System.Windows.Forms.ColumnHeader nameColumnHeader;
+    private System.Windows.Forms.ColumnHeader versionColumnHeader;
+    private System.Windows.Forms.ColumnHeader descriptionColumnHeader;
+    private System.Windows.Forms.ImageList smallImageList;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.RadioButton showLargeIconsButton;
+    private System.Windows.Forms.RadioButton showDetailsButton;
+    private System.Windows.Forms.Button aboutButton;
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 9512)
@@ -0,0 +1,319 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure.Advanced;
+using HeuristicLab.PluginInfrastructure.Manager;
+
+namespace HeuristicLab.PluginInfrastructure.Starter {
+  /// <summary>
+  /// The starter form is responsible for initializing the plugin infrastructure
+  /// and shows a list of installed applications.
+  /// </summary>
+  public partial class StarterForm : Form {
+    private const string pluginManagerItemName = "Plugin Manager";
+    private const string updatePluginsItemName = "Updates Available";
+    private const string optimizerItemName = "Optimizer";
+
+    private readonly ICommandLineArgument[] arguments;
+
+    private ListViewItem pluginManagerListViewItem;
+    private bool abortRequested;
+    private PluginManager pluginManager;
+    private SplashScreen splashScreen;
+    private bool updatesAvailable = false;
+
+    /// <summary>
+    /// Initializes an instance of the starter form.
+    /// The starter form shows a splashscreen and initializes the plugin infrastructure.
+    /// </summary>
+    public StarterForm()
+      : base() {
+      InitializeComponent();
+      largeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.HeuristicLab.ToBitmap());
+      largeImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.UpdateAvailable.ToBitmap());
+      smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.HeuristicLab.ToBitmap());
+      smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.UpdateAvailable.ToBitmap());
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      Text = "HeuristicLab " + pluginInfrastructureVersion.FileVersion;
+
+      string pluginPath = Path.GetFullPath(Application.StartupPath);
+      pluginManager = new PluginManager(pluginPath);
+      splashScreen = new SplashScreen(pluginManager, 1000);
+      splashScreen.VisibleChanged += new EventHandler(splashScreen_VisibleChanged);
+      splashScreen.Show(this, "Loading HeuristicLab...");
+
+      pluginManager.DiscoverAndCheckPlugins();
+      UpdateApplicationsList();
+
+      CheckUpdatesAvailableAsync();
+    }
+
+    /// <summary>
+    /// Creates a new StarterForm and passes the arguments in <paramref name="args"/>.
+    /// </summary>
+    /// <param name="args">The arguments that should be processed</param>
+    public StarterForm(string[] args)
+      : this() {
+      arguments = CommandLineArgumentHandling.GetArguments(args);
+    }
+
+    protected override void SetVisibleCore(bool value) {
+      value &= !(arguments.OfType<HideStarterArgument>().Any() || arguments.OfType<OpenArgument>().Any());
+      if (!value) HandleArguments();
+      base.SetVisibleCore(value);
+    }
+
+    #region Events
+    private void StarterForm_Load(object sender, EventArgs e) {
+      HandleArguments();
+    }
+
+    private void StarterForm_FormClosing(object sender, FormClosingEventArgs e) {
+      splashScreen.Close();
+      abortRequested = true;
+    }
+
+    private void applicationsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      startButton.Enabled = applicationsListView.SelectedItems.Count > 0;
+    }
+
+    private void applicationsListView_ItemActivate(object sender, EventArgs e) {
+      if (applicationsListView.SelectedItems.Count > 0) {
+        ListViewItem selected = applicationsListView.SelectedItems[0];
+        if (selected.Text == pluginManagerItemName) {
+          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
+            MessageBox.Show("Installation Manager cannot be started while another HeuristicLab application is active." + Environment.NewLine +
+              "Please stop all active HeuristicLab applications and try again.", "Plugin Manager",
+              MessageBoxButtons.OK, MessageBoxIcon.Information);
+          } else {
+            try {
+              Cursor = Cursors.AppStarting;
+              using (InstallationManagerForm form = new InstallationManagerForm(pluginManager)) {
+                form.ShowDialog(this);
+              }
+              UpdateApplicationsList();
+            }
+            finally {
+              Cursor = Cursors.Arrow;
+            }
+          }
+        } else if (selected.Text == updatePluginsItemName) {
+          if (pluginManager.Plugins.Any(x => x.PluginState == PluginState.Loaded)) {
+            MessageBox.Show("Updating is not possible while another HeuristicLab application is active." + Environment.NewLine +
+              "Please stop all active HeuristicLab applications and try again.", "Update plugins",
+              MessageBoxButtons.OK, MessageBoxIcon.Information);
+          } else {
+            try {
+              Cursor = Cursors.AppStarting;
+              using (PluginUpdaterForm form = new PluginUpdaterForm(pluginManager)) {
+                form.ShowDialog(this);
+              }
+              updatesAvailable = false;
+              CheckUpdatesAvailableAsync();
+              UpdateApplicationsList();
+            }
+            finally {
+              Cursor = Cursors.Arrow;
+            }
+          }
+        } else {
+          ApplicationDescription app = (ApplicationDescription)applicationsListView.SelectedItems[0].Tag;
+          StartApplication(app, arguments);
+        }
+      }
+    }
+
+    private void largeIconsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.LargeIcon;
+    }
+
+    private void detailsButton_Click(object sender, EventArgs e) {
+      applicationsListView.View = View.Details;
+      foreach (ColumnHeader column in applicationsListView.Columns) {
+        if (applicationsListView.Items.Count > 0)
+          column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+        else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
+      }
+    }
+
+    private void aboutButton_Click(object sender, EventArgs e) {
+      List<IPluginDescription> plugins = new List<IPluginDescription>(pluginManager.Plugins.OfType<IPluginDescription>());
+      using (var dialog = new AboutDialog(plugins)) {
+        dialog.ShowDialog();
+      }
+    }
+
+    private void splashScreen_VisibleChanged(object sender, EventArgs e) {
+      // close hidden starter form
+      if (!splashScreen.Visible && arguments != null &&
+           (arguments.OfType<HideStarterArgument>().Any() || arguments.OfType<OpenArgument>().Any()))
+        Close();
+    }
+    #endregion
+
+    #region Helpers
+    private void UpdateApplicationsList() {
+      if (InvokeRequired) Invoke((Action)UpdateApplicationsList);
+      else {
+        applicationsListView.Items.Clear();
+        AddPluginManagerItem();
+        AddUpdatePluginsItem();
+
+        foreach (ApplicationDescription info in pluginManager.Applications) {
+          ListViewItem item = new ListViewItem(info.Name, 0);
+          item.Tag = info;
+          item.Group = applicationsListView.Groups["Applications"];
+          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Version.ToString()));
+          item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Description));
+          item.ToolTipText = info.Description;
+          applicationsListView.Items.Add(item);
+        }
+        foreach (ColumnHeader column in applicationsListView.Columns) {
+          if (applicationsListView.Items.Count > 0)
+            column.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
+          else column.AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize);
+        }
+      }
+    }
+
+    private void AddPluginManagerItem() {
+      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
+      pluginManagerListViewItem = new ListViewItem(pluginManagerItemName, 0);
+      pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, pluginInfrastructureVersion.FileVersion));
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
+      pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
+
+      applicationsListView.Items.Add(pluginManagerListViewItem);
+    }
+
+    private void AddUpdatePluginsItem() {
+      if (updatesAvailable) {
+        var updateListViewItem = new ListViewItem(updatePluginsItemName, 1);
+        updateListViewItem.Group = applicationsListView.Groups["Plugin Management"];
+        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, ""));
+        updateListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(updateListViewItem, "Download and install updates"));
+        updateListViewItem.ToolTipText = "Download and install updates";
+
+        applicationsListView.Items.Add(updateListViewItem);
+      }
+    }
+
+    private void CheckUpdatesAvailableAsync() {
+      string pluginPath = Path.GetFullPath(Application.StartupPath);
+      var task = Task.Factory.StartNew<bool>(() => {
+        var installationManager = new InstallationManager(pluginPath);
+        IEnumerable<IPluginDescription> installedPlugins = pluginManager.Plugins.OfType<IPluginDescription>();
+        var remotePlugins = installationManager.GetRemotePluginList();
+        // if there is a local plugin with same name and same major and minor version then it's an update
+        var pluginsToUpdate = from remotePlugin in remotePlugins
+                              let matchingLocalPlugins = from installedPlugin in installedPlugins
+                                                         where installedPlugin.Name == remotePlugin.Name
+                                                         where installedPlugin.Version.Major == remotePlugin.Version.Major
+                                                         where installedPlugin.Version.Minor == remotePlugin.Version.Minor
+                                                         where Util.IsNewerThan(remotePlugin, installedPlugin)
+                                                         select installedPlugin
+                              where matchingLocalPlugins.Count() > 0
+                              select remotePlugin;
+        return pluginsToUpdate.Count() > 0;
+      });
+      task.ContinueWith(t => {
+        try {
+          t.Wait();
+          updatesAvailable = t.Result;
+          UpdateApplicationsList();
+        }
+        catch (AggregateException ae) {
+          ae.Handle(ex => {
+            if (ex is InstallationManagerException) {
+              // this is expected when no internet connection is available => do nothing 
+              return true;
+            } else {
+              return false;
+            }
+          });
+        }
+      });
+    }
+
+    private void HandleArguments() {
+      try {
+        if (arguments.OfType<OpenArgument>().Any() && !arguments.OfType<StartArgument>().Any()) {
+          InitiateApplicationStart(optimizerItemName);
+        }
+        foreach (var argument in arguments) {
+          if (argument is StartArgument) {
+            var arg = (StartArgument)argument;
+            InitiateApplicationStart(arg.Value);
+          }
+        }
+      }
+      catch (AggregateException ex) {
+        ErrorHandling.ShowErrorDialog(this, "One or more errors occurred while initializing the application.", ex);
+      }
+    }
+
+    private void InitiateApplicationStart(string appName) {
+      var appDesc = (from desc in pluginManager.Applications
+                     where desc.Name.Equals(appName)
+                     select desc).SingleOrDefault();
+      if (appDesc != null) {
+        StartApplication(appDesc, arguments);
+      } else {
+        MessageBox.Show("Cannot start application " + appName + ".",
+                        "HeuristicLab",
+                        MessageBoxButtons.OK,
+                        MessageBoxIcon.Warning);
+      }
+    }
+
+    private void StartApplication(ApplicationDescription app, ICommandLineArgument[] args) {
+      splashScreen.Show("Loading " + app.Name);
+      Thread t = new Thread(delegate() {
+        bool stopped = false;
+        do {
+          try {
+            if (!abortRequested) {
+              pluginManager.Run(app, args);
+            }
+            stopped = true;
+          }
+          catch (Exception ex) {
+            stopped = false;
+            ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+            Thread.Sleep(5000); // sleep 5 seconds before autorestart
+          }
+        } while (!abortRequested && !stopped && app.AutoRestart);
+      });
+      t.SetApartmentState(ApartmentState.STA); // needed for the AdvancedOptimizationFrontent
+      t.Start();
+    }
+    #endregion
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/TypeExtensions.cs	(revision 9512)
@@ -0,0 +1,129 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+  internal static class TypeExtensions {
+    internal static bool IsNonDiscoverableType(this Type t) {
+      return t.GetCustomAttributes(typeof(NonDiscoverableTypeAttribute), false).Any();
+    }
+
+    /// <summary>
+    /// Constructs a concrete type from a given proto type.
+    /// </summary>
+    /// <param name="type"></param>
+    /// <param name="protoType"></param>
+    /// <returns>The constructed type, a generic type definition or null, if a type construction is not possible</returns>
+    /// <remarks>This method does not work with nested generic types</remarks>
+    internal static Type BuildType(this Type type, Type protoType) {
+      if (type == null || protoType == null) throw new ArgumentNullException();
+
+      if (!type.IsGenericTypeDefinition) return type;
+      if (protoType.IsGenericTypeDefinition) return type;
+      if (!protoType.IsGenericType) return type;
+
+      var typeGenericArguments = type.GetGenericArguments();
+      var protoTypeGenericArguments = protoType.GetGenericArguments();
+      if (typeGenericArguments.Length != protoTypeGenericArguments.Length) return null;
+
+      for (int i = 0; i < typeGenericArguments.Length; i++) {
+        var typeGenericArgument = typeGenericArguments[i];
+        var protoTypeGenericArgument = protoTypeGenericArguments[i];
+
+        //check class contraint on generic type parameter 
+        if (typeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint))
+          if (!protoTypeGenericArgument.IsClass && !protoTypeGenericArgument.IsInterface && !protoType.IsArray) return null;
+
+        //check default constructor constraint on generic type parameter 
+        if (typeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint))
+          if (!protoTypeGenericArgument.IsValueType && protoTypeGenericArgument.GetConstructor(Type.EmptyTypes) == null) return null;
+
+        //check type restrictions on generic type parameter
+        foreach (var constraint in typeGenericArgument.GetGenericParameterConstraints())
+          if (!constraint.IsAssignableFrom(protoTypeGenericArgument)) return null;
+      }
+
+      try {
+        return type.MakeGenericType(protoTypeGenericArguments);
+      }
+      catch (Exception) {
+        return null;
+      }
+    }
+
+    internal static bool IsSubTypeOf(this Type subType, Type baseType) {
+      if (baseType.IsAssignableFrom(subType)) return true;
+      if (!baseType.IsGenericType) return false;
+
+      if (RecursiveCheckGenericTypes(baseType, subType)) return true;
+      IEnumerable<Type> implementedInterfaces = subType.GetInterfaces().Where(t => t.IsGenericType);
+      foreach (var implementedInterface in implementedInterfaces.Where(i => i.IsGenericType)) {
+        if (baseType.CheckGenericTypes(implementedInterface)) return true;
+      }
+
+      return false;
+    }
+
+    private static bool RecursiveCheckGenericTypes(Type baseType, Type subType) {
+      if (!baseType.IsGenericType) return false;
+      if (!subType.IsGenericType) return false;
+      if (baseType.CheckGenericTypes(subType)) return true;
+      if (subType.BaseType == null) return false;
+
+      return RecursiveCheckGenericTypes(baseType, subType.BaseType);
+    }
+
+    private static bool CheckGenericTypes(this Type baseType, Type subType) {
+      var baseTypeGenericTypeDefinition = baseType.GetGenericTypeDefinition();
+      var subTypeGenericTypeDefinition = subType.GetGenericTypeDefinition();
+      if (baseTypeGenericTypeDefinition != subTypeGenericTypeDefinition) return false;
+      var baseTypeGenericArguments = baseType.GetGenericArguments();
+      var subTypeGenericArguments = subType.GetGenericArguments();
+
+      for (int i = 0; i < baseTypeGenericArguments.Length; i++) {
+        var baseTypeGenericArgument = baseTypeGenericArguments[i];
+        var subTypeGenericArgument = subTypeGenericArguments[i];
+
+        if (baseTypeGenericArgument.IsGenericParameter ^ subTypeGenericArgument.IsGenericParameter) return false;
+        if (baseTypeGenericArgument == subTypeGenericArgument) continue;
+        if (!baseTypeGenericArgument.IsGenericParameter && !subTypeGenericArgument.IsGenericParameter) return false;
+
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint)) return false;
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint)) return false;
+        if (baseTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint) &&
+            !subTypeGenericArgument.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)) return false;
+
+        foreach (var baseTypeGenericParameterConstraint in baseTypeGenericArgument.GetGenericParameterConstraints()) {
+          if (!subTypeGenericArgument.GetGenericParameterConstraints().Any(t => baseTypeGenericParameterConstraint.IsAssignableFrom(t))) return false;
+        }
+      }
+      return true;
+    }
+  }
+}
Index: branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/app.config
===================================================================
--- branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/app.config	(revision 9512)
+++ branches/ExportSymbolicDataAnalysisSolutions/HeuristicLab.PluginInfrastructure/3.3/app.config	(revision 9512)
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+  <configSections>
+    <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>
+
+  <userSettings>
+    <HeuristicLab.PluginInfrastructure.Properties.Settings>
+      <setting name="UpdateLocationUserName" serializeAs="String">
+        <value>anonymous</value>
+      </setting>
+      <setting name="UpdateLocationPassword" serializeAs="String">
+        <value>GetTheLab!</value>
+      </setting>
+      <setting name="ShowPluginUploadControls" serializeAs="String">
+        <value>False</value>
+      </setting>
+      <setting name="UpdateLocation" serializeAs="String">
+        <value>http://services.heuristiclab.com/Deployment-3.3/UpdateService.svc</value>
+      </setting>
+      <setting name="UpdateLocationAdministrationAddress" serializeAs="String">
+        <value>http://services.heuristiclab.com/Deployment-3.3/AdminService.svc</value>
+      </setting>
+    </HeuristicLab.PluginInfrastructure.Properties.Settings>
+  </userSettings>
+
+  <system.serviceModel>
+    <bindings>
+      <wsHttpBinding>
+        <binding name="WSHttpBinding_IUpdateService" closeTimeout="00:01:00"
+          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
+          maxBufferPoolSize="524288" maxReceivedMessageSize="200000000" messageEncoding="Text"
+          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+          <readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000"
+            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00"
+            enabled="false" />
+          <security mode="Message">
+            <transport clientCredentialType="Windows" proxyCredentialType="None"
+              realm="" />
+            <message clientCredentialType="UserName" negotiateServiceCredential="true"
+              algorithmSuite="Default" />
+          </security>
+        </binding>
+
+        <binding name="WSHttpBinding_IAdminService" closeTimeout="00:01:00"
+          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
+          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
+          maxBufferPoolSize="524288" maxReceivedMessageSize="200000000" messageEncoding="Text"
+          textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+          <readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000"
+            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00"
+            enabled="false" />
+          <security mode="Message">
+            <transport clientCredentialType="Windows" proxyCredentialType="None"
+              realm="" />
+            <message clientCredentialType="UserName" negotiateServiceCredential="true"
+              algorithmSuite="Default" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+    </bindings>
+
+    <client>
+      <endpoint address="http://services.heuristiclab.com/Deployment-3.3/UpdateService.svc"
+        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUpdateService"
+        contract="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IUpdateService"
+        name="WSHttpBinding_IUpdateService">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+        </identity>
+      </endpoint>
+      <endpoint address="http://services.heuristiclab.com/Deployment-3.3/AdminService.svc"
+        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IAdminService"
+        contract="HeuristicLab.PluginInfrastructure.Advanced.DeploymentService.IAdminService"
+        name="WSHttpBinding_IAdminService">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+        </identity>
+      </endpoint>
+    </client>
+  </system.serviceModel>
+</configuration>
