Index: trunk/sources/HeuristicLab.Core/3.3/AliasEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/AliasEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/AliasEventArgs.cs	(revision 1662)
@@ -0,0 +1,47 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected alias. 
+  /// </summary>
+  public class AliasEventArgs : EventArgs {
+    private string myAlias;
+    /// <summary>
+    /// Gets the affected alias.
+    /// </summary>
+    public string Alias {
+      get { return myAlias; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AliasEventArgs"/> with the given <paramref name="alias"/>.
+    /// </summary>
+    /// <param name="alias">The affected alias.</param>
+    public AliasEventArgs(string alias) {
+      myAlias = alias;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/AtomicOperation.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/AtomicOperation.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/AtomicOperation.cs	(revision 1662)
@@ -0,0 +1,112 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a single operation with one operator and one scope.
+  /// </summary>
+  public class AtomicOperation : ItemBase, IOperation {
+    private IOperator myOperator;
+    /// <summary>
+    /// Gets the current operator as <see cref="IOperator"/>.
+    /// </summary>
+    public IOperator Operator {
+      get { return myOperator; }
+    }
+    private IScope myScope;  
+    /// <summary>
+    /// Gets the current scope as <see cref="IScope"/>.
+    /// </summary>
+    public IScope Scope {
+      get { return myScope; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="AtomicOperation"/>.
+    /// </summary>
+    public AtomicOperation() { }
+    /// <summary>
+    /// Initializes a new instance of <see cref="AtomicOperation"/> with the given <paramref name="op"/> 
+    /// and the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="op">The operator to assign.</param>
+    /// <param name="scope">The scope to assign.</param>
+    public AtomicOperation(IOperator op, IScope scope) {
+      myOperator = op;
+      myScope = scope;
+    }
+
+    /// <summary>
+    /// Clones the current instance.
+    /// </summary>
+    /// <remarks>The operator and the scope objects are cloned with the 
+    /// <see cref="HeuristicLab.Core.Auxiliary.Clone"/> method of the <see cref="Auxiliary"/> class.</remarks>
+    /// <param name="clonedObjects">All already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="AtomicOperation"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      AtomicOperation clone = new AtomicOperation();
+      clonedObjects.Add(Guid, clone);
+      clone.myOperator = (IOperator)Auxiliary.Clone(Operator, clonedObjects);
+      clone.myScope = (IScope)Auxiliary.Clone(Scope, clonedObjects);
+      return clone;
+    }
+
+    #region Persistence Methods
+
+    /// <summary>
+    ///  Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.StorableBase.GetXmlNode"/> of base 
+    /// class <see cref="ItemBase"/>. <br/>
+    /// The operator is saved as child node having the tag name <c>Operator</c>.<br/>
+    /// The scope is also saved as a child node having the tag name <c>Scope</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Operator", Operator, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Scope", Scope, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operation from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.StorableBase.Populate"/> of base class 
+    /// <see cref="ItemBase"/>.<br/>
+    /// The operator must be saved as a child node with the tag name <c>Operator</c>, also the scope must 
+    /// be saved as a child node having the tag name <c>Scope</c> (see <see cref="GetXmlNode"/>).</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operation is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myOperator = (IOperator)PersistenceManager.Restore(node.SelectSingleNode("Operator"), restoredObjects);
+      myScope = (IScope)PersistenceManager.Restore(node.SelectSingleNode("Scope"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Auxiliary.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Auxiliary.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Auxiliary.cs	(revision 1662)
@@ -0,0 +1,130 @@
+#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.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Static helper class.
+  /// </summary>
+  public static class Auxiliary {
+    #region Cloning
+    /// <summary>
+    /// Clones the given <paramref name="obj"/> (deep clone).
+    /// </summary>
+    /// <remarks>Checks before clone if object has not already been cloned.</remarks>
+    /// <param name="obj">The object to clone.</param>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object.</returns>
+    public static object Clone(IStorable obj, IDictionary<Guid, object> clonedObjects) {
+      object clone;
+      if (clonedObjects.TryGetValue(obj.Guid, out clone))
+        return clone;
+      else
+        return obj.Clone(clonedObjects);
+    }
+    #endregion
+
+    #region Error Messages
+    /// <summary>
+    /// Shows an error message box with a given error <paramref name="message"/> and an OK-Button.
+    /// </summary>
+    /// <param name="message">The error message to display.</param>
+    public static void ShowErrorMessageBox(string message) {
+      MessageBox.Show(message,
+                      "Error",
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Error);
+    }
+    /// <summary>
+    /// Shows an error message box with a given exception <paramref name="ex"/> and an OK-Button.
+    /// </summary>
+    /// <param name="ex">The exception to display.</param>
+    public static void ShowErrorMessageBox(Exception ex) {
+      MessageBox.Show(BuildErrorMessage(ex),
+                      "Error - " + ex.GetType().Name,
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Error);
+    }
+    /// <summary>
+    /// Builds an error message out of an exception and formats it accordingly.
+    /// </summary>
+    /// <param name="ex">The exception to format.</param>
+    /// <returns>The formated message.</returns>
+    private static string BuildErrorMessage(Exception ex) {
+      StringBuilder sb = new StringBuilder();
+      sb.Append("Sorry, but something went wrong!\n\n" + ex.Message + "\n\n" + ex.StackTrace);
+
+      while (ex.InnerException != null) {
+        ex = ex.InnerException;
+        sb.Append("\n\n-----\n\n" + ex.Message + "\n\n" + ex.StackTrace);
+      }
+      return sb.ToString();
+    }
+    #endregion
+
+    #region Constraint Violation Messages
+    /// <summary>
+    /// Shows a warning message box with an OK-Button, indicating that the given constraints were violated and so 
+    /// the operation could not be completed. 
+    /// </summary>
+    /// <param name="violatedConstraints">The constraints that could not be fulfilled.</param>
+    public static void ShowConstraintViolationMessageBox(ICollection<IConstraint> violatedConstraints) {
+      string message = BuildConstraintViolationMessage(violatedConstraints);
+      MessageBox.Show("The following constraints are violated. The operation could not be completed.\n\n" + message,
+                      "Constraint Violation",
+                      MessageBoxButtons.OK,
+                      MessageBoxIcon.Warning);
+    }
+    /// <summary>
+    /// Shows a question message box with a yes-no option, where to choose whether to ignore 
+    /// the given violated constraints and to complete the operation or not.
+    /// </summary>
+    /// <param name="violatedConstraints">The constraints that could not be fulfilled.</param>
+    /// <returns>The result of the choice ("Yes" = 6, "No" = 7).</returns>
+    public static DialogResult ShowIgnoreConstraintViolationMessageBox(ICollection<IConstraint> violatedConstraints) {
+      string message = BuildConstraintViolationMessage(violatedConstraints);
+      return MessageBox.Show("The following constraints are violated. Do you want to complete the operation anyhow?\n\n" + message,
+                             "Constraint Violation",
+                             MessageBoxButtons.YesNo,
+                             MessageBoxIcon.Question);
+    }
+    /// <summary>
+    /// Builds a message out of a given collection of violated constraints, 
+    /// including the constraints type and description.
+    /// </summary>
+    /// <param name="violatedConstraints">The constraints that could not be fulfilled.</param>
+    /// <returns>The message to display.</returns>
+    private static string BuildConstraintViolationMessage(ICollection<IConstraint> violatedConstraints) {
+      StringBuilder sb = new StringBuilder();
+      foreach (IConstraint constraint in violatedConstraints) {
+        sb.AppendLine(constraint.GetType().Name);
+        sb.AppendLine(constraint.Description);
+        sb.AppendLine();
+      }
+      return sb.ToString();
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.Designer.cs	(revision 1662)
@@ -0,0 +1,131 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class ChooseItemDialog {
+    /// <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.cancelButton = new System.Windows.Forms.Button();
+      this.typesGroupBox = new System.Windows.Forms.GroupBox();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.typesGroupBox.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.Cancel;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      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(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // typesGroupBox
+      // 
+      this.typesGroupBox.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.typesGroupBox.Controls.Add(this.treeView);
+      this.typesGroupBox.Location = new System.Drawing.Point(12, 12);
+      this.typesGroupBox.Name = "typesGroupBox";
+      this.typesGroupBox.Size = new System.Drawing.Size(449, 350);
+      this.typesGroupBox.TabIndex = 0;
+      this.typesGroupBox.TabStop = false;
+      this.typesGroupBox.Text = "&Available Item Types";
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.HideSelection = false;
+      this.treeView.Location = new System.Drawing.Point(3, 16);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(443, 331);
+      this.treeView.TabIndex = 0;
+      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // ChooseItemDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.typesGroupBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseItemDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Item";
+      this.Load += new System.EventHandler(this.ChooseItemDialog_Load);
+      this.typesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox typesGroupBox;
+    private System.Windows.Forms.TreeView treeView;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.cs	(revision 1662)
@@ -0,0 +1,191 @@
+#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;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// A dialog to select an item. 
+  /// </summary>
+  public partial class ChooseItemDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Gets or sets the caption of the dialog.
+    /// </summary>
+    /// <remarks>Uses property <see cref="Form.Text"/> of base class <see cref="System.Windows.Forms.Form"/>.
+    /// No own data storage present.</remarks>
+    public string Caption {
+      get { return Text; }
+      set { Text = value; }
+    }
+
+    private IItem myItem;
+    /// <summary>
+    /// Gets the selected item.
+    /// </summary>
+    public IItem Item {
+      get { return myItem; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseItemDialog"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ChooseItemDialog(System.Type)"/> with the type of <see cref="IItem"/>
+    /// as parameter.</remarks>
+    public ChooseItemDialog()
+      : this(typeof(IItem)) {
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseItemDialog"/> with 
+    /// the given <paramref name="itemType"/>.
+    /// </summary>
+    /// <param name="itemType">The type of the items to choose from.</param>
+    public ChooseItemDialog(Type itemType) {
+      InitializeComponent();
+
+      treeView.TreeViewNodeSorter = new TreeNodeSorter();
+
+      if (itemType == null) {
+        itemType = typeof(IItem);
+      }
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      foreach (PluginInfo plugin in discoveryService.Plugins) {
+        TreeNode pluginNode = new TreeNode(plugin.Name);
+        pluginNode.Tag = null;
+
+        Type[] types = discoveryService.GetTypes(itemType, plugin);
+        foreach (Type type in types) {
+          if (!type.IsAbstract) {
+            TreeNode itemNode = new TreeNode();
+            itemNode.Text = type.Name;
+            itemNode.Tag = type;
+            pluginNode.Nodes.Add(itemNode);
+          }
+        }
+        if (pluginNode.Nodes.Count > 0) {
+          treeView.Nodes.Add(pluginNode);
+        }
+      }
+      if (treeView.Nodes.Count == 0) {
+        treeView.Enabled = false;
+        treeView.Nodes.Add(new TreeNode("No item types available"));
+      }
+      okButton.Enabled = false;
+
+      if (treeView.Nodes.Count == 1) {
+        TreeNodeCollection items = treeView.Nodes[0].Nodes;
+        treeView.Nodes.Clear();
+        foreach (TreeNode i in items) {
+          treeView.Nodes.Add(i);
+        }
+      }
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      Type type = (Type)treeView.SelectedNode.Tag;
+
+      if (type.ContainsGenericParameters) {
+        type = type.GetGenericTypeDefinition();
+        Type[] args = new Type[type.GetGenericArguments().Length];
+        ChooseTypeDialog dialog = new ChooseTypeDialog();
+        for (int i = 0; i < args.Length; i++) {
+          dialog.Caption = "Choose type of generic parameter " + (i + 1).ToString();
+          if (dialog.ShowDialog(this) == DialogResult.OK)
+            args[i] = dialog.Type;
+          else
+            args[i] = null;
+        }
+        dialog.Dispose();
+        type = type.MakeGenericType(args);
+      }
+
+      myItem = (IItem)Activator.CreateInstance(type);
+      this.DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      // plugin groups have a null-tag
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null)) {
+        Type type = (Type)treeView.SelectedNode.Tag;
+
+        if (type.ContainsGenericParameters) {
+          type = type.GetGenericTypeDefinition();
+          Type[] args = new Type[type.GetGenericArguments().Length];
+          ChooseTypeDialog dialog = new ChooseTypeDialog();
+          for (int i = 0; i < args.Length; i++) {
+            dialog.Caption = "Choose type of generic parameter " + (i + 1).ToString();
+            if (dialog.ShowDialog(this) == DialogResult.OK)
+              args[i] = dialog.Type;
+            else
+              args[i] = null;
+          }
+          dialog.Dispose();
+          type = type.MakeGenericType(args);
+        }
+
+        myItem = (IItem)Activator.CreateInstance(type);
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null))
+        okButton.Enabled = true;
+    }
+
+    private void ChooseItemDialog_Load(object sender, EventArgs e) {
+      myItem = null;
+      if (treeView.Nodes.Count == 1) {
+        Type type = (Type)treeView.Nodes[0].Tag;
+        if (!type.ContainsGenericParameters) {
+          myItem = (IItem)Activator.CreateInstance(type);
+          this.DialogResult = DialogResult.OK;
+          this.Close();
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseItemDialog.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.Designer.cs	(revision 1662)
@@ -0,0 +1,342 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class ChooseOperatorDialog {
+    /// <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.cancelButton = new System.Windows.Forms.Button();
+      this.builtinOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.builtinOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.builtinOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.operatorLibrariesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorLibraryTextBox = new System.Windows.Forms.TextBox();
+      this.operatorLibraryLabel = new System.Windows.Forms.Label();
+      this.operatorLibraryOperatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorLibraryOperatorsTreeView = new System.Windows.Forms.TreeView();
+      this.operatorLibraryOperatorsDescriptionTextBox = new System.Windows.Forms.TextBox();
+      this.loadButton = new System.Windows.Forms.Button();
+      this.builtinTabPage = new System.Windows.Forms.TabPage();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.builtinOperatorsGroupBox.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.operatorLibrariesTabPage.SuspendLayout();
+      this.operatorLibraryOperatorsGroupBox.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.builtinTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Enabled = false;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      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(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // builtinOperatorsGroupBox
+      // 
+      this.builtinOperatorsGroupBox.Controls.Add(this.splitContainer2);
+      this.builtinOperatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.builtinOperatorsGroupBox.Name = "builtinOperatorsGroupBox";
+      this.builtinOperatorsGroupBox.Size = new System.Drawing.Size(435, 318);
+      this.builtinOperatorsGroupBox.TabIndex = 0;
+      this.builtinOperatorsGroupBox.TabStop = false;
+      this.builtinOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.builtinOperatorsTreeView);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.builtinOperatorsDescriptionTextBox);
+      this.splitContainer2.Size = new System.Drawing.Size(429, 299);
+      this.splitContainer2.SplitterDistance = 220;
+      this.splitContainer2.TabIndex = 2;
+      // 
+      // builtinOperatorsTreeView
+      // 
+      this.builtinOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsTreeView.HideSelection = false;
+      this.builtinOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsTreeView.Name = "builtinOperatorsTreeView";
+      this.builtinOperatorsTreeView.Size = new System.Drawing.Size(429, 220);
+      this.builtinOperatorsTreeView.TabIndex = 0;
+      this.builtinOperatorsTreeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.builtinOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.builtinOperatorsTreeView_AfterSelect);
+      // 
+      // builtinOperatorsDescriptionTextBox
+      // 
+      this.builtinOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.builtinOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.builtinOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.builtinOperatorsDescriptionTextBox.Multiline = true;
+      this.builtinOperatorsDescriptionTextBox.Name = "builtinOperatorsDescriptionTextBox";
+      this.builtinOperatorsDescriptionTextBox.ReadOnly = true;
+      this.builtinOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.builtinOperatorsDescriptionTextBox.Size = new System.Drawing.Size(429, 75);
+      this.builtinOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // 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.operatorLibrariesTabPage);
+      this.tabControl.Controls.Add(this.builtinTabPage);
+      this.tabControl.Location = new System.Drawing.Point(12, 12);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(449, 350);
+      this.tabControl.TabIndex = 0;
+      // 
+      // operatorLibrariesTabPage
+      // 
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryTextBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryLabel);
+      this.operatorLibrariesTabPage.Controls.Add(this.operatorLibraryOperatorsGroupBox);
+      this.operatorLibrariesTabPage.Controls.Add(this.loadButton);
+      this.operatorLibrariesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorLibrariesTabPage.Name = "operatorLibrariesTabPage";
+      this.operatorLibrariesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.operatorLibrariesTabPage.Size = new System.Drawing.Size(441, 324);
+      this.operatorLibrariesTabPage.TabIndex = 0;
+      this.operatorLibrariesTabPage.Text = "Operator Libraries";
+      this.operatorLibrariesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorLibraryTextBox
+      // 
+      this.operatorLibraryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.operatorLibraryTextBox.Location = new System.Drawing.Point(97, 8);
+      this.operatorLibraryTextBox.Name = "operatorLibraryTextBox";
+      this.operatorLibraryTextBox.ReadOnly = true;
+      this.operatorLibraryTextBox.Size = new System.Drawing.Size(257, 20);
+      this.operatorLibraryTextBox.TabIndex = 2;
+      // 
+      // operatorLibraryLabel
+      // 
+      this.operatorLibraryLabel.AutoSize = true;
+      this.operatorLibraryLabel.Location = new System.Drawing.Point(6, 11);
+      this.operatorLibraryLabel.Name = "operatorLibraryLabel";
+      this.operatorLibraryLabel.Size = new System.Drawing.Size(85, 13);
+      this.operatorLibraryLabel.TabIndex = 1;
+      this.operatorLibraryLabel.Text = "&Operator Library:";
+      // 
+      // operatorLibraryOperatorsGroupBox
+      // 
+      this.operatorLibraryOperatorsGroupBox.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.operatorLibraryOperatorsGroupBox.Controls.Add(this.splitContainer1);
+      this.operatorLibraryOperatorsGroupBox.Enabled = false;
+      this.operatorLibraryOperatorsGroupBox.Location = new System.Drawing.Point(6, 35);
+      this.operatorLibraryOperatorsGroupBox.Name = "operatorLibraryOperatorsGroupBox";
+      this.operatorLibraryOperatorsGroupBox.Size = new System.Drawing.Size(429, 283);
+      this.operatorLibraryOperatorsGroupBox.TabIndex = 3;
+      this.operatorLibraryOperatorsGroupBox.TabStop = false;
+      this.operatorLibraryOperatorsGroupBox.Text = "&Available Operators";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorLibraryOperatorsTreeView);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.operatorLibraryOperatorsDescriptionTextBox);
+      this.splitContainer1.Size = new System.Drawing.Size(423, 264);
+      this.splitContainer1.SplitterDistance = 187;
+      this.splitContainer1.TabIndex = 1;
+      // 
+      // operatorLibraryOperatorsTreeView
+      // 
+      this.operatorLibraryOperatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsTreeView.HideSelection = false;
+      this.operatorLibraryOperatorsTreeView.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsTreeView.Name = "operatorLibraryOperatorsTreeView";
+      this.operatorLibraryOperatorsTreeView.ShowNodeToolTips = true;
+      this.operatorLibraryOperatorsTreeView.Size = new System.Drawing.Size(423, 187);
+      this.operatorLibraryOperatorsTreeView.TabIndex = 0;
+      this.operatorLibraryOperatorsTreeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.operatorLibraryOperatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      // 
+      // operatorLibraryOperatorsDescriptionTextBox
+      // 
+      this.operatorLibraryOperatorsDescriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorLibraryOperatorsDescriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorLibraryOperatorsDescriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorLibraryOperatorsDescriptionTextBox.Multiline = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.Name = "operatorLibraryOperatorsDescriptionTextBox";
+      this.operatorLibraryOperatorsDescriptionTextBox.ReadOnly = true;
+      this.operatorLibraryOperatorsDescriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.operatorLibraryOperatorsDescriptionTextBox.Size = new System.Drawing.Size(423, 73);
+      this.operatorLibraryOperatorsDescriptionTextBox.TabIndex = 0;
+      // 
+      // loadButton
+      // 
+      this.loadButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.loadButton.Location = new System.Drawing.Point(360, 6);
+      this.loadButton.Name = "loadButton";
+      this.loadButton.Size = new System.Drawing.Size(75, 23);
+      this.loadButton.TabIndex = 0;
+      this.loadButton.Text = "&Load...";
+      this.loadButton.UseVisualStyleBackColor = true;
+      this.loadButton.Click += new System.EventHandler(this.loadButton_Click);
+      // 
+      // builtinTabPage
+      // 
+      this.builtinTabPage.Controls.Add(this.builtinOperatorsGroupBox);
+      this.builtinTabPage.Location = new System.Drawing.Point(4, 22);
+      this.builtinTabPage.Name = "builtinTabPage";
+      this.builtinTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.builtinTabPage.Size = new System.Drawing.Size(441, 324);
+      this.builtinTabPage.TabIndex = 1;
+      this.builtinTabPage.Text = "Built-In";
+      this.builtinTabPage.UseVisualStyleBackColor = true;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "library";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Open file ...";
+      // 
+      // ChooseOperatorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseOperatorDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Operator";
+      this.Shown += new System.EventHandler(this.ChooseOperatorDialog_Shown);
+      this.builtinOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.Panel2.PerformLayout();
+      this.splitContainer2.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.operatorLibrariesTabPage.ResumeLayout(false);
+      this.operatorLibrariesTabPage.PerformLayout();
+      this.operatorLibraryOperatorsGroupBox.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.Panel2.PerformLayout();
+      this.splitContainer1.ResumeLayout(false);
+      this.builtinTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox builtinOperatorsGroupBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage operatorLibrariesTabPage;
+    private System.Windows.Forms.TabPage builtinTabPage;
+    private System.Windows.Forms.TextBox operatorLibraryTextBox;
+    private System.Windows.Forms.Label operatorLibraryLabel;
+    private System.Windows.Forms.GroupBox operatorLibraryOperatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorLibraryOperatorsTreeView;
+    private System.Windows.Forms.Button loadButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.TreeView builtinOperatorsTreeView;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.TextBox builtinOperatorsDescriptionTextBox;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.TextBox operatorLibraryOperatorsDescriptionTextBox;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.cs	(revision 1662)
@@ -0,0 +1,185 @@
+#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;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// A dialog to select an operator out of a library.
+  /// </summary>
+  public partial class ChooseOperatorDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    private IOperatorLibrary operatorLibrary;
+
+    private IOperator myOperator;
+    /// <summary>
+    /// Gets the selected operator.
+    /// </summary>
+    public IOperator Operator {
+      get { return myOperator; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseOperatorDialog"/>.
+    /// </summary>
+    public ChooseOperatorDialog() {
+      InitializeComponent();
+      operatorLibrary = null;
+      myOperator = null;
+      TreeNodeSorter nodeSorter = new TreeNodeSorter();
+      operatorLibraryOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+      builtinOperatorsTreeView.TreeViewNodeSorter = nodeSorter;
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      PluginInfo[] plugins = discoveryService.Plugins;
+      foreach(PluginInfo plugin in plugins) {
+        TreeNode pluginItem = new TreeNode();
+        pluginItem.Text = plugin.Name;
+        pluginItem.Tag = plugin;
+
+        Type[] operators = discoveryService.GetTypes(typeof(IOperator), plugin);
+        foreach(Type type in operators) {
+          if(!type.IsAbstract) {
+            TreeNode operatorItem = new TreeNode();
+            operatorItem.Text = type.Name;
+            operatorItem.Tag = type;
+            pluginItem.Nodes.Add(operatorItem);
+          }
+        }
+        // add plugin node only if it contains operators
+        if(pluginItem.Nodes.Count > 0) {
+          builtinOperatorsTreeView.Nodes.Add(pluginItem);
+        }
+      }
+      if (builtinOperatorsTreeView.Nodes.Count == 0) {
+        builtinOperatorsTreeView.Enabled = false;
+        builtinOperatorsTreeView.Nodes.Add("No operators available");
+      }
+      builtinOperatorsTreeView.Sort();
+    }
+
+    private void UpdateOperatorsTreeView() {
+      operatorLibraryOperatorsTreeView.Nodes.Clear();
+      operatorLibraryOperatorsTreeView.Nodes.Add(CreateTreeNode(operatorLibrary.Group));
+      operatorLibraryOperatorsTreeView.Sort();
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+
+    #region Form Events
+    private void ChooseOperatorDialog_Shown(object sender, EventArgs e) {
+      operatorLibraryOperatorsTreeView.SelectedNode = null;
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      myOperator = null;
+      builtinOperatorsTreeView.SelectedNode = null;
+      builtinOperatorsDescriptionTextBox.Text = "";
+      okButton.Enabled = false;
+    }
+    #endregion
+
+    #region Selection Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      myOperator = null;
+      operatorLibraryOperatorsDescriptionTextBox.Text = "";
+      if ((operatorLibraryOperatorsTreeView.SelectedNode != null) && (operatorLibraryOperatorsTreeView.SelectedNode.Tag is IOperator)) {
+        myOperator = (IOperator)operatorLibraryOperatorsTreeView.SelectedNode.Tag;
+        myOperator = (IOperator)myOperator.Clone();
+        operatorLibraryOperatorsDescriptionTextBox.Text = myOperator.Description;
+        okButton.Enabled = true;
+      }
+    }
+    private void builtinOperatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      myOperator = null;
+      builtinOperatorsDescriptionTextBox.Text = "";
+      if ((builtinOperatorsTreeView.SelectedNode != null) && (builtinOperatorsTreeView.SelectedNode.Tag is Type)) {
+        okButton.Enabled = true;
+        myOperator = (IOperator)Activator.CreateInstance((Type)builtinOperatorsTreeView.SelectedNode.Tag);
+        builtinOperatorsDescriptionTextBox.Text = myOperator.Description;
+      }
+    }
+    #endregion
+
+    #region Click Events
+    private void loadButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        operatorLibrary = (IOperatorLibrary)PersistenceManager.Load(openFileDialog.FileName);
+        operatorLibraryTextBox.Text = openFileDialog.FileName;
+        toolTip.SetToolTip(operatorLibraryTextBox, openFileDialog.FileName);
+        operatorLibraryOperatorsGroupBox.Enabled = true;
+        UpdateOperatorsTreeView();
+      }
+    }
+    private void okButton_Click(object sender, EventArgs e) {
+      if (Operator != null) {
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      if (Operator != null) {
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseOperatorDialog.resx	(revision 1662)
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>141, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.Designer.cs	(revision 1662)
@@ -0,0 +1,131 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class ChooseTypeDialog {
+    /// <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.cancelButton = new System.Windows.Forms.Button();
+      this.typesGroupBox = new System.Windows.Forms.GroupBox();
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.typesGroupBox.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.Cancel;
+      this.okButton.Location = new System.Drawing.Point(305, 368);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 1;
+      this.okButton.Text = "&OK";
+      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(386, 368);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // typesGroupBox
+      // 
+      this.typesGroupBox.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.typesGroupBox.Controls.Add(this.treeView);
+      this.typesGroupBox.Location = new System.Drawing.Point(12, 12);
+      this.typesGroupBox.Name = "typesGroupBox";
+      this.typesGroupBox.Size = new System.Drawing.Size(449, 350);
+      this.typesGroupBox.TabIndex = 0;
+      this.typesGroupBox.TabStop = false;
+      this.typesGroupBox.Text = "&Available Types";
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.HideSelection = false;
+      this.treeView.Location = new System.Drawing.Point(3, 16);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(443, 331);
+      this.treeView.TabIndex = 0;
+      this.treeView.DoubleClick += new System.EventHandler(this.treeView_DoubleClick);
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // ChooseTypeDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(473, 403);
+      this.Controls.Add(this.typesGroupBox);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "ChooseTypeDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Choose Type";
+      this.Load += new System.EventHandler(this.ChooseTypeDialog_Load);
+      this.typesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.GroupBox typesGroupBox;
+    private System.Windows.Forms.TreeView treeView;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.cs	(revision 1662)
@@ -0,0 +1,153 @@
+#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;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// A dialog to select a specific type.
+  /// </summary>
+  public partial class ChooseTypeDialog : Form {
+    #region Inner Class TreeNodeSorter
+    private class TreeNodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Gets or sets the caption of the dialog.
+    /// </summary>
+    /// <remarks>Uses property <see cref="Form.Text"/> of base class <see cref="Form"/>.
+    /// No own data storage present.</remarks>
+    public string Caption {
+      get { return Text; }
+      set { Text = value; }
+    }
+
+    private Type myType;
+    /// <summary>
+    /// Gets the selected type.
+    /// </summary>
+    public Type Type {
+      get { return myType; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseTypeDialog"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ChooseTypeDialog(Type)"/> with the type of <see cref="IItem"/> as
+    /// parameter.</remarks>
+    public ChooseTypeDialog()
+      : this(typeof(IItem)) {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ChooseTypeDialog"/> with the given 
+    /// <paramref name="baseType"/>.
+    /// </summary>
+    /// <param name="baseType">The base type of all chooseable types.</param>
+    public ChooseTypeDialog(Type baseType) {
+      InitializeComponent();
+
+      treeView.TreeViewNodeSorter = new TreeNodeSorter();
+
+      if (baseType == null) {
+        baseType = typeof(IItem);
+      }
+
+      DiscoveryService discoveryService = new DiscoveryService();
+      foreach (PluginInfo plugin in discoveryService.Plugins) {
+        TreeNode pluginNode = new TreeNode(plugin.Name);
+        pluginNode.Tag = null;
+
+        Type[] types = discoveryService.GetTypes(baseType, plugin);
+        foreach (Type type in types) {
+          TreeNode itemNode = new TreeNode();
+          itemNode.Text = type.Name;
+          itemNode.Tag = type;
+          pluginNode.Nodes.Add(itemNode);
+        }
+        if (pluginNode.Nodes.Count > 0) {
+          treeView.Nodes.Add(pluginNode);
+        }
+      }
+      if (treeView.Nodes.Count == 0) {
+        treeView.Enabled = false;
+        treeView.Nodes.Add(new TreeNode("No item types available"));
+      }
+      okButton.Enabled = false;
+
+      if (treeView.Nodes.Count == 1) {
+        TreeNodeCollection items = treeView.Nodes[0].Nodes;
+        treeView.Nodes.Clear();
+        foreach (TreeNode i in items) {
+          treeView.Nodes.Add(i);
+        }
+      }
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      myType = (Type)treeView.SelectedNode.Tag;
+      this.DialogResult = DialogResult.OK;
+      this.Close();
+    }
+
+    private void treeView_DoubleClick(object sender, EventArgs e) {
+      // plugin groups have a null-tag
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null)) {
+        myType = (Type)treeView.SelectedNode.Tag;
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      okButton.Enabled = false;
+      if ((treeView.SelectedNode != null) && (treeView.SelectedNode.Tag != null))
+        okButton.Enabled = true;
+    }
+
+    private void ChooseTypeDialog_Load(object sender, EventArgs e) {
+      myType = null;
+      if (treeView.Nodes.Count == 1) {
+        myType = (Type)treeView.Nodes[0].Tag;
+        this.DialogResult = DialogResult.OK;
+        this.Close();
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ChooseTypeDialog.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/CompositeOperation.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/CompositeOperation.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/CompositeOperation.cs	(revision 1662)
@@ -0,0 +1,137 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a class for operations consisting themselves of several operations. 
+  /// Can also be executed in parallel.
+  /// </summary>
+  public class CompositeOperation : ItemBase, IOperation {
+    private bool myExecuteInParallel;
+
+    /// <summary>
+    /// Gets or sets the bool value, whether the operation should be executed in parallel or not.  
+    /// </summary>
+    public bool ExecuteInParallel {
+      get { return myExecuteInParallel; }
+      set { myExecuteInParallel = value; }
+    }
+    private List<IOperation> myOperations;
+    /// <summary>
+    /// Gets all current operations.
+    /// <note type="caution"> Operations are read-only!</note>
+    /// </summary>
+    public IList<IOperation> Operations {
+      get { return myOperations.AsReadOnly(); }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="CompositeOperation"/>, the <see cref="ExecuteInParallel"/>
+    /// property set to <c>false</c>.
+    /// </summary>
+    public CompositeOperation() {
+      myOperations = new List<IOperation>();
+      myExecuteInParallel = false;
+    }
+
+    /// <summary>
+    /// Adds an operation to the current list of operations.
+    /// </summary>
+    /// <param name="operation">The operation to add.</param>
+    public void AddOperation(IOperation operation) {
+      myOperations.Add(operation);
+    }
+    /// <summary>
+    /// Removes an operation from the current list.
+    /// </summary>
+    /// <param name="operation">The operation to remove.</param>
+    public void RemoveOperation(IOperation operation) {
+      myOperations.Remove(operation);
+    }
+
+    /// <summary>
+    /// Clones the current instance of <see cref="CompositeOperation"/> (deep clone).
+    /// </summary>
+    /// <remarks>All operations of the current instance are cloned, too (deep clone), with the 
+    /// <see cref="HeuristicLab.Core.Auxiliary.Clone"/> method of the class <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">A dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned operation as <see cref="CompositeOperation"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      CompositeOperation clone = new CompositeOperation();
+      clonedObjects.Add(Guid, clone);
+      clone.myExecuteInParallel = ExecuteInParallel;
+      for (int i = 0; i < Operations.Count; i++)
+        clone.AddOperation((IOperation)Auxiliary.Clone(Operations[i], clonedObjects));
+      return clone;
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="HeuristicLab.Core.StorableBase.GetXmlNode"/> of base 
+    /// class <see cref="ItemBase"/>.<br/>
+    /// The <see cref="ExecuteInParallel"/> property is saved as <see cref="XmlAttribute"/> with the
+    /// tag name <c>ExecuteInParallel</c>. A child node with tag name <c>Operations</c> is created where
+    /// all operations are saved as child nodes.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute parallelAttribute = document.CreateAttribute("ExecuteInParallel");
+      parallelAttribute.Value = ExecuteInParallel.ToString();
+      node.Attributes.Append(parallelAttribute);
+
+      XmlNode operationsNode = document.CreateNode(XmlNodeType.Element, "Operations", null);
+      for (int i = 0; i < Operations.Count; i++)
+        operationsNode.AppendChild(PersistenceManager.Persist(Operations[i], document, persistedObjects));
+      node.AppendChild(operationsNode);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operation from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The <see cref="ExecuteInParallel"/> property must be saved as <see cref="XmlAttribute"/>
+    /// with the tag name <c>ExecuteInParallel</c>. <br/>
+    /// The single operations must be saved as child nodes of a node with tag name <c>Operations</c>, 
+    /// being a child node of the current instance. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operation is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      myExecuteInParallel = bool.Parse(node.Attributes["ExecuteInParallel"].Value);
+
+      XmlNode operationsNode = node.SelectSingleNode("Operations");
+      for (int i = 0; i < operationsNode.ChildNodes.Count; i++)
+        AddOperation((IOperation)PersistenceManager.Restore(operationsNode.ChildNodes[i], restoredObjects));
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBase.cs	(revision 1662)
@@ -0,0 +1,189 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Base class for all items that are subjects to restrictions.
+  /// </summary>
+  public abstract class ConstrainedItemBase : ItemBase, IConstrainedItem {
+    private List<IConstraint> myConstraints;
+    /// <summary>
+    /// Gets all current constraints.
+    /// <note type="caution"> The constraints are returned read-only.</note>
+    /// </summary>
+    public virtual ICollection<IConstraint> Constraints {
+      get { return myConstraints.AsReadOnly(); }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedItemBase"/>.
+    /// </summary>
+    protected ConstrainedItemBase() {
+      myConstraints = new List<IConstraint>();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.Clone
+    /// (System.Collections.Generic.IDictionary&lt;System.Guid, object&gt;)"/> 
+    /// of base class <see cref="ItemBase"/>.<br/>
+    /// Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="ConstrainedItemBase"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      ConstrainedItemBase clone = (ConstrainedItemBase)base.Clone(clonedObjects);
+      clone.myConstraints.Clear();
+      foreach (IConstraint constraint in Constraints)
+        clone.AddConstraint((IConstraint)Auxiliary.Clone(constraint, clonedObjects));
+      return clone;
+    }
+
+    /// <summary>
+    /// Adds the given <paramref name="constraint"/> to the current list.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnConstraintAdded"/>.</remarks>
+    /// <param name="constraint">The constraint to add.</param>
+    public virtual void AddConstraint(IConstraint constraint) {
+      myConstraints.Add(constraint);
+      OnConstraintAdded(constraint);
+    }
+    /// <summary>
+    /// Removes the given <paramref name="constraint"/> from the current list.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnConstraintRemoved"/> if the constraint can be successfully removed.</remarks>
+    /// <param name="constraint">The constraint to remove.</param>
+    public virtual void RemoveConstraint(IConstraint constraint) {
+      if (myConstraints.Remove(constraint))
+        OnConstraintRemoved(constraint);
+    }
+
+    /// <summary>
+    /// Checks all constraints of the current instance.
+    /// </summary>
+    /// <returns><c>true</c> if all constraints could be fulfilled, <c>false</c> otherwise.</returns>
+    public bool IsValid() {
+      bool result = true;
+      foreach (IConstraint constraint in Constraints)
+        result = result && constraint.Check(this);
+      return result;
+    }
+    /// <summary>
+    /// Checks all constraints of the current instance.
+    /// </summary>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if all constraints could be fulfilled, <c>false</c> otherwise.</returns>
+    public bool IsValid(out ICollection<IConstraint> violatedConstraints) {
+      bool result = true;
+      violatedConstraints = new List<IConstraint>();
+      foreach (IConstraint constraint in Constraints) {
+        if (!constraint.Check(this)) {
+          result = false;
+          violatedConstraints.Add(constraint);
+        }
+      }
+      return result;
+    }
+
+    /// <summary>
+    /// Creates an instance of <see cref="ConstrainedItemBaseView"/> 
+    /// to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="ConstrainedItemBaseView"/>.</returns>
+    public override IView CreateView() {
+      return new ConstrainedItemBaseView(this);
+    }
+
+    /// <summary>
+    /// Occurs when a constraint is added.
+    /// </summary>
+    public event EventHandler<ConstraintEventArgs> ConstraintAdded;
+    /// <summary>
+    /// Fires a new <c>ConstraintAdded</c> event.
+    /// </summary>
+    /// <param name="constraint">The constraint that was added.</param>
+    protected virtual void OnConstraintAdded(IConstraint constraint) {
+      if (ConstraintAdded != null)
+        ConstraintAdded(this, new ConstraintEventArgs(constraint));
+    }
+    /// <summary>
+    /// Occurs when a constraint is removed.
+    /// </summary>
+    public event EventHandler<ConstraintEventArgs> ConstraintRemoved;
+    /// <summary>
+    /// Fires a new <c>ConstraintRemoved</c> event.
+    /// </summary>
+    /// <param name="constraint">The constraint that was removed.</param>
+    protected virtual void OnConstraintRemoved(IConstraint constraint) {
+      if (ConstraintRemoved != null)
+        ConstraintRemoved(this, new ConstraintEventArgs(constraint));
+    }
+
+    #region Persistence Methods  
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>. <br/>
+    /// For saving the constraints a child node is created having the tag name <c>Constraints</c>. Beyond this
+    /// child node all constraints are saved as child nodes themselves.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      if (Constraints.Count > 0) {
+        XmlNode constraintsNode = document.CreateNode(XmlNodeType.Element, "Constraints", null);
+        foreach (IConstraint constraint in Constraints)
+          constraintsNode.AppendChild(PersistenceManager.Persist(constraint, document, persistedObjects));
+        node.AppendChild(constraintsNode);
+      }
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted item from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get information about how the constrained item must
+    /// be saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the constrained item is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      XmlNode constraintsNode = node.SelectSingleNode("Constraints");
+      if (constraintsNode != null) {
+        myConstraints.Clear();
+        foreach (XmlNode constraintNode in constraintsNode.ChildNodes)
+          AddConstraint((IConstraint)PersistenceManager.Restore(constraintNode, restoredObjects));
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.Designer.cs	(revision 1662)
@@ -0,0 +1,174 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class ConstrainedItemBaseView {
+    /// <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 (chooseItemDialog != null) chooseItemDialog.Dispose();
+      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.removeConstraintButton = new System.Windows.Forms.Button();
+      this.addConstraintButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.constraintsGroupBox = new System.Windows.Forms.GroupBox();
+      this.constraintsListView = new System.Windows.Forms.ListView();
+      this.columnHeader3 = new System.Windows.Forms.ColumnHeader();
+      this.constraintDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.constraintsGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // removeConstraintButton
+      // 
+      this.removeConstraintButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeConstraintButton.Enabled = false;
+      this.removeConstraintButton.Location = new System.Drawing.Point(81, 310);
+      this.removeConstraintButton.Name = "removeConstraintButton";
+      this.removeConstraintButton.Size = new System.Drawing.Size(75, 23);
+      this.removeConstraintButton.TabIndex = 2;
+      this.removeConstraintButton.Text = "&Remove";
+      this.removeConstraintButton.UseVisualStyleBackColor = true;
+      this.removeConstraintButton.Click += new System.EventHandler(this.removeConstraintButton_Click);
+      // 
+      // addConstraintButton
+      // 
+      this.addConstraintButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addConstraintButton.Location = new System.Drawing.Point(0, 310);
+      this.addConstraintButton.Name = "addConstraintButton";
+      this.addConstraintButton.Size = new System.Drawing.Size(75, 23);
+      this.addConstraintButton.TabIndex = 1;
+      this.addConstraintButton.Text = "&Add...";
+      this.addConstraintButton.UseVisualStyleBackColor = true;
+      this.addConstraintButton.Click += new System.EventHandler(this.addConstraintButton_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.constraintsGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.constraintDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 304);
+      this.splitContainer.SplitterDistance = 149;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // constraintsGroupBox
+      // 
+      this.constraintsGroupBox.Controls.Add(this.constraintsListView);
+      this.constraintsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.constraintsGroupBox.Name = "constraintsGroupBox";
+      this.constraintsGroupBox.Size = new System.Drawing.Size(149, 304);
+      this.constraintsGroupBox.TabIndex = 0;
+      this.constraintsGroupBox.TabStop = false;
+      this.constraintsGroupBox.Text = "&Constraints";
+      // 
+      // constraintsListView
+      // 
+      this.constraintsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader3});
+      this.constraintsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.constraintsListView.HideSelection = false;
+      this.constraintsListView.Location = new System.Drawing.Point(3, 16);
+      this.constraintsListView.Name = "constraintsListView";
+      this.constraintsListView.ShowItemToolTips = true;
+      this.constraintsListView.Size = new System.Drawing.Size(143, 285);
+      this.constraintsListView.TabIndex = 0;
+      this.constraintsListView.UseCompatibleStateImageBehavior = false;
+      this.constraintsListView.View = System.Windows.Forms.View.Details;
+      this.constraintsListView.SelectedIndexChanged += new System.EventHandler(this.constraintsListView_SelectedIndexChanged);
+      this.constraintsListView.SizeChanged += new System.EventHandler(this.constraintsListView_SizeChanged);
+      this.constraintsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.constraintsListView_KeyDown);
+      // 
+      // constraintDetailsGroupBox
+      // 
+      this.constraintDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constraintDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.constraintDetailsGroupBox.Name = "constraintDetailsGroupBox";
+      this.constraintDetailsGroupBox.Size = new System.Drawing.Size(270, 304);
+      this.constraintDetailsGroupBox.TabIndex = 0;
+      this.constraintDetailsGroupBox.TabStop = false;
+      this.constraintDetailsGroupBox.Text = "&Details";
+      // 
+      // ConstrainedItemBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.addConstraintButton);
+      this.Controls.Add(this.removeConstraintButton);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "ConstrainedItemBaseView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.constraintsGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ColumnHeader columnHeader3;
+    protected Button removeConstraintButton;
+    protected Button addConstraintButton;
+    protected SplitContainer splitContainer;
+    protected GroupBox constraintsGroupBox;
+    protected ListView constraintsListView;
+    protected GroupBox constraintDetailsGroupBox;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.cs	(revision 1662)
@@ -0,0 +1,182 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of an <see cref="IConstrainedItem"/>.
+  /// </summary>
+  public partial class ConstrainedItemBaseView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    /// <summary>
+    /// Gets or sets the current item to represent visually.
+    /// </summary>
+    public IConstrainedItem ConstrainedItem {
+      get { return (IConstrainedItem)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedItemBaseView"/> 
+    /// with the caption "Constrained Item".
+    /// </summary>
+    public ConstrainedItemBaseView() {
+      InitializeComponent();
+      constraintsListView.Columns[0].Width = Math.Max(0, constraintsListView.Width - 25);
+      Caption = "Constrained Item";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstrainedItemBaseView"/> with the given 
+    /// <paramref name="constraintItem"/>.
+    /// </summary>
+    /// <param name="constraintItem">The item to represent visually.</param>
+    public ConstrainedItemBaseView(IConstrainedItem constraintItem)
+      : this() {
+      ConstrainedItem = constraintItem;
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="IConstrainedItem"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      ConstrainedItem.ConstraintAdded -= new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintAdded);
+      ConstrainedItem.ConstraintRemoved -= new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintRemoved);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="IConstrainedItem"/>. 
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      ConstrainedItem.ConstraintAdded += new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintAdded);
+      ConstrainedItem.ConstraintRemoved += new EventHandler<ConstraintEventArgs>(ConstrainedItemBase_ConstraintRemoved);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      constraintDetailsGroupBox.Controls.Clear();
+      if (ConstrainedItem == null) {
+        Caption = "Constrained Item";
+        constraintsListView.Enabled = false;
+        constraintDetailsGroupBox.Enabled = false;
+        removeConstraintButton.Enabled = false;
+      } else {
+        Caption = "Constrained Item (" + ConstrainedItem.GetType().Name + ")";
+        constraintsListView.Enabled = true;
+        constraintsListView.Items.Clear();
+        foreach (IConstraint constraint in ConstrainedItem.Constraints) {
+          ListViewItem item = new ListViewItem();
+          item.Text = constraint.GetType().Name;
+          item.Tag = constraint;
+          constraintsListView.Items.Add(item);
+        }
+        if (constraintsListView.Items.Count > 0)
+          constraintsListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void constraintsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (constraintDetailsGroupBox.Controls.Count > 0)
+        constraintDetailsGroupBox.Controls[0].Dispose();
+      constraintDetailsGroupBox.Controls.Clear();
+      constraintDetailsGroupBox.Enabled = false;
+      removeConstraintButton.Enabled = false;
+      if (constraintsListView.SelectedItems.Count > 0) {
+        removeConstraintButton.Enabled = true;
+      }
+      if (constraintsListView.SelectedItems.Count == 1) {
+        IConstraint constraint = (IConstraint)constraintsListView.SelectedItems[0].Tag;
+        Control view = (Control)constraint.CreateView();
+        if (view != null) {
+          constraintDetailsGroupBox.Controls.Add(view);
+          view.Dock = DockStyle.Fill;
+          constraintDetailsGroupBox.Enabled = true;
+        }
+      }
+    }
+
+    #region Size Changed Events
+    private void constraintsListView_SizeChanged(object sender, EventArgs e) {
+      if (constraintsListView.Columns.Count > 0)
+        constraintsListView.Columns[0].Width = Math.Max(0, constraintsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void constraintsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (constraintsListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in constraintsListView.SelectedItems)
+            ConstrainedItem.RemoveConstraint((IConstraint)item.Tag);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addConstraintButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog(typeof(IConstraint));
+        chooseItemDialog.Caption = "Add Constraint";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK)
+        ConstrainedItem.AddConstraint((IConstraint)chooseItemDialog.Item);
+    }
+    private void removeConstraintButton_Click(object sender, EventArgs e) {
+      if (constraintsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in constraintsListView.SelectedItems)
+          ConstrainedItem.RemoveConstraint((IConstraint)item.Tag);
+      }
+    }
+    #endregion
+
+    #region ConstrainedItemBase Events
+    private void ConstrainedItemBase_ConstraintAdded(object sender, ConstraintEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.Constraint.GetType().Name;
+      item.Tag = e.Constraint;
+      constraintsListView.Items.Add(item);
+    }
+    private void ConstrainedItemBase_ConstraintRemoved(object sender, ConstraintEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in constraintsListView.Items) {
+        if (item.Tag == e.Constraint)
+          itemToDelete = item;
+      }
+      constraintsListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ConstrainedItemBaseView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ConstraintEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ConstraintEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ConstraintEventArgs.cs	(revision 1662)
@@ -0,0 +1,50 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected constraint.
+  /// </summary>
+  public class ConstraintEventArgs : ItemEventArgs {
+    /// <summary>
+    /// Gets the affected constraint.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class <see cref="ItemEventArgs"/>.
+    /// No own data storage present.</remarks>
+    public IConstraint Constraint {
+      get { return (IConstraint)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ConstraintEventArgs"/> with the given
+    /// <paramref name="constraint"/>.
+    /// </summary>
+    /// <remarks>Only calls the constructor of base class <see cref="ItemEventArgs"/>.</remarks>
+    /// <param name="constraint">The affected constraint.</param>
+    public ConstraintEventArgs(IConstraint constraint)
+      : base(constraint) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EditorBase.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EditorBase.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EditorBase.Designer.cs	(revision 1662)
@@ -0,0 +1,62 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class EditorBase {
+    /// <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.SuspendLayout();
+      // 
+      // EditorBase
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "EditorBase";
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EditorBase.cs	(revision 1662)
@@ -0,0 +1,82 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Base class for views that can load and save data.
+  /// </summary>
+  public partial class EditorBase : ViewBase, IEditor {
+    private string myFilename;
+    /// <summary>
+    /// Gets or sets the filename of the current editor.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnFilenameChanged"/> in the setter if the filename is new.</remarks>
+    public string Filename {
+      get { return myFilename; }
+      set {
+        if (value != myFilename) {
+          myFilename = value;
+          OnFilenameChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EditorBase"/> with the caption "Editor".
+    /// </summary>
+    public EditorBase() {
+      InitializeComponent();
+      Caption = "Editor";
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Item == null)
+        Caption = "Editor";
+      else
+        Caption = "Editor (" + Item.GetType().Name + ")";
+    }
+
+    /// <summary>
+    /// Occurs when the filename is changed.
+    /// </summary>
+    public event EventHandler FilenameChanged;
+    /// <summary>
+    /// Fires a new <c>FilenameChanged</c> event.
+    /// </summary>
+    protected virtual void OnFilenameChanged() {
+      if (FilenameChanged != null)
+        FilenameChanged(this, new EventArgs());
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EditorBase.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EditorBase.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EditorBase.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/EngineBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EngineBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EngineBase.cs	(revision 1662)
@@ -0,0 +1,349 @@
+#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.Text;
+using System.Xml;
+using System.Threading;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Base class to represent an engine, which is an interpreter, holding the code, the data and 
+  /// the actual state, which is the runtime stack and a pointer onto the next operation. It represents
+  /// one execution and can handle parallel executions.
+  /// </summary>
+  public abstract class EngineBase : ItemBase, IEngine {
+    /// <summary>
+    /// Field of the current instance that represent the operator graph.
+    /// </summary>
+    protected IOperatorGraph myOperatorGraph;
+    /// <summary>
+    /// Gets the current operator graph.
+    /// </summary>
+    public IOperatorGraph OperatorGraph {
+      get { return myOperatorGraph; }
+    }
+    /// <summary>
+    /// Field of the current instance that represent the global scope.
+    /// </summary>
+    protected IScope myGlobalScope;
+    /// <summary>
+    /// Gets the current global scope.
+    /// </summary>
+    public IScope GlobalScope {
+      get { return myGlobalScope; }
+    }
+
+    private TimeSpan myExecutionTime;
+    /// <summary>
+    /// Gets or sets the execution time.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnExecutionTimeChanged"/> in the setter.</remarks>
+    public TimeSpan ExecutionTime {
+      get { return myExecutionTime; }
+      protected set {
+        myExecutionTime = value;
+        OnExecutionTimeChanged();
+      }
+    }
+
+    /// <summary>
+    /// Field of the current instance that represent the execution stack.
+    /// </summary>
+    protected Stack<IOperation> myExecutionStack;
+    /// <summary>
+    /// Gets the current execution stack.
+    /// </summary>
+    public Stack<IOperation> ExecutionStack {
+      get { return myExecutionStack; }
+    }
+    
+    /// <summary>
+    /// Flag of the current instance whether it is currently running.
+    /// </summary>
+    protected bool myRunning;
+    /// <summary>
+    /// Gets information whether the instance is currently running.
+    /// </summary>
+    public bool Running {
+      get { return myRunning; }
+    }
+
+    /// <summary>
+    /// Flag of the current instance whether it is canceled.
+    /// </summary>
+    protected bool myCanceled;
+    /// <summary>
+    /// Gets information whether the instance is currently canceled.
+    /// </summary>
+    public bool Canceled {
+      get { return myCanceled; }
+    }
+    /// <summary>
+    /// Gets information whether the instance has already terminated.
+    /// </summary>
+    public virtual bool Terminated {
+      get { return ExecutionStack.Count == 0; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EngineBase"/> with a new global scope.
+    /// </summary>
+    /// <remarks>Calls <see cref="Reset"/>.</remarks>
+    protected EngineBase() {
+      myOperatorGraph = new OperatorGraph();
+      myGlobalScope = new Scope("Global");
+      myExecutionStack = new Stack<IOperation>();
+      Reset();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="EngineBase"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      EngineBase clone = (EngineBase)base.Clone(clonedObjects);
+      clone.myOperatorGraph = (IOperatorGraph)Auxiliary.Clone(OperatorGraph, clonedObjects);
+      clone.myGlobalScope = (IScope)Auxiliary.Clone(GlobalScope, clonedObjects);
+      clone.myExecutionTime = ExecutionTime;
+      IOperation[] operations = new IOperation[ExecutionStack.Count];
+      ExecutionStack.CopyTo(operations, 0);
+      for (int i = operations.Length - 1; i >= 0; i--)
+        clone.myExecutionStack.Push((IOperation)Auxiliary.Clone(operations[i], clonedObjects));
+      clone.myRunning = Running;
+      clone.myCanceled = Canceled;
+      return clone;
+      
+    }
+
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback, object)"/> 
+    /// of class <see cref="ThreadPool"/>.</remarks>
+    public virtual void Execute() {
+      myRunning = true;
+      myCanceled = false;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback, object)"/> 
+    /// of class <see cref="ThreadPool"/>.</remarks>
+    public virtual void ExecuteSteps(int steps) {
+      myRunning = true;
+      myCanceled = false;
+      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), steps);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="ThreadPool.QueueUserWorkItem(System.Threading.WaitCallback, object)"/> 
+    /// of class <see cref="ThreadPool"/>.</remarks>
+    public void ExecuteStep() {
+      ExecuteSteps(1);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Sets the protected flag <c>myCanceled</c> to <c>true</c>.</remarks>
+    public virtual void Abort() {
+      myCanceled = true;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Sets <c>myCanceled</c> and <c>myRunning</c> to <c>false</c>. The global scope is cleared,
+    /// the execution time is reseted, the execution stack is cleared and a new <see cref="AtomicOperation"/>
+    /// with the initial operator is added. <br/>
+    /// Calls <see cref="OnInitialized"/>.</remarks>
+    public virtual void Reset() {
+      myCanceled = false;
+      myRunning = false;
+      GlobalScope.Clear();
+      ExecutionTime = new TimeSpan();
+      myExecutionStack.Clear();
+      if (OperatorGraph.InitialOperator != null)
+        myExecutionStack.Push(new AtomicOperation(OperatorGraph.InitialOperator, GlobalScope));
+      OnInitialized();
+    }
+
+    private void Run(object state) {
+      if (state == null) Run();
+      else RunSteps((int)state);
+      myRunning = false;
+      OnFinished();
+    }
+    private void Run() {
+      DateTime start = DateTime.Now;
+      DateTime end;
+      while ((!Canceled) && (!Terminated)) {
+        ProcessNextOperation();
+        end = DateTime.Now;
+        ExecutionTime += end - start;
+        start = end;
+      }
+      ExecutionTime += DateTime.Now - start;
+    }
+    private void RunSteps(int steps) {
+      DateTime start = DateTime.Now;
+      DateTime end;
+      int step = 0;
+      while ((!Canceled) && (!Terminated) && (step < steps)) {
+        ProcessNextOperation();
+        step++;
+        end = DateTime.Now;
+        ExecutionTime += end - start;
+        start = end;
+      }
+      ExecutionTime += DateTime.Now - start;
+    }
+
+    /// <summary>
+    /// Performs the next operation.
+    /// </summary>
+    protected abstract void ProcessNextOperation();
+
+    /// <summary>
+    /// Occurs when the current instance is initialized.
+    /// </summary>
+    public event EventHandler Initialized;
+    /// <summary>
+    /// Fires a new <c>Initialized</c> event.
+    /// </summary>
+    protected virtual void OnInitialized() {
+      if (Initialized != null)
+        Initialized(this, new EventArgs());
+    }
+    /// <summary>
+    /// Occurs when an operation is executed.
+    /// </summary>
+    public event EventHandler<OperationEventArgs> OperationExecuted;
+    /// <summary>
+    /// Fires a new <c>OperationExecuted</c> event.
+    /// </summary>
+    /// <param name="operation">The operation that has been executed.</param>
+    protected virtual void OnOperationExecuted(IOperation operation) {
+      if (OperationExecuted != null)
+        OperationExecuted(this, new OperationEventArgs(operation));
+    }
+    /// <summary>
+    /// Occurs when an exception occured during the execution.
+    /// </summary>
+    public event EventHandler<ExceptionEventArgs> ExceptionOccurred;
+    /// <summary>
+    /// Aborts the execution and fires a new <c>ExceptionOccurred</c> event.
+    /// </summary>
+    /// <param name="exception">The exception that was thrown.</param>
+    protected virtual void OnExceptionOccurred(Exception exception) {
+      Abort();
+      if (ExceptionOccurred != null)
+        ExceptionOccurred(this, new ExceptionEventArgs(exception));
+    }
+    /// <summary>
+    /// Occurs when the execution time changed.
+    /// </summary>
+    public event EventHandler ExecutionTimeChanged;
+    /// <summary>
+    /// Fires a new <c>ExecutionTimeChanged</c> event.
+    /// </summary>
+    protected virtual void OnExecutionTimeChanged() {
+      if (ExecutionTimeChanged != null)
+        ExecutionTimeChanged(this, new EventArgs());
+    }
+    /// <summary>
+    /// Occurs when the execution is finished.
+    /// </summary>
+    public event EventHandler Finished;
+    /// <summary>
+    /// Fires a new <c>Finished</c> event.
+    /// </summary>
+    protected virtual void OnFinished() {
+      if (Finished != null)
+        Finished(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// A quick overview how the single elements of the current instance are saved:
+    /// <list type="bullet">
+    /// <item>
+    /// <term>Operator graph: </term>
+    /// <description>Saved as a child node with the tag name <c>OperatorGraph</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Global scope: </term>
+    /// <description>Saved as a child node with the tag name <c>GlobalScope</c>.</description> 
+    /// </item>
+    /// <item>
+    /// <term>Execution stack: </term>
+    /// <description>A child node is created with the tag name <c>ExecutionStack</c>. Beyond this child node
+    /// all operations of the execution stack are saved as child nodes.</description>
+    /// </item>
+    /// <item>
+    /// <term>Execution time: </term>
+    /// <description>Saved as a child node with the tag name <c>ExecutionTime</c>, where the execution
+    /// time is saved as string in the node's inner text.</description>
+    /// </item>
+    /// </list></remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+
+      node.AppendChild(PersistenceManager.Persist("OperatorGraph", OperatorGraph, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("GlobalScope", GlobalScope, document, persistedObjects));
+
+      XmlNode stackNode = document.CreateNode(XmlNodeType.Element, "ExecutionStack", null);
+      IOperation[] operations = new IOperation[ExecutionStack.Count];
+      ExecutionStack.CopyTo(operations, 0);
+      for (int i = 0; i < operations.Length; i++)
+        stackNode.AppendChild(PersistenceManager.Persist(operations[i], document, persistedObjects));
+      node.AppendChild(stackNode);
+
+      XmlNode timeNode = document.CreateNode(XmlNodeType.Element, "ExecutionTime", null);
+      timeNode.InnerText = ExecutionTime.ToString();
+      node.AppendChild(timeNode);
+      return node;
+    }
+    /// <summary>
+    ///  Loads the persisted instance from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get information on how the instance must be saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the engine is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myOperatorGraph = (IOperatorGraph)PersistenceManager.Restore(node.SelectSingleNode("OperatorGraph"), restoredObjects);
+      myGlobalScope = (IScope)PersistenceManager.Restore(node.SelectSingleNode("GlobalScope"), restoredObjects);
+
+      XmlNode stackNode = node.SelectSingleNode("ExecutionStack");
+      for (int i = stackNode.ChildNodes.Count - 1; i >= 0; i--)
+        myExecutionStack.Push((IOperation)PersistenceManager.Restore(stackNode.ChildNodes[i], restoredObjects));
+
+      XmlNode timeNode = node.SelectSingleNode("ExecutionTime");
+      myExecutionTime = TimeSpan.Parse(timeNode.InnerText);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.Designer.cs	(revision 1662)
@@ -0,0 +1,214 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class EngineBaseEditor {
+    /// <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.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorGraphGroupBox = new System.Windows.Forms.GroupBox();
+      this.operatorGraphView = new HeuristicLab.Core.OperatorGraphView();
+      this.globalScopeGroupBox = new System.Windows.Forms.GroupBox();
+      this.scopeView = new HeuristicLab.Core.ScopeView();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.abortButton = new System.Windows.Forms.Button();
+      this.executeButton = new System.Windows.Forms.Button();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorGraphGroupBox.SuspendLayout();
+      this.globalScopeGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(499, 460);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(141, 20);
+      this.executionTimeTextBox.TabIndex = 5;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(496, 444);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 4;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorGraphGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.globalScopeGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(640, 441);
+      this.splitContainer1.SplitterDistance = 320;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // operatorGraphGroupBox
+      // 
+      this.operatorGraphGroupBox.Controls.Add(this.operatorGraphView);
+      this.operatorGraphGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorGraphGroupBox.Name = "operatorGraphGroupBox";
+      this.operatorGraphGroupBox.Size = new System.Drawing.Size(320, 441);
+      this.operatorGraphGroupBox.TabIndex = 0;
+      this.operatorGraphGroupBox.TabStop = false;
+      this.operatorGraphGroupBox.Text = "Operator &Graph";
+      // 
+      // operatorGraphView
+      // 
+      this.operatorGraphView.Caption = "Operator Graph";
+      this.operatorGraphView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorGraphView.Location = new System.Drawing.Point(3, 16);
+      this.operatorGraphView.Name = "operatorGraphView";
+      this.operatorGraphView.OperatorGraph = null;
+      this.operatorGraphView.Size = new System.Drawing.Size(314, 422);
+      this.operatorGraphView.TabIndex = 0;
+      // 
+      // globalScopeGroupBox
+      // 
+      this.globalScopeGroupBox.Controls.Add(this.scopeView);
+      this.globalScopeGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.globalScopeGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.globalScopeGroupBox.Name = "globalScopeGroupBox";
+      this.globalScopeGroupBox.Size = new System.Drawing.Size(316, 441);
+      this.globalScopeGroupBox.TabIndex = 0;
+      this.globalScopeGroupBox.TabStop = false;
+      this.globalScopeGroupBox.Text = "Global &Scope";
+      // 
+      // scopeView
+      // 
+      this.scopeView.Caption = "Scope";
+      this.scopeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scopeView.Location = new System.Drawing.Point(3, 16);
+      this.scopeView.Name = "scopeView";
+      this.scopeView.Scope = null;
+      this.scopeView.Size = new System.Drawing.Size(310, 422);
+      this.scopeView.TabIndex = 0;
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Location = new System.Drawing.Point(196, 457);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(92, 23);
+      this.resetButton.TabIndex = 3;
+      this.resetButton.Text = "&Reset";
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // abortButton
+      // 
+      this.abortButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.abortButton.Enabled = false;
+      this.abortButton.Location = new System.Drawing.Point(98, 457);
+      this.abortButton.Name = "abortButton";
+      this.abortButton.Size = new System.Drawing.Size(92, 23);
+      this.abortButton.TabIndex = 2;
+      this.abortButton.Text = "&Abort";
+      this.abortButton.UseVisualStyleBackColor = true;
+      this.abortButton.Click += new System.EventHandler(this.abortButton_Click);
+      // 
+      // executeButton
+      // 
+      this.executeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.executeButton.Location = new System.Drawing.Point(0, 457);
+      this.executeButton.Name = "executeButton";
+      this.executeButton.Size = new System.Drawing.Size(92, 23);
+      this.executeButton.TabIndex = 1;
+      this.executeButton.Text = "&Execute";
+      this.executeButton.UseVisualStyleBackColor = true;
+      this.executeButton.Click += new System.EventHandler(this.executeButton_Click);
+      // 
+      // EngineBaseEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.resetButton);
+      this.Controls.Add(this.abortButton);
+      this.Controls.Add(this.executeButton);
+      this.Name = "EngineBaseEditor";
+      this.Size = new System.Drawing.Size(640, 480);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorGraphGroupBox.ResumeLayout(false);
+      this.globalScopeGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+    protected System.Windows.Forms.GroupBox operatorGraphGroupBox;
+    protected System.Windows.Forms.GroupBox globalScopeGroupBox;
+    protected System.Windows.Forms.Button resetButton;
+    protected System.Windows.Forms.Button abortButton;
+    protected System.Windows.Forms.Button executeButton;
+    protected HeuristicLab.Core.OperatorGraphView operatorGraphView;
+    protected HeuristicLab.Core.ScopeView scopeView;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.cs	(revision 1662)
@@ -0,0 +1,170 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Base class for editors of engines.
+  /// </summary>
+  public partial class EngineBaseEditor : EditorBase {
+    private int executionTimeCounter;
+
+    /// <summary>
+    /// Gets or sets the current engine.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="EditorBase"/>.</remarks>
+    public IEngine Engine {
+      get { return (IEngine)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="EngineBaseEditor"/>.
+    /// </summary>
+    public EngineBaseEditor() {
+      InitializeComponent();
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      Engine.Initialized -= new EventHandler(Engine_Initialized);
+      Engine.ExceptionOccurred -= new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged -= new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Finished -= new EventHandler(Engine_Finished);
+      operatorGraphView.OperatorGraph = null;
+      scopeView.Scope = null;
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="IEngine"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Engine.Initialized += new EventHandler(Engine_Initialized);
+      Engine.ExceptionOccurred += new EventHandler<ExceptionEventArgs>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged += new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Finished += new EventHandler(Engine_Finished);
+      operatorGraphView.OperatorGraph = Engine.OperatorGraph;
+      scopeView.Scope = Engine.GlobalScope;
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="EditorBase.UpdateControls"/> of base class <see cref="EditorBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      abortButton.Enabled = false;
+      if (Engine == null) {
+        executeButton.Enabled = false;
+        resetButton.Enabled = false;
+        executionTimeTextBox.Enabled = false;
+      } else {
+        executeButton.Enabled = true;
+        resetButton.Enabled = true;
+        executionTimeCounter = 0;
+        executionTimeTextBox.Text = Engine.ExecutionTime.ToString();
+        executionTimeTextBox.Enabled = true;
+      }
+    }
+
+    #region Engine Events
+    private void Engine_Initialized(object sender, EventArgs e) {
+      Refresh();
+    }
+    private delegate void OnExceptionEventDelegate(object sender, ExceptionEventArgs e);
+    private void Engine_ExceptionOccurred(object sender, ExceptionEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnExceptionEventDelegate(Engine_ExceptionOccurred), sender, e);
+      else
+        Auxiliary.ShowErrorMessageBox(e.Exception);
+    }
+    private void Engine_ExecutionTimeChanged(object sender, EventArgs e) {
+      executionTimeCounter++;
+      if (executionTimeCounter == 1000)
+        UpdateExecutionTimeTextBox();
+    }
+    private void Engine_Finished(object sender, EventArgs e) {
+      UpdateExecutionTimeTextBox();
+      if (globalScopeGroupBox.Controls.Count > 0) {
+        ScopeView scopeEditor = (ScopeView)globalScopeGroupBox.Controls[0];
+        if (!scopeEditor.AutomaticUpdating)
+          scopeEditor.Refresh();
+      }
+      EnableDisableControls();
+    }
+    private void UpdateExecutionTimeTextBox() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateExecutionTimeTextBox));
+      else {
+        executionTimeCounter = 0;
+        executionTimeTextBox.Text = Engine.ExecutionTime.ToString();
+      }
+    }
+    private void EnableDisableControls() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(EnableDisableControls));
+      else {
+        executeButton.Enabled = true;
+        abortButton.Enabled = false;
+        resetButton.Enabled = true;
+        operatorGraphGroupBox.Enabled = true;
+        globalScopeGroupBox.Enabled = true;
+      }
+    }
+    #endregion
+
+    #region Button events
+    private void executeButton_Click(object sender, EventArgs e) {
+      executeButton.Enabled = false;
+      abortButton.Enabled = true;
+      resetButton.Enabled = false;
+      operatorGraphGroupBox.Enabled = false;
+      globalScopeGroupBox.Enabled = false;
+      Engine.Execute();
+    }
+    private void abortButton_Click(object sender, EventArgs e) {
+      Engine.Abort();
+    }
+    private void resetButton_Click(object sender, EventArgs e) {
+      Engine.Reset();
+      UpdateExecutionTimeTextBox();
+      if (globalScopeGroupBox.Controls.Count > 0) {
+        ScopeView scopeEditor = (ScopeView)globalScopeGroupBox.Controls[0];
+        if (!scopeEditor.AutomaticUpdating)
+          scopeEditor.Refresh();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/EngineBaseEditor.resx	(revision 1662)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ExceptionEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ExceptionEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ExceptionEventArgs.cs	(revision 1662)
@@ -0,0 +1,48 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected exception.
+  /// </summary>
+  public class ExceptionEventArgs : EventArgs {
+    private Exception myException;
+    /// <summary>
+    /// Gets the affected exception.
+    /// </summary>
+    public Exception Exception {
+      get { return myException; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ExceptionEventArgs"/> 
+    /// with the given <paramref name="exception"/>.
+    /// </summary>
+    /// <param name="exception">The affected exception.</param>
+    public ExceptionEventArgs(Exception exception) {
+      myException = exception;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.2.csproj	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/HeuristicLab.Core-3.2.csproj	(revision 1662)
@@ -0,0 +1,389 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F43B59AB-2B8C-4570-BC1E-15592086517C}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Core</RootNamespace>
+    <AssemblyName>HeuristicLab.Core-3.2</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <PublishUrl>http://localhost/HeuristicLab.Core/</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Web</InstallFrom>
+    <UpdateEnabled>true</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>true</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>
+    </DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DocumentationFile>bin\Release\HeuristicLab.Core-3.2.XML</DocumentationFile>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Core-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Core-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Auxiliary.cs" />
+    <Compile Include="ChooseItemDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseItemDialog.Designer.cs">
+      <DependentUpon>ChooseItemDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ChooseOperatorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseOperatorDialog.Designer.cs">
+      <DependentUpon>ChooseOperatorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstrainedItemBase.cs" />
+    <Compile Include="ConstrainedItemBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ConstrainedItemBaseView.Designer.cs">
+      <DependentUpon>ConstrainedItemBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ConstraintEventArgs.cs" />
+    <Compile Include="AtomicOperation.cs" />
+    <Compile Include="CompositeOperation.cs" />
+    <Compile Include="ChooseTypeDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="ChooseTypeDialog.Designer.cs">
+      <DependentUpon>ChooseTypeDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="AliasEventArgs.cs" />
+    <Compile Include="KeyValueEventArgs.cs" />
+    <Compile Include="OperatorBaseDescriptionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseDescriptionView.Designer.cs">
+      <DependentUpon>OperatorBaseDescriptionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IOperation.cs" />
+    <Compile Include="Interfaces\IOperatorLibrary.cs" />
+    <Compile Include="Interfaces\IVisualizationItem.cs" />
+    <Compile Include="NameChangingEventArgs.cs" />
+    <Compile Include="OperationEventArgs.cs" />
+    <Compile Include="OperatorBaseVariablesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseVariablesView.Designer.cs">
+      <DependentUpon>OperatorBaseVariablesView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorBaseVariableInfosView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseVariableInfosView.Designer.cs">
+      <DependentUpon>OperatorBaseVariableInfosView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ExceptionEventArgs.cs" />
+    <Compile Include="Interfaces\IConstrainedItem.cs" />
+    <Compile Include="Interfaces\IConstraint.cs" />
+    <Compile Include="Interfaces\IItem.cs" />
+    <Compile Include="ItemBase.cs" />
+    <Compile Include="ItemBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ItemBaseView.Designer.cs">
+      <DependentUpon>ItemBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ItemEventArgs.cs" />
+    <Compile Include="ItemIndexEventArgs.cs" />
+    <Compile Include="OperatorLibrary.cs" />
+    <Compile Include="OperatorLibraryEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorLibraryEditor.Designer.cs">
+      <DependentUpon>OperatorLibraryEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeIndexEventArgs.cs" />
+    <Compile Include="EngineBaseEditor.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EngineBaseEditor.Designer.cs">
+      <DependentUpon>EngineBaseEditor.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableInfoEventArgs.cs" />
+    <Compile Include="VariableEventArgs.cs" />
+    <Compile Include="Interfaces\IOperatorGroup.cs" />
+    <Compile Include="Interfaces\IOperatorGraph.cs" />
+    <Compile Include="Interfaces\IScope.cs" />
+    <Compile Include="Interfaces\IVariable.cs" />
+    <Compile Include="Interfaces\IVariableInfo.cs" />
+    <Compile Include="OperatorEventArgs.cs" />
+    <Compile Include="OperatorGroup.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="OperatorIndexEventArgs.cs" />
+    <Compile Include="ScopeEventArgs.cs" />
+    <Compile Include="OperatorBaseView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorBaseView.Designer.cs">
+      <DependentUpon>OperatorBaseView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OperatorGraphView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="OperatorGraphView.Designer.cs">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ScopeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ScopeView.Designer.cs">
+      <DependentUpon>ScopeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableInfoView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableInfoView.Designer.cs">
+      <DependentUpon>VariableInfoView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="VariableView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariableView.Designer.cs">
+      <DependentUpon>VariableView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ViewBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ViewBase.Designer.cs">
+      <DependentUpon>ViewBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IViewable.cs" />
+    <Compile Include="Interfaces\IView.cs" />
+    <Compile Include="EditorBase.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EditorBase.Designer.cs">
+      <DependentUpon>EditorBase.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Interfaces\IEditable.cs" />
+    <Compile Include="Interfaces\IEditor.cs" />
+    <Compile Include="OperatorBase.cs" />
+    <Compile Include="Interfaces\IRandom.cs" />
+    <Compile Include="OperatorGraph.cs" />
+    <Compile Include="StorableBase.cs" />
+    <Compile Include="Scope.cs" />
+    <Compile Include="EngineBase.cs" />
+    <Compile Include="Interfaces\IEngine.cs" />
+    <Compile Include="Interfaces\IOperator.cs" />
+    <Compile Include="Interfaces\IStorable.cs" />
+    <Compile Include="PersistenceManager.cs" />
+    <Compile Include="HeuristicLabCorePlugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Variable.cs" />
+    <Compile Include="VariableInfo.cs" />
+    <Compile Include="VariableKind.cs" />
+    <Compile Include="VariablesScopeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="VariablesScopeView.Designer.cs">
+      <DependentUpon>VariablesScopeView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="ChooseItemDialog.resx">
+      <DependentUpon>ChooseItemDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ChooseOperatorDialog.resx">
+      <DependentUpon>ChooseOperatorDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ConstrainedItemBaseView.resx">
+      <DependentUpon>ConstrainedItemBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ChooseTypeDialog.resx">
+      <DependentUpon>ChooseTypeDialog.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseDescriptionView.resx">
+      <DependentUpon>OperatorBaseDescriptionView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseVariablesView.resx">
+      <DependentUpon>OperatorBaseVariablesView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseVariableInfosView.resx">
+      <DependentUpon>OperatorBaseVariableInfosView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EditorBase.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>EditorBase.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ItemBaseView.resx">
+      <DependentUpon>ItemBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorBaseView.resx">
+      <DependentUpon>OperatorBaseView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorGraphView.resx">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OperatorLibraryEditor.resx">
+      <DependentUpon>OperatorLibraryEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <SubType>Designer</SubType>
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ScopeView.resx">
+      <DependentUpon>ScopeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="EngineBaseEditor.resx">
+      <DependentUpon>EngineBaseEditor.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableInfoView.resx">
+      <DependentUpon>VariableInfoView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariablesScopeView.resx">
+      <DependentUpon>VariablesScopeView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="VariableView.resx">
+      <DependentUpon>VariableView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\CombinedOperator.bmp" />
+    <Content Include="Resources\HeuristicLab.ico" />
+    <Content Include="Resources\Operator.bmp" />
+    <Content Include="Resources\ProgrammableOperator.bmp" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5</ProductName>
+      <Install>false</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>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/sources/HeuristicLab.Core/3.3/HeuristicLabCorePlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/HeuristicLabCorePlugin.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/HeuristicLabCorePlugin.cs	(revision 1662)
@@ -0,0 +1,36 @@
+#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.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Core plugin.
+  /// </summary>
+  [ClassInfo(Name = "HeuristicLab.Core-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Core-3.2.dll", Filetype = PluginFileType.Assembly)]
+  public class HeuristicLabCorePlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstrainedItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstrainedItem.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstrainedItem.cs	(revision 1662)
@@ -0,0 +1,68 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent items that are subjects to restrictions. 
+  /// </summary>
+  public interface IConstrainedItem : IItem {
+    /// <summary>
+    /// All constraints of the current instance. 
+    /// </summary>
+    ICollection<IConstraint> Constraints { get; }
+
+    /// <summary>
+    /// Adds a constraint to the current instance.
+    /// </summary>
+    /// <param name="constraint">The constraint to add.</param>
+    void AddConstraint(IConstraint constraint);
+    /// <summary>
+    /// Removes a constraint from the current instance.
+    /// </summary>
+    /// <param name="constraint">The constraint to remove.</param>
+    void RemoveConstraint(IConstraint constraint);
+
+    /// <summary>
+    /// Checks whether the current instance fullfills all constraints.
+    /// </summary>
+    /// <returns><c>true</c> if all constraints are fullfilled, <c>false</c> otherwise.</returns>
+    bool IsValid();
+    /// <summary>
+    /// Checks whether the current instance fullfills all constraints.
+    /// </summary>
+    /// <param name="violatedConstraints">Output parameter, all constraints that could not be fullfilled.</param>
+    /// <returns><c>true</c> if all constraints are fullfilled, <c>false</c> otherwise.</returns>
+    bool IsValid(out ICollection<IConstraint> violatedConstraints);
+
+    /// <summary>
+    /// An <see cref="EventHandler"/> for events when a new constraint is added.
+    /// </summary>
+    event EventHandler<ConstraintEventArgs> ConstraintAdded;
+    /// <summary>
+    /// An <see cref="EventHandler"/> for events when a constraint is deleted.
+    /// </summary>
+    event EventHandler<ConstraintEventArgs> ConstraintRemoved;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstraint.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstraint.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IConstraint.cs	(revision 1662)
@@ -0,0 +1,43 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent restrictions.
+  /// </summary>
+  public interface IConstraint : IItem {
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    string Description { get; }
+
+    /// <summary>
+    /// Checks whether the given <paramref name="data"/> fulfills the current constraint.
+    /// </summary>
+    /// <param name="data">The item to check.</param>
+    /// <returns><c>true</c> if the current instance could be fulfilled, <c>false</c> otherwise.</returns>
+    bool Check(IItem data);
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditable.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditable.cs	(revision 1662)
@@ -0,0 +1,37 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent editable items.
+  /// </summary>
+  public interface IEditable : IViewable {
+    /// <summary>
+    /// Creates an editor.
+    /// </summary>
+    /// <returns>The created editor as <see cref="IEditor"/>.</returns>
+    IEditor CreateEditor();
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEditor.cs	(revision 1662)
@@ -0,0 +1,42 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent an editor.
+  /// </summary>
+  public interface IEditor : IView {
+
+    /// <summary>
+    /// Gets or sets the filename.
+    /// </summary>
+    string Filename { get; set; }
+
+    /// <summary>
+    /// Occurs when the filename was changed.
+    /// </summary>
+    event EventHandler FilenameChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IEngine.cs	(revision 1662)
@@ -0,0 +1,103 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent one run. (An engine is an interpreter, holding the code, 
+  /// the data and the actual state, which is the runtime stack and a pointer onto the next operation.).
+  /// It is responsible for operator execution and able to deal with parallelism.
+  /// </summary>
+  public interface IEngine : IItem {
+    /// <summary>
+    /// Gets the operator graph of the current instance.
+    /// </summary>
+    IOperatorGraph OperatorGraph { get; }
+    /// <summary>
+    /// Gets the global scope of the current instance.
+    /// </summary>
+    IScope GlobalScope { get; }
+
+    /// <summary>
+    /// Gets the execution time of the current instance.
+    /// </summary>
+    TimeSpan ExecutionTime { get; }
+
+    /// <summary>
+    /// Gets information whether the engine is currently running.
+    /// </summary>
+    bool Running { get; }
+    /// <summary>
+    /// Gets information whether the engine is canceled.
+    /// </summary>
+    bool Canceled { get; }
+    /// <summary>
+    /// Gets information whether the engine has already terminated.
+    /// </summary>
+    bool Terminated { get; }
+
+    /// <summary>
+    /// Executes the whole run.
+    /// </summary>
+    void Execute();
+    /// <summary>
+    /// Executes one step (one operation).
+    /// </summary>
+    void ExecuteStep();
+    /// <summary>
+    /// Executes the given number of steps.
+    /// </summary>
+    /// <param name="steps">The number of steps to execute.</param>
+    void ExecuteSteps(int steps);
+    /// <summary>
+    /// Aborts the engine run.
+    /// </summary>
+    void Abort();
+    /// <summary>
+    /// Resets the current instance.
+    /// </summary>
+    void Reset();
+
+    /// <summary>
+    /// Occurs when the current instance is initialized.
+    /// </summary>
+    event EventHandler Initialized;
+    /// <summary>
+    /// Occurs when an operation is executed.
+    /// </summary>
+    event EventHandler<OperationEventArgs> OperationExecuted;
+    /// <summary>
+    /// Occurs when an exception was thrown.
+    /// </summary>
+    event EventHandler<ExceptionEventArgs> ExceptionOccurred;
+    /// <summary>
+    /// Occurs when the execution time was changed.
+    /// </summary>
+    event EventHandler ExecutionTimeChanged;
+    /// <summary>
+    /// Occurs when the engine is finished.
+    /// </summary>
+    event EventHandler Finished;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IItem.cs	(revision 1662)
@@ -0,0 +1,41 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent (almost) every HeuristicLab object (an object, an operator,...).
+  /// </summary>
+  public interface IItem : IStorable, IViewable {
+    /// <summary>
+    /// Fires a new <c>Changed</c> event.
+    /// </summary>
+    void FireChanged();
+
+    /// <summary>
+    /// Occurs when the current instance has changed.
+    /// </summary>
+    event EventHandler Changed;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperation.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperation.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperation.cs	(revision 1662)
@@ -0,0 +1,32 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent an operation (Executes a defined number of operators on a defined scope). 
+  /// </summary>
+  public interface IOperation : IItem {
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperator.cs	(revision 1662)
@@ -0,0 +1,313 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent an operator (e.g. GreaterThanComparator,...), 
+  /// a basic instruction of an algorithm.
+  /// </summary>
+  public interface IOperator : IConstrainedItem {
+    /// <summary>
+    /// Gets or sets the name of the current instance.
+    /// </summary>
+    string Name { get; set; }
+    /// <summary>
+    /// Gets or sets the description of the current instance.
+    /// </summary>
+    string Description { get; }
+
+    /// <summary>
+    /// Gets information whether the current operator has been canceled.
+    /// </summary>
+    bool Canceled { get; }
+    /// <summary>
+    /// Gets or sets a boolean value whether the engine should stop here during the run.
+    /// </summary>
+    bool Breakpoint { get; set; }
+
+    /// <summary>
+    /// Gets a list of all sub operators.
+    /// </summary>
+    IList<IOperator> SubOperators { get; }
+    /// <summary>
+    /// Gets a collection of all variable (parameter) infos.
+    /// </summary>
+    ICollection<IVariableInfo> VariableInfos { get; }
+    /// <summary>
+    /// Gets a collection of all variables of the current operator.
+    /// </summary>
+    ICollection<IVariable> Variables { get; }
+
+    /// <summary>
+    /// Adds the given sub operator to the current instance.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    void AddSubOperator(IOperator op);
+    /// <summary>
+    /// Adds the given sub operator to the current instance if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    /// <returns><c>true</c> if the operator could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddSubOperator(IOperator op);
+    /// <summary>
+    /// Adds the given sub operator to the current instance if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if the operator could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddSubOperator(IOperator op, out ICollection<IConstraint> violatedConstraints);
+    /// <summary>
+    /// Adds the given sub operator at a the specified <paramref name="index"/>.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    /// <param name="index">The position where to add the operator.</param>
+    void AddSubOperator(IOperator op, int index);
+    /// <summary>
+    /// Adds the given operator at the specified <paramref name="index"/> to the current instance 
+    /// if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    /// <param name="index">The position where to add the operator.</param>
+    /// <returns><c>true</c> if the operator could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddSubOperator(IOperator op, int index);
+    /// <summary>
+    /// Adds the given operator at the specified <paramref name="index"/> to the current instance 
+    /// if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    /// <param name="index">The position where to add the operator.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if the operator could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddSubOperator(IOperator op, int index, out ICollection<IConstraint> violatedConstraints);
+    /// <summary>
+    /// Removes a sub operator at the specified <paramref name="index"/>.
+    /// </summary>
+    /// <param name="index">The position where to delete the operator.</param>
+    void RemoveSubOperator(int index);
+    /// <summary>
+    /// Removes a sub operator at the specified <paramref name="index"/> if all constraint can be fulfilled.
+    /// </summary>
+    /// <param name="index">The position where to delete the operator.</param>
+    /// <returns><c>true</c> if the operator could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveSubOperator(int index);
+    /// <summary>
+    /// Deletes the operator at the specified <paramref name="index"/>  
+    /// if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="index">The position where to delete the operator.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if the operator could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveSubOperator(int index, out ICollection<IConstraint> violatedConstraints);
+
+    /// <summary>
+    /// Gets the variable info with the given <paramref name="formalName"/>.
+    /// </summary>
+    /// <param name="formalName">The formal name of the variable info.</param>
+    /// <returns>The variable info with the specified formal name.</returns>
+    IVariableInfo GetVariableInfo(string formalName);
+    /// <summary>
+    /// Adds the specified variable info to the current instance.
+    /// </summary>
+    /// <param name="variableInfo">The variable info to add.</param>
+    void AddVariableInfo(IVariableInfo variableInfo);
+    /// <summary>
+    /// Adds the specified variable info to the current instance, if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="variableInfo">The variable info to add.</param>
+    /// <returns><c>true</c> if the variable info could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddVariableInfo(IVariableInfo variableInfo);
+    /// <summary>
+    /// Adds the specified variable info to the current instance, if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="variableInfo">The variable info to add.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if the variable info could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddVariableInfo(IVariableInfo variableInfo, out ICollection<IConstraint> violatedConstraints);
+    /// <summary>
+    /// Removes the variable info with the given formal name.
+    /// </summary>
+    /// <param name="formalName">The formal name of the variable info to remove.</param>
+    void RemoveVariableInfo(string formalName);
+    /// <summary>
+    /// Deletes the variable info with the given formal name, 
+    /// if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="formalName">The formal name of the variable info to remove.</param>
+    /// <returns><c>true</c> if the variable info could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveVariableInfo(string formalName);
+    /// <summary>
+    /// Deletes the variable info with the given formal name, 
+    /// if all constraints can be fulfilled.
+    /// </summary>
+    /// <param name="formalName">The formal name of the variable info to remove.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could not be
+    /// fulfilled.</param>
+    /// <returns><c>true</c> if the variable info could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveVariableInfo(string formalName, out ICollection<IConstraint> violatedConstraints);
+
+    /// <summary>
+    /// Gets a variable with the given <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the variable.</param>
+    /// <returns>The variable with the specified name.</returns>
+    IVariable GetVariable(string name);
+    /// <summary>
+    /// Adds the specified <paramref name="variable"/> to the current instance.
+    /// </summary>
+    /// <param name="variable">The variable to add.</param>
+    void AddVariable(IVariable variable);
+    /// <summary>
+    /// Adds the specified <paramref name="variable"/> to the current instance if all constraints can
+    /// be fulfilled.
+    /// </summary>
+    /// <param name="variable">The variable to add.</param>
+    /// <returns><c>true</c> if the variable could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddVariable(IVariable variable);
+    /// <summary>
+    /// Adds the specified <paramref name="variable"/> to the current instance if all constraints can
+    /// be fulfilled.
+    /// </summary>
+    /// <param name="variable">The variable to add.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could 
+    /// not be fulfillled.</param>
+    /// <returns><c>true</c> if the variable could be added without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryAddVariable(IVariable variable, out ICollection<IConstraint> violatedConstraints);
+    /// <summary>
+    /// Deletes the variable with the specified <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the variable to delete.</param>
+    void RemoveVariable(string name);
+    /// <summary>
+    /// Deletes the variable with the specified <paramref name="name"/> if all constraints can be 
+    /// fulfilled.
+    /// </summary>
+    /// <param name="name">The name of the variable to remove.</param>
+    /// <returns><c>true</c> if the variable could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveVariable(string name);
+    /// <summary>
+    /// Deletes the variable with the specified <paramref name="name"/> if all constraints can be 
+    /// fulfilled.
+    /// </summary>
+    /// <param name="name">The name of the variable to remove.</param>
+    /// <param name="violatedConstraints">Output parameter; contains all constraints that could 
+    /// not be fulfilled.</param>
+    /// <returns><c>true</c> if the variable could be deleted without violating constraints,
+    /// <c>false</c> otherwise.</returns>
+    bool TryRemoveVariable(string name, out ICollection<IConstraint> violatedConstraints);
+    
+    /// <inheritdoc cref="GetVariableValue(string, HeuristicLab.Core.IScope, bool)"/>
+    /// <typeparam name="T">The type of the value that is searched.</typeparam>       
+    T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup) where T : class, IItem;
+    /// <inheritdoc cref="GetVariableValue(string, HeuristicLab.Core.IScope, bool, bool)"/>
+    /// <typeparam name="T">The type of the value that is searched.</typeparam>
+    T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) where T : class, IItem;
+    /// <inheritdoc cref="GetVariableValue(System.String, IScope, bool, bool)" 
+    /// select="summary"/>
+    /// <param name="formalName">The formal name of the variable info whose variable value is searched.</param>
+    /// <param name="scope">The scope where to look for the variable.</param>
+    /// <param name="recursiveLookup">Boolean value, whether also the parent scopes shall be searched if
+    /// the variable is not found in the specified <paramref name="scope"/>.</param>
+    /// <returns>The value of the searched variable or null if it is not found.</returns>
+    IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup);
+    /// <summary>
+    /// Gets the value of the variable in the specified <paramref name="scope"/>
+    /// whose variable(parameter) info has the specified <paramref name="formalName"/>.
+    /// </summary>
+    /// <param name="formalName">The formal name of the variable info whose variable value is searched.</param>
+    /// <param name="scope">The scope where to look for the variable.</param>
+    /// <param name="recursiveLookup">Boolean value, whether also the parent scopes shall be searched if
+    /// the variable is not found in the specified <paramref name="scope"/>.</param>
+    /// <param name="throwOnError">Boolean value, whether an exception shall be thrown, if the variable 
+    /// cannot be found or just <c>null</c> shall be returned.</param>
+    /// <returns>The value of the searched variable (or null if the variable is not 
+    /// found and <paramref name="throwOnError"/> is set to false).</returns>
+    IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup, bool throwOnError);
+
+    /// <summary>
+    /// Executes the current instance on the specified <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to execute the current instance.</param>
+    /// <returns>The next operation.</returns>
+    IOperation Execute(IScope scope);
+    /// <summary>
+    /// Aborts the current operator.
+    /// </summary>
+    void Abort();
+
+    /// <summary>
+    /// Occurs when the name of the operator was changed.
+    /// </summary>
+    event EventHandler NameChanged;
+    /// <summary>
+    /// Occurs when the breakpoint flag of the current instance was changed.
+    /// </summary>
+    event EventHandler BreakpointChanged; 
+    /// <summary>
+    /// Occurs when a sub operator has been added.
+    /// </summary>
+    event EventHandler<OperatorIndexEventArgs> SubOperatorAdded;
+    /// <summary>
+    /// Occurs when a sub operator has been deleted.
+    /// </summary>
+    event EventHandler<OperatorIndexEventArgs> SubOperatorRemoved;
+    /// <summary>
+    /// Occurs when a variable info has been added.
+    /// </summary>
+    event EventHandler<VariableInfoEventArgs> VariableInfoAdded;
+    /// <summary>
+    /// Occurs when a variable info has been deleted.
+    /// </summary>
+    event EventHandler<VariableInfoEventArgs> VariableInfoRemoved;
+    /// <summary>
+    /// Occurs when a variable has been added.
+    /// </summary>
+    event EventHandler<VariableEventArgs> VariableAdded;
+    /// <summary>
+    /// Occurs when a variable has been deleted.
+    /// </summary>
+    event EventHandler<VariableEventArgs> VariableRemoved;
+    /// <summary>
+    /// Occurs when the current instance is executed.
+    /// </summary>
+    event EventHandler Executed;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGraph.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGraph.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGraph.cs	(revision 1662)
@@ -0,0 +1,75 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent an operator graph.
+  /// </summary>
+  public interface IOperatorGraph : IItem {
+    /// <summary>
+    /// Gets all operators of the current instance.
+    /// </summary>
+    ICollection<IOperator> Operators { get; }
+    /// <summary>
+    /// Gets or sets the initial operator (the starting one) of the current instance.
+    /// </summary>
+    IOperator InitialOperator { get; set; }
+
+    /// <summary>
+    /// Adds the given operator to the current instance.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    void AddOperator(IOperator op);
+    /// <summary>
+    /// Removes an operator with the specified <paramref name="guid"/> from the current instance.
+    /// </summary>
+    /// <param name="guid">The unique id of the operator to remove.</param>
+    void RemoveOperator(Guid guid);
+    /// <summary>
+    /// Gets the operator with the specified <paramref name="guid"/>.
+    /// </summary>
+    /// <param name="guid">The unique id of the operator.</param>
+    /// <returns>The searched operator.</returns>
+    IOperator GetOperator(Guid guid);
+    /// <summary>
+    /// Clears the current instance.
+    /// </summary>
+    void Clear();
+
+    /// <summary>
+    /// Occurs when a new operator has been added to the current instance.
+    /// </summary>
+    event EventHandler<OperatorEventArgs> OperatorAdded;
+    /// <summary>
+    /// Occurs when an operator has been deleted from the current instance.
+    /// </summary>
+    event EventHandler<OperatorEventArgs> OperatorRemoved;
+    /// <summary>
+    /// Occurs when the initial operator (the starting one) has been changed.
+    /// </summary>
+    event EventHandler InitialOperatorChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGroup.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGroup.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorGroup.cs	(revision 1662)
@@ -0,0 +1,71 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent a group of operators.
+  /// </summary>
+  public interface IOperatorGroup : IStorable {
+    /// <summary>
+    /// Gets or sets the name of the current instance.
+    /// </summary>
+    string Name { get; set; }
+    /// <summary>
+    /// Gets all sub groups of operators of the current instance.
+    /// </summary>
+    ICollection<IOperatorGroup> SubGroups { get; }
+    /// <summary>
+    /// Gets all operators of the current operator group.
+    /// </summary>
+    ICollection<IOperator> Operators { get; }
+
+    /// <summary>
+    /// Adds the specified sub group of operators to the current operator group.
+    /// </summary>
+    /// <param name="group">The operator group to add.</param>
+    void AddSubGroup(IOperatorGroup group);
+    /// <summary>
+    /// Deletes the specified sub group of operators from the current instance.
+    /// </summary>
+    /// <param name="group">The sub group to delete.</param>
+    void RemoveSubGroup(IOperatorGroup group);
+    /// <summary>
+    /// Adds the specified operator to the current instance.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    void AddOperator(IOperator op);
+    /// <summary>
+    /// Deletes the specified operator from the current instance.
+    /// </summary>
+    /// <param name="op">The operator to remove.</param>
+    void RemoveOperator(IOperator op);
+
+    /// <summary>
+    /// Occurs when the name of the operator group has been changed.
+    /// </summary>
+    event EventHandler NameChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorLibrary.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorLibrary.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IOperatorLibrary.cs	(revision 1662)
@@ -0,0 +1,37 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent a library of operators.
+  /// </summary>
+  public interface IOperatorLibrary : IItem {
+    /// <summary>
+    /// Gets the operator group of the current instance.
+    /// </summary>
+    IOperatorGroup Group { get; }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IRandom.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IRandom.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IRandom.cs	(revision 1662)
@@ -0,0 +1,66 @@
+#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.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents an interface for random number generators.
+  /// </summary>
+  public interface IRandom : IItem {
+    /// <summary>
+    /// Resets the random number generator.
+    /// </summary>
+    void Reset();
+    /// <summary>
+    /// Resets the random number generator with the given <paramref name="seed"/>.
+    /// </summary>
+    /// <param name="seed">The new seed.</param>
+    void Reset(int seed);
+
+    /// <summary>
+    /// Gets a new random number.
+    /// </summary>
+    /// <returns>A random integer number.</returns>
+    int Next();
+    /// <summary>
+    /// Gets a new random number between 0 and <paramref name="maxVal"/>.
+    /// </summary>
+    /// <param name="maxVal">The maximal value of the random number (exclusive).</param>
+    /// <returns>A random integer number smaller than <paramref name="maxVal"/>.</returns>
+    int Next(int maxVal);
+    /// <summary>
+    /// Gets a new random number between <paramref name="minVal"/> and <paramref name="maxVal"/>.
+    /// </summary>
+    /// <param name="maxVal">The maximal value of the random number (exclusive).</param>
+    /// <param name="minVal">The minimal value of the random number (inclusive).</param>
+    /// <returns>A random integer number. (<paramref name="minVal"/> &lt;= x &lt; <paramref name="maxVal"/>).</returns>
+    int Next(int minVal, int maxVal);
+    /// <summary>
+    /// Gets a new double random number.
+    /// </summary>
+    /// <returns>A random double number.</returns>
+    double NextDouble();
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IScope.cs	(revision 1662)
@@ -0,0 +1,177 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface for a hierarchical container of variables (containing variables and subscopes). 
+  /// </summary>
+  public interface IScope : IItem {
+    /// <summary>
+    /// Gets the name of the current instance.
+    /// </summary>
+    string Name { get; }
+
+    /// <summary>
+    /// Gets the varibles of the current scope.
+    /// </summary>
+    ICollection<IVariable> Variables { get; }
+    /// <summary>
+    /// Gets all aliases of the current scope.
+    /// </summary>
+    IEnumerable<KeyValuePair<string, string>> Aliases { get; }
+    /// <summary>
+    /// Gets all subscopes in the current scope.
+    /// </summary>
+    IList<IScope> SubScopes { get; }
+
+    /// <summary>
+    /// Sets the parent scope for the current instance.
+    /// </summary>
+    /// <param name="scope">The parent scope of the current instance.</param>
+    void SetParent(IScope scope);
+
+    /// <summary>
+    /// Gets a variable with the given <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the variable.</param>
+    /// <returns>The variable with the specified name.</returns>
+    IVariable GetVariable(string name);
+    /// <summary>
+    /// Adds the specified variable to the curent instance.
+    /// </summary>
+    /// <param name="variable">The variable to add.</param>
+    void AddVariable(IVariable variable);
+    /// <summary>
+    /// Deletes a variable with the specified <paramref name="name"/> from the current instance.
+    /// </summary>
+    /// <param name="name">The name of the variable to delete.</param>
+    void RemoveVariable(string name);
+    
+    /// <inheritdoc cref="GetVariableValue(string, bool)"/>
+    /// <typeparam name="T">The type of the value that is searched.</typeparam>
+    T GetVariableValue<T>(string name, bool recursiveLookup) where T : class, IItem;
+    /// <inheritdoc cref="GetVariableValue(string, bool, bool)"/>
+    /// <typeparam name="T">The type of the value that is searched.</typeparam>
+    T GetVariableValue<T>(string name, bool recursiveLookup, bool throwOnError) where T : class, IItem;
+    /// <inheritdoc cref="GetVariableValue(string, bool, bool)" select="summary"/>
+    /// <param name="name">The name of the variable.</param>
+    /// <param name="recursiveLookup">Boolean value, whether the parent scopes shall be searched
+    /// when the variable is not found in the current instance.</param>
+    /// <returns>The value of the variable or <c>null</c> if it was not found.</returns>
+    IItem GetVariableValue(string name, bool recursiveLookup);
+    /// <summary>
+    /// Gets the value of the variable with the given <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the variable.</param>
+    /// <param name="recursiveLookup">Boolean value, whether the parent scopes shall be searched
+    /// when the variable is not found in the current instance.</param>
+    /// <param name="throwOnError">Boolean value, whether an exception shall be thrown when the searched 
+    /// variable cannot be found, or only <c>null</c> shall be returned.</param>
+    /// <returns>The value of the searched variable or <c>null</c> if <paramref name="throwOnError"/>
+    /// is set to <c>false</c>.</returns>
+    IItem GetVariableValue(string name, bool recursiveLookup, bool throwOnError);
+
+    /// <summary>
+    /// Gets the actual name of the given alias.
+    /// </summary>
+    /// <param name="name">The alias whose actual name is searched.</param>
+    /// <returns>The actual name.</returns>
+    string TranslateName(string name);
+    /// <summary>
+    /// Adds an alias to the current instance. 
+    /// </summary>
+    /// <param name="alias">The alias to add.</param>
+    /// <param name="name">The actual name of the alias.</param>
+    void AddAlias(string alias, string name);
+    /// <summary>
+    /// Deletes the specified <paramref name="alias"/> from the current instance.
+    /// </summary>
+    /// <param name="alias">The alias to delete.</param>
+    void RemoveAlias(string alias);
+
+    /// <summary>
+    /// Adds the specified sub scope to the current instance.
+    /// </summary>
+    /// <param name="scope">The sub scope to add.</param>
+    void AddSubScope(IScope scope);
+    /// <summary>
+    /// Deletes the specified sub scope from the current instance.
+    /// </summary>
+    /// <param name="scope">The sub scope to delete.</param>
+    void RemoveSubScope(IScope scope);
+    /// <summary>
+    /// Reorders all sub scopes according to the specified chronology.
+    /// </summary>
+    /// <param name="sequence">The chronology how to order the sub scopes.</param>
+    void ReorderSubScopes(int[] sequence);
+    /// <summary>
+    /// Gets the sub scope with the given <paramref name="guid"/>.
+    /// </summary>
+    /// <param name="guid">The unique identifier of the sub scope.</param>
+    /// <returns>The sub scope with the given <paramref name="guid"/>.</returns>
+    IScope GetScope(Guid guid);
+    /// <summary>
+    /// Gets the sub scope with the given <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the sub scope.</param>
+    /// <returns>The sub scope with the given <paramref name="name"/>.</returns>
+    IScope GetScope(string name);
+
+    /// <summary>
+    /// Clears the current instance.
+    /// </summary>
+    void Clear();
+
+    /// <summary>
+    /// Occurs when a variable has been added to the current instance.
+    /// </summary>
+    event EventHandler<VariableEventArgs> VariableAdded;
+    /// <summary>
+    /// Occurs when a variable has been deleted from the current instance.
+    /// </summary>
+    event EventHandler<VariableEventArgs> VariableRemoved;
+    /// <summary>
+    /// Occurs when an alias has been added to the current instance.
+    /// </summary>
+    event EventHandler<AliasEventArgs> AliasAdded;
+    /// <summary>
+    /// Occurs when an alias has been removed from the current instance.
+    /// </summary>
+    event EventHandler<AliasEventArgs> AliasRemoved;
+    /// <summary>
+    /// Occurs when a sub scope has been added to the current instance.
+    /// </summary>
+    event EventHandler<ScopeIndexEventArgs> SubScopeAdded;
+    /// <summary>
+    /// Occurs when a sub scope has been deleted from the current instance.
+    /// </summary>
+    event EventHandler<ScopeIndexEventArgs> SubScopeRemoved;
+    /// <summary>
+    /// Occurs when the sub scopes have been reordered.
+    /// </summary>
+    event EventHandler SubScopesReordered;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IStorable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IStorable.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IStorable.cs	(revision 1662)
@@ -0,0 +1,67 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent objects that are de- and serializeable.
+  /// </summary>
+  public interface IStorable {
+    /// <summary>
+    /// Gets the objects unique identifier.
+    /// </summary>
+    Guid Guid { get; }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <returns>The cloned object.</returns>
+    object Clone();
+    /// <summary>
+    /// Clones the current instance, considering already cloned objects.
+    /// </summary>
+    /// <param name="clonedObjects">All already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object.</returns>
+    object Clone(IDictionary<Guid, object> clonedObjects);
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified 
+    /// <typeparamref name="document"/>.
+    /// </summary>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects);
+    /// <summary>
+    /// Loads the persisted object from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <param name="node">The <see cref="XmlNode"/> where the object is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid 
+    /// cycles.)</param>
+    void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects);
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariable.cs	(revision 1662)
@@ -0,0 +1,61 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent a variable (of an operator) having a name and a value.
+  /// </summary>
+  public interface IVariable : IItem {
+    /// <summary>
+    /// Gets or sets the name of the variable.
+    /// </summary>
+    string Name { get; set; }
+    /// <summary>
+    /// Gets or sets the value of the variable.
+    /// </summary>
+    IItem Value { get; set; }
+
+    /// <summary>
+    /// Gets the value of the variable.
+    /// </summary>
+    /// <typeparam name="T">The type of the variable's value.</typeparam>
+    /// <returns>The value of the current instance.</returns>
+    T GetValue<T>() where T : class, IItem;
+
+    /// <summary>
+    /// Occurs when the name of the variable is currently changing.
+    /// </summary>
+    event EventHandler<NameChangingEventArgs> NameChanging;
+    /// <summary>
+    /// Occurs when the name of the current instance has been changed.
+    /// </summary>
+    event EventHandler NameChanged;
+    /// <summary>
+    /// Occurs when the value of the current instance has been changed.
+    /// </summary>
+    event EventHandler ValueChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariableInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariableInfo.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVariableInfo.cs	(revision 1662)
@@ -0,0 +1,66 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to store meta-information about variables/parameters of operators.
+  /// </summary>
+  public interface IVariableInfo : IItem {
+    /// <summary>
+    /// Gets or sets the actual name of the variable info.
+    /// </summary>
+    string ActualName { get; set; }
+    /// <summary>
+    /// Gets or sets the formal name of the current instance.
+    /// </summary>
+    string FormalName { get; }
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    string Description { get; }
+    /// <summary>
+    /// Gets the data type of the current instance.
+    /// </summary>
+    Type DataType { get; }
+    /// <summary>
+    /// Gets the kind of the variable info (in, out, new,...).
+    /// </summary>
+    VariableKind Kind { get; }
+    /// <summary>
+    /// Gets or sets a boolean value whether the current instance is a local variable info.
+    /// </summary>
+    bool Local { get; set; }
+
+    /// <summary>
+    /// Occurs when the actual name of the current instance has been changed.
+    /// </summary>
+    event EventHandler ActualNameChanged;
+    /// <summary>
+    /// Occurs when the local flag has been changed.
+    /// </summary>
+    event EventHandler LocalChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IView.cs	(revision 1662)
@@ -0,0 +1,50 @@
+#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.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// An interface for all kinds visual representations of items (objects, operators...).
+  /// </summary>
+  public interface IView : IControl {
+    /// <summary>
+    /// Gets the current item instance.
+    /// </summary>
+    IItem Item { get; }
+    /// <summary>
+    /// Gets or sets the caption of the current instance. 
+    /// </summary>
+    string Caption { get; set; }
+
+    /// <summary>
+    /// Occurs when the item was changed.
+    /// </summary>
+    event EventHandler ItemChanged;
+    /// <summary>
+    /// Occurs when the caption was changed.
+    /// </summary>
+    event EventHandler CaptionChanged;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IViewable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IViewable.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IViewable.cs	(revision 1662)
@@ -0,0 +1,37 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Interface to represent items that can displayed visually.
+  /// </summary>
+  public interface IViewable {
+    /// <summary>
+    /// Creates a view to display the current instance.
+    /// </summary>
+    /// <returns>The created view.</returns>
+    IView CreateView();
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVisualizationItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVisualizationItem.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Interfaces/IVisualizationItem.cs	(revision 1662)
@@ -0,0 +1,31 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Marker interface for items that can be visualized.
+  /// </summary>
+  public interface IVisualizationItem : IItem { }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemBase.cs	(revision 1662)
@@ -0,0 +1,69 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents the base class for all basic item types.
+  /// </summary>
+  public abstract class ItemBase : StorableBase, IItem {
+    /// <summary>
+    /// Creates a new instance of <see cref="ItemBaseView"/> for 
+    /// visual representation of the current instance.
+    /// </summary>
+    /// <returns>The created instance as <see cref="ItemBaseView"/>.</returns>
+    public virtual IView CreateView() {
+      return new ItemBaseView(this);
+    }
+
+    /// <summary>
+    /// Gets the string representation of the current instance.
+    /// </summary>
+    /// <returns>The type name of the current instance.</returns>
+    public override string ToString() {
+      return GetType().Name;
+    }
+
+    /// <summary>
+    /// Fires a new <c>Changed</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnChanged"/>.</remarks>
+    public void FireChanged() {
+      OnChanged();
+    }
+
+    /// <summary>
+    /// Occurs when the current item was changed.
+    /// </summary>
+    public event EventHandler Changed;
+    /// <summary>
+    /// Fires a new <c>Changed</c> event.
+    /// </summary>
+    protected virtual void OnChanged() {
+      if (Changed != null)
+        Changed(this, new EventArgs());
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.Designer.cs	(revision 1662)
@@ -0,0 +1,76 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class ItemBaseView {
+    /// <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.messageLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // messageLabel
+      // 
+      this.messageLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
+      this.messageLabel.AutoSize = true;
+      this.messageLabel.Location = new System.Drawing.Point(55, 0);
+      this.messageLabel.Name = "messageLabel";
+      this.messageLabel.Size = new System.Drawing.Size(91, 13);
+      this.messageLabel.TabIndex = 0;
+      this.messageLabel.Text = "No view available";
+      // 
+      // DataBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.messageLabel);
+      this.Name = "DataBaseView";
+      this.Size = new System.Drawing.Size(201, 46);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label messageLabel;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.cs	(revision 1662)
@@ -0,0 +1,50 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core { 
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  public partial class ItemBaseView : ViewBase {
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public ItemBaseView() {
+      InitializeComponent();
+    }
+    /// <summary>
+    /// Intializes a new instance of <see cref="ItemBaseView"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The item that should be displayed.</param>
+    public ItemBaseView(IItem item)
+      : this() {
+      Item = item;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemBaseView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ItemEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemEventArgs.cs	(revision 1662)
@@ -0,0 +1,47 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected item.
+  /// </summary>
+  public class ItemEventArgs : EventArgs {
+    private IItem myItem;
+    /// <summary>
+    /// Gets the affected item.
+    /// </summary>
+    public IItem Item {
+      get { return myItem; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemEventArgs"/> with the given <paramref name="item"/>.
+    /// </summary>
+    /// <param name="item">The affected item.</param>
+    public ItemEventArgs(IItem item) {
+      myItem = item;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ItemIndexEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ItemIndexEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ItemIndexEventArgs.cs	(revision 1662)
@@ -0,0 +1,51 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected item at a specified index.
+  /// </summary>
+  public class ItemIndexEventArgs : ItemEventArgs {
+    private int myIndex;
+    /// <summary>
+    /// Gets the affected index.
+    /// </summary>
+    public int Index {
+      get { return myIndex; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemIndexEventArgs"/> with the given <paramref name="item"/>
+    /// and the given <paramref name="index"/>.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemEventArgs"/>.</remarks>
+    /// <param name="item">The affected item.</param>
+    /// <param name="index">The affected index.</param>
+    public ItemIndexEventArgs(IItem item, int index)
+      : base(item) {
+      myIndex = index;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/KeyValueEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/KeyValueEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/KeyValueEventArgs.cs	(revision 1662)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected key-value pair.
+  /// </summary>
+  public class KeyValueEventArgs : EventArgs {
+
+    private IItem key;
+    /// <summary>
+    /// Gets the affected key.
+    /// </summary>
+    public IItem Key {
+      get { return key; }
+    }
+
+    private IItem value;
+    /// <summary>
+    /// Gets the affected value.
+    /// </summary>
+    public IItem Value {
+      get { return value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="KeyValueEventArgs"/> with the given <paramref name="key"/>
+    /// and <paramref name="value"/>.
+    /// </summary>
+    /// <param name="key">The affected key.</param>
+    /// <param name="value">The affected value.</param>
+    public KeyValueEventArgs(IItem key, IItem value) {
+      this.key = key;
+      this.value = value; 
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/NameChangingEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/NameChangingEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/NameChangingEventArgs.cs	(revision 1662)
@@ -0,0 +1,61 @@
+#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.Text;
+using System.ComponentModel;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected name.
+  /// </summary>
+  public class NameChangingEventArgs : CancelEventArgs {
+    private string myName;
+    /// <summary>
+    /// Gets the affected name.
+    /// </summary>
+    public string Name {
+      get { return myName; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="NameChangingEventArgs"/> 
+    /// with the specified <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The affected name.</param>
+    public NameChangingEventArgs(string name)
+      : base() {
+      myName = name;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="NameChangingEventArgs"/> 
+    /// with the specified <paramref name="name"/> and a flag whether the event has been canceled.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="CancelEventArgs"/>.</remarks> 
+    /// <param name="name">The affected name.</param>
+    /// <param name="cancel">Flag, whether the event has been canceled.</param>
+    public NameChangingEventArgs(string name, bool cancel)
+      : base(cancel) {
+      myName = name;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperationEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperationEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperationEventArgs.cs	(revision 1662)
@@ -0,0 +1,48 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected operation.
+  /// </summary>
+  public class OperationEventArgs : EventArgs {
+    private IOperation myOperation;
+    /// <summary>
+    /// Gets the affected operation.
+    /// </summary>
+    public IOperation Operation {
+      get { return myOperation; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperationEventArgs"/> with the given 
+    /// <paramref name="operation"/>.
+    /// </summary>
+    /// <param name="operation">The affected operation.</param>
+    public OperationEventArgs(IOperation operation) {
+      myOperation = operation;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBase.cs	(revision 1662)
@@ -0,0 +1,681 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The base class for all operators.
+  /// </summary>
+  public abstract class OperatorBase : ConstrainedItemBase, IOperator {
+    private string myName;
+    /// <summary>
+    /// Gets or sets the name of the operator.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnNameChanged"/> in the setter.</remarks>
+    public string Name {
+      get { return myName; }
+      set {
+        if (myName != value) {
+          myName = value;
+          OnNameChanged();
+        }
+      }
+    }
+    /// <summary>
+    /// Gets the description of the current operator.
+    /// </summary>
+    /// <remarks>Returns "No operator description available" if the method is not overriden.</remarks>
+    public virtual string Description {
+      get { return "No operator description available."; }
+    }
+    /// <summary>
+    /// Flag whether the current instance has been canceled.
+    /// </summary>
+    protected bool myCanceled;
+    /// <inheritdoc/>
+    public bool Canceled {
+      get { return myCanceled; }
+    }
+    private bool myBreakpoint;
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnBreakpointChanged"/> in the setter.</remarks>
+    public bool Breakpoint {
+      get { return myBreakpoint; }
+      set {
+        if (value != myBreakpoint) {
+          myBreakpoint = value;
+          OnBreakpointChanged();
+        }
+      }
+    }
+
+    private List<IOperator> mySubOperators;
+    /// <summary>
+    /// Gets a list of all suboperators.
+    /// <note type="caution"> Returns the suboperators read-only!</note>
+    /// </summary>
+    public virtual IList<IOperator> SubOperators {
+      get { return mySubOperators.AsReadOnly(); }
+    }
+    private Dictionary<string, IVariableInfo> myVariableInfos;
+    /// <inheritdoc/>
+    public virtual ICollection<IVariableInfo> VariableInfos {
+      get { return myVariableInfos.Values; }
+    }
+    private Dictionary<string, IVariable> myVariables;
+    /// <inheritdoc/>
+    public virtual ICollection<IVariable> Variables {
+      get { return myVariables.Values; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBase"/> setting the breakpoint flag and 
+    /// the canceled flag to <c>false</c> and the name of the operator to the type name. 
+    /// </summary>
+    protected OperatorBase() {
+      myName = this.GetType().Name;
+      myCanceled = false;
+      myBreakpoint = false;
+      mySubOperators = new List<IOperator>();
+      myVariableInfos = new Dictionary<string, IVariableInfo>();
+      myVariables = new Dictionary<string, IVariable>();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Clones also sub operators, variables and variable infos.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OperatorBase"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorBase clone = (OperatorBase)base.Clone(clonedObjects);
+      clone.myName = Name;
+      clone.mySubOperators.Clear();
+      for (int i = 0; i < SubOperators.Count; i++)
+        clone.AddSubOperator((IOperator)Auxiliary.Clone(SubOperators[i], clonedObjects));
+      clone.myVariableInfos.Clear();
+      foreach (IVariableInfo variableInfo in myVariableInfos.Values)
+        clone.AddVariableInfo((IVariableInfo)Auxiliary.Clone(variableInfo, clonedObjects));
+      clone.myVariables.Clear();
+      foreach (IVariable variable in myVariables.Values)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="OperatorBaseView"/> to represent the current operator
+    /// visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="OperatorBaseView"/>.</returns>
+    public override IView CreateView() {
+      return new OperatorBaseView(this);
+    }
+
+    #region SubOperator Methods
+    /// <inheritdoc cref="HeuristicLab.Core.IOperator.AddSubOperator(HeuristicLab.Core.IOperator)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual void AddSubOperator(IOperator subOperator) {
+      mySubOperators.Add(subOperator);
+      OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+    }
+    /// <inheritdoc cref="IOperator.TryAddSubOperator(HeuristicLab.Core.IOperator)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual bool TryAddSubOperator(IOperator subOperator) {
+      mySubOperators.Add(subOperator);
+      if (IsValid()) {
+        OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(mySubOperators.Count - 1);
+        return false;
+      }
+    }
+    /// <inheritdoc cref="HeuristicLab.Core.IOperator.TryAddSubOperator(HeuristicLab.Core.IOperator, 
+    /// out System.Collections.Generic.ICollection&lt;HeuristicLab.Core.IConstraint&gt;)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual bool TryAddSubOperator(IOperator subOperator, out ICollection<IConstraint> violatedConstraints) {
+      mySubOperators.Add(subOperator);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorAdded(subOperator, mySubOperators.Count - 1);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(mySubOperators.Count - 1);
+        return false;
+      }
+    }
+    /// <inheritdoc cref="HeuristicLab.Core.IOperator.AddSubOperator(HeuristicLab.Core.IOperator, int)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual void AddSubOperator(IOperator subOperator, int index) {
+      mySubOperators.Insert(index, subOperator);
+      OnSubOperatorAdded(subOperator, index);
+    }
+    /// <inheritdoc cref="IOperator.TryAddSubOperator(HeuristicLab.Core.IOperator, int)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual bool TryAddSubOperator(IOperator subOperator, int index) {
+      mySubOperators.Insert(index, subOperator);
+      if (IsValid()) {
+        OnSubOperatorAdded(subOperator, index);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(index);
+        return false;
+      }
+    }
+    /// <inheritdoc cref="IOperator.TryAddSubOperator(HeuristicLab.Core.IOperator, int, out
+    /// System.Collections.Generic.ICollection&lt;HeuristicLab.Core.IConstraint&gt;)"/>
+    /// <param name="subOperator">The sub operator to add.</param>
+    /// <remarks>Calls <see cref="OnSubOperatorAdded"/>.</remarks>
+    public virtual bool TryAddSubOperator(IOperator subOperator, int index, out ICollection<IConstraint> violatedConstraints) {
+      mySubOperators.Insert(index, subOperator);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorAdded(subOperator, index);
+        return true;
+      } else {
+        mySubOperators.RemoveAt(index);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnSubOperatorRemoved"/>.</remarks>
+    public virtual void RemoveSubOperator(int index) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      OnSubOperatorRemoved(op, index);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnSubOperatorRemoved"/>.</remarks>
+    public virtual bool TryRemoveSubOperator(int index) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      if (IsValid()) {
+        OnSubOperatorRemoved(op, index);
+        return true;
+      } else {
+        mySubOperators.Insert(index, op);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnSubOperatorRemoved"/>.</remarks>
+    public virtual bool TryRemoveSubOperator(int index, out ICollection<IConstraint> violatedConstraints) {
+      IOperator op = mySubOperators[index];
+      mySubOperators.RemoveAt(index);
+      if (IsValid(out violatedConstraints)) {
+        OnSubOperatorRemoved(op, index);
+        return true;
+      } else {
+        mySubOperators.Insert(index, op);
+        return false;
+      }
+    }
+    #endregion
+
+    #region VariableInfo Methods
+    /// <inheritdoc/>
+    public virtual IVariableInfo GetVariableInfo(string formalName) {
+      IVariableInfo info;
+      if (myVariableInfos.TryGetValue(formalName, out info))
+        return info;
+      else
+        return null;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoAdded"/>.</remarks>
+    public virtual void AddVariableInfo(IVariableInfo variableInfo) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      OnVariableInfoAdded(variableInfo);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoAdded"/>.</remarks>
+    public virtual bool TryAddVariableInfo(IVariableInfo variableInfo) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      if (IsValid()) {
+        OnVariableInfoAdded(variableInfo);
+        return true;
+      } else {
+        myVariableInfos.Remove(variableInfo.FormalName);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoAdded"/>.</remarks>
+    public virtual bool TryAddVariableInfo(IVariableInfo variableInfo, out ICollection<IConstraint> violatedConstraints) {
+      myVariableInfos.Add(variableInfo.FormalName, variableInfo);
+      if (IsValid(out violatedConstraints)) {
+        OnVariableInfoAdded(variableInfo);
+        return true;
+      } else {
+        myVariableInfos.Remove(variableInfo.FormalName);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoRemoved"/>.</remarks>
+    public virtual void RemoveVariableInfo(string formalName) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        OnVariableInfoRemoved(variableInfo);
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoRemoved"/>.</remarks>
+    public virtual bool TryRemoveVariableInfo(string formalName) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        if (IsValid()) {
+          OnVariableInfoRemoved(variableInfo);
+          return true;
+        } else {
+          myVariableInfos.Add(formalName, variableInfo);
+          return false;
+        }
+      }
+      return true;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableInfoRemoved"/>.</remarks>
+    public virtual bool TryRemoveVariableInfo(string formalName, out ICollection<IConstraint> violatedConstraints) {
+      IVariableInfo variableInfo;
+      if (myVariableInfos.TryGetValue(formalName, out variableInfo)) {
+        myVariableInfos.Remove(formalName);
+        if (IsValid(out violatedConstraints)) {
+          OnVariableInfoRemoved(variableInfo);
+          return true;
+        } else {
+          myVariableInfos.Add(formalName, variableInfo);
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+    #endregion
+
+    #region Variable Methods
+    /// <inheritdoc/>
+    public virtual IVariable GetVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable))
+        return variable;
+      else
+        return null;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableAdded"/> and adds <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual void AddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+      OnVariableAdded(variable);
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableAdded"/> and adds <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual bool TryAddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      if (IsValid()) {
+        variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged += new EventHandler(Variable_NameChanged);
+        OnVariableAdded(variable);
+        return true;
+      } else {
+        myVariableInfos.Remove(variable.Name);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableAdded"/> and adds <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual bool TryAddVariable(IVariable variable, out ICollection<IConstraint> violatedConstraints) {
+      myVariables.Add(variable.Name, variable);
+      if (IsValid(out violatedConstraints)) {
+        variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged += new EventHandler(Variable_NameChanged);
+        OnVariableAdded(variable);
+        return true;
+      } else {
+        myVariableInfos.Remove(variable.Name);
+        return false;
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableRemoved"/> and removes <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual void RemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        myVariables.Remove(name);
+        OnVariableRemoved(variable);
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableRemoved"/> and removes <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual bool TryRemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        myVariables.Remove(name);
+        if (IsValid()) {
+          variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+          variable.NameChanged -= new EventHandler(Variable_NameChanged);
+          OnVariableRemoved(variable);
+          return true;
+        } else {
+          myVariables.Add(name, variable);
+          return false;
+        }
+      }
+      return true;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnVariableRemoved"/> and removes <c>NameChanging</c> and <c>NameChanged</c>
+    /// event handlers.</remarks>
+    public virtual bool TryRemoveVariable(string name, out ICollection<IConstraint> violatedConstraints) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        myVariables.Remove(name);
+        if (IsValid(out violatedConstraints)) {
+          variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+          variable.NameChanged -= new EventHandler(Variable_NameChanged);
+          OnVariableRemoved(variable);
+          return true;
+        } else {
+          myVariables.Add(name, variable);
+          return false;
+        }
+      }
+      violatedConstraints = new List<IConstraint>();
+      return true;
+    }
+    private void Variable_NameChanging(object sender, NameChangingEventArgs e) {
+      e.Cancel = myVariables.ContainsKey(e.Name);
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      string oldName = null;
+      foreach (KeyValuePair<string, IVariable> element in myVariables) {
+        if (element.Value == variable)
+          oldName = element.Key;
+      }
+      myVariables.Remove(oldName);
+      myVariables.Add(variable.Name, variable);
+    }
+    /// <inheritdoc cref="IOperator.GetVariableValue&lt;T&gt;(string, HeuristicLab.Core.IScope, bool)"/>
+    ///  <remarks>Calls <see cref="GetVariableValue&lt;T&gt;(string, HeuristicLab.Core.IScope, bool, bool)"/> 
+    /// with <c>throwOnError</c> set to <c>false</c>.</remarks>
+    public T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup) where T : class, IItem {
+      return GetVariableValue<T>(formalName, scope, recursiveLookup, true);
+    }
+    /// <inheritdoc cref="IOperator.GetVariableValue&lt;T&gt;(string, HeuristicLab.Core.IScope, bool, bool)"/>
+    /// <remarks>Calls 
+    /// <see cref="GetVariableValue(string, HeuristicLab.Core.IScope, bool, bool)"/>.</remarks>
+    public T GetVariableValue<T>(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) where T : class, IItem {
+      return (T)GetVariableValue(formalName, scope, recursiveLookup, throwOnError);
+    }
+    /// <inheritdoc cref="IOperator.GetVariableValue(string, HeuristicLab.Core.IScope, bool)"/>
+    /// <remarks>Calls <see cref="GetVariableValue(string, HeuristicLab.Core.IScope, bool, bool)"/> 
+    /// with <c>throwOnError</c> set to <c>false</c>.</remarks>
+    public IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup) {
+      return GetVariableValue(formalName, scope, recursiveLookup, true);
+    }
+    /// <inheritdoc cref="IOperator.GetVariableValue(string, HeuristicLab.Core.IScope, bool, bool)"/>
+    public virtual IItem GetVariableValue(string formalName, IScope scope, bool recursiveLookup, bool throwOnError) {
+      IVariableInfo info = GetVariableInfo(formalName);
+      if (info.Local) {
+        IVariable variable;
+        if (myVariables.TryGetValue(info.ActualName, out variable))
+          return variable.Value;
+        else {
+          if (throwOnError)
+            throw new ArgumentException("Variable " + info.ActualName + " not found");
+          else
+            return null;
+        }
+      } else {
+        return scope.GetVariableValue(formalName, recursiveLookup, throwOnError);
+      }
+    }
+    #endregion
+    /// <inheritdoc/>
+    public virtual IOperation Execute(IScope scope) {
+      myCanceled = false;
+
+      foreach (IVariableInfo variableInfo in VariableInfos)
+        scope.AddAlias(variableInfo.FormalName, variableInfo.ActualName);
+
+      IOperation next = Apply(scope);
+
+      foreach (IVariableInfo variableInfo in VariableInfos)
+        scope.RemoveAlias(variableInfo.FormalName);
+
+      OnExecuted();
+      return next;
+    }
+    /// <inheritdoc/>
+    /// <remarks>Sets property <see cref="Canceled"/> to <c>true</c>.</remarks>
+    public virtual void Abort() {
+      myCanceled = true;
+    }
+    /// <summary>
+    /// Performs the current operator on the specified <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The scope where to execute the operator</param>
+    /// <returns><c>null</c>.</returns>
+    public virtual IOperation Apply(IScope scope) {
+      return null;
+    }
+    /// <inheritdoc/>
+    public event EventHandler NameChanged;
+    /// <summary>
+    /// Fires a new <c>NameChanged</c> event.
+    /// </summary>
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null) {
+        NameChanged(this, new EventArgs());
+      }
+    }
+    /// <inheritdoc/>
+    public event EventHandler BreakpointChanged;
+    /// <summary>
+    /// Fires a new <c>BreakpointChanged</c> event.
+    /// </summary>
+    protected virtual void OnBreakpointChanged() {
+      if (BreakpointChanged != null) {
+        BreakpointChanged(this, new EventArgs());
+      }
+    }
+    /// <inheritdoc/>
+    public event EventHandler<OperatorIndexEventArgs> SubOperatorAdded;
+    /// <summary>
+    /// Fires a new <c>SubOperatorAdded</c> event.
+    /// </summary>
+    /// <param name="subOperator">The sub operator that has been added.</param>
+    /// <param name="index">The position where the operator has been added.</param>
+    protected virtual void OnSubOperatorAdded(IOperator subOperator, int index) {
+      if (SubOperatorAdded != null)
+        SubOperatorAdded(this, new OperatorIndexEventArgs(subOperator, index));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<OperatorIndexEventArgs> SubOperatorRemoved;
+    /// <summary>
+    /// Fires a new <c>SubOperatorRemoved</c> event.
+    /// </summary>
+    /// <param name="subOperator">The sub operator that has been removed.</param>
+    /// <param name="index">The position where the operator has been removed.</param>
+    protected virtual void OnSubOperatorRemoved(IOperator subOperator, int index) {
+      if (SubOperatorRemoved != null)
+        SubOperatorRemoved(this, new OperatorIndexEventArgs(subOperator, index));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<VariableInfoEventArgs> VariableInfoAdded;
+    /// <summary>
+    /// Fires a new <c>VariableInfoAdded</c> event.
+    /// </summary>
+    /// <param name="variableInfo">The variable info that has been added.</param>
+    protected virtual void OnVariableInfoAdded(IVariableInfo variableInfo) {
+      if (VariableInfoAdded != null)
+        VariableInfoAdded(this, new VariableInfoEventArgs(variableInfo));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<VariableInfoEventArgs> VariableInfoRemoved;
+    /// <summary>
+    /// Fires a new <c>VariableInfoRemoved</c> event.
+    /// </summary>
+    /// <param name="variableInfo">The variable info that has been removed.</param>
+    protected virtual void OnVariableInfoRemoved(IVariableInfo variableInfo) {
+      if (VariableInfoRemoved != null)
+        VariableInfoRemoved(this, new VariableInfoEventArgs(variableInfo));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<VariableEventArgs> VariableAdded;
+    /// <summary>
+    /// Fires a new <c>VariableAdded</c> event.
+    /// </summary>
+    /// <param name="variable">The variable that has been added.</param>
+    protected virtual void OnVariableAdded(IVariable variable) {
+      if (VariableAdded != null)
+        VariableAdded(this, new VariableEventArgs(variable));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<VariableEventArgs> VariableRemoved;
+    /// <summary>
+    /// Fires a new <c>VariableRemoved</c> event.
+    /// </summary>
+    /// <param name="variable">The variable that has been removed</param>
+    protected virtual void OnVariableRemoved(IVariable variable) {
+      if (VariableRemoved != null)
+        VariableRemoved(this, new VariableEventArgs(variable));
+    }
+    /// <inheritdoc/>
+    public event EventHandler Executed;
+    /// <summary>
+    /// Fires a new <c>Executed</c> event.
+    /// </summary>
+    protected virtual void OnExecuted() {
+      if (Executed != null) {
+        Executed(this, new EventArgs());
+      }
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>
+    /// Calls <see cref="ConstrainedItemBase.GetXmlNode"/> of base class <see cref="ConstrainedItemBase"/>.
+    /// <br/>A quick overview how the single elements of the current instance are saved:
+    /// <list type="bullet">
+    /// <item>
+    /// <term>Name: </term>
+    /// <description>Saved as an <see cref="XmlAttribute"/> with the name <c>Name</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Breakpoint: </term>
+    /// <description>Is only saved if it set to <c>true</c>. 
+    /// Saved as an <see cref="XmlAttribute"/> with the name <c>Breakpoint</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Sub operators: </term>
+    /// <description>Saved as child node with tag name <c>SubOperators</c>. All sub operators are themselves
+    /// saved as child nodes.</description>
+    /// </item>
+    /// <item>
+    /// <term>Variable infos: </term>
+    /// <description>Saved as child node with tag name <c>VariableInfos</c>. All variable infos are themselves
+    /// saved as child nodes.</description>
+    /// </item>
+    /// <item>
+    /// <term>Variables: </term>
+    /// <description>Saved as child node with tag name <c>Variables</c>. All variables are themselves
+    /// saved as child nodes.</description>
+    /// </item> 
+    /// </list>
+    /// </remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      if (Breakpoint) {
+        XmlAttribute breakpointAttribute = document.CreateAttribute("Breakpoint");
+        breakpointAttribute.Value = Breakpoint.ToString();
+        node.Attributes.Append(breakpointAttribute);
+      }
+      XmlNode subOperatorsNode = document.CreateNode(XmlNodeType.Element, "SubOperators", null);
+      for (int i = 0; i < SubOperators.Count; i++)
+        subOperatorsNode.AppendChild(PersistenceManager.Persist(SubOperators[i], document, persistedObjects));
+      node.AppendChild(subOperatorsNode);
+      XmlNode infosNode = document.CreateNode(XmlNodeType.Element, "VariableInfos", null);
+      foreach (IVariableInfo info in myVariableInfos.Values)
+        infosNode.AppendChild(PersistenceManager.Persist(info, document, persistedObjects));
+      node.AppendChild(infosNode);
+      XmlNode variablesNode = document.CreateNode(XmlNodeType.Element, "Variables", null);
+      foreach (IVariable variable in myVariables.Values)
+        variablesNode.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects));
+      node.AppendChild(variablesNode);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operation from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ConstrainedItemBase.Populate"/> of base class 
+    /// <see cref="ConstrainedItemBase"/>.
+    /// For informations how the different elements must be saved please see <see cref="GetXmlNode"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operation is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+      if (node.Attributes["Breakpoint"] != null)
+        myBreakpoint = bool.Parse(node.Attributes["Breakpoint"].Value);
+      XmlNode subOperatorsNode = node.SelectSingleNode("SubOperators");
+      for (int i = 0; i < subOperatorsNode.ChildNodes.Count; i++)
+        AddSubOperator((IOperator)PersistenceManager.Restore(subOperatorsNode.ChildNodes[i], restoredObjects));
+      XmlNode infosNode = node.SelectSingleNode("VariableInfos");
+      myVariableInfos.Clear();
+      foreach (XmlNode infoNode in infosNode.ChildNodes)
+        AddVariableInfo((IVariableInfo)PersistenceManager.Restore(infoNode, restoredObjects));
+      XmlNode variablesNode = node.SelectSingleNode("Variables");
+      myVariables.Clear();
+      foreach (XmlNode variableNode in variablesNode.ChildNodes)
+        AddVariable((IVariable)PersistenceManager.Restore(variableNode, restoredObjects));
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.Designer.cs	(revision 1662)
@@ -0,0 +1,84 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseDescriptionView {
+    /// <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.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.descriptionTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.descriptionTextBox.Location = new System.Drawing.Point(0, 0);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+      this.descriptionTextBox.Size = new System.Drawing.Size(423, 333);
+      this.descriptionTextBox.TabIndex = 0;
+      // 
+      // OperatorBaseDescriptionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.descriptionTextBox);
+      this.Name = "OperatorBaseDescriptionView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private TextBox descriptionTextBox;
+
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.cs	(revision 1662)
@@ -0,0 +1,78 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of the description of operators.
+  /// </summary>
+  public partial class OperatorBaseDescriptionView : ViewBase {
+    /// <summary>
+    /// Gets or sets the operator whose description should be displayed.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseDescriptionView"/> with caption "Operator".
+    /// </summary>
+    public OperatorBaseDescriptionView() {
+      InitializeComponent();
+      Caption = "Operator";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseDescriptionView"/> 
+    /// with the operator <paramref name="op"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBaseDescriptionView()"/>.</remarks>
+    /// <param name="op">The operator whose description to display.</param>
+    public OperatorBaseDescriptionView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Operator == null) {
+        Caption = "Operator";
+        descriptionTextBox.Text = "";
+        descriptionTextBox.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        descriptionTextBox.Text = Operator.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseDescriptionView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.Designer.cs	(revision 1662)
@@ -0,0 +1,144 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseVariableInfosView {
+    /// <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) {
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        ((IVariableInfo)item.Tag).ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      }
+      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.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variableInfosGroupBox = new System.Windows.Forms.GroupBox();
+      this.variableInfosListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.variableInfoDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variableInfosGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // 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.variableInfosGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableInfoDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.SplitterDistance = 203;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // variableInfosGroupBox
+      // 
+      this.variableInfosGroupBox.Controls.Add(this.variableInfosListView);
+      this.variableInfosGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfosGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableInfosGroupBox.Name = "variableInfosGroupBox";
+      this.variableInfosGroupBox.Size = new System.Drawing.Size(203, 333);
+      this.variableInfosGroupBox.TabIndex = 0;
+      this.variableInfosGroupBox.TabStop = false;
+      this.variableInfosGroupBox.Text = "&Variable Infos";
+      // 
+      // variableInfosListView
+      // 
+      this.variableInfosListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.variableInfosListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfosListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variableInfosListView.HideSelection = false;
+      this.variableInfosListView.Location = new System.Drawing.Point(3, 16);
+      this.variableInfosListView.Name = "variableInfosListView";
+      this.variableInfosListView.Size = new System.Drawing.Size(197, 314);
+      this.variableInfosListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variableInfosListView.TabIndex = 0;
+      this.variableInfosListView.UseCompatibleStateImageBehavior = false;
+      this.variableInfosListView.View = System.Windows.Forms.View.Details;
+      this.variableInfosListView.SelectedIndexChanged += new System.EventHandler(this.variableInfosListView_SelectedIndexChanged);
+      this.variableInfosListView.SizeChanged += new System.EventHandler(this.variableInfosListView_SizeChanged);
+      // 
+      // variableInfoDetailsGroupBox
+      // 
+      this.variableInfoDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableInfoDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableInfoDetailsGroupBox.Name = "variableInfoDetailsGroupBox";
+      this.variableInfoDetailsGroupBox.Size = new System.Drawing.Size(216, 333);
+      this.variableInfoDetailsGroupBox.TabIndex = 0;
+      this.variableInfoDetailsGroupBox.TabStop = false;
+      this.variableInfoDetailsGroupBox.Text = "&Details";
+      // 
+      // OperatorBaseVariableInfosView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Name = "OperatorBaseVariableInfosView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.variableInfosGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    protected SplitContainer splitContainer;
+    protected GroupBox variableInfosGroupBox;
+    protected ListView variableInfosListView;
+    protected GroupBox variableInfoDetailsGroupBox;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.cs	(revision 1662)
@@ -0,0 +1,188 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of the information of the variables of an operator.
+  /// </summary>
+  public partial class OperatorBaseVariableInfosView : ViewBase {
+    /// <summary>
+    /// Gets or sets the operator whose variable infos should be represented visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+    /// <summary>
+    /// Gets all selected variable infos.
+    /// <note type="caution"> Variable infos are returned read-only!</note>
+    /// </summary>
+    public ICollection<IVariableInfo> SelectedVariableInfos {
+      get {
+        List<IVariableInfo> selected = new List<IVariableInfo>();
+        foreach (ListViewItem item in variableInfosListView.SelectedItems)
+          selected.Add((IVariableInfo)item.Tag);
+        return selected.AsReadOnly();
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseVariableInfosView"/> with caption "Operator".
+    /// </summary>
+    public OperatorBaseVariableInfosView() {
+      InitializeComponent();
+      variableInfosListView.Columns[0].Width = Math.Max(0, variableInfosListView.Width - 25);
+      Caption = "Operator";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseVariableInfosView"/> with the given operator
+    /// <paramref name="op"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBaseVariableInfosView()"/>.</remarks>
+    /// <param name="op">The operator whose variable infos should be displayed.</param>
+    public OperatorBaseVariableInfosView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      Operator.VariableInfoAdded -= new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoAdded);
+      Operator.VariableInfoRemoved -= new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoRemoved);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Operator.VariableInfoAdded += new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoAdded);
+      Operator.VariableInfoRemoved += new EventHandler<VariableInfoEventArgs>(OperatorBase_VariableInfoRemoved);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      variableInfoDetailsGroupBox.Controls.Clear();
+      if (Operator == null) {
+        Caption = "Operator";
+        variableInfosListView.Enabled = false;
+        variableInfoDetailsGroupBox.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        variableInfosListView.Enabled = true;
+        foreach (ListViewItem item in variableInfosListView.Items) {
+          ((IVariableInfo)item.Tag).ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+        }
+        variableInfosListView.Items.Clear();
+        foreach (IVariableInfo variableInfo in Operator.VariableInfos) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variableInfo.ActualName;
+          item.Tag = variableInfo;
+          variableInfosListView.Items.Add(item);
+          variableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+        }
+        if (variableInfosListView.Items.Count > 0)
+          variableInfosListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void variableInfosListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (variableInfoDetailsGroupBox.Controls.Count > 0)
+        variableInfoDetailsGroupBox.Controls[0].Dispose();
+      variableInfoDetailsGroupBox.Controls.Clear();
+      variableInfoDetailsGroupBox.Enabled = false;
+      if (variableInfosListView.SelectedItems.Count == 1) {
+        IVariableInfo variableInfo = (IVariableInfo)variableInfosListView.SelectedItems[0].Tag;
+        Control control = (Control)variableInfo.CreateView();
+        variableInfoDetailsGroupBox.Controls.Add(control);
+        control.Dock = DockStyle.Fill;
+        variableInfoDetailsGroupBox.Enabled = true;
+      }
+      OnSelectedVariableInfosChanged();
+    }
+
+    /// <summary>
+    /// Occurs when the variables were changed, whose infos should be displayed.
+    /// </summary>
+    public event EventHandler SelectedVariableInfosChanged;
+    /// <summary>
+    /// Fires a new <c>SelectedVariableInfosChanged</c>.
+    /// </summary>
+    protected virtual void OnSelectedVariableInfosChanged() {
+      if (SelectedVariableInfosChanged != null)
+        SelectedVariableInfosChanged(this, new EventArgs());
+    }
+
+    #region Size Changed Events
+    private void variableInfosListView_SizeChanged(object sender, EventArgs e) {
+      if (variableInfosListView.Columns.Count > 0)
+        variableInfosListView.Columns[0].Width = Math.Max(0, variableInfosListView.Width - 25);
+    }
+    #endregion
+
+    #region VariableInfo Events
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      IVariableInfo variableInfo = (IVariableInfo)sender;
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        if (item.Tag == variableInfo)
+          item.Text = variableInfo.ActualName;
+      }
+    }
+    #endregion
+
+    #region OperatorBase Events
+    private void OperatorBase_VariableInfoAdded(object sender, VariableInfoEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.VariableInfo.ActualName;
+      item.Tag = e.VariableInfo;
+      variableInfosListView.Items.Add(item);
+      e.VariableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+    }
+    private void OperatorBase_VariableInfoRemoved(object sender, VariableInfoEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in variableInfosListView.Items) {
+        if (item.Tag == e.VariableInfo)
+          itemToDelete = item;
+      }
+      e.VariableInfo.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      variableInfosListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariableInfosView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.Designer.cs	(revision 1662)
@@ -0,0 +1,177 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseVariablesView {
+    /// <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 (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in variablesListView.Items) {
+        ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+      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.removeVariableButton = new System.Windows.Forms.Button();
+      this.addVariableButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
+      this.variableDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // removeVariableButton
+      // 
+      this.removeVariableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeVariableButton.Enabled = false;
+      this.removeVariableButton.Location = new System.Drawing.Point(81, 310);
+      this.removeVariableButton.Name = "removeVariableButton";
+      this.removeVariableButton.Size = new System.Drawing.Size(75, 23);
+      this.removeVariableButton.TabIndex = 2;
+      this.removeVariableButton.Text = "&Remove";
+      this.removeVariableButton.UseVisualStyleBackColor = true;
+      this.removeVariableButton.Click += new System.EventHandler(this.removeVariableButton_Click);
+      // 
+      // addVariableButton
+      // 
+      this.addVariableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addVariableButton.Location = new System.Drawing.Point(0, 310);
+      this.addVariableButton.Name = "addVariableButton";
+      this.addVariableButton.Size = new System.Drawing.Size(75, 23);
+      this.addVariableButton.TabIndex = 1;
+      this.addVariableButton.Text = "&Add...";
+      this.addVariableButton.UseVisualStyleBackColor = true;
+      this.addVariableButton.Click += new System.EventHandler(this.addVariableButton_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.variablesGroupBox);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.variableDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(423, 304);
+      this.splitContainer.SplitterDistance = 212;
+      this.splitContainer.TabIndex = 0;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(212, 304);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "&Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader2});
+      this.variablesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(3, 16);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(206, 285);
+      this.variablesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variablesListView.TabIndex = 0;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
+      this.variablesListView.SelectedIndexChanged += new System.EventHandler(this.variablesListView_SelectedIndexChanged);
+      this.variablesListView.SizeChanged += new System.EventHandler(this.variablesListView_SizeChanged);
+      this.variablesListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variablesListView_KeyDown);
+      // 
+      // variableDetailsGroupBox
+      // 
+      this.variableDetailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableDetailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variableDetailsGroupBox.Name = "variableDetailsGroupBox";
+      this.variableDetailsGroupBox.Size = new System.Drawing.Size(207, 304);
+      this.variableDetailsGroupBox.TabIndex = 0;
+      this.variableDetailsGroupBox.TabStop = false;
+      this.variableDetailsGroupBox.Text = "&Details";
+      // 
+      // OperatorBaseVariablesView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer);
+      this.Controls.Add(this.removeVariableButton);
+      this.Controls.Add(this.addVariableButton);
+      this.Name = "OperatorBaseVariablesView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ColumnHeader columnHeader2;
+    protected SplitContainer splitContainer;
+    protected GroupBox variablesGroupBox;
+    protected ListView variablesListView;
+    protected GroupBox variableDetailsGroupBox;
+    protected Button removeVariableButton;
+    protected Button addVariableButton;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.cs	(revision 1662)
@@ -0,0 +1,219 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of the variables of an operator.
+  /// </summary>
+  public partial class OperatorBaseVariablesView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    /// <summary>
+    /// Gets or sets the operator whose variables to represent.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseVariablesView"/> with caption "Operator".
+    /// </summary>
+    public OperatorBaseVariablesView() {
+      InitializeComponent();
+      variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+      Caption = "Operator";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseVariablesView"/> with the given 
+    /// operator <paramref name="op"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBaseVariablesView"/>.</remarks>
+    /// <param name="op">The operator whose variables should be represented visually.</param>
+    public OperatorBaseVariablesView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the unterlying <see cref="IOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      Operator.VariableAdded -= new EventHandler<VariableEventArgs>(OperatorBase_VariableAdded);
+      Operator.VariableRemoved -= new EventHandler<VariableEventArgs>(OperatorBase_VariableRemoved);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IOperator"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Operator.VariableAdded += new EventHandler<VariableEventArgs>(OperatorBase_VariableAdded);
+      Operator.VariableRemoved += new EventHandler<VariableEventArgs>(OperatorBase_VariableRemoved);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      variableDetailsGroupBox.Controls.Clear();
+      if (Operator == null) {
+        Caption = "Operator";
+        variablesListView.Enabled = false;
+        variableDetailsGroupBox.Enabled = false;
+        removeVariableButton.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        variablesListView.Enabled = true;
+        foreach (ListViewItem item in variablesListView.Items) {
+          ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+        }
+        variablesListView.Items.Clear();
+        foreach (IVariable variable in Operator.Variables) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variable.Name;
+          item.Tag = variable;
+          variablesListView.Items.Add(item);
+          variable.NameChanged += new EventHandler(Variable_NameChanged);
+        }
+        if (variablesListView.Items.Count > 0)
+          variablesListView.SelectedIndices.Add(0);
+      }
+    }
+
+    private void variablesListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (variableDetailsGroupBox.Controls.Count > 0)
+        variableDetailsGroupBox.Controls[0].Dispose();
+      variableDetailsGroupBox.Controls.Clear();
+      variableDetailsGroupBox.Enabled = false;
+      removeVariableButton.Enabled = false;
+      if (variablesListView.SelectedItems.Count > 0) {
+        removeVariableButton.Enabled = true;
+      }
+      if (variablesListView.SelectedItems.Count == 1) {
+        IVariable variable = (IVariable)variablesListView.SelectedItems[0].Tag;
+        Control editor = (Control)variable.CreateView();
+        variableDetailsGroupBox.Controls.Add(editor);
+        editor.Dock = DockStyle.Fill;
+        variableDetailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void variablesListView_SizeChanged(object sender, EventArgs e) {
+      if (variablesListView.Columns.Count > 0)
+        variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void variablesListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (variablesListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in variablesListView.SelectedItems)
+            Operator.RemoveVariable(((IVariable)item.Tag).Name);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addVariableButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Variable";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        IVariable newVariable = new Variable(chooseItemDialog.Item.GetType().Name, chooseItemDialog.Item);
+        int index = 1;
+        bool valid = true;
+        string name = null;
+        do {
+          valid = true;
+          name = newVariable.Name + " (" + index.ToString() + ")";
+          foreach (IVariable existingVariable in Operator.Variables) {
+            if (existingVariable.Name == name) {
+              valid = false;
+              index++;
+            }
+          }
+        } while (!valid);
+        newVariable.Name = name;
+        Operator.AddVariable(newVariable);
+      }
+    }
+    private void removeVariableButton_Click(object sender, EventArgs e) {
+      if (variablesListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variablesListView.SelectedItems)
+          Operator.RemoveVariable(((IVariable)item.Tag).Name);
+      }
+    }
+    #endregion
+
+    #region Variable Events
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      foreach (ListViewItem item in variablesListView.Items) {
+        if (item.Tag == variable)
+          item.Text = variable.Name;
+      }
+    }
+    #endregion
+
+    #region OperatorBase Events
+    private void OperatorBase_VariableAdded(object sender, VariableEventArgs e) {
+      ListViewItem item = new ListViewItem();
+      item.Text = e.Variable.Name;
+      item.Tag = e.Variable;
+      variablesListView.Items.Add(item);
+      // select the new item
+      foreach(ListViewItem oldSelected in variablesListView.SelectedItems) {
+        oldSelected.Selected = false;
+      }
+      item.Selected = true;
+      e.Variable.NameChanged += new EventHandler(Variable_NameChanged);
+    }
+    private void OperatorBase_VariableRemoved(object sender, VariableEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in variablesListView.Items) {
+        if (item.Tag == e.Variable)
+          itemToDelete = item;
+      }
+      e.Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      variablesListView.Items.Remove(itemToDelete);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseVariablesView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.Designer.cs	(revision 1662)
@@ -0,0 +1,194 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class OperatorBaseView {
+    /// <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.tabControl = new System.Windows.Forms.TabControl();
+      this.variableInfosTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
+      this.variablesTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseVariablesView = new HeuristicLab.Core.OperatorBaseVariablesView();
+      this.constraintsTabPage = new System.Windows.Forms.TabPage();
+      this.constrainedItemBaseView = new HeuristicLab.Core.ConstrainedItemBaseView();
+      this.descriptionTabPage = new System.Windows.Forms.TabPage();
+      this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.tabControl.SuspendLayout();
+      this.variableInfosTabPage.SuspendLayout();
+      this.variablesTabPage.SuspendLayout();
+      this.constraintsTabPage.SuspendLayout();
+      this.descriptionTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.variableInfosTabPage);
+      this.tabControl.Controls.Add(this.variablesTabPage);
+      this.tabControl.Controls.Add(this.constraintsTabPage);
+      this.tabControl.Controls.Add(this.descriptionTabPage);
+      this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.tabControl.Location = new System.Drawing.Point(0, 0);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(423, 333);
+      this.tabControl.TabIndex = 0;
+      // 
+      // variableInfosTabPage
+      // 
+      this.variableInfosTabPage.Controls.Add(this.operatorBaseVariableInfosView);
+      this.variableInfosTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variableInfosTabPage.Name = "variableInfosTabPage";
+      this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(415, 307);
+      this.variableInfosTabPage.TabIndex = 0;
+      this.variableInfosTabPage.Text = "Variable Infos";
+      this.variableInfosTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariableInfosView
+      // 
+      this.operatorBaseVariableInfosView.Caption = "Operator";
+      this.operatorBaseVariableInfosView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariableInfosView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
+      this.operatorBaseVariableInfosView.Operator = null;
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseVariableInfosView.TabIndex = 0;
+      // 
+      // variablesTabPage
+      // 
+      this.variablesTabPage.Controls.Add(this.operatorBaseVariablesView);
+      this.variablesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.variablesTabPage.Name = "variablesTabPage";
+      this.variablesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.variablesTabPage.Size = new System.Drawing.Size(415, 307);
+      this.variablesTabPage.TabIndex = 1;
+      this.variablesTabPage.Text = "Local Variables";
+      this.variablesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseVariablesView
+      // 
+      this.operatorBaseVariablesView.Caption = "Operator";
+      this.operatorBaseVariablesView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseVariablesView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseVariablesView.Name = "operatorBaseVariablesView";
+      this.operatorBaseVariablesView.Operator = null;
+      this.operatorBaseVariablesView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseVariablesView.TabIndex = 0;
+      // 
+      // constraintsTabPage
+      // 
+      this.constraintsTabPage.Controls.Add(this.constrainedItemBaseView);
+      this.constraintsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.constraintsTabPage.Name = "constraintsTabPage";
+      this.constraintsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.constraintsTabPage.Size = new System.Drawing.Size(415, 307);
+      this.constraintsTabPage.TabIndex = 2;
+      this.constraintsTabPage.Text = "Constraints";
+      this.constraintsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // constrainedItemBaseView
+      // 
+      this.constrainedItemBaseView.Caption = "Constrained Data";
+      this.constrainedItemBaseView.ConstrainedItem = null;
+      this.constrainedItemBaseView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.constrainedItemBaseView.Location = new System.Drawing.Point(3, 3);
+      this.constrainedItemBaseView.Name = "constrainedItemBaseView";
+      this.constrainedItemBaseView.Size = new System.Drawing.Size(409, 301);
+      this.constrainedItemBaseView.TabIndex = 0;
+      // 
+      // descriptionTabPage
+      // 
+      this.descriptionTabPage.Controls.Add(this.operatorBaseDescriptionView);
+      this.descriptionTabPage.Location = new System.Drawing.Point(4, 22);
+      this.descriptionTabPage.Name = "descriptionTabPage";
+      this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.descriptionTabPage.Size = new System.Drawing.Size(415, 307);
+      this.descriptionTabPage.TabIndex = 3;
+      this.descriptionTabPage.Text = "Description";
+      this.descriptionTabPage.UseVisualStyleBackColor = true;
+      // 
+      // operatorBaseDescriptionView
+      // 
+      this.operatorBaseDescriptionView.Caption = "Operator";
+      this.operatorBaseDescriptionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorBaseDescriptionView.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.operatorBaseDescriptionView.Location = new System.Drawing.Point(3, 3);
+      this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
+      this.operatorBaseDescriptionView.Operator = null;
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(409, 301);
+      this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // OperatorBaseView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "OperatorBaseView";
+      this.Size = new System.Drawing.Size(423, 333);
+      this.tabControl.ResumeLayout(false);
+      this.variableInfosTabPage.ResumeLayout(false);
+      this.variablesTabPage.ResumeLayout(false);
+      this.constraintsTabPage.ResumeLayout(false);
+      this.descriptionTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected TabControl tabControl;
+    protected TabPage variableInfosTabPage;
+    protected TabPage variablesTabPage;
+    private TabPage constraintsTabPage;
+    protected ConstrainedItemBaseView constrainedItemBaseView;
+    protected OperatorBaseVariableInfosView operatorBaseVariableInfosView;
+    protected OperatorBaseVariablesView operatorBaseVariablesView;
+    private TabPage descriptionTabPage;
+    private OperatorBaseDescriptionView operatorBaseDescriptionView;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.cs	(revision 1662)
@@ -0,0 +1,100 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The base class for visual representation of operators (contains description view, variable view, 
+  /// variable info view,...).
+  /// </summary>
+  public partial class OperatorBaseView : ViewBase {
+    /// <summary>
+    /// Gets or sets the operator to represent visually. 
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+      set {base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseView"/> with caption "Operator".
+    /// </summary>
+    public OperatorBaseView() {
+      InitializeComponent();
+      Caption = "Operator";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorBaseView"/> 
+    /// with the given operator <paramref name="op"/>. 
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorBaseView()"/>.</remarks>
+    /// <param name="op">The operator to represent visually.</param>
+    public OperatorBaseView(IOperator op)
+      : this() {
+      Operator = op;
+    }
+
+    /// <summary>
+    /// Removes event handlers in all children.
+    /// </summary>
+    protected override void RemoveItemEvents() {
+      operatorBaseVariableInfosView.Operator = null;
+      operatorBaseVariablesView.Operator = null;
+      constrainedItemBaseView.ConstrainedItem = null;
+      operatorBaseDescriptionView.Operator = null;
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds event handlers in all children.
+    /// </summary>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      operatorBaseVariableInfosView.Operator = Operator;
+      operatorBaseVariablesView.Operator = Operator;
+      constrainedItemBaseView.ConstrainedItem = Operator;
+      operatorBaseDescriptionView.Operator = Operator;
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (Operator == null) {
+        Caption = "Operator";
+        tabControl.Enabled = false;
+      } else {
+        Caption = Operator.Name + " (" + Operator.GetType().Name + ")";
+        tabControl.Enabled = true;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorBaseView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorEventArgs.cs	(revision 1662)
@@ -0,0 +1,49 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected operator.
+  /// </summary>
+  public class OperatorEventArgs : ItemEventArgs {
+    /// <summary>
+    /// Gets the affected operator.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class <see cref="ItemEventArgs"/>.
+    /// No own data storage present.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorEventArgs"/> with the specified operator.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemEventArgs"/>.</remarks>
+    /// <param name="op">The affected operator.</param>
+    public OperatorEventArgs(IOperator op)
+      : base(op) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 1662)
@@ -0,0 +1,215 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a graph of operators.
+  /// </summary>
+  public class OperatorGraph : ItemBase, IOperatorGraph {
+    private IDictionary<Guid, IOperator> myOperators;
+    /// <summary>
+    /// Gets all operators of the current instance.
+    /// </summary>
+    public ICollection<IOperator> Operators {
+      get { return myOperators.Values; }
+    }
+    private IOperator myInitialOperator;
+    /// <summary>
+    /// Gets or sets the initial operator (the starting one).
+    /// </summary>
+    /// <remarks>Calls <see cref="OnInitialOperatorChanged"/> in the setter.</remarks>
+    public IOperator InitialOperator {
+      get { return myInitialOperator; }
+      set {
+        if (myInitialOperator != value) {
+          myInitialOperator = value;
+          OnInitialOperatorChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorGraph"/>.
+    /// </summary>
+    public OperatorGraph() {
+      myOperators = new Dictionary<Guid, IOperator>();
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="OperatorGraphView"/> to represent the current instance
+    /// visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="OperatorGraphView"/>.</returns>
+    public override IView CreateView() {
+      return new OperatorGraphView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OperatorGraph"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorGraph clone = new OperatorGraph();
+      clonedObjects.Add(Guid, clone);
+      foreach (IOperator op in Operators)
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      if (InitialOperator != null)
+        clone.myInitialOperator = (IOperator)Auxiliary.Clone(InitialOperator, clonedObjects);
+      return clone;
+    }
+
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnOperatorAdded"/>.</remarks>
+    public void AddOperator(IOperator op) {
+      if (!myOperators.ContainsKey(op.Guid)) {
+        myOperators.Add(op.Guid, op);
+        OnOperatorAdded(op);
+
+        foreach (IOperator subOperator in op.SubOperators)
+          AddOperator(subOperator);
+      }
+    }
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnOperatorRemoved"/>.</remarks>
+    public void RemoveOperator(Guid guid) {
+      IOperator op = GetOperator(guid);
+      if (op != null) {
+        foreach (IOperator o in Operators) {
+          int i = 0;
+          while (i < o.SubOperators.Count) {
+            if (o.SubOperators[i] == op)
+              o.RemoveSubOperator(i);
+            else
+              i++;
+          }
+        }
+        if (InitialOperator == op)
+          InitialOperator = null;
+        myOperators.Remove(op.Guid);
+        OnOperatorRemoved(op);
+      }
+    }
+    /// <inheritdoc/>
+    public IOperator GetOperator(Guid guid) {
+      IOperator op;
+      if (myOperators.TryGetValue(guid, out op))
+        return op;
+      else
+        return null;
+    }
+    /// <inheritdoc/>
+    public void Clear() {
+      Guid[] guids = new Guid[Operators.Count];
+      int i = 0;
+      foreach (IOperator op in Operators) {
+        guids[i] = op.Guid;
+        i++;
+      }
+      for (int j = 0; j < guids.Length; j++)
+        RemoveOperator(guids[j]);
+    }
+
+    /// <inheritdoc/>
+    public event EventHandler<OperatorEventArgs> OperatorAdded;
+    /// <summary>
+    /// Fires a new <c>OperatorAdded</c> event.
+    /// </summary>
+    /// <param name="op">The operator that has been added.</param>
+    protected virtual void OnOperatorAdded(IOperator op) {
+      if (OperatorAdded != null)
+        OperatorAdded(this, new OperatorEventArgs(op));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<OperatorEventArgs> OperatorRemoved;
+    /// <summary>
+    /// Fires a new <c>OperatorRemoved</c> event.
+    /// </summary>
+    /// <param name="op">The operator that has been removed.</param>
+    protected virtual void OnOperatorRemoved(IOperator op) {
+      if (OperatorRemoved != null)
+        OperatorRemoved(this, new OperatorEventArgs(op));
+    }
+    /// <inheritdoc/>
+    public event EventHandler InitialOperatorChanged;
+    /// <summary>
+    /// Fires a new <c>InitialOperatorChanged</c> event.
+    /// </summary>
+    protected virtual void OnInitialOperatorChanged() {
+      if (InitialOperatorChanged != null)
+        InitialOperatorChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// To save the operators of the current instance a child node is created with the tag name 
+    /// <c>Operators</c>. Beyond this child node all operators are saved as child nodes themselves.<br/>
+    /// The initial operator is saved as child node with the tag name <c>InitialOperator</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlNode ops = document.CreateNode(XmlNodeType.Element, "Operators", null);
+      foreach (IOperator op in myOperators.Values)
+        ops.AppendChild(PersistenceManager.Persist(op, document, persistedObjects));
+      node.AppendChild(ops);
+      if (InitialOperator != null)
+        node.AppendChild(PersistenceManager.Persist("InitialOperator", InitialOperator, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operator graph from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get more information about how the graph must be saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operator graph is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+
+      XmlNode ops = node.SelectSingleNode("Operators");
+      for (int i = 0; i < ops.ChildNodes.Count; i++) {
+        XmlNode opNode = ops.ChildNodes[i];
+        IOperator op = (IOperator)PersistenceManager.Restore(opNode, restoredObjects);
+        myOperators.Add(op.Guid, op);
+      }
+
+      XmlNode initial = node.SelectSingleNode("InitialOperator");
+      if (initial != null)
+        myInitialOperator = (IOperator)PersistenceManager.Restore(initial, restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.Designer.cs	(revision 1662)
@@ -0,0 +1,288 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class OperatorGraphView {
+    /// <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 (chooseOperatorDialog != null) chooseOperatorDialog.Dispose();
+      if (graphTreeView.Nodes.Count > 0) {
+        RemoveTreeNode(graphTreeView.Nodes[0]);
+        graphTreeView.Nodes.Clear();
+      }
+      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(OperatorGraphView));
+      this.operatorsListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.operatorsContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.initialOperatorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.imageList = new System.Windows.Forms.ImageList(this.components);
+      this.addOperatorButton = new System.Windows.Forms.Button();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.operatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.graphGroupBox = new System.Windows.Forms.GroupBox();
+      this.graphTreeView = new System.Windows.Forms.TreeView();
+      this.graphContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.breakpointToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.viewToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.operatorsContextMenuStrip.SuspendLayout();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.operatorsGroupBox.SuspendLayout();
+      this.graphGroupBox.SuspendLayout();
+      this.graphContextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorsListView
+      // 
+      this.operatorsListView.AllowDrop = true;
+      this.operatorsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.operatorsListView.ContextMenuStrip = this.operatorsContextMenuStrip;
+      this.operatorsListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.operatorsListView.HideSelection = false;
+      this.operatorsListView.LabelEdit = true;
+      this.operatorsListView.Location = new System.Drawing.Point(3, 16);
+      this.operatorsListView.Name = "operatorsListView";
+      this.operatorsListView.Size = new System.Drawing.Size(169, 243);
+      this.operatorsListView.SmallImageList = this.imageList;
+      this.operatorsListView.TabIndex = 0;
+      this.operatorsListView.UseCompatibleStateImageBehavior = false;
+      this.operatorsListView.View = System.Windows.Forms.View.Details;
+      this.operatorsListView.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.operatorsListView_AfterLabelEdit);
+      this.operatorsListView.SelectedIndexChanged += new System.EventHandler(this.operatorsListView_SelectedIndexChanged);
+      this.operatorsListView.SizeChanged += new System.EventHandler(this.operatorsListView_SizeChanged);
+      this.operatorsListView.DoubleClick += new System.EventHandler(this.operatorsListView_DoubleClick);
+      this.operatorsListView.DragDrop += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragDrop);
+      this.operatorsListView.DragEnter += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragEnter);
+      this.operatorsListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.operatorsListView_KeyDown);
+      this.operatorsListView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorsListView_ItemDrag);
+      this.operatorsListView.DragOver += new System.Windows.Forms.DragEventHandler(this.operatorsListView_DragOver);
+      // 
+      // operatorsContextMenuStrip
+      // 
+      this.operatorsContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.initialOperatorToolStripMenuItem,
+            this.viewToolStripMenuItem});
+      this.operatorsContextMenuStrip.Name = "operatorsContextMenuStrip";
+      this.operatorsContextMenuStrip.Size = new System.Drawing.Size(159, 48);
+      this.operatorsContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.operatorsContextMenuStrip_Opening);
+      // 
+      // initialOperatorToolStripMenuItem
+      // 
+      this.initialOperatorToolStripMenuItem.CheckOnClick = true;
+      this.initialOperatorToolStripMenuItem.Name = "initialOperatorToolStripMenuItem";
+      this.initialOperatorToolStripMenuItem.Size = new System.Drawing.Size(158, 22);
+      this.initialOperatorToolStripMenuItem.Text = "&Initial Operator";
+      this.initialOperatorToolStripMenuItem.ToolTipText = "Set as initial operator";
+      this.initialOperatorToolStripMenuItem.Click += new System.EventHandler(this.initialOperatorToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(158, 22);
+      this.viewToolStripMenuItem.Text = "&View...";
+      this.viewToolStripMenuItem.ToolTipText = "View operator";
+      this.viewToolStripMenuItem.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // imageList
+      // 
+      this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
+      this.imageList.TransparentColor = System.Drawing.Color.Magenta;
+      this.imageList.Images.SetKeyName(0, "Operator.bmp");
+      this.imageList.Images.SetKeyName(1, "CombinedOperator.bmp");
+      this.imageList.Images.SetKeyName(2, "ProgrammableOperator.bmp");
+      // 
+      // addOperatorButton
+      // 
+      this.addOperatorButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addOperatorButton.Location = new System.Drawing.Point(0, 268);
+      this.addOperatorButton.Name = "addOperatorButton";
+      this.addOperatorButton.Size = new System.Drawing.Size(75, 23);
+      this.addOperatorButton.TabIndex = 0;
+      this.addOperatorButton.Text = "&Add...";
+      this.addOperatorButton.UseVisualStyleBackColor = true;
+      this.addOperatorButton.Click += new System.EventHandler(this.addOperatorButton_Click);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.operatorsGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.graphGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(475, 262);
+      this.splitContainer1.SplitterDistance = 175;
+      this.splitContainer1.TabIndex = 4;
+      // 
+      // operatorsGroupBox
+      // 
+      this.operatorsGroupBox.Controls.Add(this.operatorsListView);
+      this.operatorsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorsGroupBox.Name = "operatorsGroupBox";
+      this.operatorsGroupBox.Size = new System.Drawing.Size(175, 262);
+      this.operatorsGroupBox.TabIndex = 3;
+      this.operatorsGroupBox.TabStop = false;
+      this.operatorsGroupBox.Text = "&Operators";
+      // 
+      // graphGroupBox
+      // 
+      this.graphGroupBox.Controls.Add(this.graphTreeView);
+      this.graphGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.graphGroupBox.Name = "graphGroupBox";
+      this.graphGroupBox.Size = new System.Drawing.Size(296, 262);
+      this.graphGroupBox.TabIndex = 0;
+      this.graphGroupBox.TabStop = false;
+      this.graphGroupBox.Text = "&Graph";
+      // 
+      // graphTreeView
+      // 
+      this.graphTreeView.AllowDrop = true;
+      this.graphTreeView.ContextMenuStrip = this.graphContextMenuStrip;
+      this.graphTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphTreeView.HideSelection = false;
+      this.graphTreeView.Location = new System.Drawing.Point(3, 16);
+      this.graphTreeView.Name = "graphTreeView";
+      this.graphTreeView.ShowNodeToolTips = true;
+      this.graphTreeView.Size = new System.Drawing.Size(290, 243);
+      this.graphTreeView.TabIndex = 0;
+      this.graphTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.graphTreeView_BeforeExpand);
+      this.graphTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragDrop);
+      this.graphTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.graphTreeView_AfterSelect);
+      this.graphTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.graphTreeView_MouseDown);
+      this.graphTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragEnter);
+      this.graphTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.graphTreeView_KeyDown);
+      this.graphTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.graphTreeView_ItemDrag);
+      this.graphTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.graphTreeView_DragOver);
+      // 
+      // graphContextMenuStrip
+      // 
+      this.graphContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.breakpointToolStripMenuItem,
+            this.viewToolStripMenuItem1});
+      this.graphContextMenuStrip.Name = "graphContextMenuStrip";
+      this.graphContextMenuStrip.Size = new System.Drawing.Size(137, 48);
+      this.graphContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.graphContextMenuStrip_Opening);
+      // 
+      // breakpointToolStripMenuItem
+      // 
+      this.breakpointToolStripMenuItem.CheckOnClick = true;
+      this.breakpointToolStripMenuItem.Name = "breakpointToolStripMenuItem";
+      this.breakpointToolStripMenuItem.Size = new System.Drawing.Size(136, 22);
+      this.breakpointToolStripMenuItem.Text = "&Breakpoint";
+      this.breakpointToolStripMenuItem.ToolTipText = "Halt engine execution after executing the operator";
+      this.breakpointToolStripMenuItem.Click += new System.EventHandler(this.breakpointToolStripMenuItem_Click);
+      // 
+      // viewToolStripMenuItem1
+      // 
+      this.viewToolStripMenuItem1.Name = "viewToolStripMenuItem1";
+      this.viewToolStripMenuItem1.Size = new System.Drawing.Size(136, 22);
+      this.viewToolStripMenuItem1.Text = "&View...";
+      this.viewToolStripMenuItem1.ToolTipText = "View operator";
+      this.viewToolStripMenuItem1.Click += new System.EventHandler(this.viewToolStripMenuItem_Click);
+      // 
+      // removeButton
+      // 
+      this.removeButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.removeButton.Location = new System.Drawing.Point(81, 268);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 1;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // OperatorGraphView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer1);
+      this.Controls.Add(this.addOperatorButton);
+      this.Controls.Add(this.removeButton);
+      this.Name = "OperatorGraphView";
+      this.Size = new System.Drawing.Size(475, 291);
+      this.operatorsContextMenuStrip.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.operatorsGroupBox.ResumeLayout(false);
+      this.graphGroupBox.ResumeLayout(false);
+      this.graphContextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button addOperatorButton;
+    private System.Windows.Forms.ListView operatorsListView;
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.GroupBox operatorsGroupBox;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.ContextMenuStrip operatorsContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem initialOperatorToolStripMenuItem;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.GroupBox graphGroupBox;
+    private System.Windows.Forms.TreeView graphTreeView;
+    private System.Windows.Forms.ImageList imageList;
+    private System.Windows.Forms.ContextMenuStrip graphContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem breakpointToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem1;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.cs	(revision 1662)
@@ -0,0 +1,514 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of an <see cref="IOperatorGraph"/>.
+  /// </summary>
+  public partial class OperatorGraphView : ViewBase {
+    private ChooseOperatorDialog chooseOperatorDialog;
+    private Dictionary<IOperator, IList<TreeNode>> operatorNodeTable;
+
+    /// <summary>
+    /// Gets or sets the operator graph to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IOperatorGraph OperatorGraph {
+      get { return (IOperatorGraph)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorGraphView"/> with caption "Operator Graph".
+    /// </summary>
+    public OperatorGraphView() {
+      InitializeComponent();
+      operatorNodeTable = new Dictionary<IOperator, IList<TreeNode>>();
+      operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);
+      Caption = "Operator Graph";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorGraphView"/> 
+    /// with the given <paramref name="operatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="OperatorGraphView()"/>.</remarks>
+    /// <param name="operatorGraph">The operator graph to represent visually.</param>
+    public OperatorGraphView(IOperatorGraph operatorGraph)
+      : this() {
+      OperatorGraph = operatorGraph;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IOperatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      OperatorGraph.OperatorAdded -= new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorAdded);
+      OperatorGraph.OperatorRemoved -= new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorRemoved);
+      OperatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IOperatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      OperatorGraph.OperatorAdded += new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorAdded);
+      OperatorGraph.OperatorRemoved += new EventHandler<OperatorEventArgs>(OperatorGraph_OperatorRemoved);
+      OperatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (graphTreeView.Nodes.Count > 0)
+        RemoveTreeNode(graphTreeView.Nodes[0]);
+      graphTreeView.SelectedNode = null;
+      graphTreeView.Nodes.Clear();
+      graphTreeView.Enabled = false;
+      operatorsListView.Items.Clear();
+      removeButton.Enabled = false;
+      if (OperatorGraph == null) {
+        Caption = "Operator Graph";
+        operatorsListView.Enabled = false;
+        addOperatorButton.Enabled = false;
+      } else {
+        Caption = "Operator Graph (" + OperatorGraph.GetType().Name + ")";
+        foreach (IOperator op in OperatorGraph.Operators) {
+          operatorsListView.Items.Add(CreateListViewItem(op));
+        }
+        operatorsListView.Enabled = true;
+        addOperatorButton.Enabled = true;
+        if (OperatorGraph.InitialOperator != null) {
+          graphTreeView.Nodes.Add(CreateTreeNode(OperatorGraph.InitialOperator));
+          graphTreeView.Enabled = true;
+        }
+      }
+    }
+
+    private ListViewItem CreateListViewItem(IOperator op) {
+      ListViewItem item = new ListViewItem();
+      item.Text = op.Name;
+      item.Tag = op;
+      item.ImageIndex = 0;
+      if (op.GetType().Name == "CombinedOperator")
+        item.ImageIndex = 1;
+      else if (op.GetType().Name == "ProgrammableOperator")
+        item.ImageIndex = 2;
+      if (op == OperatorGraph.InitialOperator)
+        item.Font = new Font(operatorsListView.Font, FontStyle.Bold);
+      return item;
+    }
+
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.Tag = op;
+      if (op.Breakpoint)
+        node.ForeColor = Color.Red;
+
+      if (!operatorNodeTable.ContainsKey(op)) {
+        operatorNodeTable.Add(op, new List<TreeNode>());
+        op.NameChanged += new EventHandler(Operator_NameChanged);
+        op.BreakpointChanged += new EventHandler(Operator_BreakpointChanged);
+        op.SubOperatorAdded += new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorAdded);
+        op.SubOperatorRemoved += new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorRemoved);
+      }
+      operatorNodeTable[op].Add(node);
+
+      for (int i = 0; i < op.SubOperators.Count; i++)
+        node.Nodes.Add(new TreeNode());
+      return node;
+    }
+
+    private void RemoveTreeNode(TreeNode node) {
+      foreach (TreeNode child in node.Nodes)
+        RemoveTreeNode(child);
+
+      IOperator op = (IOperator)node.Tag;
+      if (op != null) {
+        operatorNodeTable[op].Remove(node);
+        if (operatorNodeTable[op].Count == 0) {
+          op.NameChanged -= new EventHandler(Operator_NameChanged);
+          op.BreakpointChanged -= new EventHandler(Operator_BreakpointChanged);
+          op.SubOperatorAdded -= new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorAdded);
+          op.SubOperatorRemoved -= new EventHandler<OperatorIndexEventArgs>(Operator_SubOperatorRemoved);
+          operatorNodeTable.Remove(op);
+        }
+      }
+    }
+
+    #region ListView Events
+    private void operatorsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      removeButton.Enabled = false;
+      if (operatorsListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+    }
+    private void operatorsListView_DoubleClick(object sender, EventArgs e) {
+      if (operatorsListView.SelectedItems.Count == 1) {
+        IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag;
+        IView view = op.CreateView();
+        if (view != null)
+          PluginManager.ControlManager.ShowControl(view);
+      }
+    }
+    #endregion
+
+    #region TreeView Events
+    private void graphTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      IOperator op = (IOperator)node.Tag;
+      for (int i = 0; i < node.Nodes.Count; i++) {
+        if (node.Nodes[i].Tag == null) {
+          node.Nodes[i].Remove();
+          node.Nodes.Insert(i, CreateTreeNode(op.SubOperators[i]));
+        }
+      }
+    }
+    private void graphTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      IOperator op = (IOperator)e.Node.Tag;
+      foreach (ListViewItem item in operatorsListView.Items)
+        item.Selected = item.Tag == op;
+    }
+    #endregion
+
+    #region Size Changed Events
+    private void operatorsListView_SizeChanged(object sender, EventArgs e) {
+      if (operatorsListView.Columns.Count > 0)
+        operatorsListView.Columns[0].Width = Math.Max(0, operatorsListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void operatorsListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (operatorsListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in operatorsListView.SelectedItems)
+            OperatorGraph.RemoveOperator(((IOperator)item.Tag).Guid);
+        }
+      }
+      if (e.KeyCode == Keys.F2) {
+        if (operatorsListView.SelectedItems.Count == 1)
+          operatorsListView.SelectedItems[0].BeginEdit();
+      }
+    }
+    private void graphTreeView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        TreeNode node = graphTreeView.SelectedNode;
+        if ((node != null) && (node.Parent != null)) {
+          IOperator parent = (IOperator)node.Parent.Tag;
+          parent.RemoveSubOperator(node.Index);
+        }
+      }
+    }
+    #endregion
+
+    #region Edit Events
+    private void operatorsListView_AfterLabelEdit(object sender, LabelEditEventArgs e) {
+      e.CancelEdit = false;
+
+      string name = e.Label;
+      if (name != null) {
+        IOperator op = (IOperator)operatorsListView.Items[e.Item].Tag;
+        op.Name = name;
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addOperatorButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK)
+        OperatorGraph.AddOperator(chooseOperatorDialog.Operator);
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (operatorsListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in operatorsListView.SelectedItems)
+          OperatorGraph.RemoveOperator(((IOperator)item.Tag).Guid);
+      }
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorsListView_ItemDrag(object sender, ItemDragEventArgs e) {
+      ListViewItem item = (ListViewItem)e.Item;
+      IOperator op = (IOperator)item.Tag;
+      DataObject data = new DataObject();
+      data.SetData("IOperator", op);
+      data.SetData("DragSource", operatorsListView);
+      DoDragDrop(data, DragDropEffects.Copy);
+    }
+    private void operatorsListView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator"))
+        e.Effect = DragDropEffects.Copy;
+    }
+    private void operatorsListView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator"))
+        e.Effect = DragDropEffects.Copy;
+    }
+    private void operatorsListView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          op = (IOperator)op.Clone();
+          OperatorGraph.AddOperator(op);
+        }
+      }
+    }
+    private void graphTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      if (node.Parent != null) {
+        IOperator op = (IOperator)node.Tag;
+        IOperator parent = (IOperator)node.Parent.Tag;
+        int index = node.Index;
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", graphTreeView);
+        data.SetData("ParentOperator", parent);
+        data.SetData("Index", index);
+        DoDragDrop(data, DragDropEffects.Move);
+      }
+    }
+    private void graphTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = graphTreeView.GetNodeAt(p);
+        if (node != null) {
+          if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))
+              e.Effect = DragDropEffects.Move;
+          } else {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))
+              e.Effect = DragDropEffects.Copy;
+          }
+        }
+      }
+    }
+    private void graphTreeView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = graphTreeView.GetNodeAt(p);
+        if (node != null) {
+          if ((e.Data.GetDataPresent("ParentOperator")) && (node.Parent != null)) {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == graphTreeView))
+              e.Effect = DragDropEffects.Move;
+          } else {
+            if ((e.Data.GetDataPresent("DragSource")) && (e.Data.GetData("DragSource") == operatorsListView))
+              e.Effect = DragDropEffects.Copy;
+          }
+        }
+      }
+    }
+    private void graphTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          Point p = graphTreeView.PointToClient(new Point(e.X, e.Y));
+          TreeNode node = graphTreeView.GetNodeAt(p);
+          if (e.Data.GetDataPresent("ParentOperator")) {
+            if (node.Parent != null) {
+              TreeNode parentNode = node.Parent;
+              IOperator oldParent = (IOperator)e.Data.GetData("ParentOperator");
+              int oldIndex = (int)e.Data.GetData("Index");
+              IOperator newParent = (IOperator)node.Parent.Tag;
+              int newIndex = node.Index;
+              ICollection<IConstraint> violatedConstraints;
+              ICollection<IConstraint> violatedConstraints2;
+              oldParent.TryRemoveSubOperator(oldIndex, out violatedConstraints);
+              newParent.TryAddSubOperator(op, newIndex, out violatedConstraints2);
+              if ((violatedConstraints.Count == 0) && (violatedConstraints2.Count == 0)) {
+                graphTreeView.SelectedNode = parentNode.Nodes[newIndex];
+              } else {
+                List<IConstraint> allViolatedConstraints = new List<IConstraint>(violatedConstraints);
+                allViolatedConstraints.AddRange(violatedConstraints2);
+                if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(allViolatedConstraints) == DialogResult.Yes) {
+                  if (violatedConstraints.Count > 0)
+                    oldParent.RemoveSubOperator(oldIndex);
+                  if (violatedConstraints2.Count > 0)
+                    newParent.AddSubOperator(op, newIndex);
+                  graphTreeView.SelectedNode = parentNode.Nodes[newIndex];
+                } else {
+                  if (violatedConstraints.Count == 0)
+                    oldParent.AddSubOperator(op, oldIndex);
+                  if (violatedConstraints2.Count == 0)
+                    newParent.RemoveSubOperator(newIndex);
+                }
+              }
+            }
+          } else {
+            if (node != null) {
+              IOperator parent = (IOperator)node.Tag;
+              ICollection<IConstraint> violatedConstraints;
+              if (parent.TryAddSubOperator(op, out violatedConstraints)) {
+                graphTreeView.SelectedNode = node.Nodes[node.Nodes.Count - 1];
+              } else if (Auxiliary.ShowIgnoreConstraintViolationMessageBox(violatedConstraints) == DialogResult.Yes) {
+                parent.AddSubOperator(op);
+                graphTreeView.SelectedNode = node.Nodes[node.Nodes.Count - 1];
+              }
+            }
+          }
+        }
+      }
+    }
+    #endregion
+
+    #region Context Menu Events
+    private void operatorsContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem.Enabled = false;
+      initialOperatorToolStripMenuItem.Enabled = false;
+      initialOperatorToolStripMenuItem.Checked = false;
+      if (operatorsListView.SelectedItems.Count == 1) {
+        IOperator op = (IOperator)operatorsListView.SelectedItems[0].Tag;
+        IView view = op.CreateView();
+        if (view != null) {
+          viewToolStripMenuItem.Enabled = true;
+          viewToolStripMenuItem.Tag = view;
+        }
+        initialOperatorToolStripMenuItem.Enabled = true;
+        initialOperatorToolStripMenuItem.Tag = op;
+        if (op == OperatorGraph.InitialOperator)
+          initialOperatorToolStripMenuItem.Checked = true;
+      }
+    }
+    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IView view = (IView)((ToolStripMenuItem)sender).Tag;
+      PluginManager.ControlManager.ShowControl(view);
+    }
+    private void initialOperatorToolStripMenuItem_Click(object sender, EventArgs e) {
+      if (initialOperatorToolStripMenuItem.Checked) {
+        foreach (ListViewItem item in operatorsListView.Items)
+          item.Font = operatorsListView.Font;
+        operatorsListView.SelectedItems[0].Font = new Font(operatorsListView.Font, FontStyle.Bold);
+        OperatorGraph.InitialOperator = (IOperator)initialOperatorToolStripMenuItem.Tag;
+      } else {
+        operatorsListView.SelectedItems[0].Font = operatorsListView.Font;
+        OperatorGraph.InitialOperator = null;
+      }
+    }
+    private void graphContextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem1.Enabled = false;
+      breakpointToolStripMenuItem.Enabled = false;
+      breakpointToolStripMenuItem.Checked = false;
+      if (graphTreeView.SelectedNode != null) {
+        IOperator op = (IOperator)graphTreeView.SelectedNode.Tag;
+        IView view = op.CreateView();
+        if (view != null) {
+          viewToolStripMenuItem1.Enabled = true;
+          viewToolStripMenuItem1.Tag = view;
+        }
+        breakpointToolStripMenuItem.Enabled = true;
+        breakpointToolStripMenuItem.Tag = op;
+        if (op.Breakpoint)
+          breakpointToolStripMenuItem.Checked = true;
+      }
+    }
+    private void breakpointToolStripMenuItem_Click(object sender, EventArgs e) {
+      IOperator op = (IOperator)breakpointToolStripMenuItem.Tag;
+      op.Breakpoint = breakpointToolStripMenuItem.Checked;
+    }
+    #endregion
+
+    #region OperatorGraph Events
+    private void OperatorGraph_OperatorAdded(object sender, OperatorEventArgs e) {
+      operatorsListView.Items.Add(CreateListViewItem(e.Operator));
+    }
+    private void OperatorGraph_OperatorRemoved(object sender, OperatorEventArgs e) {
+      ListViewItem itemToDelete = null;
+      foreach (ListViewItem item in operatorsListView.Items) {
+        if (item.Tag == e.Operator)
+          itemToDelete = item;
+      }
+      itemToDelete.Remove();
+    }
+    private void OperatorGraph_InitialOperatorChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+    #endregion
+
+    #region Operator Events
+    private void Operator_NameChanged(object sender, EventArgs e) {
+      IOperator op = (IOperator)sender;
+      foreach (TreeNode node in operatorNodeTable[op])
+        node.Text = op.Name;
+    }
+    private void Operator_BreakpointChanged(object sender, EventArgs e) {
+      IOperator op = (IOperator)sender;
+      foreach (TreeNode node in operatorNodeTable[op]) {
+        if (op.Breakpoint)
+          node.ForeColor = Color.Red;
+        else
+          node.ForeColor = graphTreeView.ForeColor;
+      }
+    }
+    private void Operator_SubOperatorAdded(object sender, OperatorIndexEventArgs e) {
+      IOperator op = (IOperator)sender;
+      if (operatorNodeTable.ContainsKey(op)) {
+        TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count];
+        operatorNodeTable[op].CopyTo(nodes, 0);
+        foreach (TreeNode node in nodes)
+          node.Nodes.Insert(e.Index, CreateTreeNode(e.Operator));
+      }
+    }
+    private void Operator_SubOperatorRemoved(object sender, OperatorIndexEventArgs e) {
+      IOperator op = (IOperator)sender;
+      if (operatorNodeTable.ContainsKey(op)) {
+        TreeNode[] nodes = new TreeNode[operatorNodeTable[op].Count];
+        operatorNodeTable[op].CopyTo(nodes, 0);
+        foreach (TreeNode node in nodes) {
+          RemoveTreeNode(node.Nodes[e.Index]);
+          node.Nodes.RemoveAt(e.Index);
+        }
+      }
+    }
+    #endregion
+
+    #region Mouse Events
+    private void graphTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right) return;
+      TreeNode clickedNode = graphTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        graphTreeView.SelectedNode = clickedNode;
+        graphTreeView.Refresh();
+      }
+    }
+    #endregion
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraphView.resx	(revision 1662)
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="operatorsContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="imageList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>434, 17</value>
+  </metadata>
+  <data name="imageList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC6
+        CgAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
+        AwABEAMAAQEBAAEYBgABDP8APwABuQGiAZIBYAFIATQBYgFJATUBYQFJATcBZgFJATQBYgFKATQBYgFJ
+        ATUBYQFIATQBYQFIATgBZQFIATMBZQFKATYBYQFHATaBAAHlAssBnQFNASUBnQFNASUBnQFNASUB3QK7
+        DAABuwGhAZMB/QH/Af4BuQGiAZIBuQGiAZIBtQGgAZgBswGkAZEBtAGhAZIBuQGiAZMBtQGiAZMBugGk
+        AZIBuAGhAZEBYwFKATZRAAHsAdIB7AFyASQBcQHmAcwB5gkAAfsBwwH7AcsBHwHNAfwB1QH8EgAB8ALh
+        AZ0BTQElAfoBnQFiAeEBhgFYAeEBhgFYAZ0BTQElDAABtwGiAZMG/wH+AfoB+QH8AfoB+QH2AfEB8AHx
+        AeYB4gHsAd0B1AHlAdMByAHhAckBvQG3AaMBkgFhAUgBNE4AAe0B2AHtAakBUAGoAYABMAF/AXUBJwF1
+        AesB0QHrAwAB/QHpAf4BywEfAc0BywEfAc0BywEfAc0DAAHpAfAB6QEnAW8BKAEaAWcBHAEaAWcBHAHp
+        AfAB6QHnAZoBcwH8Ab4BlwH7AcABoQH7AbEBggGiAVYBMQHyAuQB1QHdAeIBQAF5AY4BNwFiAXUBKAFV
+        AWoBKwFVAWwBKgFVAWgBJwFRAWgBMwFcAXUBLAFYAWkB+QL3AfUB7AHoAfEB5AHcAeoB2QHQAeUBzwHE
+        AbcBogGTAWIBSQE1SwAB6AHRAegBqgFQAakBzAFnAcsBfgEuAX4BlgE4AZUBewErAXoB8AHVAfAB2AFr
+        AdcB/wFeAfwBywEfAc0BywEfAc0B6QHwAekBLAGCATMBWgGvAV8BWwGpAV8BTQGcAU8BGQF3ARwB9wLw
+        AecBmgFzAecBmgFzAecBmgFzAfMC5wMAATwBdAGNAaYB1wHfAbcB5wHzAa4B5QHyAbAB5gHxAa4B5gHx
+        AaQB3gHqAUYBeAGUAUEBowHTATkBeQGSAfsB8gHvAfIB6QHlAewB3wHXAecB1AHMAbQBoQGSAWIBSQE1
+        NgABqwHwAfcBqwHiAeUBrAHOAcwBrQG7AbUBrgGnAZwDAAHkAcoB5AGpAVABqAHTAWsB0gHUAW4B0wF/
+        ATABfgGfATwBnwGOATUBjQF9AS0BfAHYAWsB1wHkAUIB5gH/AaYB/wHLAR8BzQErAYIBOQGIAdcBkwF+
+        Ac0BiAFkAbMBaQEiAXoBJwHpAfAB6QYAAVYBUAFKCQABYAGVAaoBUAGEAZsBRgF8AZMBVwGJAZ8BVgGK
+        AaEBVgGIAZ4BVAGDAZkBXAGFAZwBRwGtAdgBPQF/AZwB/AH7AfcB9gHvAewB7wHlAd4B6wHbAdQBtwGi
+        AZMBYgFJATVIAAGqAVIBqQHSAWoB0QHVAW8B1QG9AXABvAHeAZgB3QGPAUYBjgGdATwBnAF+AS4BfgHY
+        AWsB1wH/AaYB/wHYAWsB1wH8AdUB/AHpAfAB6QErAYIBOQEmAX4BLgEiAXoBJwHpAfAB6QFWAVABSgMA
+        AVYBUAFKDwAB1QHdAeIBfgGpAbwBiAHUAesBXwHBAekBXwHBAesBTwG5AegBTAGyAeIBPgGEAaEBYQGL
+        AZ4B+gH9AfsB+QH2AfIB9AHrAecB7AHgAdoBuQGiAZIBYgFJATUzAAGrAfAB9wGrAeUB6QGsAtUBrAHE
+        AcEBrQG1AawBrgGkAZgDAAGoAU8BpwHSAW0B0QG8AW8BuwHvAaUB7gH7AZ8B+gHvAZ0B7gGXAVIBlgF8
+        AS4BfAH9AekB/gHYAWsB1wH9AekB/gFWAVABShIAAVYBUAFKFQABPgF2AY8BhQHZAfIBcQHNAfABZwHE
+        AesBWAG+AegBPQF6AZQBdAGhAbYD/gL/Af4B/wH6AfkB9wHwAe0B8QHmAeIBuQGiAZIBYgFJATVIAAGn
+        AVABpgG8AW8BuwHvAaUB7gH7AZsB+gH7AZgB+gH7AZkB+gHnAZgB5gGRAU4BkAwAAVYBUAFKDAABVgFQ
+        AUoDAAFWAVABSgH7AcMB+wHLAR8BzQH8AdUB/AYAAV0BjwGhAXcBoAGvAZUB5AH3AYoB3AH1AXwB1AHy
+        AWoBxAHmAT0BeAGYAe4B9gH1Af0C/wH7Av8D/gH6AfYC9QHvAeoBuQGiAZIBYgFJATU5AAGrAfAB9wGs
+        AtUBrgG0AawBrgGZAYoD/QHPAYgBzwHiAa8B4gH7AasB+gH7AZgB+gH7AZgB+gHqAZAB6QHPAYgBzwH0
+        AeYB9A8AA4YBEgFbAYUBhwGwAcgBVgFQAUoGAAH9AekB/gHLAR8BzQHLAR8BzQHLAR8BzQYAAW0BmwGs
+        Aa4B9AH7AasB8AH/AZ0B6wH4AZcB5AH3ATUBdgGVAVEBpAHDATgBbgGFATkBawF/Af8B/gH/Af0B/wH+
+        A/8B+gH3AfMBuQGiAZIBYgFJATVIAAHwAdQB8AHPAYgBzwHuAb4B7gH7Aa4B+gHsAZEB6wHPAYgBzwHz
+        AeAB8hIAASgBfAGrAQwBrQHuARoBZwGTAZsBvgHRBgAB2AFrAdcB/wFeAfwBywEfAc0BywEfAc0GAAE2
+        AW4BhwGtAfIB+wGvAfQB/QGxAfQB/QGnAe0B+gEkAWEBewFUAaMBxAFfAbIB0QEaAUkBXgP+A/8B/gH8
+        AfsBtwGiAZMBuwGiAZIBYwFKATZLAAHyAdsB8gHPAYgBzwHjAawB4wHPAYgBzwHzAeMB8xUAAQwBrQHu
+        ASgBfAGrAQwBrQHuARoBZwGTBgAB2AFrAdcB5AFCAeYB/wGmAf8BywEfAc0GAAHVAd0B4gF7Aa0BvwF3
+        AaYBuwFwAZ4BtgFoAZcBrQFjAY4BowEwAWQBdQE0AWQBdgH/Af4D/wL+Af0B/wG3AaIBkwFhAUkBNQFk
+        AUwBNgFiAUsBNU4AAfIB2wHyAc8BiAHPAfAB4wHwGAABBAG0AfwBZgHMAf8BKAF8AasBIQFyAaAGAAHY
+        AWsB1wH/AaYB/wHYAWsB1wH8AdUB/A8AAdIBwAGvAf8B/gP/Af4B/Qf/Af4B/wH+A/8B/AG4AaQBkwHU
+        AcQBvQFlAUoBNQHgAdsB11EAAf4B+wH+GwAB2QHlAewBBAG0AfwBZgHMAf8BKAF8AasGAAH9AekB/gHY
+        AWsB1wH9AekB/hIAAdkBwgGyAf4B/wL9A/8B/gX/Af0C/wH+Af8B/AH/Af0BvgGrAZwBZQFKATUB4AHb
+        Add1AAHZAeUB7AEEAbQB/AG4AdAB3SEAAdgBwgGwAdsBwQGzAdcBwgGzAdgBwgGwAdkBwgGzAdIBwwGw
+        AdUBvgGvAc4BuQGqAcoBswGjAeAB2wHXNgABQgFNAT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGA
+        FwAD/wEABv8CAAT/AfADAAP/AeAB8AMAAf8B4wGPAcAB8AMAAf8BwQEIBQAB/wGAAQABAQQAAcECAAE3
+        BAAB/wIAAS8BgAMAAYEBAAEPAd8BwAMAAf8BAAH3AaEBgAMAAeABAAH4AWEBgAMAAf8BAQH4AWEBgAMA
+        Af8BgwH4AWEBgAMAAf8BxwH4AWEB8AMAAf8B7wH4AWMB8AEBAgAC/wH8AX8B8AEDAgAL
+</value>
+  </data>
+  <metadata name="graphContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>204, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>349, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGroup.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGroup.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGroup.cs	(revision 1662)
@@ -0,0 +1,193 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Representation of a group of operators (can also include subgroups).
+  /// </summary>
+  public class OperatorGroup : StorableBase, IOperatorGroup {
+    private string myName;
+    /// <summary>
+    /// Gets or sets the name of the current operator group.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnNameChanged"/> in the setter.</remarks>
+    public string Name {
+      get { return myName; }
+      set {
+        if (myName != value) {
+          myName = value;
+          OnNameChanged();
+        }
+      }
+    }
+    private List<IOperatorGroup> mySubGroups;
+    /// <summary>
+    /// Gets all subgroups of the current instance.
+    /// <note type="caution"> The subgroups are returned read-only.</note>
+    /// </summary>
+    public ICollection<IOperatorGroup> SubGroups {
+      get { return mySubGroups.AsReadOnly(); }
+    }
+    private List<IOperator> myOperators;
+    /// <summary>
+    /// Gets all operators of the current instance.
+    /// <note type="caution"> The operators are returned read-only.</note>
+    /// </summary>
+    public ICollection<IOperator> Operators {
+      get { return myOperators.AsReadOnly(); }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorGroup"/> having "Anonymous" as name.
+    /// </summary>
+    public OperatorGroup() {
+      myName = "Anonymous";
+      mySubGroups = new List<IOperatorGroup>();
+      myOperators = new List<IOperator>();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone with <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OperatorGroup"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorGroup clone = (OperatorGroup)base.Clone(clonedObjects);
+      clone.myName = Name;
+      foreach (IOperatorGroup group in SubGroups)
+        clone.AddSubGroup((IOperatorGroup)Auxiliary.Clone(group, clonedObjects));
+      foreach (IOperator op in Operators)
+        clone.AddOperator((IOperator)Auxiliary.Clone(op, clonedObjects));
+      return clone;
+    }
+
+    /// <summary>
+    /// Adds the given subgroup (<paramref name="group"/>) to the current instance.
+    /// </summary>
+    /// <param name="group">The subgroup to add.</param>
+    public virtual void AddSubGroup(IOperatorGroup group) {
+      mySubGroups.Add(group);
+    }
+    /// <summary>
+    /// Removes the given subgroup (<paramref name="group"/>) from the current instance.
+    /// </summary>
+    /// <param name="group">The subgroup to remove.</param>
+    public virtual void RemoveSubGroup(IOperatorGroup group) {
+      mySubGroups.Remove(group);
+    }
+    /// <summary>
+    /// Ads the given operator <paramref name="op"/> to the current instance.
+    /// </summary>
+    /// <param name="op">The operator to add.</param>
+    public virtual void AddOperator(IOperator op) {
+      myOperators.Add(op);
+    }
+    /// <summary>
+    /// Removes the given operator <paramref name="op"/> from the current instance.
+    /// </summary>
+    /// <param name="op">The operator to remove.</param>
+    public virtual void RemoveOperator(IOperator op) {
+      myOperators.Remove(op);
+    }
+
+    /// <summary>
+    /// Occurs when the name of the operator was changed.
+    /// </summary>
+    public event EventHandler NameChanged;
+    /// <summary>
+    /// Fires a new <c>NameChanged</c> event.
+    /// </summary>
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null) {
+        NameChanged(this, new EventArgs());
+      }
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// A quick overview how the single elements of the current instance are saved:
+    /// <list type="bullet">
+    /// <item>
+    /// <term>Name: </term>
+    /// <description>Saved as an <see cref="XmlAttribute"/> with attribute name <c>Name</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Sub groups: </term>
+    /// <description>A child node is created with tag name <c>SubGroups</c>. Beyond this child node 
+    /// all sub operator groups are saved as child nodes themselves.</description>
+    /// </item>
+    /// <item>
+    /// <term>Operators: </term>
+    /// <description>A child node is created with tag name <c>Operators</c>. Beyond this child node
+    /// all operators are saved as child nodes themselves.</description>
+    /// </item>
+    /// </list>
+    /// </remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      XmlNode subGroupsNode = document.CreateNode(XmlNodeType.Element, "SubGroups", null);
+      foreach (IOperatorGroup group in SubGroups)
+        subGroupsNode.AppendChild(PersistenceManager.Persist(group, document, persistedObjects));
+      node.AppendChild(subGroupsNode);
+      XmlNode operatorsNode = document.CreateNode(XmlNodeType.Element, "Operators", null);
+      foreach (IOperator op in Operators)
+        operatorsNode.AppendChild(PersistenceManager.Persist(op, document, persistedObjects));
+      node.AppendChild(operatorsNode);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operator group from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get information about how the data must be saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="StorableBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the boolean value is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+      XmlNode subGroupsNode = node.SelectSingleNode("SubGroups");
+      foreach (XmlNode subGroupNode in subGroupsNode.ChildNodes)
+        AddSubGroup((IOperatorGroup)PersistenceManager.Restore(subGroupNode, restoredObjects));
+      XmlNode operatorsNode = node.SelectSingleNode("Operators");
+      foreach (XmlNode operatorNode in operatorsNode.ChildNodes)
+        AddOperator((IOperator)PersistenceManager.Restore(operatorNode, restoredObjects));
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorIndexEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorIndexEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorIndexEventArgs.cs	(revision 1662)
@@ -0,0 +1,51 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected operator at the specified index.
+  /// </summary>
+  public class OperatorIndexEventArgs : ItemIndexEventArgs {
+    /// <summary>
+    /// Gets the affected operator.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class 
+    /// <see cref="ItemIndexEventArgs"/>. No own data storage present.</remarks>
+    public IOperator Operator {
+      get { return (IOperator)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorIndexEventArgs"/> with the given operator
+    /// and the specified <paramref name="index"/>.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemIndexEventArgs"/>.</remarks>
+    /// <param name="op">The affected operator.</param>
+    /// <param name="index">The affected index.</param>
+    public OperatorIndexEventArgs(IOperator op, int index)
+      : base(op, index) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorLibrary.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorLibrary.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorLibrary.cs	(revision 1662)
@@ -0,0 +1,106 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a library of operators consisting of one <see cref="IOperatorGroup"/>.
+  /// </summary>
+  public class OperatorLibrary : ItemBase, IOperatorLibrary, IEditable {
+    private IOperatorGroup myGroup;
+    /// <summary>
+    /// Gets the operator group of the current instance.
+    /// </summary>
+    public IOperatorGroup Group {
+      get { return myGroup; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorLibrary"/>.
+    /// </summary>
+    public OperatorLibrary() {
+      myGroup = new OperatorGroup();
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="OperatorLibraryEditor"/> to display the current instance.
+    /// </summary>
+    /// <returns>The created view as <see cref="OperatorLibraryEditor"/>.</returns>
+    public override IView CreateView() {
+      return new OperatorLibraryEditor(this);
+    }
+    /// <summary>
+    /// Creates a new instance of <see cref="OperatorLibraryEditor"/> to display the current instance.
+    /// </summary>
+    /// <returns>The created editor as <see cref="OperatorLibraryEditor"/>.</returns>
+    public virtual IEditor CreateEditor() {
+      return new OperatorLibraryEditor(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="OperatorLibrary"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      OperatorLibrary clone = new OperatorLibrary();
+      clonedObjects.Add(Guid, clone);
+      clone.myGroup = (IOperatorGroup)Auxiliary.Clone(Group, clonedObjects);
+      return clone;
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// The operator group is saved as a child node with the tag name <c>OperatorGroup</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("OperatorGroup", Group, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted operator library from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.<br/>
+    /// See <see cref="GetXmlNode"/> for further information on how the data must be saved.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the operator library is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myGroup = (IOperatorGroup)PersistenceManager.Restore(node.SelectSingleNode("OperatorGroup"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.Designer.cs	(revision 1662)
@@ -0,0 +1,196 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class OperatorLibraryEditor {
+    /// <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 (chooseOperatorDialog != null) chooseOperatorDialog.Dispose();
+      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.operatorsGroupBox = new System.Windows.Forms.GroupBox();
+      this.operatorsTreeView = new System.Windows.Forms.TreeView();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.addGroupButton = new System.Windows.Forms.Button();
+      this.addOperatorButton = new System.Windows.Forms.Button();
+      this.importButton = new System.Windows.Forms.Button();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.operatorsGroupBox.SuspendLayout();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // operatorsGroupBox
+      // 
+      this.operatorsGroupBox.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.operatorsGroupBox.Controls.Add(this.operatorsTreeView);
+      this.operatorsGroupBox.Enabled = false;
+      this.operatorsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.operatorsGroupBox.Name = "operatorsGroupBox";
+      this.operatorsGroupBox.Size = new System.Drawing.Size(522, 366);
+      this.operatorsGroupBox.TabIndex = 0;
+      this.operatorsGroupBox.TabStop = false;
+      this.operatorsGroupBox.Text = "&Operators";
+      // 
+      // operatorsTreeView
+      // 
+      this.operatorsTreeView.AllowDrop = true;
+      this.operatorsTreeView.ContextMenuStrip = this.contextMenuStrip;
+      this.operatorsTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.operatorsTreeView.HideSelection = false;
+      this.operatorsTreeView.LabelEdit = true;
+      this.operatorsTreeView.Location = new System.Drawing.Point(3, 16);
+      this.operatorsTreeView.Name = "operatorsTreeView";
+      this.operatorsTreeView.ShowNodeToolTips = true;
+      this.operatorsTreeView.Size = new System.Drawing.Size(516, 347);
+      this.operatorsTreeView.TabIndex = 0;
+      this.operatorsTreeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.operatorsTreeView_AfterLabelEdit);
+      this.operatorsTreeView.DoubleClick += new System.EventHandler(this.operatorsTreeView_DoubleClick);
+      this.operatorsTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragDrop);
+      this.operatorsTreeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.operatorsTreeView_AfterSelect);
+      this.operatorsTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.operatorsTreeView_MouseDown);
+      this.operatorsTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragEnter);
+      this.operatorsTreeView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.operatorsTreeView_KeyDown);
+      this.operatorsTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.operatorsTreeView_ItemDrag);
+      this.operatorsTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.operatorsTreeView_DragOver);
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.viewToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(120, 26);
+      this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(119, 22);
+      this.viewToolStripMenuItem.Text = "&View...";
+      this.viewToolStripMenuItem.Click += new System.EventHandler(this.viewToolStripMenuItem_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.Location = new System.Drawing.Point(220, 372);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(104, 23);
+      this.removeButton.TabIndex = 3;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // addGroupButton
+      // 
+      this.addGroupButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addGroupButton.Enabled = false;
+      this.addGroupButton.Location = new System.Drawing.Point(0, 372);
+      this.addGroupButton.Name = "addGroupButton";
+      this.addGroupButton.Size = new System.Drawing.Size(104, 23);
+      this.addGroupButton.TabIndex = 1;
+      this.addGroupButton.Text = "&Add &Group...";
+      this.addGroupButton.UseVisualStyleBackColor = true;
+      this.addGroupButton.Click += new System.EventHandler(this.addGroupButton_Click);
+      // 
+      // addOperatorButton
+      // 
+      this.addOperatorButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addOperatorButton.Enabled = false;
+      this.addOperatorButton.Location = new System.Drawing.Point(110, 372);
+      this.addOperatorButton.Name = "addOperatorButton";
+      this.addOperatorButton.Size = new System.Drawing.Size(104, 23);
+      this.addOperatorButton.TabIndex = 2;
+      this.addOperatorButton.Text = "Add &Operator...";
+      this.addOperatorButton.UseVisualStyleBackColor = true;
+      this.addOperatorButton.Click += new System.EventHandler(this.addOperatorButton_Click);
+      // 
+      // importButton
+      // 
+      this.importButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.importButton.Location = new System.Drawing.Point(330, 372);
+      this.importButton.Name = "importButton";
+      this.importButton.Size = new System.Drawing.Size(104, 23);
+      this.importButton.TabIndex = 4;
+      this.importButton.Text = "&Import...";
+      this.importButton.UseVisualStyleBackColor = true;
+      this.importButton.Click += new System.EventHandler(this.importButton_Click);
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "item";
+      this.openFileDialog.Filter = "HeuristicLab files|*.hl|All files|*.*";
+      this.openFileDialog.Title = "Import ...";
+      // 
+      // OperatorLibraryEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.importButton);
+      this.Controls.Add(this.operatorsGroupBox);
+      this.Controls.Add(this.addGroupButton);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addOperatorButton);
+      this.Name = "OperatorLibraryEditor";
+      this.Size = new System.Drawing.Size(522, 395);
+      this.operatorsGroupBox.ResumeLayout(false);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox operatorsGroupBox;
+    private System.Windows.Forms.TreeView operatorsTreeView;
+    private System.Windows.Forms.Button removeButton;
+    private System.Windows.Forms.Button addGroupButton;
+    private System.Windows.Forms.Button addOperatorButton;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.Button importButton;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.cs	(revision 1662)
@@ -0,0 +1,346 @@
+#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;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Visual representation of the class <see cref="IOperatorLibrary"/>.
+  /// </summary>
+  public partial class OperatorLibraryEditor : EditorBase {
+    private ChooseOperatorDialog chooseOperatorDialog;
+
+    /// <summary>
+    /// Gets or sets the operator library that should be displayed.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="EditorBase"/>.</remarks>
+    public IOperatorLibrary OperatorLibrary {
+      get { return (IOperatorLibrary)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorLibraryEditor"/> with caption 
+    /// <c>Operator Library</c>.
+    /// </summary>
+    public OperatorLibraryEditor() {
+      InitializeComponent();
+      operatorsTreeView.TreeViewNodeSorter = new NodeSorter();
+      Caption = "Operator Library";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="OperatorLibraryEditor"/> with the 
+    /// specified <paramref name="operatorLibrary"/>.
+    /// </summary>
+    /// <param name="operatorLibrary">The operator library to display.</param>
+    public OperatorLibraryEditor(IOperatorLibrary operatorLibrary)
+      : this() {
+      OperatorLibrary = operatorLibrary;
+    }
+
+    private class NodeSorter : IComparer {
+      public int Compare(object x, object y) {
+        TreeNode tx = x as TreeNode;
+        TreeNode ty = y as TreeNode;
+
+        int result = string.Compare(tx.Text, ty.Text);
+        if (result == 0)
+          result = tx.Index.CompareTo(ty.Index);
+        return result;
+      }
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="EditorBase.UpdateControls"/> of base class <see cref="EditorBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      operatorsTreeView.Nodes.Clear();
+      addGroupButton.Enabled = false;
+      addOperatorButton.Enabled = false;
+      removeButton.Enabled = false;
+      if (OperatorLibrary == null) {
+        Caption = "Operator Library";
+        operatorsGroupBox.Enabled = false;
+      } else {
+        Caption = OperatorLibrary.Group.Name + " (" + OperatorLibrary.GetType().Name + ")";
+        operatorsGroupBox.Enabled = true;
+        operatorsTreeView.Nodes.Add(CreateTreeNode(OperatorLibrary.Group));
+        operatorsTreeView.Sort();
+      }
+    }
+
+    private TreeNode CreateTreeNode(IOperatorGroup group) {
+      TreeNode node = new TreeNode();
+      node.Text = group.Name;
+      node.ForeColor = Color.LightGray;
+      node.Tag = group;
+
+      foreach (IOperator op in group.Operators)
+        node.Nodes.Add(CreateTreeNode(op));
+      foreach (IOperatorGroup subGroup in group.SubGroups)
+        node.Nodes.Add(CreateTreeNode(subGroup));
+      return node;
+    }
+    private TreeNode CreateTreeNode(IOperator op) {
+      TreeNode node = new TreeNode();
+      node.Text = op.Name;
+      node.ToolTipText = op.GetType().Name;
+      node.Tag = op;
+      return node;
+    }
+    private void RemoveTreeNode(TreeNode node) {
+      if (node.Tag is IOperatorGroup) {
+        IOperatorGroup group = node.Tag as IOperatorGroup;
+        IOperatorGroup parent = node.Parent.Tag as IOperatorGroup;
+        parent.RemoveSubGroup(group);
+      } else if (node.Tag is IOperator) {
+        IOperator op = node.Tag as IOperator;
+        IOperatorGroup group = node.Parent.Tag as IOperatorGroup;
+        group.RemoveOperator(op);
+      }
+      node.Remove();
+      EnableDisableButtons();
+    }
+
+    private void EnableDisableButtons() {
+      addGroupButton.Enabled = false;
+      addOperatorButton.Enabled = false;
+      removeButton.Enabled = false;
+      operatorsTreeView.Focus();
+
+      if (operatorsTreeView.SelectedNode != null) {
+        if (operatorsTreeView.SelectedNode.Parent != null)
+          removeButton.Enabled = true;
+        if (operatorsTreeView.SelectedNode.Tag is IOperatorGroup) {
+          addGroupButton.Enabled = true;
+          addOperatorButton.Enabled = true;
+        }
+      }
+    }
+
+    private void MergeOperatorLibrary(IOperatorGroup src, IOperatorGroup dest) {
+      foreach(IOperator op in src.Operators) {
+        if(!Contains(dest, op)) {
+          dest.AddOperator(op);
+        }
+      }
+
+      foreach(OperatorGroup group in src.SubGroups) {
+        bool mergedIntoExistingGroup = false;
+        // try to find a group in dest with matching name
+        foreach(OperatorGroup destGroup in dest.SubGroups) {
+          if(group.Name == destGroup.Name) {
+            MergeOperatorLibrary(group, destGroup);
+            mergedIntoExistingGroup = true;
+            break;
+          }
+        }
+        if(!mergedIntoExistingGroup) {
+          OperatorGroup newGroup = new OperatorGroup();
+          newGroup.Name = group.Name;
+          dest.AddSubGroup(newGroup);
+          MergeOperatorLibrary(group, newGroup);
+        }
+      }
+    }
+
+    private bool Contains(IOperatorGroup group, IOperator op) {
+      foreach(IOperator destOp in group.Operators) {
+        if(op.Name == destOp.Name) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+
+    #region TreeView Events
+    private void operatorsTreeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      EnableDisableButtons();
+    }
+    private void operatorsTreeView_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
+      e.CancelEdit = false;
+
+      string name = e.Label;
+      if (name != null) {
+        if (e.Node.Tag is IOperatorGroup)
+          ((IOperatorGroup)e.Node.Tag).Name = name;
+        else if (e.Node.Tag is IOperator)
+          ((IOperator)e.Node.Tag).Name = name;
+      }
+    }
+    private void operatorsTreeView_DoubleClick(object sender, EventArgs e) {
+      if (operatorsTreeView.SelectedNode != null) {
+        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
+        if (op != null) {
+          IView view = op.CreateView();
+          if (view != null)
+            PluginManager.ControlManager.ShowControl(view);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addOperatorButton_Click(object sender, EventArgs e) {
+      if (chooseOperatorDialog == null) chooseOperatorDialog = new ChooseOperatorDialog();
+      if (chooseOperatorDialog.ShowDialog(this) == DialogResult.OK) {
+        TreeNode node = operatorsTreeView.SelectedNode;
+        IOperatorGroup group = node.Tag as IOperatorGroup;
+        group.AddOperator(chooseOperatorDialog.Operator);
+        node.Nodes.Add(CreateTreeNode(chooseOperatorDialog.Operator));
+        operatorsTreeView.Sort();
+        EnableDisableButtons();
+      }
+    }
+    private void addGroupButton_Click(object sender, EventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      IOperatorGroup newGroup = new OperatorGroup();
+      IOperatorGroup group = node.Tag as OperatorGroup;
+      group.AddSubGroup(newGroup);
+      node.Nodes.Add(CreateTreeNode(newGroup));
+      operatorsTreeView.Sort();
+      EnableDisableButtons();
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      RemoveTreeNode(node);
+    }
+    private void importButton_Click(object sender, EventArgs e) {
+      if(openFileDialog.ShowDialog() == DialogResult.OK) {
+        IOperatorLibrary loadedLibrary = (PersistenceManager.Load(openFileDialog.FileName) as IOperatorLibrary);
+        if(loadedLibrary == null) {
+          Auxiliary.ShowErrorMessageBox("The selected file does not contain an operator library");
+        } else {
+          MergeOperatorLibrary(loadedLibrary.Group, OperatorLibrary.Group);
+          Refresh();
+        }
+      }
+    }
+    #endregion
+
+    #region Key Events
+    private void operatorsTreeView_KeyDown(object sender, KeyEventArgs e) {
+      TreeNode node = operatorsTreeView.SelectedNode;
+      if ((e.KeyCode == Keys.Delete) && (node != null) && (node.Parent != null))
+        RemoveTreeNode(operatorsTreeView.SelectedNode);
+      if ((e.KeyCode == Keys.F2) && (node != null))
+        node.BeginEdit();
+    }
+    #endregion
+
+
+    #region Mouse Events
+    private void operatorsTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right) return;
+      TreeNode clickedNode = operatorsTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        operatorsTreeView.SelectedNode = clickedNode;
+        operatorsTreeView.Refresh();
+      }
+    }
+    #endregion
+
+
+    #region Context Menu Events
+    private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      viewToolStripMenuItem.Enabled = false;
+      if (operatorsTreeView.SelectedNode != null) {
+        IOperator op = operatorsTreeView.SelectedNode.Tag as IOperator;
+        if (op != null) {
+          IView view = op.CreateView();
+          if (view != null) {
+            viewToolStripMenuItem.Enabled = true;
+            viewToolStripMenuItem.Tag = view;
+          }
+        }
+      }
+    }
+    private void viewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IView view = (IView)viewToolStripMenuItem.Tag;
+      PluginManager.ControlManager.ShowControl(view);
+    }
+    #endregion
+
+    #region Drag and Drop Events
+    private void operatorsTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      IOperator op = node.Tag as IOperator;
+      if (op != null) {
+        DataObject data = new DataObject();
+        data.SetData("IOperator", op);
+        data.SetData("DragSource", operatorsTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    private void operatorsTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = operatorsTreeView.GetNodeAt(p);
+        if ((node != null) && (node.Tag is IOperatorGroup))
+          e.Effect = DragDropEffects.Copy;
+      }
+    }
+    private void operatorsTreeView_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      if (e.Data.GetDataPresent("IOperator")) {
+        Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+        TreeNode node = operatorsTreeView.GetNodeAt(p);
+        if ((node != null) && (node.Tag is IOperatorGroup))
+          e.Effect = DragDropEffects.Copy;
+      }
+    }
+    private void operatorsTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        if (e.Data.GetDataPresent("IOperator")) {
+          IOperator op = (IOperator)e.Data.GetData("IOperator");
+          Point p = operatorsTreeView.PointToClient(new Point(e.X, e.Y));
+          TreeNode node = operatorsTreeView.GetNodeAt(p);
+          if (node != null) {
+            op = (IOperator)op.Clone();
+
+            while (op.SubOperators.Count > 0)
+              op.RemoveSubOperator(0);
+
+            IOperatorGroup group = (IOperatorGroup)node.Tag;
+            group.AddOperator(op);
+            node.Nodes.Add(CreateTreeNode(op));
+            operatorsTreeView.Sort();
+            EnableDisableButtons();
+          }
+        }
+      }
+    }
+    #endregion
+
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorLibraryEditor.resx	(revision 1662)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>139, 17</value>
+  </metadata>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>277, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/PersistenceManager.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/PersistenceManager.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/PersistenceManager.cs	(revision 1662)
@@ -0,0 +1,237 @@
+#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.Text;
+using System.Xml;
+using System.IO;
+using System.IO.Compression;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Static class for serializing and deserializing objects.
+  /// </summary>
+  public static class PersistenceManager {
+    /// <summary>
+    /// Creates an <see cref="XmlDocument"/> to persist an object with xml declaration.
+    /// </summary>
+    /// <returns>The created <see cref="XmlDocument"/>.</returns>
+    public static XmlDocument CreateXmlDocument() {
+      XmlDocument document = new XmlDocument();
+      document.AppendChild(document.CreateXmlDeclaration("1.0", null, null));
+      return document;
+    }
+    /// <summary>
+    /// Saves the specified <paramref name="instance"/> in the specified <paramref name="document"/>
+    /// if it has not already been serialized.
+    /// </summary>
+    /// <remarks>The tag name of the saved instance is its type name.<br/>
+    /// The guid is saved as an <see cref="XmlAttribute"/> with tag name <c>GUID</c>.</remarks>
+    /// <param name="instance">The object that should be saved.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public static XmlNode Persist(IStorable instance, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      string name = instance.GetType().Name;
+      name = name.Replace('`', '_');
+      return Persist(name, instance, document, persistedObjects);
+    }
+    /// <summary>
+    /// Saves the specified <paramref name="instance"/> in the specified <paramref name="document"/>
+    /// if it has not already been serialized.
+    /// </summary>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="instance">The object that should be saved.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public static XmlNode Persist(string name, IStorable instance, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      if(persistedObjects.ContainsKey(instance.Guid)) {
+        XmlNode node = document.CreateNode(XmlNodeType.Element, name, null);
+        XmlAttribute guidAttribute = document.CreateAttribute("GUID");
+        guidAttribute.Value = instance.Guid.ToString();
+        node.Attributes.Append(guidAttribute);
+        return node;
+      } else {
+        persistedObjects.Add(instance.Guid, instance);
+        XmlNode node = instance.GetXmlNode(name, document, persistedObjects);
+        return node;
+      }
+    }
+    /// <summary>
+    /// Loads a persisted object from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>The guid is saved as an attribute with tag name <c>GUID</c>. The type of the 
+    /// persisted object is saved as attribute with tag name <c>Type</c>.<br/>
+    /// Calls <c>instance.Populate</c>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the object is saved.</param>
+    /// <param name="restoredObjects">A dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The loaded object.</returns>
+    public static IStorable Restore(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      Guid guid = new Guid(node.Attributes["GUID"].Value);
+      if(restoredObjects.ContainsKey(guid)) {
+        return restoredObjects[guid];
+      } else {
+        Type type = Type.GetType(node.Attributes["Type"].Value, true);
+        IStorable instance = (IStorable)Activator.CreateInstance(type);
+        restoredObjects.Add(guid, instance);
+        instance.Populate(node, restoredObjects);
+        return instance;
+      }
+    }
+    /// <summary>
+    /// Saves the specified <paramref name="instance"/> in the specified file through creating an 
+    /// <see cref="XmlDocument"/>.
+    /// </summary>
+    /// <param name="instance">The object that should be saved.</param>
+    /// <param name="filename">The name of the file where the <paramref name="object"/> should be saved.</param>
+    public static void Save(IStorable instance, string filename) {
+      using(FileStream stream = File.Create(filename)) {
+        Save(instance, stream);
+        stream.Close();
+      }
+    }
+    /// <summary>
+    /// Saves the specified <paramref name="instance"/> in the specified <paramref name="stream"/> 
+    /// through creating an <see cref="XmlDocument"/>.
+    /// </summary>
+    /// <param name="instance">The object that should be saved.</param>
+    /// <param name="stream">The (file) stream where the object should be saved.</param>
+    public static void Save(IStorable instance, Stream stream) {
+      XmlDocument document = PersistenceManager.CreateXmlDocument();
+      Dictionary<Guid, IStorable> dictionary = new Dictionary<Guid, IStorable>();
+      XmlNode rootNode = document.CreateElement("Root");
+      document.AppendChild(rootNode);
+      XmlNode necessaryPluginsNode = document.CreateElement("NecessaryPlugins");
+      rootNode.AppendChild(necessaryPluginsNode);
+      rootNode.AppendChild(Persist(instance, document, dictionary));
+      // determine the list of necessary plugins for this document
+      DiscoveryService service = new DiscoveryService();
+      List<PluginInfo> plugins = new List<PluginInfo>();
+      foreach(IStorable storeable in dictionary.Values) {
+        PluginInfo pluginInfo = service.GetDeclaringPlugin(storeable.GetType());
+        if(!plugins.Contains(pluginInfo)) plugins.Add(pluginInfo);
+      }
+      foreach(PluginInfo uniquePlugin in plugins) {
+        XmlNode necessaryPluginNode = document.CreateElement("Plugin");
+        XmlAttribute nameAttr = document.CreateAttribute("Name");
+        nameAttr.Value = uniquePlugin.Name;
+        XmlAttribute versionAttr = document.CreateAttribute("Version");
+        versionAttr.Value = uniquePlugin.Version.ToString();
+        necessaryPluginNode.Attributes.Append(nameAttr);
+        necessaryPluginNode.Attributes.Append(versionAttr);
+        necessaryPluginsNode.AppendChild(necessaryPluginNode);
+      }
+      document.Save(stream);
+    }
+    /// <summary>
+    /// Loads an object from a file with the specified <paramref name="filename"/>.
+    /// </summary>
+    /// <remarks>The object must be saved as an <see cref="XmlDocument"/>. <br/>
+    /// Calls <see cref="Restore"/>.</remarks>
+    /// <param name="filename">The filename of the file where the data is saved.</param>
+    /// <returns>The loaded object.</returns>
+    public static IStorable Load(string filename) {
+      using(FileStream stream = File.OpenRead(filename)) {
+        IStorable storable = Load(stream);
+        stream.Close();
+        return storable;
+      }
+    }
+    /// <summary>
+    /// Loads an object from the specified <paramref name="stream"/>.
+    /// </summary>
+    /// <remarks>The object must be saved as an <see cref="XmlDocument"/>. <br/>
+    /// Calls <see cref="Restore"/>.</remarks>
+    /// <param name="stream">The stream from where to load the data.</param>
+    /// <returns>The loaded object.</returns>
+    public static IStorable Load(Stream stream) {
+      XmlDocument doc = new XmlDocument();
+      doc.Load(stream);
+      XmlNode rootNode = doc.ChildNodes[1];
+      if(rootNode.Name == "Root" && rootNode.ChildNodes.Count == 2) {
+        // load documents that have a list of necessary plugins at the top
+        return PersistenceManager.Restore(rootNode.ChildNodes[1], new Dictionary<Guid, IStorable>());
+      } else {
+        // compatibility to load documents without list of necessary plugins 
+        return PersistenceManager.Restore(rootNode, new Dictionary<Guid, IStorable>());
+      }
+    }
+
+    /// <summary>
+    /// Loads an object from a zip file.
+    /// </summary>
+    /// <param name="serializedStorable">The zip file from where to load as byte array.</param>
+    /// <returns>The loaded object.</returns>
+    public static IStorable RestoreFromGZip(byte[] serializedStorable) {
+      GZipStream stream = new GZipStream(new MemoryStream(serializedStorable), CompressionMode.Decompress);
+      return Load(stream);
+    }
+
+    /// <summary>
+    /// Saves the specified <paramref name="storable"/> in a zip file.
+    /// </summary>
+    /// <remarks>Calls <see cref="Save(HeuristicLab.Core.IStorable, Stream)"/>.</remarks>
+    /// <param name="storable">The object to save.</param>
+    /// <returns>The zip stream as byte array.</returns>
+    public static byte[] SaveToGZip(IStorable storable) {
+      MemoryStream memStream = new MemoryStream();
+      GZipStream stream = new GZipStream(memStream, CompressionMode.Compress, true);
+      Save(storable, stream);
+      stream.Close();
+      return memStream.ToArray();
+    }
+
+    /// <summary>
+    /// Builds a meaningful string for the given <paramref name="type"/> with the namespace information, 
+    /// all its arguments, the assembly name...
+    /// </summary>
+    /// <param name="type">The type for which a string should be created.</param>
+    /// <returns>A string value of this type containing different additional information.</returns>
+    public static string BuildTypeString(Type type) {
+      string assembly = type.Assembly.FullName;
+      assembly = assembly.Substring(0, assembly.IndexOf(", "));
+
+      StringBuilder builder = new StringBuilder();
+      builder.Append(type.Namespace);
+      builder.Append(".");
+      builder.Append(type.Name);
+      Type[] args = type.GetGenericArguments();
+      if(args.Length > 0) {
+        builder.Append("[[");
+        builder.Append(BuildTypeString(args[0]));
+        builder.Append("]");
+        for(int i = 1; i < args.Length; i++) {
+          builder.Append(",[");
+          builder.Append(BuildTypeString(args[i]));
+          builder.Append("]");
+        }
+        builder.Append("]");
+      }
+      builder.Append(", ");
+      builder.Append(assembly);
+      return builder.ToString();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Properties/AssemblyInfo.frame	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Properties/AssemblyInfo.frame	(revision 1662)
@@ -0,0 +1,60 @@
+#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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+using System.Security;
+
+// 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.Core")]
+[assembly: AssemblyDescription("HeuristicLab core classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: AllowPartiallyTrustedCallers]
+
+// 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("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyBuildDate("$WCNOW$")]
Index: trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.Designer.cs	(revision 1662)
@@ -0,0 +1,112 @@
+#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
+
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1433
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Core.Properties {
+    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", "2.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.Core.Properties.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 CombinedOperator {
+            get {
+                object obj = ResourceManager.GetObject("CombinedOperator", 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 Operator {
+            get {
+                object obj = ResourceManager.GetObject("Operator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+        
+        internal static System.Drawing.Bitmap ProgrammableOperator {
+            get {
+                object obj = ResourceManager.GetObject("ProgrammableOperator", resourceCulture);
+                return ((System.Drawing.Bitmap)(obj));
+            }
+        }
+    }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Properties/Resources.resx	(revision 1662)
@@ -0,0 +1,133 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CombinedOperator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\CombinedOperator.bmp;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="Operator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\Operator.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+  <data name="ProgrammableOperator" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\ProgrammableOperator.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/Scope.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Scope.cs	(revision 1662)
@@ -0,0 +1,435 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Hierarchical container of variables (and of subscopes).
+  /// </summary>
+  public class Scope : ItemBase, IScope {
+    private IScope parent;
+
+    private string myName; 
+    /// <summary>
+    /// Gets the name of the current scope.
+    /// </summary>
+    public string Name {
+      get { return myName; }
+    }
+
+    private IDictionary<string, IVariable> myVariables;
+    /// <inheritdoc/>
+    public ICollection<IVariable> Variables {
+      get { return myVariables.Values; }
+    }
+    private IDictionary<string, string> myAliases;
+    /// <inheritdoc/>
+    public IEnumerable<KeyValuePair<string, string>> Aliases {
+      get { return myAliases; }
+    }
+    private List<IScope> mySubScopes;
+    /// <summary>
+    /// Gets all subscopes of the current instance.
+    /// <note type="caution"> The subscopes are returned as read-only.</note>
+    /// </summary>
+    public IList<IScope> SubScopes {
+      get { return mySubScopes.AsReadOnly(); }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Scope"/> having "Anonymous" as default name.
+    /// </summary>
+    public Scope() {
+      myName = "Anonymous";
+      myVariables = new Dictionary<string, IVariable>();
+      myAliases = new Dictionary<string, string>();
+      mySubScopes = new List<IScope>();
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="Scope"/> with the given <paramref name="name"/>.
+    /// </summary>
+    /// <param name="name">The name of the scope.</param>
+    public Scope(string name)
+      : this() {
+      if (name != null) myName = name;
+    }
+
+    /// <inheritdoc/>
+    public void SetParent(IScope scope) {
+      parent = scope;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="ScopeView"/> to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="ScopeView"/>.</returns>
+    public override IView CreateView() {
+      return new ScopeView(this);
+    }
+
+    /// <inheritdoc/>
+    public IVariable GetVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable))
+        return variable;
+      else
+        return null;
+    }
+    /// <inheritdoc/>
+    public void AddVariable(IVariable variable) {
+      myVariables.Add(variable.Name, variable);
+      variable.NameChanging += new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+      variable.NameChanged += new EventHandler(Variable_NameChanged);
+      OnVariableAdded(variable);
+    }
+
+    /// <inheritdoc/>
+    public void RemoveVariable(string name) {
+      IVariable variable;
+      if (myVariables.TryGetValue(name, out variable)) {
+        variable.NameChanging -= new EventHandler<NameChangingEventArgs>(Variable_NameChanging);
+        variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        myVariables.Remove(name);
+        OnVariableRemoved(variable);
+      }
+    }
+    private void Variable_NameChanging(object sender, NameChangingEventArgs e) {
+      e.Cancel = myVariables.ContainsKey(e.Name);
+    }
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      IVariable variable = (IVariable)sender;
+      string oldName = null;
+      foreach (KeyValuePair<string, IVariable> element in myVariables) {
+        if (element.Value == variable)
+          oldName = element.Key;
+      }
+      myVariables.Remove(oldName);
+      myVariables.Add(variable.Name, variable);
+    }
+    /// <inheritdoc cref="IScope.GetVariableValue&lt;T&gt;(string, bool)"/>
+    public T GetVariableValue<T>(string name, bool recursiveLookup) where T : class, IItem {
+      return GetVariableValue<T>(name, recursiveLookup, true);
+    }
+    /// <inheritdoc cref="IScope.GetVariableValue&lt;T&gt;(string, bool, bool)"/>
+    public T GetVariableValue<T>(string name, bool recursiveLookup, bool throwOnError) where T : class, IItem {
+      return (T)GetVariableValue(name, recursiveLookup, throwOnError);
+    }
+    /// <inheritdoc cref="IScope.GetVariableValue(string, bool)"/>
+    public IItem GetVariableValue(string name, bool recursiveLookup) {
+      return GetVariableValue(name, recursiveLookup, true);
+    }
+    /// <inheritdoc cref="IScope.GetVariableValue(string, bool, bool)"/>
+    public IItem GetVariableValue(string name, bool recursiveLookup, bool throwOnError) {
+      IVariable variable;
+      name = TranslateName(name);
+      if (myVariables.TryGetValue(name, out variable)) {
+        return variable.Value;
+      } else {
+        if (recursiveLookup && (parent != null))
+          return parent.GetVariableValue(name, recursiveLookup, throwOnError);
+        else {
+          if (throwOnError)
+            throw new ArgumentException("Variable " + name + " not found");
+          else
+            return null;
+        }
+      }
+    }
+    /// <inheritdoc/>
+    public string TranslateName(string name) {
+      while (myAliases.ContainsKey(name))
+        name = myAliases[name];
+      if (parent != null)
+        name = parent.TranslateName(name);
+      return name;
+    }
+    /// <inheritdoc/>
+    public void AddAlias(string alias, string name) {
+      RemoveAlias(alias);
+      if (alias != name) {
+        myAliases.Add(alias, name);
+        OnAliasAdded(alias);
+      }
+    }
+    /// <inheritdoc/>
+    public void RemoveAlias(string alias) {
+      if (myAliases.ContainsKey(alias)) {
+        myAliases.Remove(alias);
+        OnAliasRemoved(alias);
+      }
+    }
+
+    /// <inheritdoc/>
+    public void AddSubScope(IScope scope) {
+      scope.SetParent(this);
+      mySubScopes.Add(scope);
+      OnSubScopeAdded(scope, mySubScopes.Count - 1);
+    }
+    /// <inheritdoc/>
+    public void RemoveSubScope(IScope scope) {
+      int index = mySubScopes.IndexOf(scope);
+      if (mySubScopes.Remove(scope)) {
+        scope.SetParent(null);
+        OnSubScopeRemoved(scope, index);
+      }
+    }
+    /// <inheritdoc/>
+    public void ReorderSubScopes(int[] sequence) {
+      IScope[] scopes = mySubScopes.ToArray();
+      mySubScopes.Clear();
+      for (int i = 0; i < scopes.Length; i++)
+        mySubScopes.Add(scopes[sequence[i]]);
+      OnSubScopesReordered();
+    }
+    /// <inheritdoc/>
+    public IScope GetScope(Guid guid) {
+      if (Guid == guid) return this;
+      else {
+        for (int i = 0; i < mySubScopes.Count; i++) {
+          IScope s = mySubScopes[i].GetScope(guid);
+          if (s != null) return s;
+        }
+      }
+      return null;
+    }
+    /// <inheritdoc/>
+    public IScope GetScope(string name) {
+      if (Name == name) return this;
+      else {
+        for (int i = 0; i < mySubScopes.Count; i++) {
+          IScope s = mySubScopes[i].GetScope(name);
+          if (s != null) return s;
+        }
+      }
+      return null;
+    }
+
+    /// <inheritdoc/>
+    public void Clear() {
+      string[] variableNames = new string[Variables.Count];
+      int i = 0;
+      foreach (IVariable variable in Variables) {
+        variableNames[i] = variable.Name;
+        i++;
+      }
+      for (int j = 0; j < variableNames.Length; j++)
+        RemoveVariable(variableNames[j]);
+
+      KeyValuePair<string, string>[] aliases = new KeyValuePair<string,string>[myAliases.Count];
+      myAliases.CopyTo(aliases, 0);
+      for (int j = 0; j < aliases.Length; j++)
+        RemoveAlias(aliases[j].Key);
+
+      while (SubScopes.Count > 0)
+        RemoveSubScope(SubScopes[0]);
+    }
+
+    /// <inheritdoc/>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Scope clone = (Scope)base.Clone(clonedObjects);
+      clone.myName = Name;
+
+      foreach (IVariable variable in myVariables.Values)
+        clone.AddVariable((IVariable)Auxiliary.Clone(variable, clonedObjects));
+      foreach (KeyValuePair<string, string> alias in myAliases)
+        clone.AddAlias(alias.Key, alias.Value);
+      for (int i = 0; i < SubScopes.Count; i++)
+        clone.AddSubScope((IScope)Auxiliary.Clone(SubScopes[i], clonedObjects));
+
+      return clone;
+    }
+
+    /// <inheritdoc />
+    public event EventHandler<VariableEventArgs> VariableAdded;
+    /// <summary>
+    /// Fires a new <c>VariableAdded</c> event.
+    /// </summary>
+    /// <param name="variable">The variable that has been added.</param>
+    protected virtual void OnVariableAdded(IVariable variable) {
+      if (VariableAdded != null)
+        VariableAdded(this, new VariableEventArgs(variable));
+    }
+    /// <inheritdoc />
+    public event EventHandler<VariableEventArgs> VariableRemoved;
+    /// <summary>
+    /// Fires a new <c>VariableRemoved</c>.
+    /// </summary>
+    /// <param name="variable">The variable that has been deleted.</param>
+    protected virtual void OnVariableRemoved(IVariable variable) {
+      if (VariableRemoved != null)
+        VariableRemoved(this, new VariableEventArgs(variable));
+    }
+    /// <inheritdoc /> 
+    public event EventHandler<AliasEventArgs> AliasAdded;
+    /// <summary>
+    /// Fires a new <c>AliasAdded</c> event.
+    /// </summary>
+    /// <param name="alias">The alias that has been added.</param>
+    protected virtual void OnAliasAdded(string alias) {
+      if (AliasAdded != null)
+        AliasAdded(this, new AliasEventArgs(alias));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<AliasEventArgs> AliasRemoved;
+    /// <summary>
+    /// Fires a new <c>AliasRemoved</c> event.
+    /// </summary>
+    /// <param name="alias">The alias that has been deleted.</param>
+    protected virtual void OnAliasRemoved(string alias) {
+      if (AliasRemoved != null)
+        AliasRemoved(this, new AliasEventArgs(alias));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<ScopeIndexEventArgs> SubScopeAdded;
+    /// <summary>
+    /// Fires a new <c>SubScopeAdded</c> event.
+    /// </summary>
+    /// <param name="scope">The sub scope that has been added.</param>
+    /// <param name="index">The index where the scope has been added.</param>
+    protected virtual void OnSubScopeAdded(IScope scope, int index) {
+      if (SubScopeAdded != null)
+        SubScopeAdded(this, new ScopeIndexEventArgs(scope, index));
+    }
+    /// <inheritdoc/>
+    public event EventHandler<ScopeIndexEventArgs> SubScopeRemoved;
+    /// <summary>
+    /// Fires a new <c>SubScopeRemoved</c> event.
+    /// </summary>
+    /// <param name="scope">The sub scope that has been deleted.</param>
+    /// <param name="index">The position of the sub scope.</param>
+    protected virtual void OnSubScopeRemoved(IScope scope, int index) {
+      if (SubScopeRemoved != null)
+        SubScopeRemoved(this, new ScopeIndexEventArgs(scope, index));
+    }
+    /// <inheritdoc />
+    public event EventHandler SubScopesReordered;
+    /// <summary>
+    /// Fires a new <c>SubScopesReordered</c> event
+    /// </summary>
+    protected virtual void OnSubScopesReordered() {
+      if (SubScopesReordered != null)
+        SubScopesReordered(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the given <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>
+    /// Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// A quick overview how the single elements of the current instance are saved:
+    /// <list type="bullet">
+    /// <item>
+    /// <term>Name: </term>
+    /// <description>Saved as an <see cref="XmlAttribute"/> having the tag name <c>Name</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Variables: </term>
+    /// <description>A child node is created with the tag name <c>Variables</c>. Beyond this child node,
+    /// all variables are saved as child nodes.</description>
+    /// </item>
+    /// <item>
+    /// <term>Aliases: </term>
+    /// <description>A child node is created with the tag name <c>Aliases</c>. Beyond this child node, 
+    /// all aliases are saved as child nodes with the tag name <c>Alias</c>. Each alias has an
+    /// <see cref="XmlAttribute"/> with the tag name "Alias", holding the alias, and an attribute 
+    /// with the tag name <c>Name</c>, holding the name of the alias.</description>
+    /// </item>
+    /// <item>
+    /// <term>Sub scopes: </term>
+    /// <description>A child node is created with the tag name <c>SubScopes</c>. Beyond this child node,
+    /// all sub scopes are saved as child nodes.</description>
+    /// </item>
+    /// </list>
+    /// </remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name.ToString();
+      node.Attributes.Append(nameAttribute);
+
+      XmlNode variables = document.CreateNode(XmlNodeType.Element, "Variables", null);
+      foreach (IVariable variable in Variables)
+        variables.AppendChild(PersistenceManager.Persist(variable, document, persistedObjects));
+      node.AppendChild(variables);
+
+      XmlNode aliases = document.CreateNode(XmlNodeType.Element, "Aliases", null);
+      foreach (KeyValuePair<string, string> alias in myAliases) {
+        XmlNode aliasNode = document.CreateNode(XmlNodeType.Element, "Alias", null);
+        XmlAttribute keyAttribute = document.CreateAttribute("Alias");
+        keyAttribute.Value = alias.Key;
+        aliasNode.Attributes.Append(keyAttribute);
+        XmlAttribute valueAttribute = document.CreateAttribute("Name");
+        valueAttribute.Value = alias.Value;
+        aliasNode.Attributes.Append(valueAttribute);
+        aliases.AppendChild(aliasNode);
+      }
+      node.AppendChild(aliases);
+
+      XmlNode subScopes = document.CreateNode(XmlNodeType.Element, "SubScopes", null);
+      for (int i = 0; i < SubScopes.Count; i++)
+        subScopes.AppendChild(PersistenceManager.Persist(SubScopes[i], document, persistedObjects));
+      node.AppendChild(subScopes);
+
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted scope from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get further information on how the current instance must
+    /// be saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the boolean value is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+
+      XmlNode variables = node.SelectSingleNode("Variables");
+      foreach (XmlNode variableNode in variables.ChildNodes) {
+        IVariable variable = (IVariable)PersistenceManager.Restore(variableNode, restoredObjects);
+        AddVariable(variable);
+      }
+
+      XmlNode aliases = node.SelectSingleNode("Aliases");
+      if (aliases != null) {
+        foreach (XmlNode aliasNode in aliases.ChildNodes)
+          AddAlias(aliasNode.Attributes["Alias"].Value, aliasNode.Attributes["Name"].Value);
+      }
+
+      XmlNode subScopes = node.SelectSingleNode("SubScopes");
+      for (int i = 0; i < subScopes.ChildNodes.Count; i++) {
+        IScope scope = (IScope)PersistenceManager.Restore(subScopes.ChildNodes[i], restoredObjects);
+        AddSubScope(scope);
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeEventArgs.cs	(revision 1662)
@@ -0,0 +1,48 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected scope.
+  /// </summary>
+  public class ScopeEventArgs : ItemEventArgs {
+    /// <summary>
+    /// Gets the affected scope.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class <see cref="ItemEventArgs"/>.
+    /// No own data storage present.</remarks>
+    public IScope Scope {
+      get { return (IScope)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ScopeEventArgs"/> with the specified scope.
+    /// </summary>
+    /// <param name="scope">The affected scope.</param>
+    public ScopeEventArgs(IScope scope)
+      : base(scope) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeIndexEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeIndexEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeIndexEventArgs.cs	(revision 1662)
@@ -0,0 +1,51 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected scope at the specified index.
+  /// </summary>
+  public class ScopeIndexEventArgs : ItemIndexEventArgs {
+    /// <summary>
+    /// Gets the affected scope.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class 
+    /// <see cref="ItemIndexEventArgs"/>. No own data storage present.</remarks>
+    public IScope Scope {
+      get { return (IScope)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ScopeIndexEventArgs"/> with the specified 
+    /// <paramref name="scope"/> and <paramref name="index"/>.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemIndexEventArgs"/>.</remarks>
+    /// <param name="scope">The affected scope.</param>
+    /// <param name="index">The affected index.</param>
+    public ScopeIndexEventArgs(IScope scope, int index)
+      : base(scope, index) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeView.Designer.cs	(revision 1662)
@@ -0,0 +1,146 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class ScopeView {
+    /// <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 (scopesTreeView.Nodes.Count > 0) {
+        RemoveTreeNode(scopesTreeView.Nodes[0]);
+        scopesTreeView.Nodes.Clear();
+      }
+      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.scopesTreeView = new System.Windows.Forms.TreeView();
+      this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.automaticUpdatingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+      this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.variablesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+      this.contextMenuStrip.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // scopesTreeView
+      // 
+      this.scopesTreeView.ContextMenuStrip = this.contextMenuStrip;
+      this.scopesTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.scopesTreeView.HideSelection = false;
+      this.scopesTreeView.Location = new System.Drawing.Point(0, 0);
+      this.scopesTreeView.Name = "scopesTreeView";
+      this.scopesTreeView.ShowNodeToolTips = true;
+      this.scopesTreeView.Size = new System.Drawing.Size(400, 400);
+      this.scopesTreeView.TabIndex = 0;
+      this.scopesTreeView.AfterCollapse += new System.Windows.Forms.TreeViewEventHandler(this.scopesTreeView_AfterCollapse);
+      this.scopesTreeView.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.scopesTreeView_BeforeExpand);
+      this.scopesTreeView.DoubleClick += new System.EventHandler(this.scopesTreeView_DoubleClick);
+      this.scopesTreeView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.scopesTreeView_MouseDown);
+      this.scopesTreeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.scopesTreeView_ItemDrag);
+      // 
+      // contextMenuStrip
+      // 
+      this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.automaticUpdatingToolStripMenuItem,
+            this.refreshToolStripMenuItem,
+            this.toolStripMenuItem1,
+            this.variablesToolStripMenuItem,
+            this.viewToolStripMenuItem});
+      this.contextMenuStrip.Name = "contextMenuStrip";
+      this.contextMenuStrip.Size = new System.Drawing.Size(180, 98);
+      this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
+      // 
+      // automaticUpdatingToolStripMenuItem
+      // 
+      this.automaticUpdatingToolStripMenuItem.CheckOnClick = true;
+      this.automaticUpdatingToolStripMenuItem.Name = "automaticUpdatingToolStripMenuItem";
+      this.automaticUpdatingToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.automaticUpdatingToolStripMenuItem.Text = "Automatic &Updating";
+      this.automaticUpdatingToolStripMenuItem.ToolTipText = "Automatically update scope editor during execution";
+      this.automaticUpdatingToolStripMenuItem.Click += new System.EventHandler(this.automaticUpdatingToolStripMenuItem_Click);
+      // 
+      // refreshToolStripMenuItem
+      // 
+      this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem";
+      this.refreshToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.refreshToolStripMenuItem.Text = "&Refresh";
+      this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click);
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(176, 6);
+      // 
+      // viewToolStripMenuItem
+      // 
+      this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
+      this.viewToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.viewToolStripMenuItem.Text = "&View";
+      // 
+      // variablesToolStripMenuItem
+      // 
+      this.variablesToolStripMenuItem.Name = "variablesToolStripMenuItem";
+      this.variablesToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
+      this.variablesToolStripMenuItem.Text = "&Variables...";
+      this.variablesToolStripMenuItem.Click += new System.EventHandler(this.variablesToolStripMenuItem_Click);
+      // 
+      // ScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.scopesTreeView);
+      this.Name = "ScopeView";
+      this.Size = new System.Drawing.Size(400, 400);
+      this.contextMenuStrip.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView scopesTreeView;
+    private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem automaticUpdatingToolStripMenuItem;
+    private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem;
+    private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+    private System.Windows.Forms.ToolStripMenuItem variablesToolStripMenuItem;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeView.cs	(revision 1662)
@@ -0,0 +1,280 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual represenation of <see cref="IScope"/>.
+  /// </summary>
+  public partial class ScopeView : ViewBase {
+    private Dictionary<IScope, TreeNode> scopeNodeTable;
+    private Dictionary<IScope, bool> scopeExpandedTable;
+
+    /// <summary>
+    /// Gets or sets the scope to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IScope Scope {
+      get { return (IScope)Item; }
+      set { base.Item = value; }
+    }
+    private bool myAutomaticUpdating;
+    /// <summary>
+    /// Gets information whether the scope is automatically updating. 
+    /// </summary>
+    public bool AutomaticUpdating {
+      get { return myAutomaticUpdating; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ScopeView"/> with caption "Scope" and 
+    /// property <see cref="AutomaticUpdating"/> set to <c>false</c>.
+    /// </summary>
+    public ScopeView() {
+      InitializeComponent();
+      Caption = "Scope";
+      scopeNodeTable = new Dictionary<IScope, TreeNode>();
+      scopeExpandedTable = new Dictionary<IScope, bool>();
+      myAutomaticUpdating = false;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="ScopeView"/> with the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ScopeView()"/>.</remarks>
+    /// <param name="scope">The scope to represent visually.</param>
+    public ScopeView(IScope scope)
+      : this() {
+      Scope = scope;
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      if (scopesTreeView.Nodes.Count > 0)
+        RemoveTreeNode(scopesTreeView.Nodes[0]);
+      scopesTreeView.SelectedNode = null;
+      scopesTreeView.Nodes.Clear();
+      if (Scope == null) {
+        Caption = "Scope";
+        scopesTreeView.Enabled = false;
+      } else {
+        Caption = Scope.Name + " (" + Scope.GetType().Name + ")";
+        scopesTreeView.Nodes.Add(CreateTreeNode(Scope));
+        scopesTreeView.Enabled = true;
+      }
+    }
+
+    private TreeNode CreateTreeNode(IScope scope) {
+      TreeNode node = new TreeNode();
+      node.Text = scope.Name;
+      node.Tag = scope;
+
+      scopeNodeTable.Add(scope, node);
+      scopeExpandedTable.Add(scope, false);
+      if (myAutomaticUpdating) {
+        scope.SubScopeAdded += new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeAdded);
+        scope.SubScopeRemoved += new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeRemoved);
+        scope.SubScopesReordered += new EventHandler(Scope_SubScopesReordered);
+      }
+      if (scope.SubScopes.Count > 0)
+        node.Nodes.Add(new TreeNode());
+      return node;
+    }
+    private void RemoveTreeNode(TreeNode node) {
+      foreach (TreeNode child in node.Nodes)
+        RemoveTreeNode(child);
+
+      IScope scope = node.Tag as IScope;
+      if ((scope != null) && (scopeNodeTable.ContainsKey(scope))) {
+        scopeNodeTable.Remove(scope);
+        scopeExpandedTable.Remove(scope);
+        scope.SubScopeAdded -= new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeAdded);
+        scope.SubScopeRemoved -= new EventHandler<ScopeIndexEventArgs>(Scope_SubScopeRemoved);
+        scope.SubScopesReordered -= new EventHandler(Scope_SubScopesReordered);
+      }
+    }
+
+    #region TreeView Events
+    private void scopesTreeView_DoubleClick(object sender, EventArgs e) {
+      // make sure that we can't get NullPointerExceptions
+      if(scopesTreeView.SelectedNode != null && scopesTreeView.SelectedNode.Tag != null) {
+        IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+        PluginManager.ControlManager.ShowControl(new VariablesScopeView(scope));
+      }
+    }
+    private void scopesTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      node.Nodes.Clear();
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        node.Nodes.Add(CreateTreeNode(scope.SubScopes[i]));
+      scopeExpandedTable[scope] = true;
+    }
+    private void scopesTreeView_AfterCollapse(object sender, System.Windows.Forms.TreeViewEventArgs e) {
+      TreeNode node = e.Node;
+      IScope scope = (IScope)node.Tag;
+
+      if (node.Nodes.Count > 0) {
+        for (int i = 0; i < node.Nodes.Count; i++)
+          RemoveTreeNode(node.Nodes[i]);
+        node.Nodes.Clear();
+        node.Nodes.Add(new TreeNode());
+      }
+      scopeExpandedTable[scope] = false;
+    }
+    private void scopesTreeView_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode node = (TreeNode)e.Item;
+      IScope scope = node.Tag as IScope;
+      if (scope != null) {
+        DataObject data = new DataObject();
+        data.SetData("IScope", scope);
+        data.SetData("DragSource", scopesTreeView);
+        DoDragDrop(data, DragDropEffects.Copy);
+      }
+    }
+    #endregion
+
+    #region Context Menu Events
+    private void contextMenuStrip_Opening(object sender, CancelEventArgs e) {
+      variablesToolStripMenuItem.Enabled = false;
+      viewToolStripMenuItem.DropDownItems.Clear();
+      viewToolStripMenuItem.Enabled = false;
+      if (scopesTreeView.SelectedNode != null) {
+        variablesToolStripMenuItem.Enabled = true;
+        IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+        foreach (IVariable variable in scope.Variables) {
+          if (variable.Value is IVisualizationItem) {
+            ToolStripMenuItem item = new ToolStripMenuItem();
+            item.Text = variable.Name + "...";
+            item.Tag = variable.Value;
+            item.Click += new EventHandler(showViewToolStripMenuItem_Click);
+            viewToolStripMenuItem.DropDownItems.Add(item);
+          }
+        }
+        if (viewToolStripMenuItem.DropDownItems.Count > 0)
+          viewToolStripMenuItem.Enabled = true;
+      }
+    }
+    private void automaticUpdatingToolStripMenuItem_Click(object sender, EventArgs e) {
+      ToolStripMenuItem item = (ToolStripMenuItem)sender;
+      myAutomaticUpdating = item.Checked;
+      if (myAutomaticUpdating)
+        Refresh();
+    }
+    private void refreshToolStripMenuItem_Click(object sender, EventArgs e) {
+      Refresh();
+    }
+    private void variablesToolStripMenuItem_Click(object sender, EventArgs e) {
+      IScope scope = (IScope)scopesTreeView.SelectedNode.Tag;
+      PluginManager.ControlManager.ShowControl(new VariablesScopeView(scope));
+    }
+    private void showViewToolStripMenuItem_Click(object sender, EventArgs e) {
+      IItem item = (IItem)((ToolStripMenuItem)sender).Tag;
+      PluginManager.ControlManager.ShowControl(item.CreateView());
+    }
+    #endregion
+
+    #region Scope Events
+    private delegate void ScopeDelegate(IScope scope);
+    private delegate void ScopeScopeIndexDelegate(IScope scope, IScope subScope, int index);
+    private void Scope_SubScopeAdded(object sender, ScopeIndexEventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope] || (scope.SubScopes.Count == 1))
+        AddSubScope(scope, e.Scope, e.Index);
+    }
+    private void AddSubScope(IScope scope, IScope subScope, int index) {
+      if (InvokeRequired) {
+        Invoke(new ScopeScopeIndexDelegate(AddSubScope), scope, subScope, index);
+      } else {
+        TreeNode parent = scopeNodeTable[scope];
+        TreeNode child;
+        if (parent.IsExpanded)
+          child = CreateTreeNode(subScope);
+        else
+          child = new TreeNode();
+        parent.Nodes.Insert(index, child);
+      }
+    }
+    private void Scope_SubScopeRemoved(object sender, ScopeIndexEventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope] || (scope.SubScopes.Count == 0))
+        RemoveSubScope(scope, e.Scope, e.Index);
+    }
+    private void RemoveSubScope(IScope scope, IScope subScope, int index) {
+      if (InvokeRequired) {
+        Invoke(new ScopeScopeIndexDelegate(RemoveSubScope), scope, subScope, index);
+      } else {
+        if (scopeNodeTable.ContainsKey(subScope)) {
+          TreeNode node = scopeNodeTable[subScope];
+          RemoveTreeNode(scopeNodeTable[subScope]);
+          node.Remove();
+        } else {
+          TreeNode node = scopeNodeTable[scope];
+          node.Nodes[0].Remove();
+        }
+      }
+    }
+    private void Scope_SubScopesReordered(object sender, EventArgs e) {
+      IScope scope = (IScope)sender;
+      TreeNode node = scopeNodeTable[scope];
+      if (scopeExpandedTable[scope])
+        ReorderSubScopes(scope);
+    }
+    private void ReorderSubScopes(IScope scope) {
+      if (InvokeRequired) {
+        Invoke(new ScopeDelegate(ReorderSubScopes), scope);
+      } else {
+        TreeNode node = scopeNodeTable[scope];
+        node.Nodes.Clear();
+        for (int i = 0; i < scope.SubScopes.Count; i++)
+          node.Nodes.Add(scopeNodeTable[scope.SubScopes[i]]);
+      }
+    }
+    #endregion
+
+    #region Mouse Events
+    private void scopesTreeView_MouseDown(object sender, MouseEventArgs e) {
+      if (e.Button != MouseButtons.Right)
+        return;
+      TreeNode clickedNode = scopesTreeView.GetNodeAt(e.X, e.Y);
+      if (clickedNode != null) {
+        scopesTreeView.SelectedNode = clickedNode;
+        scopesTreeView.Refresh();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ScopeView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ScopeView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ScopeView.resx	(revision 1662)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/StorableBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/StorableBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/StorableBase.cs	(revision 1662)
@@ -0,0 +1,97 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The base class for all storable objects.
+  /// </summary>
+  public abstract class StorableBase : IStorable {
+    private Guid myGuid;
+    /// <summary>
+    /// Gets the Guid of the item.
+    /// </summary>
+    public Guid Guid {
+      get { return myGuid; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the class <see cref="StorableBase"/> with a new <see cref="Guid"/>. 
+    /// </summary>
+    protected StorableBase() {
+      myGuid = Guid.NewGuid();
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Uses the <see cref="Auxiliary.Clone"/> method of the class <see cref="Auxiliary"/>.</remarks>
+    /// <returns>The clone.</returns>
+    public object Clone() {
+      return Auxiliary.Clone(this, new Dictionary<Guid, object>());
+    }
+    /// <summary>
+    /// Clones the current instance with the <see cref="M:Activator.CreateInstance"/> 
+    /// method of <see cref="Activator"/>.
+    /// </summary>
+    /// <param name="clonedObjects">All already cloned objects.</param>
+    /// <returns>The clone.</returns>
+    public virtual object Clone(IDictionary<Guid, object> clonedObjects) {
+      object clone = Activator.CreateInstance(this.GetType());
+      clonedObjects.Add(Guid, clone);
+      return clone;
+    }
+
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The type of the current instance is saved as <see cref="XmlAttribute"/> with tag name
+    /// <c>Type</c>, the guid is also saved as an attribute with the tag name <c>GUID</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public virtual XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = document.CreateNode(XmlNodeType.Element, name, null);
+      XmlAttribute typeAttribute = document.CreateAttribute("Type");
+      typeAttribute.Value = PersistenceManager.BuildTypeString(this.GetType());
+      node.Attributes.Append(typeAttribute);
+      XmlAttribute guidAttribute = document.CreateAttribute("GUID");
+      guidAttribute.Value = Guid.ToString();
+      node.Attributes.Append(guidAttribute);
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted object from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Loads only guid; type,... already loaded by the <see cref="PersistenceManager"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the object is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public virtual void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      myGuid = new Guid(node.Attributes["GUID"].Value);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/Variable.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/Variable.cs	(revision 1662)
@@ -0,0 +1,185 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents a variable of an operator having a name and a value.
+  /// </summary>
+  public class Variable : ItemBase, IVariable {
+    private string myName;
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnNameChanging"/> and also <see cref="OnNameChanged"/> 
+    /// eventually in the setter.</remarks>
+    public string Name {
+      get { return myName; }
+      set {
+        if (!myName.Equals(value)) {
+          NameChangingEventArgs e = new NameChangingEventArgs(value);
+          OnNameChanging(e);
+          if (!e.Cancel) {
+            myName = value;
+            OnNameChanged();
+          }
+        }
+      }
+    }
+    private IItem myValue;
+    /// <inheritdoc/>
+    /// <remarks>Calls <see cref="OnValueChanged"/> in the setter.</remarks>
+    public IItem Value {
+      get { return myValue; }
+      set {
+        if (myValue != value) {
+          myValue = value;
+          OnValueChanged();
+        }
+      }
+    }
+    
+    /// <summary>
+    /// Initializes a new instance of <see cref="Variable"/> with name <c>Anonymous</c> 
+    /// and value <c>null</c>.
+    /// </summary>
+    public Variable() {
+      myName = "Anonymous";
+      myValue = null;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="Variable"/> with the specified <paramref name="name"/>
+    /// and the specified <paramref name="value"/>.
+    /// </summary>
+    /// <param name="name">The name of the current instance.</param>
+    /// <param name="value">The value of the current instance.</param>
+    public Variable(string name, IItem value) {
+      myName = name;
+      myValue = value;
+    }
+
+    /// <inheritdoc cref="IVariable.GetValue&lt;T&gt;"/>
+    public T GetValue<T>() where T : class, IItem {
+      return (T)Value;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="VariableView"/> to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="VariableView"/>.</returns>
+    public override IView CreateView() {
+      return new VariableView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="Variable"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Variable clone = new Variable();
+      clonedObjects.Add(Guid, clone);
+      clone.myName = Name;
+      if (Value != null)
+        clone.myValue = (IItem)Auxiliary.Clone(Value, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Gets the string representation of the current instance in the format: <c>Name: [null|Value]</c>.
+    /// </summary>
+    /// <returns>The current instance as a string.</returns>
+    public override string ToString() {
+      return Name + ": " + ((Value == null) ? ("null") : (Value.ToString()));
+    }
+
+    /// <inheritdoc/>
+    public event EventHandler<NameChangingEventArgs> NameChanging;
+    /// <summary>
+    /// Fires a new <c>NameChanging</c> event.
+    /// </summary>
+    /// <param name="e">The event arguments of the changing.</param>
+    protected virtual void OnNameChanging(NameChangingEventArgs e) {
+      if (NameChanging != null)
+        NameChanging(this, e);
+    }
+    /// <inheritdoc/>
+    public event EventHandler NameChanged;
+    /// <summary>
+    /// Fires a new <c>NameChanged</c> event.
+    /// </summary>
+    /// <remarks>Calls <see cref="ItemBase.OnChanged"/>.</remarks>
+    protected virtual void OnNameChanged() {
+      if (NameChanged != null)
+        NameChanged(this, new EventArgs());
+      OnChanged();
+    }
+    /// <inheritdoc/>
+    public event EventHandler ValueChanged;
+    /// <summary>
+    /// Fires a new <c>ValueChanged</c> even.
+    /// </summary>
+    protected virtual void OnValueChanged() {
+      if (ValueChanged != null)
+        ValueChanged(this, new EventArgs());
+      OnChanged();
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>.<br/>
+    /// The name of the current instance is saved as an <see cref="XmlAttribute"/> with the 
+    /// tag name <c>Name</c>, the value is saved as child node with the tag name <c>Value</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute nameAttribute = document.CreateAttribute("Name");
+      nameAttribute.Value = Name;
+      node.Attributes.Append(nameAttribute);
+      if (Value != null)
+        node.AppendChild(PersistenceManager.Persist("Value", Value, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted variable from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> to get information on how the variable must be saved.<br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the variable is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myName = node.Attributes["Name"].Value;
+      XmlNode valueNode = node.SelectSingleNode("Value");
+      if (valueNode != null)
+        myValue = (IItem)PersistenceManager.Restore(valueNode, restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableEventArgs.cs	(revision 1662)
@@ -0,0 +1,50 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected variable.
+  /// </summary>
+  public class VariableEventArgs : ItemEventArgs {
+    /// <summary>
+    /// Gets the affected variable.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class <see cref="ItemEventArgs"/>.
+    /// No own data storage present.</remarks>
+    public IVariable Variable {
+      get { return (IVariable)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableEventArgs"/> with the specified 
+    /// <paramref name="variable"/>.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemEventArgs"/>.</remarks>
+    /// <param name="variable">The affected variable.</param>
+    public VariableEventArgs(IVariable variable)
+      : base(variable) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableInfo.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableInfo.cs	(revision 1662)
@@ -0,0 +1,248 @@
+#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.Text;
+using System.Xml;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Class for storing meta-information about variables/parameters of an operator.
+  /// </summary>
+  public class VariableInfo : ItemBase, IVariableInfo {
+    private string myActualName;
+    /// <summary>
+    /// Gets or sets the actual name of the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnActualNameChanged"/> in the setter.</remarks>
+    public string ActualName {
+      get { return myActualName; }
+      set {
+        if (myActualName != value) {
+          myActualName = value;
+          OnActualNameChanged();
+        }
+      }
+    }
+    private string myFormalName;
+    /// <summary>
+    /// Gets the formal name of the current instance.
+    /// </summary>
+    public string FormalName {
+      get { return myFormalName; }
+    }
+    private string myDescription;
+    /// <summary>
+    /// Gets the description of the current instance.
+    /// </summary>
+    public string Description {
+      get { return myDescription; }
+    }
+    private Type myDataType;
+    /// <summary>
+    /// Gets the data type of the parameter.
+    /// </summary>
+    public Type DataType {
+      get { return myDataType; }
+    }
+    private VariableKind myKind;
+    /// <summary>
+    /// Gets the kind of the parameter (input parameter, output parameter,...).
+    /// </summary>
+    public VariableKind Kind {
+      get { return myKind; }
+    }
+    private bool myLocal;
+    /// <summary>
+    /// Gets or sets a boolean value, whether the variable is a local one. 
+    /// </summary>
+    /// <remarks>Calls <see cref="OnLocalChanged"/> in the setter.</remarks>
+    public bool Local {
+      get { return myLocal; }
+      set {
+        if (myLocal != value) {
+          myLocal = value;
+          OnLocalChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInfo"/> with actual and formal name "Anonymous",
+    /// no description, a <c>null</c> data type and the <c>local</c> flag set to <c>false</c>. The type of 
+    /// the variable is an input parameter.
+    /// </summary>
+    public VariableInfo() {
+      myActualName = "Anonymous";
+      myFormalName = "Anonymous";
+      myDescription = "";
+      myDataType = null;
+      myKind = VariableKind.In;
+      myLocal = false;
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInfo"/> with the given parameters.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariableInfo()"/>.<br/>
+    /// The formal name is assigned to the actual name, too.</remarks>
+    /// <param name="formalName">The formal name of the current instance.</param>
+    /// <param name="description">The description of the current instance.</param>
+    /// <param name="dataType">The data type of the parameter.</param>
+    /// <param name="kind">The type of the parameter.</param>
+    public VariableInfo(string formalName, string description, Type dataType, VariableKind kind)
+      : this() {
+      myActualName = formalName;
+      myFormalName = formalName;
+      myDescription = description;
+      myDataType = dataType;
+      myKind = kind;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="VariableInfoView"/> to represent the current instance
+    /// visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="VariableInfoView"/>.</returns>
+    public override IView CreateView() {
+      return new VariableInfoView(this);
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="VariableInfo"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      VariableInfo clone = new VariableInfo();
+      clonedObjects.Add(Guid, clone);
+      clone.myActualName = ActualName;
+      clone.myFormalName = FormalName;
+      clone.myDescription = Description;
+      clone.myDataType = DataType;
+      clone.myKind = Kind;
+      clone.myLocal = Local;
+      return clone;
+    }
+
+    /// <inheritdoc/>
+    public event EventHandler ActualNameChanged;
+    /// <summary>
+    /// Fires a new <c>ActualNameChanged</c> event.
+    /// </summary>
+    protected virtual void OnActualNameChanged() {
+      if (ActualNameChanged != null)
+        ActualNameChanged(this, new EventArgs());
+    }
+    /// <inheritdoc />
+    public event EventHandler LocalChanged;
+    /// <summary>
+    /// Fires a new <c>LocalChanged</c> event.
+    /// </summary>
+    protected virtual void OnLocalChanged() {
+      if (LocalChanged != null)
+        LocalChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="StorableBase.GetXmlNode"/> of base class <see cref="ItemBase"/>. <br/>
+    /// A quick overview how the single elements of the current instance are saved:
+    /// <list type="bullet">
+    /// <item>
+    /// <term>Actual name: </term>
+    /// <description>Saved as <see cref="XmlAttribute"/> with tag name <c>ActualName</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Formal name: </term>
+    /// <description>Saves as <see cref="XmlAttribute"/> with tag name <c>FormalName</c>.</description>
+    /// </item> 
+    /// <item>
+    /// <term>Description: </term>
+    /// <description>Saved as <see cref="XmlAttribute"/> with tag name <c>Description</c>.</description>
+    /// </item>
+    /// <item><term>Data type: </term>
+    /// <description>Saved as <see cref="XmlAttribute"/> with tag name <c>DataType</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Kind: </term>
+    /// <description>Saved as <see cref="XmlAttribute"/> with tag name <c>Kind</c>.</description>
+    /// </item>
+    /// <item>
+    /// <term>Local: </term>
+    /// <description>Saved as <see cref="XmlAttribute"/> with tag name <c>Local</c>.</description>
+    /// </item>
+    /// </list></remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute actualNameAttribute = document.CreateAttribute("ActualName");
+      actualNameAttribute.Value = ActualName;
+      node.Attributes.Append(actualNameAttribute);
+
+      XmlAttribute formalNameAttribute = document.CreateAttribute("FormalName");
+      formalNameAttribute.Value = FormalName;
+      node.Attributes.Append(formalNameAttribute);
+
+      XmlAttribute descriptionAttribute = document.CreateAttribute("Description");
+      descriptionAttribute.Value = Description;
+      node.Attributes.Append(descriptionAttribute);
+
+      XmlAttribute dataTypeAttribute = document.CreateAttribute("DataType");
+      dataTypeAttribute.Value = PersistenceManager.BuildTypeString(DataType);
+      node.Attributes.Append(dataTypeAttribute);
+
+      XmlAttribute kindAttribute = document.CreateAttribute("Kind");
+      kindAttribute.Value = Kind.ToString();
+      node.Attributes.Append(kindAttribute);
+
+      XmlAttribute localAttribute = document.CreateAttribute("Local");
+      localAttribute.Value = Local.ToString();
+      node.Attributes.Append(localAttribute);
+
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted variable info from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>See <see cref="GetXmlNode"/> for further information on how the variable info must be 
+    /// saved. <br/>
+    /// Calls <see cref="StorableBase.Populate"/> of base class <see cref="ItemBase"/>.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the variable info is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid,IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myActualName = node.Attributes["ActualName"].Value;
+      myFormalName = node.Attributes["FormalName"].Value;
+      myDescription = node.Attributes["Description"].Value;
+      myDataType = Type.GetType(node.Attributes["DataType"].Value, true);
+      myKind = (VariableKind)Enum.Parse(typeof(VariableKind), node.Attributes["Kind"].Value);
+      myLocal = bool.Parse(node.Attributes["Local"].Value);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableInfoEventArgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableInfoEventArgs.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableInfoEventArgs.cs	(revision 1662)
@@ -0,0 +1,50 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Event arguments to be able to specify the affected variable info.
+  /// </summary>
+  public class VariableInfoEventArgs : ItemEventArgs {
+    /// <summary>
+    /// Gets the affected variable info.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ItemEventArgs.Item"/> of base class <see cref="ItemEventArgs"/>.
+    /// No own data storage present.</remarks>
+    public IVariableInfo VariableInfo {
+      get { return (IVariableInfo)Item; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInfoEventArgs"/> with the specified 
+    /// <paramref name="variableInfo"/>.
+    /// </summary>
+    /// <remarks>Calls constructor of base class <see cref="ItemEventArgs"/>.</remarks>
+    /// <param name="variableInfo">The affected variable info.</param>
+    public VariableInfoEventArgs(IVariableInfo variableInfo)
+      : base(variableInfo) {
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.Designer.cs	(revision 1662)
@@ -0,0 +1,217 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class VariableInfoView {
+    /// <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.actualNameLabel = new System.Windows.Forms.Label();
+      this.actualNameTextBox = new System.Windows.Forms.TextBox();
+      this.dataTypeLabel = new System.Windows.Forms.Label();
+      this.dataTypeTextBox = new System.Windows.Forms.TextBox();
+      this.descriptionLabel = new System.Windows.Forms.Label();
+      this.descriptionTextBox = new System.Windows.Forms.TextBox();
+      this.kindLabel = new System.Windows.Forms.Label();
+      this.kindTextBox = new System.Windows.Forms.TextBox();
+      this.formalNameTextBox = new System.Windows.Forms.TextBox();
+      this.formalNameLabel = new System.Windows.Forms.Label();
+      this.localLabel = new System.Windows.Forms.Label();
+      this.localCheckBox = new System.Windows.Forms.CheckBox();
+      this.SuspendLayout();
+      // 
+      // actualNameLabel
+      // 
+      this.actualNameLabel.AutoSize = true;
+      this.actualNameLabel.Location = new System.Drawing.Point(3, 3);
+      this.actualNameLabel.Name = "actualNameLabel";
+      this.actualNameLabel.Size = new System.Drawing.Size(71, 13);
+      this.actualNameLabel.TabIndex = 0;
+      this.actualNameLabel.Text = "&Actual Name:";
+      // 
+      // actualNameTextBox
+      // 
+      this.actualNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.actualNameTextBox.Location = new System.Drawing.Point(81, 0);
+      this.actualNameTextBox.Name = "actualNameTextBox";
+      this.actualNameTextBox.Size = new System.Drawing.Size(188, 20);
+      this.actualNameTextBox.TabIndex = 1;
+      this.actualNameTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // dataTypeLabel
+      // 
+      this.dataTypeLabel.AutoSize = true;
+      this.dataTypeLabel.Location = new System.Drawing.Point(3, 55);
+      this.dataTypeLabel.Name = "dataTypeLabel";
+      this.dataTypeLabel.Size = new System.Drawing.Size(34, 13);
+      this.dataTypeLabel.TabIndex = 4;
+      this.dataTypeLabel.Text = "&Type:";
+      // 
+      // dataTypeTextBox
+      // 
+      this.dataTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataTypeTextBox.Location = new System.Drawing.Point(81, 52);
+      this.dataTypeTextBox.Name = "dataTypeTextBox";
+      this.dataTypeTextBox.ReadOnly = true;
+      this.dataTypeTextBox.Size = new System.Drawing.Size(188, 20);
+      this.dataTypeTextBox.TabIndex = 5;
+      // 
+      // descriptionLabel
+      // 
+      this.descriptionLabel.AutoSize = true;
+      this.descriptionLabel.Location = new System.Drawing.Point(3, 127);
+      this.descriptionLabel.Name = "descriptionLabel";
+      this.descriptionLabel.Size = new System.Drawing.Size(63, 13);
+      this.descriptionLabel.TabIndex = 10;
+      this.descriptionLabel.Text = "&Description:";
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.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.descriptionTextBox.Location = new System.Drawing.Point(81, 124);
+      this.descriptionTextBox.Multiline = true;
+      this.descriptionTextBox.Name = "descriptionTextBox";
+      this.descriptionTextBox.ReadOnly = true;
+      this.descriptionTextBox.Size = new System.Drawing.Size(188, 85);
+      this.descriptionTextBox.TabIndex = 11;
+      this.descriptionTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // kindLabel
+      // 
+      this.kindLabel.AutoSize = true;
+      this.kindLabel.Location = new System.Drawing.Point(3, 81);
+      this.kindLabel.Name = "kindLabel";
+      this.kindLabel.Size = new System.Drawing.Size(31, 13);
+      this.kindLabel.TabIndex = 6;
+      this.kindLabel.Text = "&Kind:";
+      // 
+      // kindTextBox
+      // 
+      this.kindTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.kindTextBox.Location = new System.Drawing.Point(81, 78);
+      this.kindTextBox.Name = "kindTextBox";
+      this.kindTextBox.ReadOnly = true;
+      this.kindTextBox.Size = new System.Drawing.Size(188, 20);
+      this.kindTextBox.TabIndex = 7;
+      this.kindTextBox.Validated += new System.EventHandler(this.actualNameTextBox_Validated);
+      // 
+      // formalNameTextBox
+      // 
+      this.formalNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.formalNameTextBox.Location = new System.Drawing.Point(81, 26);
+      this.formalNameTextBox.Name = "formalNameTextBox";
+      this.formalNameTextBox.ReadOnly = true;
+      this.formalNameTextBox.Size = new System.Drawing.Size(188, 20);
+      this.formalNameTextBox.TabIndex = 3;
+      // 
+      // formalNameLabel
+      // 
+      this.formalNameLabel.AutoSize = true;
+      this.formalNameLabel.Location = new System.Drawing.Point(3, 29);
+      this.formalNameLabel.Name = "formalNameLabel";
+      this.formalNameLabel.Size = new System.Drawing.Size(72, 13);
+      this.formalNameLabel.TabIndex = 2;
+      this.formalNameLabel.Text = "&Formal Name:";
+      // 
+      // localLabel
+      // 
+      this.localLabel.AutoSize = true;
+      this.localLabel.Location = new System.Drawing.Point(3, 104);
+      this.localLabel.Name = "localLabel";
+      this.localLabel.Size = new System.Drawing.Size(36, 13);
+      this.localLabel.TabIndex = 8;
+      this.localLabel.Text = "&Local:";
+      // 
+      // localCheckBox
+      // 
+      this.localCheckBox.AutoSize = true;
+      this.localCheckBox.Location = new System.Drawing.Point(81, 104);
+      this.localCheckBox.Name = "localCheckBox";
+      this.localCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.localCheckBox.TabIndex = 9;
+      this.localCheckBox.UseVisualStyleBackColor = true;
+      this.localCheckBox.CheckedChanged += new System.EventHandler(this.localCheckBox_CheckedChanged);
+      // 
+      // VariableInfoEditor
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.localCheckBox);
+      this.Controls.Add(this.dataTypeTextBox);
+      this.Controls.Add(this.kindTextBox);
+      this.Controls.Add(this.descriptionTextBox);
+      this.Controls.Add(this.formalNameTextBox);
+      this.Controls.Add(this.actualNameTextBox);
+      this.Controls.Add(this.dataTypeLabel);
+      this.Controls.Add(this.kindLabel);
+      this.Controls.Add(this.formalNameLabel);
+      this.Controls.Add(this.localLabel);
+      this.Controls.Add(this.descriptionLabel);
+      this.Controls.Add(this.actualNameLabel);
+      this.Name = "VariableInfoEditor";
+      this.Size = new System.Drawing.Size(269, 209);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label actualNameLabel;
+    private System.Windows.Forms.TextBox actualNameTextBox;
+    private System.Windows.Forms.Label dataTypeLabel;
+    private System.Windows.Forms.TextBox dataTypeTextBox;
+    private System.Windows.Forms.Label descriptionLabel;
+    private System.Windows.Forms.TextBox descriptionTextBox;
+    private System.Windows.Forms.Label kindLabel;
+    private System.Windows.Forms.TextBox kindTextBox;
+    private System.Windows.Forms.TextBox formalNameTextBox;
+    private System.Windows.Forms.Label formalNameLabel;
+    private System.Windows.Forms.Label localLabel;
+    private System.Windows.Forms.CheckBox localCheckBox;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.cs	(revision 1662)
@@ -0,0 +1,127 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of <see cref="IVariableInfo"/>.
+  /// </summary>
+  public partial class VariableInfoView : ViewBase {
+    /// <summary>
+    /// Gets or sets the variable information to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IVariableInfo VariableInfo {
+      get { return (IVariableInfo)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInfoView"/> with caption "Variable Info".
+    /// </summary>
+    public VariableInfoView() {
+      InitializeComponent();
+      Caption = "Variable Info";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableInfoView"/> 
+    /// with the given <paramref name="variableInfo"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariableInfoView()"/>.</remarks>
+    /// <param name="variableInfo">The variable info to represent visually.</param>
+    public VariableInfoView(IVariableInfo variableInfo)
+      : this() {
+      VariableInfo = variableInfo;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IVariableInfo"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class 
+    /// <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      VariableInfo.ActualNameChanged -= new EventHandler(VariableInfo_ActualNameChanged);
+      VariableInfo.LocalChanged -= new EventHandler(VariableInfo_LocalChanged);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IVariableInfo"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      VariableInfo.ActualNameChanged += new EventHandler(VariableInfo_ActualNameChanged);
+      VariableInfo.LocalChanged += new EventHandler(VariableInfo_LocalChanged);
+    }
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Caption = "Variable Info";
+      if (VariableInfo == null) {
+        actualNameTextBox.Enabled = false;
+        formalNameTextBox.Enabled = false;
+        dataTypeTextBox.Enabled = false;
+        kindTextBox.Enabled = false;
+        localCheckBox.Enabled = false;
+        descriptionTextBox.Enabled = false;
+      } else {
+        Caption = VariableInfo.ActualName + " (" + VariableInfo.GetType().Name + ")";
+        actualNameTextBox.Text = VariableInfo.ActualName;
+        actualNameTextBox.Enabled = true;
+        formalNameTextBox.Text = VariableInfo.FormalName;
+        formalNameTextBox.Enabled = true;
+        dataTypeTextBox.Text = VariableInfo.DataType.FullName;
+        dataTypeTextBox.Enabled = true;
+        kindTextBox.Text = VariableInfo.Kind.ToString();
+        kindTextBox.Enabled = true;
+        localCheckBox.Checked = VariableInfo.Local;
+        localCheckBox.Enabled = true;
+        descriptionTextBox.Text = VariableInfo.Description;
+        descriptionTextBox.Enabled = true;
+      }
+    }
+
+    private void VariableInfo_ActualNameChanged(object sender, EventArgs e) {
+      actualNameTextBox.Text = VariableInfo.ActualName;
+    }
+    private void VariableInfo_LocalChanged(object sender, EventArgs e) {
+      localCheckBox.Checked = VariableInfo.Local;
+    }
+
+    private void actualNameTextBox_Validated(object sender, EventArgs e) {
+      VariableInfo.ActualName = actualNameTextBox.Text;
+    }
+    private void localCheckBox_CheckedChanged(object sender, EventArgs e) {
+      VariableInfo.Local = localCheckBox.Checked;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableInfoView.resx	(revision 1662)
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/VariableKind.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableKind.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableKind.cs	(revision 1662)
@@ -0,0 +1,53 @@
+#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.Text;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Represents the type of a variable (input, output,...).
+  /// </summary>
+  [FlagsAttribute]
+  public enum VariableKind {
+    /// <summary>
+    /// Flag for doing nothing with the variable.
+    /// </summary>
+    None = 0,
+    /// <summary>
+    /// Flag for creating a new variable.
+    /// </summary>
+    New = 1,
+    /// <summary>
+    /// Flag for changing value of a variable.
+    /// </summary>
+    Out = 2,
+    /// <summary>
+    /// Flag for reading value of a variable.
+    /// </summary>
+    In = 4,
+    /// <summary>
+    /// Flag for deleting a variable.
+    /// </summary>
+    Deleted = 8
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableView.Designer.cs	(revision 1662)
@@ -0,0 +1,143 @@
+#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
+
+namespace HeuristicLab.Core {
+  partial class VariableView {
+    /// <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 (chooseItemDialog != null) chooseItemDialog.Dispose();
+      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.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.valueLabel = new System.Windows.Forms.Label();
+      this.valueTextBox = new System.Windows.Forms.TextBox();
+      this.editorGroupBox = new System.Windows.Forms.GroupBox();
+      this.setVariableValueButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(3, 3);
+      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(50, 0);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(153, 20);
+      this.nameTextBox.TabIndex = 1;
+      this.nameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.nameTextBox_Validating);
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(3, 29);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(37, 13);
+      this.valueLabel.TabIndex = 2;
+      this.valueLabel.Text = "&Value:";
+      // 
+      // valueTextBox
+      // 
+      this.valueTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.valueTextBox.Location = new System.Drawing.Point(50, 26);
+      this.valueTextBox.Name = "valueTextBox";
+      this.valueTextBox.ReadOnly = true;
+      this.valueTextBox.Size = new System.Drawing.Size(99, 20);
+      this.valueTextBox.TabIndex = 3;
+      // 
+      // editorGroupBox
+      // 
+      this.editorGroupBox.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.editorGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.editorGroupBox.Name = "editorGroupBox";
+      this.editorGroupBox.Size = new System.Drawing.Size(203, 102);
+      this.editorGroupBox.TabIndex = 5;
+      this.editorGroupBox.TabStop = false;
+      this.editorGroupBox.Text = "&Editor:";
+      // 
+      // setVariableValueButton
+      // 
+      this.setVariableValueButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.setVariableValueButton.Location = new System.Drawing.Point(155, 26);
+      this.setVariableValueButton.Name = "setVariableValueButton";
+      this.setVariableValueButton.Size = new System.Drawing.Size(45, 20);
+      this.setVariableValueButton.TabIndex = 4;
+      this.setVariableValueButton.Text = "Set...";
+      this.setVariableValueButton.UseVisualStyleBackColor = true;
+      this.setVariableValueButton.Click += new System.EventHandler(this.setVariableValueButton_Click);
+      // 
+      // VariableView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.setVariableValueButton);
+      this.Controls.Add(this.editorGroupBox);
+      this.Controls.Add(this.valueTextBox);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.valueLabel);
+      this.Controls.Add(this.nameLabel);
+      this.Name = "VariableView";
+      this.Size = new System.Drawing.Size(203, 154);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.Label valueLabel;
+    private System.Windows.Forms.TextBox valueTextBox;
+    private System.Windows.Forms.GroupBox editorGroupBox;
+    private System.Windows.Forms.Button setVariableValueButton;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableView.cs	(revision 1662)
@@ -0,0 +1,142 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of an <see cref="IVariable"/>.
+  /// </summary>
+  public partial class VariableView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public IVariable Variable {
+      get { return (IVariable)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with caption "Variable".
+    /// </summary>
+    public VariableView() {
+      InitializeComponent();
+      Caption = "Variable";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariableView"/> with the given <paramref name="variable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariableView()"/>.</remarks>
+    /// <param name="variable">The variable to represent visually.</param>
+    public VariableView(IVariable variable)
+      : this() {
+      Variable = variable;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+      Variable.ValueChanged -= new EventHandler(Variable_ValueChanged);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IVariable"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Variable.NameChanged += new EventHandler(Variable_NameChanged);
+      Variable.ValueChanged += new EventHandler(Variable_ValueChanged);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      valueTextBox.Text = "-";
+      valueTextBox.Enabled = false;
+      editorGroupBox.Controls.Clear();
+      editorGroupBox.Enabled = false;
+      if (Variable == null) {
+        Caption = "Variable";
+        nameTextBox.Enabled = false;
+      } else {
+        Caption = Variable.Name + " (" + Variable.GetType().Name + ")";
+        nameTextBox.Text = Variable.Name;
+        nameTextBox.Enabled = true;
+        if (Variable.Value != null) {
+          valueTextBox.Text = Variable.Value.GetType().FullName;
+          valueTextBox.Enabled = true;
+          Control editor = (Control)Variable.Value.CreateView();
+          if (editor != null) {
+            editorGroupBox.Controls.Add(editor);
+            editor.Dock = DockStyle.Fill;
+            editorGroupBox.Enabled = true;
+          }
+        }
+      }
+    }
+
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      UpdateText();
+    }
+    private void UpdateText() {
+      if (InvokeRequired)
+        Invoke(new MethodInvoker(UpdateText));
+      else
+        nameTextBox.Text = Variable.Name;
+    }
+    private void Variable_ValueChanged(object sender, EventArgs e) {
+      Refresh();
+    }
+
+    private void nameTextBox_Validating(object sender, CancelEventArgs e) {
+      Variable.Name = nameTextBox.Text;
+
+      // check if variable name was set successfully
+      e.Cancel = Variable.Name != nameTextBox.Text;
+    }
+
+    private void setVariableValueButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Set Value";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK)
+        Variable.Value = chooseItemDialog.Item;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariableView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariableView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariableView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.Designer.cs	(revision 1662)
@@ -0,0 +1,175 @@
+#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.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  partial class VariablesScopeView {
+    /// <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 (chooseItemDialog != null) chooseItemDialog.Dispose();
+      foreach (ListViewItem item in variablesListView.Items) {
+        ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+      }
+      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.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.variablesGroupBox = new System.Windows.Forms.GroupBox();
+      this.variablesListView = new System.Windows.Forms.ListView();
+      this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
+      this.detailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.addButton = new System.Windows.Forms.Button();
+      this.removeButton = new System.Windows.Forms.Button();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.variablesGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.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.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.variablesGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.detailsGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(276, 155);
+      this.splitContainer1.SplitterDistance = 135;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // variablesGroupBox
+      // 
+      this.variablesGroupBox.Controls.Add(this.variablesListView);
+      this.variablesGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.variablesGroupBox.Name = "variablesGroupBox";
+      this.variablesGroupBox.Size = new System.Drawing.Size(135, 155);
+      this.variablesGroupBox.TabIndex = 0;
+      this.variablesGroupBox.TabStop = false;
+      this.variablesGroupBox.Text = "&Variables";
+      // 
+      // variablesListView
+      // 
+      this.variablesListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.columnHeader1});
+      this.variablesListView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variablesListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
+      this.variablesListView.HideSelection = false;
+      this.variablesListView.Location = new System.Drawing.Point(3, 16);
+      this.variablesListView.Name = "variablesListView";
+      this.variablesListView.Size = new System.Drawing.Size(129, 136);
+      this.variablesListView.Sorting = System.Windows.Forms.SortOrder.Ascending;
+      this.variablesListView.TabIndex = 0;
+      this.variablesListView.UseCompatibleStateImageBehavior = false;
+      this.variablesListView.View = System.Windows.Forms.View.Details;
+      this.variablesListView.SelectedIndexChanged += new System.EventHandler(this.variablesListView_SelectedIndexChanged);
+      this.variablesListView.SizeChanged += new System.EventHandler(this.variablesListView_SizeChanged);
+      this.variablesListView.KeyDown += new System.Windows.Forms.KeyEventHandler(this.variablesListView_KeyDown);
+      // 
+      // detailsGroupBox
+      // 
+      this.detailsGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.detailsGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.detailsGroupBox.Name = "detailsGroupBox";
+      this.detailsGroupBox.Size = new System.Drawing.Size(137, 155);
+      this.detailsGroupBox.TabIndex = 0;
+      this.detailsGroupBox.TabStop = false;
+      this.detailsGroupBox.Text = "&Details";
+      // 
+      // addButton
+      // 
+      this.addButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.addButton.Location = new System.Drawing.Point(0, 161);
+      this.addButton.Name = "addButton";
+      this.addButton.Size = new System.Drawing.Size(75, 23);
+      this.addButton.TabIndex = 1;
+      this.addButton.Text = "&Add...";
+      this.addButton.UseVisualStyleBackColor = true;
+      this.addButton.Click += new System.EventHandler(this.addButton_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.Location = new System.Drawing.Point(81, 161);
+      this.removeButton.Name = "removeButton";
+      this.removeButton.Size = new System.Drawing.Size(75, 23);
+      this.removeButton.TabIndex = 2;
+      this.removeButton.Text = "&Remove";
+      this.removeButton.UseVisualStyleBackColor = true;
+      this.removeButton.Click += new System.EventHandler(this.removeButton_Click);
+      // 
+      // VariablesScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.removeButton);
+      this.Controls.Add(this.addButton);
+      this.Controls.Add(this.splitContainer1);
+      this.Name = "VariablesScopeView";
+      this.Size = new System.Drawing.Size(276, 184);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.variablesGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.GroupBox variablesGroupBox;
+    private System.Windows.Forms.ListView variablesListView;
+    private System.Windows.Forms.ColumnHeader columnHeader1;
+    private System.Windows.Forms.GroupBox detailsGroupBox;
+    private System.Windows.Forms.Button addButton;
+    private System.Windows.Forms.Button removeButton;
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.cs	(revision 1662)
@@ -0,0 +1,226 @@
+#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.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// The visual representation of all variables in a specified scope.
+  /// </summary>
+  public partial class VariablesScopeView : ViewBase {
+    private ChooseItemDialog chooseItemDialog;
+
+    /// <summary>
+    /// Gets or sets the scope whose variables to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No won data storage present.</remarks>
+    public IScope Scope {
+      get { return (IScope)Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with caption "Variables Scope View".
+    /// </summary>
+    public VariablesScopeView() {
+      InitializeComponent();
+      Caption = "Variables Scope View";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="VariablesScopeView"/> with 
+    /// the given <paramref name="scope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="VariablesScopeView()"/>.</remarks>
+    /// <param name="scope">The scope whose variables should be represented visually.</param>
+    public VariablesScopeView(IScope scope)
+      : this() {
+      Scope = scope;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="IScope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      Scope.VariableAdded -= new EventHandler<VariableEventArgs>(Scope_VariableAdded);
+      Scope.VariableRemoved -= new EventHandler<VariableEventArgs>(Scope_VariableRemoved);
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IScope"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Scope.VariableAdded += new EventHandler<VariableEventArgs>(Scope_VariableAdded);
+      Scope.VariableRemoved += new EventHandler<VariableEventArgs>(Scope_VariableRemoved);
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (Scope == null) {
+        Caption = "Variables Scope View";
+        variablesListView.Enabled = false;
+      } else {
+        Caption = "Variables Scope View of " + Scope.Name + " (" + Scope.GetType().Name + ")";
+        variablesListView.Enabled = true;
+        foreach (ListViewItem item in variablesListView.Items) {
+          ((IVariable)item.Tag).NameChanged -= new EventHandler(Variable_NameChanged);
+        }
+        variablesListView.Items.Clear();
+        foreach (IVariable variable in Scope.Variables) {
+          ListViewItem item = new ListViewItem();
+          item.Text = variable.Name;
+          item.Tag = variable;
+          variablesListView.Items.Add(item);
+          variable.NameChanged += new EventHandler(Variable_NameChanged);
+        }
+      }
+    }
+
+    private void variablesListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (detailsGroupBox.Controls.Count > 0)
+        detailsGroupBox.Controls[0].Dispose();
+      detailsGroupBox.Controls.Clear();
+      detailsGroupBox.Enabled = false;
+      removeButton.Enabled = false;
+      if (variablesListView.SelectedItems.Count > 0) {
+        removeButton.Enabled = true;
+      }
+      if (variablesListView.SelectedItems.Count == 1) {
+        IVariable variable = (IVariable)variablesListView.SelectedItems[0].Tag;
+        Control control = (Control)new VariableView(variable);
+        detailsGroupBox.Controls.Add(control);
+        control.Dock = DockStyle.Fill;
+        detailsGroupBox.Enabled = true;
+      }
+    }
+
+    #region Size Changed Events
+    private void variablesListView_SizeChanged(object sender, EventArgs e) {
+      if (variablesListView.Columns.Count > 0)
+        variablesListView.Columns[0].Width = Math.Max(0, variablesListView.Width - 25);
+    }
+    #endregion
+
+    #region Key Events
+    private void variablesListView_KeyDown(object sender, KeyEventArgs e) {
+      if (e.KeyCode == Keys.Delete) {
+        if (variablesListView.SelectedItems.Count > 0) {
+          foreach (ListViewItem item in variablesListView.SelectedItems)
+            Scope.RemoveVariable(((IVariable)item.Tag).Name);
+        }
+      }
+    }
+    #endregion
+
+    #region Button Events
+    private void addButton_Click(object sender, EventArgs e) {
+      if (chooseItemDialog == null) {
+        chooseItemDialog = new ChooseItemDialog();
+        chooseItemDialog.Caption = "Add Variable";
+      }
+      if (chooseItemDialog.ShowDialog(this) == DialogResult.OK) {
+        IVariable newVariable = new Variable(chooseItemDialog.Item.GetType().Name, chooseItemDialog.Item);
+        int index = 1;
+        bool valid = true;
+        string name = null;
+        do {
+          valid = true;
+          name = newVariable.Name + " (" + index.ToString() + ")";
+          foreach (IVariable existingVariable in Scope.Variables) {
+            if (existingVariable.Name == name) {
+              valid = false;
+              index++;
+            }
+          }
+        } while (!valid);
+        newVariable.Name = name;
+        Scope.AddVariable(newVariable);
+      }
+    }
+    private void removeButton_Click(object sender, EventArgs e) {
+      if (variablesListView.SelectedItems.Count > 0) {
+        foreach (ListViewItem item in variablesListView.SelectedItems)
+          Scope.RemoveVariable(((IVariable)item.Tag).Name);
+      }
+    }
+    #endregion
+
+    #region Scope Events
+    private delegate void OnVariableEventDelegate(object sender, VariableEventArgs e);
+    private void Scope_VariableAdded(object sender, VariableEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnVariableEventDelegate(Scope_VariableAdded), sender, e);
+      else {
+        ListViewItem item = new ListViewItem();
+        item.Text = e.Variable.Name;
+        item.Tag = e.Variable;
+        variablesListView.Items.Add(item);
+        e.Variable.NameChanged += new EventHandler(Variable_NameChanged);
+      }
+    }
+    private void Scope_VariableRemoved(object sender, VariableEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnVariableEventDelegate(Scope_VariableRemoved), sender, e);
+      else {
+        ListViewItem itemToDelete = null;
+        foreach (ListViewItem item in variablesListView.Items) {
+          if (item.Tag == e.Variable)
+            itemToDelete = item;
+        }
+        e.Variable.NameChanged -= new EventHandler(Variable_NameChanged);
+        variablesListView.Items.Remove(itemToDelete);
+      }
+    }
+    #endregion
+
+    #region Variable Events
+    private delegate void OnEventDelegate(object sender, EventArgs e);
+    private void Variable_NameChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new OnEventDelegate(Variable_NameChanged), sender, e);
+      else {
+        IVariable variable = (IVariable)sender;
+        foreach (ListViewItem item in variablesListView.Items) {
+          if (item.Tag == variable)
+            item.Text = variable.Name;
+        }
+      }
+    }
+    #endregion
+  }
+}
+
Index: trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.resx
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.resx	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/VariablesScopeView.resx	(revision 1662)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Core/3.3/ViewBase.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ViewBase.Designer.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ViewBase.Designer.cs	(revision 1662)
@@ -0,0 +1,57 @@
+#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;
+
+namespace HeuristicLab.Core {
+  partial class ViewBase {
+    /// <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 (Item != null)
+        RemoveItemEvents();
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Core/3.3/ViewBase.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ViewBase.cs	(revision 1662)
+++ trunk/sources/HeuristicLab.Core/3.3/ViewBase.cs	(revision 1662)
@@ -0,0 +1,166 @@
+#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.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Xml;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core {
+  /// <summary>
+  /// Base class for all visual representations.
+  /// </summary>
+  public partial class ViewBase : UserControl, IView {
+    private IItem myItem;
+    /// <summary>
+    /// Gets or sets the item to represent visually.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnItemChanged"/>, <see cref="Refresh"/>, 
+    /// <see cref="RemoveItemEvents"/> (if the current item is not null) and 
+    /// <see cref="AddItemEvents"/> (if the new item is not null) in the setter.</remarks>
+    public IItem Item {
+      get { return myItem; }
+      protected set {
+        if (value != myItem) {
+          if (myItem != null)
+            RemoveItemEvents();
+          myItem = value;
+          if (myItem != null)
+            AddItemEvents();
+          OnItemChanged();
+          Refresh();
+        }
+      }
+    }
+    private string myCaption;
+    /// <summary>
+    /// Gets or sets the caption of the current instance.
+    /// </summary>
+    /// <remarks>Call <see cref="OnCaptionChanged"/> in the setter if a new item is set.</remarks>
+    public string Caption {
+      get { return myCaption; }
+      set {
+        if (value != myCaption) {
+          myCaption = value;
+          OnCaptionChanged();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ViewBase"/> with the caption "View".
+    /// </summary>
+    public ViewBase() {
+      InitializeComponent();
+      Caption = "View";
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the current instance.
+    /// </summary>
+    protected virtual void RemoveItemEvents() { }
+    /// <summary>
+    /// Adds eventhandlers to the current instance.
+    /// </summary>
+    protected virtual void AddItemEvents() { }
+
+    /// <summary>
+    /// Refreshes the current view.
+    /// </summary>
+    /// <remarks>Creates a new <see cref="MethodInvoker"/> if an invoke is required 
+    /// (see <see cref="Control.InvokeRequired"/>.<br/>
+    /// Otherwise calls <see cref="UpdateControls"/> and <see cref="Control.Refresh"/> of base class 
+    /// <see cref="System.Windows.Forms.UserControl"/>.</remarks>
+    public override void Refresh() {
+      if (InvokeRequired) {
+        Invoke(new MethodInvoker(Refresh));
+      } else {
+        UpdateControls();
+        base.Refresh();
+      }
+    }
+    /// <summary>
+    /// Updates the controls with the latest values of the model.
+    /// </summary>
+    protected virtual void UpdateControls() {
+      if (Item == null)
+        Caption = "View";
+      else
+        Caption = "View (" + Item.GetType().Name + ")";
+      
+    }
+
+    /// <summary>
+    /// Occurs when the current item was changed.
+    /// </summary>
+    public event EventHandler ItemChanged;
+    /// <summary>
+    /// Fires a new <c>ItemChanged</c> event.
+    /// </summary>
+    protected virtual void OnItemChanged() {
+      if (ItemChanged != null)
+        ItemChanged(this, new EventArgs());
+    }
+    /// <summary>
+    /// Occurs when the current caption was changed.
+    /// </summary>
+    public event EventHandler CaptionChanged;
+    /// <summary>
+    /// Fires a new <c>CaptionChanged</c> event.
+    /// </summary>
+    protected virtual void OnCaptionChanged() {
+      if (CaptionChanged != null)
+        CaptionChanged(this, new EventArgs());
+    }
+
+    /// <summary>
+    /// Asynchron call of GUI updating.
+    /// </summary>
+    /// <param name="method">The delegate to invoke.</param>
+    protected new void Invoke(Delegate method) {
+      // enforce context switch to improve GUI response time
+      System.Threading.Thread.Sleep(0);
+
+      // prevent blocking of worker thread in Invoke, if the control is disposed
+      IAsyncResult result = BeginInvoke(method);
+      while ((!result.AsyncWaitHandle.WaitOne(100, false)) && (!IsDisposed)) { }
+      if (!IsDisposed) EndInvoke(result);
+    }
+    /// <summary>
+    /// Asynchron call of GUI updating.
+    /// </summary>
+    /// <param name="method">The delegate to invoke.</param>
+    /// <param name="args">The invoke arguments.</param>
+    protected new void Invoke(Delegate method, params object[] args) {
+      // enforce context switch to improve GUI response time
+      System.Threading.Thread.Sleep(0);
+
+      // prevent blocking of worker thread in Invoke, if the control is disposed
+      IAsyncResult result = BeginInvoke(method, args);
+      while ((!result.AsyncWaitHandle.WaitOne(100, false)) && (!IsDisposed)) { }
+      if (!IsDisposed) EndInvoke(result);
+    }
+  }
+}
