Index: trunk/sources/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs
===================================================================
--- trunk/sources/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Core.Views/3.3/ParameterizedNamedItemView.cs	(revision 2851)
@@ -53,6 +53,8 @@
       if (Content == null) {
         parameterCollectionView.Content = null;
+        parameterCollectionView.Enabled = false;
       } else {
         parameterCollectionView.Content = Content.Parameters;
+        parameterCollectionView.Enabled = true;
       }
     }
Index: trunk/sources/HeuristicLab.Core/3.3/Engine.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Core/3.3/Engine.cs	(revision 2851)
@@ -116,4 +116,10 @@
     protected bool Canceled {
       get { return canceled; }
+      private set {
+        if (canceled != value) {
+          canceled = value;
+          OnCanceledChanged();
+        }
+      }
     }
     /// <summary>
@@ -154,5 +160,5 @@
 
     public void Prepare(IOperation initialOperation) {
-      canceled = false;
+      Canceled = false;
       running = false;
       globalScope.Clear();
@@ -177,5 +183,5 @@
     public void Start() {
       running = true;
-      canceled = false;
+      Canceled = false;
       ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
     }
@@ -185,11 +191,11 @@
     public void Step() {
       running = true;
-      canceled = false;
+      Canceled = false;
       ThreadPool.QueueUserWorkItem(new WaitCallback(RunStep), null);
     }
     /// <inheritdoc/>
     /// <remarks>Sets the protected flag <c>myCanceled</c> to <c>true</c>.</remarks>
-    public virtual void Stop() {
-      canceled = true;
+    public void Stop() {
+      Canceled = true;
     }
 
@@ -282,4 +288,5 @@
         Stopped(this, EventArgs.Empty);
     }
+    protected virtual void OnCanceledChanged() { }
     /// <summary>
     /// Occurs when an exception occured during the execution.
Index: trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Core/3.3/NamedItem.cs	(revision 2851)
@@ -31,5 +31,5 @@
   public abstract class NamedItem : Item, INamedItem {
     [Storable]
-    private string name;
+    protected string name;
     /// <inheritdoc/>
     /// <remarks>Calls <see cref="OnNameChanging"/> and also <see cref="OnNameChanged"/> 
@@ -54,5 +54,5 @@
     }
     [Storable]
-    private string description;
+    protected string description;
     public string Description {
       get { return description; }
Index: trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Core/3.3/ParameterizedNamedItem.cs	(revision 2851)
@@ -48,7 +48,8 @@
     }
 
-    protected ParameterizedNamedItem() {
-      Name = ItemName;
-      Description = ItemDescription;
+    protected ParameterizedNamedItem()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
       Parameters = new ParameterCollection();
       readOnlyParameters = null;
@@ -56,5 +57,5 @@
     protected ParameterizedNamedItem(string name)
       : base(name) {
-      Description = ItemDescription;
+      description = ItemDescription;
       Parameters = new ParameterCollection();
       readOnlyParameters = null;
@@ -62,5 +63,5 @@
     protected ParameterizedNamedItem(string name, ParameterCollection parameters)
       : base(name) {
-      Description = ItemDescription;
+      description = ItemDescription;
       Parameters = parameters;
       readOnlyParameters = null;
Index: trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Operators.Views/3.3/OperatorView.cs	(revision 2851)
@@ -77,4 +77,5 @@
       } else {
         breakpointCheckBox.Checked = Content.Breakpoint;
+        breakpointCheckBox.Enabled = true;
       }
     }
Index: trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs	(revision 2851)
@@ -31,7 +31,5 @@
   public sealed class CombinedOperator : AlgorithmOperator, IParameterizedItem {
     public new ParameterCollection Parameters {
-      get {
-        return base.Parameters;
-      }
+      get { return base.Parameters; }
     }
     IObservableKeyedCollection<string, IParameter> IParameterizedItem.Parameters {
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.Designer.cs	(revision 2851)
@@ -0,0 +1,293 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Optimization.Views {
+  partial class AlgorithmView {
+    /// <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) {
+        if (problemTypeSelectorDialog != null) problemTypeSelectorDialog.Dispose();
+        if (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.tabControl = new System.Windows.Forms.TabControl();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
+      this.problemTabPage = new System.Windows.Forms.TabPage();
+      this.saveProblemButton = new System.Windows.Forms.Button();
+      this.openProblemButton = new System.Windows.Forms.Button();
+      this.newProblemButton = new System.Windows.Forms.Button();
+      this.problemViewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.startButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.problemTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(418, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
+      // 
+      // 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.parametersTabPage);
+      this.tabControl.Controls.Add(this.problemTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 119);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(490, 204);
+      this.tabControl.TabIndex = 4;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(482, 178);
+      this.parametersTabPage.TabIndex = 0;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
+      this.parameterCollectionView.Content = null;
+      this.parameterCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.parameterCollectionView.Name = "parameterCollectionView";
+      this.parameterCollectionView.Size = new System.Drawing.Size(470, 166);
+      this.parameterCollectionView.TabIndex = 0;
+      // 
+      // problemTabPage
+      // 
+      this.problemTabPage.Controls.Add(this.saveProblemButton);
+      this.problemTabPage.Controls.Add(this.openProblemButton);
+      this.problemTabPage.Controls.Add(this.newProblemButton);
+      this.problemTabPage.Controls.Add(this.problemViewHost);
+      this.problemTabPage.Location = new System.Drawing.Point(4, 22);
+      this.problemTabPage.Name = "problemTabPage";
+      this.problemTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.problemTabPage.Size = new System.Drawing.Size(482, 178);
+      this.problemTabPage.TabIndex = 1;
+      this.problemTabPage.Text = "Problem";
+      this.problemTabPage.UseVisualStyleBackColor = true;
+      // 
+      // saveProblemButton
+      // 
+      this.saveProblemButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveProblemButton.Location = new System.Drawing.Point(66, 6);
+      this.saveProblemButton.Name = "saveProblemButton";
+      this.saveProblemButton.Size = new System.Drawing.Size(24, 24);
+      this.saveProblemButton.TabIndex = 2;
+      this.saveProblemButton.UseVisualStyleBackColor = true;
+      this.saveProblemButton.Click += new System.EventHandler(this.saveProblemButton_Click);
+      // 
+      // openProblemButton
+      // 
+      this.openProblemButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
+      this.openProblemButton.Location = new System.Drawing.Point(36, 6);
+      this.openProblemButton.Name = "openProblemButton";
+      this.openProblemButton.Size = new System.Drawing.Size(24, 24);
+      this.openProblemButton.TabIndex = 1;
+      this.openProblemButton.UseVisualStyleBackColor = true;
+      this.openProblemButton.Click += new System.EventHandler(this.openProblemButton_Click);
+      // 
+      // newProblemButton
+      // 
+      this.newProblemButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
+      this.newProblemButton.Location = new System.Drawing.Point(6, 6);
+      this.newProblemButton.Name = "newProblemButton";
+      this.newProblemButton.Size = new System.Drawing.Size(24, 24);
+      this.newProblemButton.TabIndex = 0;
+      this.newProblemButton.UseVisualStyleBackColor = true;
+      this.newProblemButton.Click += new System.EventHandler(this.newProblemButton_Click);
+      // 
+      // problemViewHost
+      // 
+      this.problemViewHost.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.problemViewHost.Content = null;
+      this.problemViewHost.Location = new System.Drawing.Point(6, 36);
+      this.problemViewHost.Name = "problemViewHost";
+      this.problemViewHost.Size = new System.Drawing.Size(470, 136);
+      this.problemViewHost.TabIndex = 3;
+      this.problemViewHost.ViewType = null;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Play;
+      this.startButton.Location = new System.Drawing.Point(0, 329);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 5;
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Stop;
+      this.stopButton.Location = new System.Drawing.Point(30, 329);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 6;
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Restart;
+      this.resetButton.Location = new System.Drawing.Point(60, 329);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(24, 24);
+      this.resetButton.TabIndex = 7;
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // 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(264, 336);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 8;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // 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(353, 333);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+      this.executionTimeTextBox.TabIndex = 9;
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.DefaultExt = "hl";
+      this.openFileDialog.FileName = "Problem";
+      this.openFileDialog.Filter = "HeuristicLab Files|*.hl|All Files|*.*";
+      this.openFileDialog.Title = "Open Problem";
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "hl";
+      this.saveFileDialog.FileName = "Problem";
+      this.saveFileDialog.Filter = "Uncompressed HeuristicLab Files|*.hl|HeuristicLab Files|*.hl|All Files|*.*";
+      this.saveFileDialog.FilterIndex = 2;
+      this.saveFileDialog.Title = "Save Problem";
+      // 
+      // AlgorithmView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.resetButton);
+      this.Name = "AlgorithmView";
+      this.Size = new System.Drawing.Size(490, 353);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.problemTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.TabPage parametersTabPage;
+    protected System.Windows.Forms.TabPage problemTabPage;
+    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
+    protected HeuristicLab.Core.Views.ViewHost problemViewHost;
+    protected System.Windows.Forms.Button newProblemButton;
+    protected System.Windows.Forms.Button saveProblemButton;
+    protected System.Windows.Forms.Button openProblemButton;
+    protected System.Windows.Forms.Button startButton;
+    protected System.Windows.Forms.Button stopButton;
+    protected System.Windows.Forms.Button resetButton;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.ToolTip toolTip;
+    protected System.Windows.Forms.OpenFileDialog openFileDialog;
+    protected System.Windows.Forms.SaveFileDialog saveFileDialog;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/AlgorithmView.cs	(revision 2851)
@@ -0,0 +1,225 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Optimization.Views { 
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(Algorithm), true)]
+  [Content(typeof(IAlgorithm), false)]
+  public partial class AlgorithmView : NamedItemView {
+    private TypeSelectorDialog problemTypeSelectorDialog;
+    private int executionTimeCounter;
+
+    public new IAlgorithm Content {
+      get { return (IAlgorithm)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public AlgorithmView() {
+      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 AlgorithmView(IAlgorithm content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared -= new EventHandler(Content_Prepared);
+      Content.ProblemChanged -= new EventHandler(Content_ProblemChanged);
+      Content.Started -= new EventHandler(Content_Started);
+      Content.Stopped -= new EventHandler(Content_Stopped);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred);
+      Content.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.Prepared += new EventHandler(Content_Prepared);
+      Content.ProblemChanged += new EventHandler(Content_ProblemChanged);
+      Content.Started += new EventHandler(Content_Started);
+      Content.Stopped += new EventHandler(Content_Stopped);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      stopButton.Enabled = false;
+      if (Content == null) {
+        parameterCollectionView.Content = null;
+        problemViewHost.Content = null;
+        tabControl.Enabled = false;
+        startButton.Enabled = resetButton.Enabled = false;
+        executionTimeTextBox.Text = "-";
+        executionTimeTextBox.Enabled = false;
+      } else {
+        parameterCollectionView.Content = Content.Parameters;
+        saveProblemButton.Enabled = Content.Problem != null;
+        problemViewHost.Content = Content.Problem;
+        tabControl.Enabled = true;
+        startButton.Enabled = !Content.Finished;
+        resetButton.Enabled = true;
+        UpdateExecutionTimeTextBox();
+        executionTimeTextBox.Enabled = true;
+      }
+    }
+
+    #region Content Events
+    protected virtual void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        parameterCollectionView.Enabled = true;
+        newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = true;
+        problemViewHost.Enabled = true;
+        startButton.Enabled = !Content.Finished;
+        stopButton.Enabled = false;
+        resetButton.Enabled = true;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    protected void Content_ProblemChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ProblemChanged), sender, e);
+      else {
+        problemViewHost.Content = Content.Problem;
+        saveProblemButton.Enabled = Content.Problem != null;
+      }
+    }
+    protected virtual void Content_Started(object sender, EventArgs e) {
+      executionTimeCounter = 0;
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Started), sender, e);
+      else {
+        parameterCollectionView.Enabled = false;
+        newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = false;
+        problemViewHost.Enabled = false;
+        startButton.Enabled = false;
+        stopButton.Enabled = true;
+        resetButton.Enabled = false;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    protected virtual void Content_Stopped(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Stopped), sender, e);
+      else {
+        parameterCollectionView.Enabled = true;
+        newProblemButton.Enabled = openProblemButton.Enabled = saveProblemButton.Enabled = true;
+        problemViewHost.Enabled = true;
+        startButton.Enabled = !Content.Finished;
+        stopButton.Enabled = false;
+        resetButton.Enabled = true;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    protected virtual void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      executionTimeCounter++;
+      if ((executionTimeCounter == 100) || !Content.Running) {
+        executionTimeCounter = 0;
+        UpdateExecutionTimeTextBox();
+      }
+    }
+    protected virtual void Content_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler<EventArgs<Exception>>(Content_ExceptionOccurred), sender, e);
+      else
+        Auxiliary.ShowErrorMessageBox(e.Value);
+    }
+    #endregion
+
+    #region Button events
+    protected void newProblemButton_Click(object sender, EventArgs e) {
+      if (problemTypeSelectorDialog == null) {
+        problemTypeSelectorDialog = new TypeSelectorDialog();
+        problemTypeSelectorDialog.Caption = "Select Problem";
+        problemTypeSelectorDialog.TypeSelector.Configure(typeof(IProblem), false, false);
+      }
+      if (problemTypeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.Problem = (IProblem)problemTypeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+      }
+    }
+    protected void openProblemButton_Click(object sender, EventArgs e) {
+      openFileDialog.Title = "Open Problem";
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        IProblem problem = null;
+        try {
+          problem = XmlParser.Deserialize(openFileDialog.FileName) as IProblem;
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+        if (problem == null)
+          MessageBox.Show(this, "Selected file does not contain a problem.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        else
+          Content.Problem = problem;
+      }
+    }
+    protected void saveProblemButton_Click(object sender, EventArgs e) {
+      saveFileDialog.Title = "Save Problem";
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (saveFileDialog.FilterIndex == 1)
+            XmlGenerator.Serialize(Content.Problem, saveFileDialog.FileName, 0);
+          else
+            XmlGenerator.Serialize(Content.Problem, saveFileDialog.FileName, 9);
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+    protected virtual void startButton_Click(object sender, EventArgs e) {
+      Content.Start();
+    }
+    protected virtual void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
+    }
+    protected virtual void resetButton_Click(object sender, EventArgs e) {
+      Content.Prepare();
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual void UpdateExecutionTimeTextBox() {
+      if (InvokeRequired)
+        Invoke(new Action(UpdateExecutionTimeTextBox));
+      else
+        executionTimeTextBox.Text = Content.ExecutionTime.ToString();
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.Designer.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.Designer.cs	(revision 2851)
@@ -0,0 +1,173 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Optimization.Views {
+  partial class EngineAlgorithmView {
+    /// <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) {
+        if (engineTypeSelectorDialog != null) engineTypeSelectorDialog.Dispose();
+        if (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.engineLabel = new System.Windows.Forms.Label();
+      this.engineTextBox = new System.Windows.Forms.TextBox();
+      this.setEngineButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.problemTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Location = new System.Drawing.Point(0, 149);
+      this.tabControl.Size = new System.Drawing.Size(490, 174);
+      this.tabControl.TabIndex = 7;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Size = new System.Drawing.Size(482, 148);
+      // 
+      // problemTabPage
+      // 
+      this.problemTabPage.Size = new System.Drawing.Size(482, 148);
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Size = new System.Drawing.Size(470, 136);
+      // 
+      // problemViewHost
+      // 
+      this.problemViewHost.Size = new System.Drawing.Size(470, 106);
+      // 
+      // startButton
+      // 
+      this.startButton.TabIndex = 8;
+      // 
+      // stopButton
+      // 
+      this.stopButton.TabIndex = 9;
+      // 
+      // resetButton
+      // 
+      this.resetButton.TabIndex = 10;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.TabIndex = 11;
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.TabIndex = 12;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // engineLabel
+      // 
+      this.engineLabel.AutoSize = true;
+      this.engineLabel.Location = new System.Drawing.Point(3, 124);
+      this.engineLabel.Name = "engineLabel";
+      this.engineLabel.Size = new System.Drawing.Size(43, 13);
+      this.engineLabel.TabIndex = 4;
+      this.engineLabel.Text = "&Engine:";
+      // 
+      // engineTextBox
+      // 
+      this.engineTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.engineTextBox.Location = new System.Drawing.Point(72, 121);
+      this.engineTextBox.Name = "engineTextBox";
+      this.engineTextBox.ReadOnly = true;
+      this.engineTextBox.Size = new System.Drawing.Size(388, 20);
+      this.engineTextBox.TabIndex = 6;
+      this.engineTextBox.DoubleClick += new System.EventHandler(this.engineTextBox_DoubleClick);
+      // 
+      // setEngineButton
+      // 
+      this.setEngineButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.setEngineButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Add;
+      this.setEngineButton.Location = new System.Drawing.Point(466, 119);
+      this.setEngineButton.Name = "setEngineButton";
+      this.setEngineButton.Size = new System.Drawing.Size(24, 24);
+      this.setEngineButton.TabIndex = 5;
+      this.setEngineButton.UseVisualStyleBackColor = true;
+      this.setEngineButton.Click += new System.EventHandler(this.setEngineButton_Click);
+      // 
+      // EngineAlgorithmView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.setEngineButton);
+      this.Controls.Add(this.engineTextBox);
+      this.Controls.Add(this.engineLabel);
+      this.Name = "EngineAlgorithmView";
+      this.Controls.SetChildIndex(this.engineLabel, 0);
+      this.Controls.SetChildIndex(this.engineTextBox, 0);
+      this.Controls.SetChildIndex(this.setEngineButton, 0);
+      this.Controls.SetChildIndex(this.resetButton, 0);
+      this.Controls.SetChildIndex(this.executionTimeLabel, 0);
+      this.Controls.SetChildIndex(this.executionTimeTextBox, 0);
+      this.Controls.SetChildIndex(this.stopButton, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.problemTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Label engineLabel;
+    protected System.Windows.Forms.TextBox engineTextBox;
+    protected System.Windows.Forms.Button setEngineButton;
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/EngineAlgorithmView.cs	(revision 2851)
@@ -0,0 +1,101 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views { 
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(EngineAlgorithm), true)]
+  public partial class EngineAlgorithmView : AlgorithmView {
+    private TypeSelectorDialog engineTypeSelectorDialog;
+
+    public new EngineAlgorithm Content {
+      get { return (EngineAlgorithm)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public EngineAlgorithmView() {
+      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 EngineAlgorithmView(EngineAlgorithm content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.EngineChanged -= new System.EventHandler(Content_EngineChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.EngineChanged += new System.EventHandler(Content_EngineChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        engineTextBox.Text = "-";
+        engineTextBox.Enabled = false;
+        setEngineButton.Enabled = false;
+      } else {
+        engineTextBox.Text = Content.Engine == null ? "-" : Content.Engine.ToString();
+        engineTextBox.Enabled = true;
+        setEngineButton.Enabled = true;
+      }
+    }
+
+    protected void Content_EngineChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_EngineChanged), sender, e);
+      else
+        engineTextBox.Text = Content.Engine == null ? "-" : Content.Engine.ToString();
+    }
+
+    protected void setEngineButton_Click(object sender, System.EventArgs e) {
+      if (engineTypeSelectorDialog == null) {
+        engineTypeSelectorDialog = new TypeSelectorDialog();
+        engineTypeSelectorDialog.Caption = "Select Engine";
+        engineTypeSelectorDialog.TypeSelector.Configure(typeof(IEngine), false, false);
+      }
+      if (engineTypeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.Engine = (IEngine)engineTypeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+      }
+    }
+
+    protected void engineTextBox_DoubleClick(object sender, System.EventArgs e) {
+      if (Content.Engine != null)
+        MainFormManager.CreateDefaultView(Content.Engine).Show();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 2851)
@@ -52,4 +52,22 @@
   <ItemGroup>
     <None Include="HeuristicLabOptimizationViewsPlugin.cs.frame" />
+    <Compile Include="AlgorithmView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="AlgorithmView.Designer.cs">
+      <DependentUpon>AlgorithmView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="UserDefinedAlgorithmView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="UserDefinedAlgorithmView.Designer.cs">
+      <DependentUpon>UserDefinedAlgorithmView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EngineAlgorithmView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EngineAlgorithmView.Designer.cs">
+      <DependentUpon>EngineAlgorithmView.cs</DependentUpon>
+    </Compile>
     <Compile Include="HeuristicLabOptimizationViewsPlugin.cs" />
     <Compile Include="ProblemView.cs">
@@ -69,4 +87,12 @@
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
       <Name>HeuristicLab.Collections-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.2\HeuristicLab.Common.Resources-3.2.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.2\HeuristicLab.Common-3.2.csproj">
+      <Project>{1FC004FC-59AF-4249-B1B6-FF25873A20E4}</Project>
+      <Name>HeuristicLab.Common-3.2</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
@@ -89,4 +115,8 @@
       <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLabOptimizationViewsPlugin.cs.frame	(revision 2851)
@@ -29,4 +29,6 @@
   [PluginFile("HeuristicLab.Optimization.Views-3.3.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.2")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.2")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
@@ -34,4 +36,5 @@
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.2")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
   public class HeuristicLabOptimizationViewsPlugin : PluginBase {
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.Designer.cs	(revision 2851)
@@ -45,5 +45,4 @@
     /// </summary>
     private void InitializeComponent() {
-      this.parameterCollectionView = new HeuristicLab.Core.Views.ParameterCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -61,28 +60,10 @@
       this.descriptionTextBox.Size = new System.Drawing.Size(418, 87);
       // 
-      // parameterCollectionView
-      // 
-      this.parameterCollectionView.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.parameterCollectionView.Caption = "ParameterCollection";
-      this.parameterCollectionView.Content = null;
-      this.parameterCollectionView.Location = new System.Drawing.Point(0, 119);
-      this.parameterCollectionView.Name = "parameterCollectionView";
-      this.parameterCollectionView.Size = new System.Drawing.Size(490, 234);
-      this.parameterCollectionView.TabIndex = 4;
-      // 
       // ProblemView
       // 
       this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.parameterCollectionView);
       this.Name = "ProblemView";
       this.Size = new System.Drawing.Size(490, 353);
-      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.descriptionLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
@@ -93,5 +74,4 @@
     #endregion
 
-    protected HeuristicLab.Core.Views.ParameterCollectionView parameterCollectionView;
 
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ProblemView.cs	(revision 2851)
@@ -29,5 +29,5 @@
   [Content(typeof(Problem), true)]
   [Content(typeof(IProblem), false)]
-  public partial class ProblemView : NamedItemView {
+  public partial class ProblemView : ParameterizedNamedItemView {
     public new IProblem Content {
       get { return (IProblem)base.Content; }
@@ -52,8 +52,4 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      if (Content == null)
-        parameterCollectionView.Content = null;
-      else
-        parameterCollectionView.Content = ((IProblem)Content).Parameters;
     }
   }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.Designer.cs	(revision 2851)
@@ -0,0 +1,180 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Optimization.Views {
+  partial class UserDefinedAlgorithmView {
+    /// <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) {
+        if (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.operatorGraphTabPage = new System.Windows.Forms.TabPage();
+      this.globalScopeTabPage = new System.Windows.Forms.TabPage();
+      this.globalScopeView = new HeuristicLab.Core.Views.ScopeView();
+      this.operatorGraphViewHost = new HeuristicLab.Core.Views.ViewHost();
+      this.newOperatorGraphButton = new System.Windows.Forms.Button();
+      this.openOperatorGraphButton = new System.Windows.Forms.Button();
+      this.saveOperatorGraphButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.problemTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.operatorGraphTabPage.SuspendLayout();
+      this.globalScopeTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.operatorGraphTabPage);
+      this.tabControl.Controls.Add(this.globalScopeTabPage);
+      this.tabControl.Controls.SetChildIndex(this.globalScopeTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.operatorGraphTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.problemTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.parametersTabPage, 0);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // operatorGraphTabPage
+      // 
+      this.operatorGraphTabPage.Controls.Add(this.saveOperatorGraphButton);
+      this.operatorGraphTabPage.Controls.Add(this.openOperatorGraphButton);
+      this.operatorGraphTabPage.Controls.Add(this.newOperatorGraphButton);
+      this.operatorGraphTabPage.Controls.Add(this.operatorGraphViewHost);
+      this.operatorGraphTabPage.Location = new System.Drawing.Point(4, 22);
+      this.operatorGraphTabPage.Name = "operatorGraphTabPage";
+      this.operatorGraphTabPage.Size = new System.Drawing.Size(482, 148);
+      this.operatorGraphTabPage.TabIndex = 2;
+      this.operatorGraphTabPage.Text = "Operator Graph";
+      this.operatorGraphTabPage.UseVisualStyleBackColor = true;
+      // 
+      // globalScopeTabPage
+      // 
+      this.globalScopeTabPage.Controls.Add(this.globalScopeView);
+      this.globalScopeTabPage.Location = new System.Drawing.Point(4, 22);
+      this.globalScopeTabPage.Name = "globalScopeTabPage";
+      this.globalScopeTabPage.Size = new System.Drawing.Size(482, 148);
+      this.globalScopeTabPage.TabIndex = 3;
+      this.globalScopeTabPage.Text = "Global Scope";
+      this.globalScopeTabPage.UseVisualStyleBackColor = true;
+      // 
+      // globalScopeView
+      // 
+      this.globalScopeView.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.globalScopeView.Caption = "Scope";
+      this.globalScopeView.Content = null;
+      this.globalScopeView.Location = new System.Drawing.Point(3, 3);
+      this.globalScopeView.Name = "globalScopeView";
+      this.globalScopeView.Size = new System.Drawing.Size(476, 142);
+      this.globalScopeView.TabIndex = 0;
+      // 
+      // operatorGraphViewHost
+      // 
+      this.operatorGraphViewHost.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.operatorGraphViewHost.Content = null;
+      this.operatorGraphViewHost.Location = new System.Drawing.Point(3, 33);
+      this.operatorGraphViewHost.Name = "operatorGraphViewHost";
+      this.operatorGraphViewHost.Size = new System.Drawing.Size(476, 112);
+      this.operatorGraphViewHost.TabIndex = 0;
+      this.operatorGraphViewHost.ViewType = null;
+      // 
+      // newOperatorGraphButton
+      // 
+      this.newOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.NewDocument;
+      this.newOperatorGraphButton.Location = new System.Drawing.Point(3, 3);
+      this.newOperatorGraphButton.Name = "newOperatorGraphButton";
+      this.newOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.newOperatorGraphButton.TabIndex = 1;
+      this.newOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.newOperatorGraphButton.Click += new System.EventHandler(this.newOperatorGraphButton_Click);
+      // 
+      // openOperatorGraphButton
+      // 
+      this.openOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Open;
+      this.openOperatorGraphButton.Location = new System.Drawing.Point(33, 3);
+      this.openOperatorGraphButton.Name = "openOperatorGraphButton";
+      this.openOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.openOperatorGraphButton.TabIndex = 1;
+      this.openOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.openOperatorGraphButton.Click += new System.EventHandler(this.openOperatorGraphButton_Click);
+      // 
+      // saveOperatorGraphButton
+      // 
+      this.saveOperatorGraphButton.Image = HeuristicLab.Common.Resources.VS2008ImageLibrary.Save;
+      this.saveOperatorGraphButton.Location = new System.Drawing.Point(63, 3);
+      this.saveOperatorGraphButton.Name = "saveOperatorGraphButton";
+      this.saveOperatorGraphButton.Size = new System.Drawing.Size(24, 24);
+      this.saveOperatorGraphButton.TabIndex = 1;
+      this.saveOperatorGraphButton.UseVisualStyleBackColor = true;
+      this.saveOperatorGraphButton.Click += new System.EventHandler(this.saveOperatorGraphButton_Click);
+      // 
+      // UserDefinedAlgorithmView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "UserDefinedAlgorithmView";
+      this.tabControl.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.problemTabPage.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.operatorGraphTabPage.ResumeLayout(false);
+      this.globalScopeTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TabPage operatorGraphTabPage;
+    private System.Windows.Forms.TabPage globalScopeTabPage;
+    private HeuristicLab.Core.Views.ScopeView globalScopeView;
+    private System.Windows.Forms.Button saveOperatorGraphButton;
+    private System.Windows.Forms.Button openOperatorGraphButton;
+    private System.Windows.Forms.Button newOperatorGraphButton;
+    private HeuristicLab.Core.Views.ViewHost operatorGraphViewHost;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/UserDefinedAlgorithmView.cs	(revision 2851)
@@ -0,0 +1,116 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Optimization.Views { 
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [Content(typeof(UserDefinedAlgorithm), true)]
+  public sealed partial class UserDefinedAlgorithmView : EngineAlgorithmView {
+    public new UserDefinedAlgorithm Content {
+      get { return (UserDefinedAlgorithm)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public UserDefinedAlgorithmView() {
+      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 UserDefinedAlgorithmView(UserDefinedAlgorithm content)
+      : this() {
+      Content = content;
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OperatorGraphChanged -= new EventHandler(Content_OperatorGraphChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.OperatorGraphChanged += new EventHandler(Content_OperatorGraphChanged);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        operatorGraphViewHost.Content = null;
+        globalScopeView.Content = null;
+      } else {
+        operatorGraphViewHost.Content = Content.OperatorGraph;
+        globalScopeView.Content = Content.GlobalScope;
+      }
+    }
+
+    private void Content_OperatorGraphChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_OperatorGraphChanged), sender, e);
+      else
+        operatorGraphViewHost.Content = Content.OperatorGraph;
+    }
+
+    private void newOperatorGraphButton_Click(object sender, EventArgs e) {
+      Content.OperatorGraph = new OperatorGraph();
+    }
+    private void openOperatorGraphButton_Click(object sender, EventArgs e) {
+      openFileDialog.Title = "Open Operator Graph";
+      if (openFileDialog.ShowDialog(this) == DialogResult.OK) {
+        OperatorGraph operatorGraph = null;
+        try {
+          operatorGraph = XmlParser.Deserialize(openFileDialog.FileName) as OperatorGraph;
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+        if (operatorGraph == null)
+          MessageBox.Show(this, "Selected file does not contain an operator graph.", "Invalid File", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        else
+          Content.OperatorGraph = operatorGraph;
+      }
+    }
+    private void saveOperatorGraphButton_Click(object sender, EventArgs e) {
+      saveFileDialog.Title = "Save Operator Graph";
+      if (saveFileDialog.ShowDialog(this) == DialogResult.OK) {
+        try {
+          if (saveFileDialog.FilterIndex == 1)
+            XmlGenerator.Serialize(Content.OperatorGraph, saveFileDialog.FileName, 0);
+          else
+            XmlGenerator.Serialize(Content.OperatorGraph, saveFileDialog.FileName, 9);
+        }
+        catch (Exception ex) {
+          Auxiliary.ShowErrorMessageBox(ex);
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Algorithm.cs	(revision 2851)
@@ -0,0 +1,142 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// A base class for algorithms.
+  /// </summary>
+  [Item("Algorithm", "A base class for algorithms.")]
+  public abstract class Algorithm : ParameterizedNamedItem, IAlgorithm {
+    public override Image ItemImage {
+      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event; }
+    }
+
+    private IProblem problem;
+    [Storable]
+    public IProblem Problem {
+      get { return problem; }
+      set {
+        if (problem != value) {
+          if (problem != null) problem.Changed -= new ChangedEventHandler(Problem_Changed);
+          problem = value;
+          if (problem != null) problem.Changed += new ChangedEventHandler(Problem_Changed);
+          OnProblemChanged();
+        }
+      }
+    }
+
+    public abstract TimeSpan ExecutionTime { get; }
+
+    private bool running;
+    public bool Running {
+      get { return running; }
+    }
+
+    public abstract bool Finished { get; }
+
+    private bool canceled;
+    protected bool Canceled {
+      get { return canceled; }
+      private set {
+        if (canceled != value) {
+          canceled = value;
+          OnCanceledChanged();
+        }
+      }
+    }
+
+    protected Algorithm() : base() { }
+    protected Algorithm(string name) : base(name) { }
+    protected Algorithm(string name, ParameterCollection parameters) : base(name, parameters) { }
+    protected Algorithm(string name, string description) : base(name, description) { }
+    protected Algorithm(string name, string description, ParameterCollection parameters) : base(name, description, parameters) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      Algorithm clone = (Algorithm)base.Clone(cloner);
+      clone.Problem = (IProblem)cloner.Clone(problem);
+      clone.running = running;
+      clone.Canceled = canceled;
+      return clone;
+    }
+
+    public void Prepare() {
+      running = false;
+      Canceled = false;
+      OnPrepared();
+    }
+    public void Start() {
+      running = true;
+      Canceled = false;
+      OnStarted();
+    }
+    public void Stop() {
+      Canceled = true;
+    }
+
+    #region Events
+    public event EventHandler ProblemChanged;
+    protected virtual void OnProblemChanged() {
+      if (ProblemChanged != null)
+        ProblemChanged(this, EventArgs.Empty);
+      OnChanged();
+    }
+    public event EventHandler ExecutionTimeChanged;
+    protected virtual void OnExecutionTimeChanged() {
+      if (ExecutionTimeChanged != null)
+        ExecutionTimeChanged(this, EventArgs.Empty);
+      OnChanged();
+    }
+    public event EventHandler Prepared;
+    protected virtual void OnPrepared() {
+      if (Prepared != null)
+        Prepared(this, EventArgs.Empty);
+      OnChanged();
+    }
+    public event EventHandler Started;
+    protected virtual void OnStarted() {
+      if (Started != null)
+        Started(this, EventArgs.Empty);
+      OnChanged();
+    }
+    public event EventHandler Stopped;
+    protected virtual void OnStopped() {
+      if (Stopped != null)
+        Stopped(this, EventArgs.Empty);
+      OnChanged();
+    }
+    protected virtual void OnCanceledChanged() { }
+    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
+    protected virtual void OnExceptionOccurred(Exception exception) {
+      if (ExceptionOccurred != null)
+        ExceptionOccurred(this, new EventArgs<Exception>(exception));
+    }
+    private void Problem_Changed(object sender, ChangedEventArgs e) {
+      OnChanged(e);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization/3.3/EngineAlgorithm.cs	(revision 2851)
@@ -0,0 +1,184 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// A base class for algorithms which use an engine for execution.
+  /// </summary>
+  [Item("EngineAlgorithm", "A base class for algorithms which use an engine for execution.")]
+  public abstract class EngineAlgorithm : Algorithm {
+    private OperatorGraph operatorGraph;
+    [Storable]
+    protected OperatorGraph OperatorGraph {
+      get { return operatorGraph; }
+      set {
+        if (value == null) throw new ArgumentNullException();
+        if (value != operatorGraph) {
+          if (operatorGraph != null) operatorGraph.InitialOperatorChanged -= new EventHandler(OperatorGraph_InitialOperatorChanged);
+          operatorGraph = value;
+          if (operatorGraph != null) operatorGraph.InitialOperatorChanged += new EventHandler(OperatorGraph_InitialOperatorChanged);
+          OnOperatorGraphChanged();
+          Prepare();
+        }
+      }
+    }
+
+    [Storable]
+    private IScope globalScope;
+    protected IScope GlobalScope {
+      get { return globalScope; }
+    }
+
+    private IEngine engine;
+    [Storable]
+    public IEngine Engine {
+      get { return engine; }
+      set {
+        if (engine != value) {
+          if (engine != null) DeregisterEngineEvents();
+          engine = value;
+          if (engine != null) RegisterEngineEvents();
+          OnEngineChanged();
+          Prepare();
+        }
+      }
+    }
+
+    public override TimeSpan ExecutionTime {
+      get {
+        if (engine == null) return TimeSpan.Zero;
+        else return engine.ExecutionTime;
+      }
+    }
+
+    public override bool Finished {
+      get {
+        if (engine == null) return true;
+        else return engine.Finished;
+      }
+    }
+
+    protected EngineAlgorithm()
+      : base() {
+      globalScope = new Scope();
+      OperatorGraph = new OperatorGraph();
+    }
+    protected EngineAlgorithm(string name)
+      : base(name) {
+      globalScope = new Scope();
+      OperatorGraph = new OperatorGraph();
+    }
+    protected EngineAlgorithm(string name, ParameterCollection parameters)
+      : base(name, parameters) {
+      globalScope = new Scope();
+      OperatorGraph = new OperatorGraph();
+    }
+    protected EngineAlgorithm(string name, string description)
+      : base(name, description) {
+      globalScope = new Scope();
+      OperatorGraph = new OperatorGraph();
+    }
+    protected EngineAlgorithm(string name, string description, ParameterCollection parameters)
+      : base(name, description, parameters) {
+      globalScope = new Scope();
+      OperatorGraph = new OperatorGraph();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      EngineAlgorithm clone = (EngineAlgorithm)base.Clone(cloner);
+      clone.globalScope = (IScope)cloner.Clone(globalScope);
+      clone.Engine = (IEngine)cloner.Clone(engine);
+      clone.OperatorGraph = (OperatorGraph)cloner.Clone(operatorGraph);
+      return clone;
+    }
+
+    protected override void OnCanceledChanged() {
+      if (Canceled && (engine != null))
+        engine.Stop();
+    }
+    protected override void OnPrepared() {
+      globalScope.Clear();
+      if (engine != null) {
+        ExecutionContext context = null;
+        if (operatorGraph.InitialOperator != null) {
+          if (Problem != null) {
+            context = new ExecutionContext(context, Problem, globalScope);
+            foreach (IParameter param in Problem.Parameters)
+              param.ExecutionContext = context;
+          }
+          context = new ExecutionContext(context, this, globalScope);
+          foreach (IParameter param in this.Parameters)
+            param.ExecutionContext = context;
+          context = new ExecutionContext(context, operatorGraph.InitialOperator, globalScope);
+        }
+        engine.Prepare(context);
+      }
+      base.OnPrepared();
+    }
+    protected override void OnStarted() {
+      if (engine != null) engine.Start();
+      base.OnStarted();
+    }
+
+    protected virtual void OnOperatorGraphChanged() { }
+
+    public event EventHandler EngineChanged;
+    protected virtual void OnEngineChanged() {
+      if (EngineChanged != null)
+        EngineChanged(this, EventArgs.Empty);
+      OnChanged();
+    }
+
+    private void OperatorGraph_InitialOperatorChanged(object sender, EventArgs e) {
+      Prepare();
+    }
+    private void RegisterEngineEvents() {
+      Engine.Changed += new ChangedEventHandler(Engine_Changed);
+      Engine.ExceptionOccurred += new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged += new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Stopped += new EventHandler(Engine_Stopped);
+    }
+    private void DeregisterEngineEvents() {
+      Engine.Changed -= new ChangedEventHandler(Engine_Changed);
+      Engine.ExceptionOccurred -= new EventHandler<EventArgs<Exception>>(Engine_ExceptionOccurred);
+      Engine.ExecutionTimeChanged -= new EventHandler(Engine_ExecutionTimeChanged);
+      Engine.Stopped -= new EventHandler(Engine_Stopped);
+    }
+
+    private void Engine_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      OnExceptionOccurred(e.Value);
+    }
+    private void Engine_ExecutionTimeChanged(object sender, EventArgs e) {
+      OnExecutionTimeChanged();
+    }
+    private void Engine_Stopped(object sender, EventArgs e) {
+      OnStopped();
+    }
+    private void Engine_Changed(object sender, ChangedEventArgs e) {
+      OnChanged(e);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 2851)
@@ -51,4 +51,7 @@
   <ItemGroup>
     <None Include="HeuristicLabOptimizationPlugin.cs.frame" />
+    <Compile Include="Algorithm.cs" />
+    <Compile Include="UserDefinedAlgorithm.cs" />
+    <Compile Include="EngineAlgorithm.cs" />
     <Compile Include="IAlgorithm.cs" />
     <Compile Include="HeuristicLabOptimizationPlugin.cs" />
Index: trunk/sources/HeuristicLab.Optimization/3.3/IAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/IAlgorithm.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization/3.3/IAlgorithm.cs	(revision 2851)
@@ -38,4 +38,5 @@
     void Stop();
 
+    event EventHandler ProblemChanged;
     event EventHandler ExecutionTimeChanged;
     event EventHandler Prepared;
@@ -43,5 +44,4 @@
     event EventHandler Stopped;
     event EventHandler<EventArgs<Exception>> ExceptionOccurred;
-
   }
 }
Index: trunk/sources/HeuristicLab.Optimization/3.3/Problem.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Problem.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Problem.cs	(revision 2851)
@@ -22,10 +22,12 @@
 using System.Drawing;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.Optimization {
   /// <summary>
-  /// The base class for all problems.
+  /// A base class for problems.
   /// </summary>
-  [Item("Problem", "Base class for problems.")]
+  [Item("Problem", "A base class for problems.")]
+  [EmptyStorableClass]
   public abstract class Problem : ParameterizedNamedItem, IProblem {
     public override Image ItemImage {
Index: trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 2851)
+++ trunk/sources/HeuristicLab.Optimization/3.3/UserDefinedAlgorithm.cs	(revision 2851)
@@ -0,0 +1,59 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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 HeuristicLab.Collections;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An algorithm which can be defined by the user.
+  /// </summary>
+  [Item("UserDefinedAlgorithm", "An algorithm which can be defined by the user.")]
+  [Creatable("Algorithms")]
+  [EmptyStorableClass]
+  public sealed class UserDefinedAlgorithm : EngineAlgorithm, IParameterizedItem {
+    public new ParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+    IObservableKeyedCollection<string, IParameter> IParameterizedItem.Parameters {
+      get { return Parameters; }
+    }
+
+    public new OperatorGraph OperatorGraph {
+      get { return base.OperatorGraph; }
+      set { base.OperatorGraph = value; }
+    }
+
+    public new IScope GlobalScope {
+      get { return base.GlobalScope; }
+    }
+
+    public UserDefinedAlgorithm() : base() { }
+
+    public event EventHandler OperatorGraphChanged;
+    protected override void OnOperatorGraphChanged() {
+      if (OperatorGraphChanged != null)
+        OperatorGraphChanged(this, EventArgs.Empty);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj	(revision 2850)
+++ trunk/sources/HeuristicLab.SGA/3.3/HeuristicLab.SGA-3.3.csproj	(revision 2851)
@@ -83,4 +83,5 @@
   <ItemGroup>
     <None Include="HeuristicLabSGAPlugin.cs.frame" />
+    <Compile Include="SGA.cs" />
     <Compile Include="SGAOperator.cs" />
     <Compile Include="HeuristicLabSGAPlugin.cs" />
@@ -108,4 +109,8 @@
       <Name>HeuristicLab.Operators-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
       <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
@@ -119,4 +124,8 @@
       <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
       <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj">
Index: trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame	(revision 2850)
+++ trunk/sources/HeuristicLab.SGA/3.3/HeuristicLabSGAPlugin.cs.frame	(revision 2851)
@@ -33,6 +33,8 @@
   [PluginDependency("HeuristicLab.Evolutionary", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
   [PluginDependency("HeuristicLab.Selection", "3.3")]
   public class HeuristicLabSGAPlugin : PluginBase {
Index: trunk/sources/HeuristicLab.SGA/3.3/SGA.cs
===================================================================
--- trunk/sources/HeuristicLab.SGA/3.3/SGA.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.SGA/3.3/SGA.cs	(revision 2851)
@@ -1,5 +1,5 @@
 #region License Information
 /* HeuristicLab
- * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
  *
  * This file is part of HeuristicLab.
@@ -21,574 +21,67 @@
 
 using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Xml;
 using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Collections;
+using HeuristicLab.Parameters;
 using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Evolutionary;
-using HeuristicLab.SequentialEngine;
-using HeuristicLab.Operators;
-using HeuristicLab.Random;
-using HeuristicLab.Logging;
-using HeuristicLab.Selection;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
 namespace HeuristicLab.SGA {
   /// <summary>
-  /// Class for the heuristic optimization technique "simple genetic algorithm".
+  /// A standard genetic algorithm.
   /// </summary>
-  public class SGA : ItemBase {
-    #region Create Operators
-    /// <summary>
-    /// Creates operators for the current instance.
-    /// </summary>
-    /// <param name="engine">The engine where to add the operators.</param>
-    public static void Create(IEngine engine) {
-      engine.OperatorGraph.Clear();
-
-      CombinedOperator co = CreateSGA();
-      co.Name = "SGA";
-      engine.OperatorGraph.AddOperator(co);
-      engine.OperatorGraph.InitialOperator = co;
-
-      engine.Reset();
-    }
-    private static CombinedOperator CreateSGA() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp);
-      op.OperatorGraph.InitialOperator = sp;
-
-      CombinedOperator co1 = CreateVariableInjection();
-      co1.Name = "Variable Injection";
-      op.OperatorGraph.AddOperator(co1);
-      sp.AddSubOperator(co1);
-
-      // place holder for ProblemInjector
-      EmptyOperator eo1 = new EmptyOperator();
-      eo1.Name = "ProblemInjector";
-      op.OperatorGraph.AddOperator(eo1);
-      co1.AddSubOperator(eo1);
-
-      CombinedOperator co2 = CreatePopulationInitialization();
-      co2.Name = "Population Initialization";
-      op.OperatorGraph.AddOperator(co2);
-      sp.AddSubOperator(co2);
-
-      // place holder for SolutionGenerator
-      EmptyOperator eo2 = new EmptyOperator();
-      eo2.Name = "SolutionGenerator";
-      op.OperatorGraph.AddOperator(eo2);
-      co2.AddSubOperator(eo2);
-
-      // place holder for Evaluator
-      EmptyOperator eo3 = new EmptyOperator();
-      eo3.Name = "Evaluator";
-      op.OperatorGraph.AddOperator(eo3);
-      co2.AddSubOperator(eo3);
-
-      CombinedOperator co3 = CreateSGAMain();
-      co3.Name = "SGA Main";
-      op.OperatorGraph.AddOperator(co3);
-      sp.AddSubOperator(co3);
-
-      // place holder for Selector
-      EmptyOperator eo4 = new EmptyOperator();
-      eo4.Name = "Selector";
-      op.OperatorGraph.AddOperator(eo4);
-      co3.AddSubOperator(eo4);
-
-      // place holder for Crossover
-      EmptyOperator eo5 = new EmptyOperator();
-      eo5.Name = "Crossover";
-      op.OperatorGraph.AddOperator(eo5);
-      co3.AddSubOperator(eo5);
-
-      // place holder for Mutator
-      EmptyOperator eo6 = new EmptyOperator();
-      eo6.Name = "Mutator";
-      op.OperatorGraph.AddOperator(eo6);
-      co3.AddSubOperator(eo6);
-
-      // place holder for Evaluator
-      co3.AddSubOperator(eo3);
-
-      return op;
-    }
-    private static CombinedOperator CreateVariableInjection() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp);
-      op.OperatorGraph.InitialOperator = sp;
-
-      RandomInjector ri = new RandomInjector();
-      op.OperatorGraph.AddOperator(ri);
-      sp.AddSubOperator(ri);
-
-      OperatorExtractor oe = new OperatorExtractor();
-      oe.Name = "ProblemInjector";
-      oe.GetVariableInfo("Operator").ActualName = "ProblemInjector";
-      op.OperatorGraph.AddOperator(oe);
-      sp.AddSubOperator(oe);
-
-      VariableInjector vi = new VariableInjector();
-      vi.AddVariable(new Variable("PopulationSize", new IntData(100)));
-      vi.AddVariable(new Variable("EvaluatedSolutions", new IntData()));
-      vi.AddVariable(new Variable("Parents", new IntData(200)));
-      vi.AddVariable(new Variable("MutationRate", new DoubleData(0.05)));
-      vi.AddVariable(new Variable("Elites", new IntData(1)));
-      vi.AddVariable(new Variable("Generations", new IntData()));
-      vi.AddVariable(new Variable("MaximumGenerations", new IntData(1000)));
-      op.OperatorGraph.AddOperator(vi);
-      sp.AddSubOperator(vi);
-
-      return op;
-    }
-    private static CombinedOperator CreatePopulationInitialization() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp1 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp1);
-      op.OperatorGraph.InitialOperator = sp1;
-
-      SubScopesCreater ssc = new SubScopesCreater();
-      ssc.GetVariableInfo("SubScopes").ActualName = "PopulationSize";
-      op.OperatorGraph.AddOperator(ssc);
-      sp1.AddSubOperator(ssc);
-
-      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
-      op.OperatorGraph.AddOperator(ussp);
-      sp1.AddSubOperator(ussp);
-
-      SequentialProcessor sp2 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp2);
-      ussp.AddSubOperator(sp2);
-
-      OperatorExtractor oe1 = new OperatorExtractor();
-      oe1.Name = "SolutionGenerator";
-      oe1.GetVariableInfo("Operator").ActualName = "SolutionGenerator";
-      op.OperatorGraph.AddOperator(oe1);
-      sp2.AddSubOperator(oe1);
-
-      OperatorExtractor oe2 = new OperatorExtractor();
-      oe2.Name = "Evaluator";
-      oe2.GetVariableInfo("Operator").ActualName = "Evaluator";
-      op.OperatorGraph.AddOperator(oe2);
-      sp2.AddSubOperator(oe2);
-
-      Counter c = new Counter();
-      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
-      op.OperatorGraph.AddOperator(c);
-      sp2.AddSubOperator(c);
-
-      Sorter s = new Sorter();
-      s.GetVariableInfo("Descending").ActualName = "Maximization";
-      s.GetVariableInfo("Value").ActualName = "Quality";
-      op.OperatorGraph.AddOperator(s);
-      sp1.AddSubOperator(s);
-
-      return op;
-    }
-    private static CombinedOperator CreateSGAMain() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp);
-      op.OperatorGraph.InitialOperator = sp;
-
-      OperatorExtractor oe = new OperatorExtractor();
-      oe.Name = "Selector";
-      oe.GetVariableInfo("Operator").ActualName = "Selector";
-      op.OperatorGraph.AddOperator(oe);
-      sp.AddSubOperator(oe);
-
-      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
-      op.OperatorGraph.AddOperator(ssp);
-      sp.AddSubOperator(ssp);
-
-      EmptyOperator eo = new EmptyOperator();
-      op.OperatorGraph.AddOperator(eo);
-      ssp.AddSubOperator(eo);
-
-      CombinedOperator co1 = CreateCreateChildren();
-      co1.Name = "Create Children";
-      op.OperatorGraph.AddOperator(co1);
-      ssp.AddSubOperator(co1);
-
-      CombinedOperator co2 = CreateReplacement();
-      co2.Name = "Replacement";
-      op.OperatorGraph.AddOperator(co2);
-      sp.AddSubOperator(co2);
-
-      QualityLogger ql = new QualityLogger();
-      op.OperatorGraph.AddOperator(ql);
-      sp.AddSubOperator(ql);
-
-      BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator();
-      op.OperatorGraph.AddOperator(bawqc);
-      sp.AddSubOperator(bawqc);
-
-      DataCollector dc = new DataCollector();
-      ItemList<StringData> names = dc.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
-      names.Add(new StringData("BestQuality"));
-      names.Add(new StringData("AverageQuality"));
-      names.Add(new StringData("WorstQuality"));
-      op.OperatorGraph.AddOperator(dc);
-      sp.AddSubOperator(dc);
-
-      LinechartInjector lci = new LinechartInjector();
-      lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
-      lci.GetVariable("NumberOfLines").GetValue<IntData>().Data = 3;
-      op.OperatorGraph.AddOperator(lci);
-      sp.AddSubOperator(lci);
-
-      Counter c = new Counter();
-      c.GetVariableInfo("Value").ActualName = "Generations";
-      op.OperatorGraph.AddOperator(c);
-      sp.AddSubOperator(c);
-
-      LessThanComparator ltc = new LessThanComparator();
-      ltc.GetVariableInfo("LeftSide").ActualName = "Generations";
-      ltc.GetVariableInfo("RightSide").ActualName = "MaximumGenerations";
-      ltc.GetVariableInfo("Result").ActualName = "GenerationsCondition";
-      op.OperatorGraph.AddOperator(ltc);
-      sp.AddSubOperator(ltc);
-
-      ConditionalBranch cb = new ConditionalBranch();
-      cb.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
-      op.OperatorGraph.AddOperator(cb);
-      sp.AddSubOperator(cb);
-
-      cb.AddSubOperator(sp);
-
-      return op;
-    }
-    private static CombinedOperator CreateCreateChildren() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp1 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp1);
-      op.OperatorGraph.InitialOperator = sp1;
-
-      ChildrenInitializer ci = new ChildrenInitializer();
-      op.OperatorGraph.AddOperator(ci);
-      sp1.AddSubOperator(ci);
-
-      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
-      op.OperatorGraph.AddOperator(ussp);
-      sp1.AddSubOperator(ussp);
-
-      SequentialProcessor sp2 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp2);
-      ussp.AddSubOperator(sp2);
-
-      OperatorExtractor oe1 = new OperatorExtractor();
-      oe1.Name = "Crossover";
-      oe1.GetVariableInfo("Operator").ActualName = "Crossover";
-      op.OperatorGraph.AddOperator(oe1);
-      sp2.AddSubOperator(oe1);
-
-      StochasticBranch hb = new StochasticBranch();
-      hb.GetVariableInfo("Probability").ActualName = "MutationRate";
-      op.OperatorGraph.AddOperator(hb);
-      sp2.AddSubOperator(hb);
-
-      OperatorExtractor oe2 = new OperatorExtractor();
-      oe2.Name = "Mutator";
-      oe2.GetVariableInfo("Operator").ActualName = "Mutator";
-      op.OperatorGraph.AddOperator(oe2);
-      hb.AddSubOperator(oe2);
-
-      OperatorExtractor oe3 = new OperatorExtractor();
-      oe3.Name = "Evaluator";
-      oe3.GetVariableInfo("Operator").ActualName = "Evaluator";
-      op.OperatorGraph.AddOperator(oe3);
-      sp2.AddSubOperator(oe3);
-
-      SubScopesRemover sr = new SubScopesRemover();
-      sr.GetVariableInfo("SubScopeIndex").Local = true;
-      op.OperatorGraph.AddOperator(sr);
-      sp2.AddSubOperator(sr);
-
-      Counter c = new Counter();
-      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
-      op.OperatorGraph.AddOperator(c);
-      sp2.AddSubOperator(c);
-
-      Sorter s = new Sorter();
-      s.GetVariableInfo("Descending").ActualName = "Maximization";
-      s.GetVariableInfo("Value").ActualName = "Quality";
-      op.OperatorGraph.AddOperator(s);
-      sp1.AddSubOperator(s);
-
-      return op;
-    }
-    private static CombinedOperator CreateReplacement() {
-      CombinedOperator op = new CombinedOperator();
-      SequentialProcessor sp1 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp1);
-      op.OperatorGraph.InitialOperator = sp1;
-
-      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
-      op.OperatorGraph.AddOperator(ssp);
-      sp1.AddSubOperator(ssp);
-
-      SequentialProcessor sp2 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp2);
-      ssp.AddSubOperator(sp2);
-
-      LeftSelector ls = new LeftSelector();
-      ls.GetVariableInfo("Selected").ActualName = "Elites";
-      op.OperatorGraph.AddOperator(ls);
-      sp2.AddSubOperator(ls);
-
-      RightReducer rr = new RightReducer();
-      op.OperatorGraph.AddOperator(rr);
-      sp2.AddSubOperator(rr);
-
-      SequentialProcessor sp3 = new SequentialProcessor();
-      op.OperatorGraph.AddOperator(sp3);
-      ssp.AddSubOperator(sp3);
-
-      RightSelector rs = new RightSelector();
-      rs.GetVariableInfo("Selected").ActualName = "Elites";
-      op.OperatorGraph.AddOperator(rs);
-      sp3.AddSubOperator(rs);
-
-      LeftReducer lr = new LeftReducer();
-      op.OperatorGraph.AddOperator(lr);
-      sp3.AddSubOperator(lr);
-
-      MergingReducer mr = new MergingReducer();
-      op.OperatorGraph.AddOperator(mr);
-      sp1.AddSubOperator(mr);
-
-      Sorter s = new Sorter();
-      s.GetVariableInfo("Descending").ActualName = "Maximization";
-      s.GetVariableInfo("Value").ActualName = "Quality";
-      op.OperatorGraph.AddOperator(s);
-      sp1.AddSubOperator(s);
-
-      return op;
-    }
-    #endregion
-
-    #region Properties
-
-    [Storable]
-    private IEngine myEngine;
-    /// <summary>
-    /// Gets the engine of the current instance.
-    /// </summary>
-    public IEngine Engine {
-      get { return myEngine; }
+  [Item("SGA", "A standard genetic algorithm.")]
+  [Creatable("Algorithms")]
+  [EmptyStorableClass]
+  public sealed class SGA : EngineAlgorithm {
+    public new IScope GlobalScope {
+      get { return base.GlobalScope; }
     }
 
-    [Storable]
-    private BoolData mySetSeedRandomly;
-    /// <summary>
-    /// Gets or sets the flag whether to set the seed randomly or not.
-    /// </summary>
-    public bool SetSeedRandomly {
-      get { return mySetSeedRandomly.Data; }
-      set { mySetSeedRandomly.Data = value; }
-    }
+    public SGA()
+      : base() {
+//      Parameters.Add(new ValueLookupParameter<BoolData>("Maximization", "True if the problem is a maximization problem, otherwise false."));
+//      Parameters.Add(new SubScopesLookupParameter<DoubleData>("Quality", "The value which represents the quality of a solution."));
+      Parameters.Add(new ValueParameter<IntData>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntData(0)));
+      Parameters.Add(new ValueParameter<BoolData>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolData(true)));
+      Parameters.Add(new ValueParameter<IntData>("PopulationSize", "The size of the population of solutions.", new IntData(100)));
+      Parameters.Add(new OperatorParameter("CrossoverOperator", "The operator used to cross solutions."));
+      Parameters.Add(new ValueParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new DoubleData(0.05)));
+      Parameters.Add(new OperatorParameter("MutationOperator", "The operator used to mutate solutions."));
+//      Parameters.Add(new ValueLookupParameter<IOperator>("SolutionEvaluator", "The operator used to evaluate solutions."));
+      Parameters.Add(new ValueParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation.", new IntData(1)));
+      Parameters.Add(new ValueParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntData(1000)));
 
-    [Storable]
-    private IntData mySeed;
-    /// <summary>
-    /// Gets or sets the value of the seed of the current instance.
-    /// </summary>
-    public int Seed {
-      get { return mySeed.Data; }
-      set { mySeed.Data = value; }
-    }
+      RandomCreator randomCreator = new RandomCreator();
+      PopulationCreator populationCreator = new PopulationCreator();
+      SGAOperator sgaOperator = new SGAOperator();
 
-    [Storable]
-    private IntData myParents;
+      randomCreator.RandomParameter.ActualName = "Random";
+      randomCreator.SeedParameter.ActualName = "Seed";
+      randomCreator.SeedParameter.Value = null;
+      randomCreator.SetSeedRandomlyParameter.ActualName = "SetSeedRandomly";
+      randomCreator.SetSeedRandomlyParameter.Value = null;
+      randomCreator.Successor = populationCreator;
 
-    [Storable]
-    private IntData myPopulationSize;    
-    /// <summary>
-    /// Gets or sets the population size of the current instance.
-    /// </summary>
-    /// <remarks>The number of parents is set to two times the population size.</remarks>
-    public int PopulationSize {
-      get { return myPopulationSize.Data; }
-      set {
-        myPopulationSize.Data = value;
-        myParents.Data = value * 2;
-      }
-    }
+      populationCreator.PopulationSizeParameter.ActualName = "PopulationSize";
+      populationCreator.PopulationSizeParameter.Value = null;
+      populationCreator.SolutionCreatorParameter.ActualName = "SolutionCreator";
+      populationCreator.SolutionEvaluatorParameter.ActualName = "SolutionEvaluator";
+      populationCreator.Successor = sgaOperator;
 
-    [Storable]
-    private IntData myMaximumGenerations;
-    /// <summary>
-    /// Gets or sets the number of maximum generations.
-    /// </summary>
-    public int MaximumGenerations {
-      get { return myMaximumGenerations.Data; }
-      set { myMaximumGenerations.Data = value; }
-    }
+      sgaOperator.CrossoverOperatorParameter.ActualName = "CrossoverOperator";
+      sgaOperator.ElitesParameter.ActualName = "Elites";
+      sgaOperator.MaximizationParameter.ActualName = "Maximization";
+      sgaOperator.MaximumGenerationsParameter.ActualName = "MaximumGenerations";
+      sgaOperator.MutationOperatorParameter.ActualName = "MutationOperator";
+      sgaOperator.MutationProbabilityParameter.ActualName = "MutationProbability";
+      sgaOperator.QualityParameter.ActualName = "Quality";
+      sgaOperator.RandomParameter.ActualName = "Random";
+      sgaOperator.SolutionEvaluatorParameter.ActualName = "SolutionEvaluator";
 
-    [Storable]
-    private DoubleData myMutationRate;
-    /// <summary>
-    /// Gets or sets the mutation rate of the current instance.
-    /// </summary>
-    public double MutationRate {
-      get { return myMutationRate.Data; }
-      set { myMutationRate.Data = value; }
-    }
-
-    [Storable]
-    private IntData myElites;
-    /// <summary>
-    /// Gets or sets the elites of the current instance.
-    /// </summary>
-    public int Elites {
-      get { return myElites.Data; }
-      set { myElites.Data = value; }
-    }
-
-    [Storable]
-    private CombinedOperator mySGA;
-
-    [Storable]
-    private IOperator myVariableInjection;
-
-    /// <summary>
-    /// Gets or sets the problem injector of the current instance.
-    /// </summary>
-    public IOperator ProblemInjector {
-      get { return myVariableInjection.SubOperators[0]; }
-      set {
-        value.Name = "ProblemInjector";
-        mySGA.OperatorGraph.RemoveOperator(ProblemInjector);
-        mySGA.OperatorGraph.AddOperator(value);
-        myVariableInjection.AddSubOperator(value, 0);
-      }
-    }
-
-    [Storable]
-    private IOperator myPopulationInitialization;
-    /// <summary>
-    /// Gets or sets the solution generator of the current instance.
-    /// </summary>
-    public IOperator SolutionGenerator {
-      get { return myPopulationInitialization.SubOperators[0]; }
-      set {
-        value.Name = "SolutionGenerator";
-        mySGA.OperatorGraph.RemoveOperator(SolutionGenerator);
-        mySGA.OperatorGraph.AddOperator(value);
-        myPopulationInitialization.AddSubOperator(value, 0);
-      }
-    }
-
-    /// <summary>
-    /// Gets or sets the evaluator of the current instance.
-    /// </summary>
-    public IOperator Evaluator {
-      get { return myPopulationInitialization.SubOperators[1]; }
-      set {
-        value.Name = "Evaluator";
-        mySGA.OperatorGraph.RemoveOperator(Evaluator);
-        mySGA.OperatorGraph.AddOperator(value);
-        myPopulationInitialization.AddSubOperator(value, 1);
-        mySGAMain.AddSubOperator(value, 3);
-      }
-    }
-
-    [Storable]
-    private IOperator mySGAMain;
-
-    /// <summary>
-    /// Gets or sets the selection operator of the current instance.
-    /// </summary>
-    public IOperator Selector {
-      get { return mySGAMain.SubOperators[0]; }
-      set {
-        value.Name = "Selector";
-        mySGA.OperatorGraph.RemoveOperator(Selector);
-        mySGA.OperatorGraph.AddOperator(value);
-        mySGAMain.AddSubOperator(value, 0);
-      }
-    }
-
-    /// <summary>
-    /// Gets or sets the crossover operator of the current instance.
-    /// </summary>
-    public IOperator Crossover {
-      get { return mySGAMain.SubOperators[1]; }
-      set {
-        value.Name = "Crossover";
-        mySGA.OperatorGraph.RemoveOperator(Crossover);
-        mySGA.OperatorGraph.AddOperator(value);
-        mySGAMain.AddSubOperator(value, 1);
-      }
-    }
-
-    /// <summary>
-    /// Gets or sets the mutation operator of the current instance.
-    /// </summary>
-    public IOperator Mutator {
-      get { return mySGAMain.SubOperators[2]; }
-      set {
-        value.Name = "Mutator";
-        mySGA.OperatorGraph.RemoveOperator(Mutator);
-        mySGA.OperatorGraph.AddOperator(value);
-        mySGAMain.AddSubOperator(value, 2);
-      }
-    }
-    #endregion
-
-    /// <summary>
-    /// Initializes a new instance of <see cref="SGA"/>.
-    /// </summary>
-    public SGA() {
-      myEngine = new SequentialEngine.SequentialEngine();
-      Create(myEngine);
-      SetReferences();
-    }
-
-    /// <summary>
-    /// Clones the current instance (deep clone).
-    /// </summary>
-    /// <remarks>Deep clone through <see cref="cloner.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="SGA"/>.</returns>
-    public override IItem Clone(ICloner cloner) {
-      SGA clone = new SGA();
-      cloner.RegisterClonedObject(this, clone);
-      clone.myEngine = (IEngine)cloner.Clone(Engine);
-      return clone;
-    }
-    
-    private void SetReferences() {
-      // SGA
-      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
-      mySGA = co1;
-      // SequentialProcessor in SGA
-      SequentialProcessor sp1 = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
-      // Variable Injection
-      CombinedOperator co2 = (CombinedOperator)sp1.SubOperators[0];
-      myVariableInjection = co2;
-      // SequentialProcessor in Variable Injection
-      SequentialProcessor sp2 = (SequentialProcessor)co2.OperatorGraph.InitialOperator;
-      // RandomInjector
-      RandomInjector ri = (RandomInjector)sp2.SubOperators[0];
-      mySetSeedRandomly = ri.GetVariable("SetSeedRandomly").GetValue<BoolData>();
-      mySeed = ri.GetVariable("Seed").GetValue<IntData>();
-      // VariableInjector
-      VariableInjector vi = (VariableInjector)sp2.SubOperators[2];
-      myPopulationSize = vi.GetVariable("PopulationSize").GetValue<IntData>();
-      myParents = vi.GetVariable("Parents").GetValue<IntData>();
-      myMaximumGenerations = vi.GetVariable("MaximumGenerations").GetValue<IntData>();
-      myMutationRate = vi.GetVariable("MutationRate").GetValue<DoubleData>();
-      myElites = vi.GetVariable("Elites").GetValue<IntData>();
-      // Population Initialization
-      CombinedOperator co3 = (CombinedOperator)sp1.SubOperators[1];
-      myPopulationInitialization = co3;
-      // SGA Main
-      CombinedOperator co4 = (CombinedOperator)sp1.SubOperators[2];
-      mySGAMain = co4;
+      OperatorGraph.InitialOperator = randomCreator;
     }
   }
Index: trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 2850)
+++ trunk/sources/HeuristicLab.SequentialEngine/3.3/SequentialEngine.cs	(revision 2851)
@@ -36,15 +36,4 @@
 
     /// <summary>
-    /// Aborts the engine execution.
-    /// </summary>
-    /// <remarks>Calls <see cref="EngineBase.Abort"/> of base class <see cref="EngineBase"/> and
-    /// <see cref="IOperator.Abort"/> of the current <see cref="IOperator"/>.</remarks>
-    public override void Stop() {
-      base.Stop();
-      if (currentOperator != null)
-        currentOperator.Abort();
-    }
-
-    /// <summary>
     /// Deals with the next operation, if it is an <see cref="AtomicOperation"/> it is executed,
     /// if it is a <see cref="CompositeOperation"/> its single operations are pushed on the execution stack.
@@ -79,4 +68,9 @@
       }
     }
+
+    protected override void OnCanceledChanged() {
+      if (Canceled && (currentOperator != null))
+        currentOperator.Abort();
+    }
   }
 }
