Index: trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- trunk/sources/HeuristicLab 3.3.sln	(revision 2852)
+++ trunk/sources/HeuristicLab 3.3.sln	(revision 2853)
@@ -490,6 +490,5 @@
 		{C664305E-497C-4533-A140-967DEDB05C19}.Debug|x64.ActiveCfg = Debug|x64
 		{C664305E-497C-4533-A140-967DEDB05C19}.Debug|x64.Build.0 = Debug|x64
-		{C664305E-497C-4533-A140-967DEDB05C19}.Debug|x86.ActiveCfg = Debug|x86
-		{C664305E-497C-4533-A140-967DEDB05C19}.Debug|x86.Build.0 = Debug|x86
+		{C664305E-497C-4533-A140-967DEDB05C19}.Debug|x86.ActiveCfg = Debug|x64
 		{C664305E-497C-4533-A140-967DEDB05C19}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C664305E-497C-4533-A140-967DEDB05C19}.Release|Any CPU.Build.0 = Release|Any CPU
@@ -522,6 +521,5 @@
 		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Debug|x64.ActiveCfg = Debug|x64
 		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Debug|x64.Build.0 = Debug|x64
-		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Debug|x86.ActiveCfg = Debug|x86
-		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Debug|x86.Build.0 = Debug|x86
+		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Debug|x86.ActiveCfg = Debug|x64
 		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}.Release|Any CPU.Build.0 = Release|Any CPU
@@ -600,6 +598,5 @@
 		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Debug|x64.ActiveCfg = Debug|x64
 		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Debug|x64.Build.0 = Debug|x64
-		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Debug|x86.ActiveCfg = Debug|x86
-		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Debug|x86.Build.0 = Debug|x86
+		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Debug|x86.ActiveCfg = Debug|x64
 		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{56F9106A-079F-4C61-92F6-86A84C2D84B7}.Release|Any CPU.Build.0 = Release|Any CPU
@@ -610,6 +607,5 @@
 		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Debug|x64.ActiveCfg = Debug|x64
 		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Debug|x64.Build.0 = Debug|x64
-		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Debug|x86.ActiveCfg = Debug|x86
-		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Debug|x86.Build.0 = Debug|x86
+		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Debug|x86.ActiveCfg = Debug|x64
 		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}.Release|Any CPU.Build.0 = Release|Any CPU
Index: trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs
===================================================================
--- trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs	(revision 2853)
@@ -67,4 +67,19 @@
     }
 
+    [Storable]
+    private IDeepCloneable visualizationInfo;
+    /// <summary>
+    /// Gets or sets the visualizationInfo.
+    /// </summary>
+    /// /// <remarks>The VisualizationInfo can only be set once and fires afterwards and InvalidOperationException</remarks>
+    public IDeepCloneable VisualizationInfo {
+      get { return visualizationInfo; }
+      set {
+        if (visualizationInfo != null)
+          throw new InvalidOperationException("The value of the property VisualizationInfo is already set and cannot be set again.");
+        visualizationInfo = value;
+      }
+    }
+
     /// <summary>
     /// Initializes a new instance of <see cref="OperatorGraph"/>.
@@ -73,4 +88,5 @@
       Operators = new OperatorSet();
       initialOperator = null;
+      visualizationInfo = null;
     }
 
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/BidirectionalLookup.cs	(revision 2853)
@@ -0,0 +1,127 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public class BidirectionalLookup<TFirst, TSecond> {
+    private Dictionary<TFirst, TSecond> firstToSecond;
+    private Dictionary<TSecond, TFirst> secondToFirst;
+
+    public BidirectionalLookup() {
+      this.firstToSecond = new Dictionary<TFirst, TSecond>();
+      this.secondToFirst = new Dictionary<TSecond, TFirst>();
+    }
+
+    #region properties
+    public int Count {
+      get { return this.firstToSecond.Count; }
+    }
+
+    public IEnumerable<TFirst> FirstValues {
+      get { return this.firstToSecond.Keys; }
+    }
+
+    public IEnumerable<TSecond> SecondValues {
+      get { return this.secondToFirst.Keys; }
+    }
+
+    public IEnumerable<KeyValuePair<TFirst, TSecond>> FirstEnumerable {
+      get { return this.firstToSecond; }
+    }
+
+    public IEnumerable<KeyValuePair<TSecond, TFirst>> SecondEnumerable {
+      get { return this.secondToFirst; }
+    }
+    #endregion
+
+
+    #region methods
+    public void Add(TFirst firstValue, TSecond secondValue) {
+      if (this.firstToSecond.ContainsKey(firstValue))
+        throw new ArgumentException("Could not add first value " + firstValue.ToString() + " because it is already contained in the bidirectional lookup.");
+      if (this.secondToFirst.ContainsKey(secondValue))
+        throw new ArgumentException("Could not add second value " + secondValue.ToString() + " because it is already contained in the bidirectional lookup.");
+
+      firstToSecond.Add(firstValue, secondValue);
+      secondToFirst.Add(secondValue, firstValue);
+    }
+
+    public bool ContainsFirst(TFirst firstValue) {
+      return this.firstToSecond.ContainsKey(firstValue);
+    }
+
+    public bool ContainsSecond(TSecond secondValue) {
+      return this.secondToFirst.ContainsKey(secondValue);
+    }
+
+    public TSecond GetByFirst(TFirst firstValue) {
+      return this.firstToSecond[firstValue];
+    }
+
+    public TFirst GetBySecond(TSecond secondValue) {
+      return this.secondToFirst[secondValue];
+    }
+
+    public void SetByFirst(TFirst firstValue, TSecond secondValue) {
+      if (this.secondToFirst.ContainsKey(secondValue))
+        throw new ArgumentException("Could not set second value " + secondValue.ToString() + " because it is already contained in the bidirectional lookup.");
+
+      this.RemoveByFirst(firstValue);
+      this.Add(firstValue, secondValue);
+    }
+
+    public void SetBySecond(TSecond secondValue, TFirst firstValue) {
+      if (this.firstToSecond.ContainsKey(firstValue))
+        throw new ArgumentException("Could not set first value " + firstValue.ToString() + " because it is already contained in the bidirectional lookup.");
+
+      this.RemoveBySecond(secondValue);
+      this.Add(firstValue, secondValue);
+    }
+
+    public void RemoveByFirst(TFirst firstValue) {
+      if (this.ContainsFirst(firstValue)) {
+        TSecond secondValue = this.firstToSecond[firstValue];
+        this.firstToSecond.Remove(firstValue);
+        this.secondToFirst.Remove(secondValue);
+      }
+    }
+
+    public void RemoveBySecond(TSecond secondValue) {
+      if (this.ContainsSecond(secondValue)) {
+        TFirst firstValue = this.secondToFirst[secondValue];
+        this.secondToFirst.Remove(secondValue);
+        this.firstToSecond.Remove(firstValue);
+      }
+    }
+
+    public void Clear() {
+      this.firstToSecond.Clear();
+      this.secondToFirst.Clear();
+    }
+
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLab.Operators.Views.GraphVisualization-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLab.Operators.Views.GraphVisualization-3.3.csproj	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/HeuristicLab.Operators.Views.GraphVisualization-3.3.csproj	(revision 2853)
@@ -83,9 +83,9 @@
   <ItemGroup>
     <Compile Include="HeuristicLabOperatorsViewsGraphVisualizationPlugin.cs" />
-    <Compile Include="OperatorGraphVisualizationView.cs">
+    <Compile Include="OperatorGraphView.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Include="OperatorGraphVisualizationView.Designer.cs">
-      <DependentUpon>OperatorGraphVisualizationView.cs</DependentUpon>
+    <Compile Include="OperatorGraphView.Designer.cs">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
     </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -95,4 +95,15 @@
     <None Include="HeuristicLabOperatorsViewsGraphVisualizationPlugin.cs.frame" />
     <None Include="Properties\AssemblyInfo.frame" />
+    <Compile Include="Model\ConnectionInfo.cs" />
+    <Compile Include="Model\IConnectionInfo.cs" />
+    <Compile Include="Model\OperatorShapeInfo.cs" />
+    <Compile Include="Model\OperatorGraphVisualizationInfo.cs" />
+    <Compile Include="BidirectionalLookup.cs" />
+    <Compile Include="Model\IShapeInfo.cs" />
+    <Compile Include="Model\OperatorShape.cs" />
+    <Compile Include="Model\ShapeInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Model\ShapeInfoFactory.cs" />
     <Compile Include="ToolBarItems\SelectToolBarItem.cs" />
     <Compile Include="ToolBarItems\PanToolBarItem.cs" />
@@ -100,5 +111,5 @@
     <Compile Include="ToolBarItems\ZoomInToolBarItem.cs" />
     <Compile Include="ToolBarItems\ZoomToolBarItem.cs" />
-    <Compile Include="ToolBarItems\OperatorGraphVisualizationToolBarItemSeparator.cs" />
+    <Compile Include="ToolBarItems\ToolBarItemSeparator.cs" />
     <Compile Include="ToolBarItems\RelayoutToolBarItem.cs" />
   </ItemGroup>
@@ -153,4 +164,9 @@
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="OperatorGraphView.resx">
+      <DependentUpon>OperatorGraphView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ConnectionInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ConnectionInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ConnectionInfo.cs	(revision 2853)
@@ -0,0 +1,51 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using Netron.Diagramming.Core;
+using System.Drawing;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  internal class ConnectionInfo : Item, IConnectionInfo {
+    #region static fields
+    private static LinePenStyle penStyle;
+    static ConnectionInfo() {
+      ConnectionInfo.penStyle = new LinePenStyle();
+      ConnectionInfo.penStyle.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
+    }
+    #endregion
+
+    public ConnectionInfo()
+      : base() {
+    }
+
+    private Point from;
+    public Point From {
+      get { return this.from; }
+      set {
+        if (this.from != value) {
+          this.from = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    private Point to;
+    public Point To {
+      get { return this.to; }
+      set {
+        if (this.to != value) {
+          this.to = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    public IConnection CreateConnection() {
+      IConnection connection = new Connection(this.From, this.To);
+      connection.PenStyle = ConnectionInfo.penStyle;
+      return connection;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IConnectionInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IConnectionInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IConnectionInfo.cs	(revision 2853)
@@ -0,0 +1,38 @@
+﻿#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.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using Netron.Diagramming.Core;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public interface IConnectionInfo :IItem{
+    Point From {get;set;}
+    Point To { get; set; }
+
+    IConnection CreateConnection();
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IShapeInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IShapeInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/IShapeInfo.cs	(revision 2853)
@@ -0,0 +1,38 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using System.Drawing;
+using Netron.Diagramming.Core;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public interface IShapeInfo : IItem{
+    Type ShapeType { get; }
+    Point Location { get; set; }
+    Size Size { get; set; }
+
+    IShape CreateShape();
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorGraphVisualizationInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorGraphVisualizationInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorGraphVisualizationInfo.cs	(revision 2853)
@@ -0,0 +1,209 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using Netron.Diagramming.Core;
+using System.Drawing;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public sealed class OperatorGraphVisualizationInfo : Item {
+    private BidirectionalLookup<IOperator, IShapeInfo> shapeInfoMapping;
+
+    public OperatorGraphVisualizationInfo(OperatorGraph operatorGraph) {
+      this.operatorGraph = operatorGraph;
+      this.shapeInfoMapping = new BidirectionalLookup<IOperator, IShapeInfo>();
+      this.shapeInfos = new ObservableSet<IShapeInfo>();
+
+      foreach (IOperator op in operatorGraph.Operators)
+        this.AddOperator(op);
+      this.initialOperator = operatorGraph.InitialOperator;
+
+      operatorGraph.Operators.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsAdded);
+      operatorGraph.Operators.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsRemoved);
+      operatorGraph.Operators.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IOperator>(Operators_CollectionReset);
+    }
+
+    private OperatorGraph operatorGraph;
+    public OperatorGraph OperatorGraph {
+      get { return this.operatorGraph; }
+    }
+
+    private ObservableSet<IShapeInfo> shapeInfos;
+    public INotifyObservableCollectionItemsChanged<IShapeInfo> ObserveableShapeInfos {
+      get { return this.shapeInfos; }
+    }
+
+    public IEnumerable<IShapeInfo> ShapeInfos {
+      get { return this.shapeInfos; }
+    }
+
+    private IOperator initialOperator;
+    public IOperator InitialOperator {
+      get { return this.initialOperator; }
+      set {
+        if (this.initialOperator != value) {
+          if (!this.shapeInfoMapping.ContainsFirst(value))
+            throw new ArgumentException("Could not set initial operator in graph visualization information, because the operator " +
+              value.ToString() + " is not contained in the operator set.");
+          this.initialOperator = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    internal void AddShapeInfo(IOperator op, IShapeInfo shapeInfo) {
+      this.RegisterOperatorEvents(op);
+      this.shapeInfoMapping.Add(op, shapeInfo);
+      this.shapeInfos.Add(shapeInfo);
+
+      this.operatorGraph.Operators.Add(op);
+    }
+
+    internal void RemoveShapeInfo(IShapeInfo shapeInfo) {
+      IOperator op = this.shapeInfoMapping.GetBySecond(shapeInfo);
+      this.operatorGraph.Operators.Remove(op);
+    }
+
+    #region operator events
+    private void AddOperator(IOperator op) {
+      if (!shapeInfoMapping.ContainsFirst(op)) {
+        this.RegisterOperatorEvents(op);
+
+        IShapeInfo shapeInfo = ShapeInfoFactory.CreateShapeInfo(op);
+        this.shapeInfoMapping.Add(op, shapeInfo);
+        this.shapeInfos.Add(shapeInfo);
+      }
+    }
+
+    private void RemoveOperator(IOperator op) {
+      this.DeregisterOperatorEvents(op);
+
+      IShapeInfo shapeInfo = this.shapeInfoMapping.GetByFirst(op);
+      this.shapeInfoMapping.RemoveByFirst(op);
+      this.shapeInfos.Remove(shapeInfo);
+    }
+
+    private void Operators_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IOperator> e) {
+      foreach (IOperator op in e.Items)
+        this.AddOperator(op);
+    }
+
+    private void Operators_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IOperator> e) {
+      foreach (IOperator op in e.Items)
+        this.RemoveOperator(op);
+    }
+
+    private void Operators_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IOperator> e) {
+      foreach (IOperator op in e.OldItems)
+        this.RemoveOperator(op);
+      foreach (IOperator op in e.Items)
+        this.AddOperator(op);
+    }
+
+    private void RegisterOperatorEvents(IOperator op) {
+      op.Parameters.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
+      op.Parameters.ItemsRemoved += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
+      op.Parameters.ItemsReplaced += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
+      op.Parameters.CollectionReset += new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
+    }
+    private void DeregisterOperatorEvents(IOperator op) {
+      op.Parameters.ItemsAdded -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
+      op.Parameters.ItemsRemoved -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
+      op.Parameters.ItemsReplaced -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
+      op.Parameters.CollectionReset -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
+    }
+    #endregion
+
+    #region parameter events
+    private void AddParameter(IParameter param) {
+      IValueParameter<IOperator> opParam = param as IValueParameter<IOperator>;
+      if (opParam != null) {
+        RegisterOperatorParameterEvents(opParam);
+        //TODO add connector
+      }
+    }
+    private void RemoveParameter(IParameter param) {
+      IValueParameter<IOperator> opParam = param as IValueParameter<IOperator>;
+      if (opParam != null) {
+        DeregisterOperatorParameterEvents(opParam);
+        //TODO remove connector
+      }
+    }
+
+    private void opParam_ValueChanged(object sender, EventArgs e) {
+      IValueParameter<IOperator> opParam = (IValueParameter<IOperator>)sender;
+      //TODO update connections
+    }
+
+    private void Parameters_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      foreach (IParameter param in e.Items)
+        AddParameter(param);
+    }
+    private void Parameters_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      foreach (IParameter param in e.Items)
+        RemoveParameter(param);
+    }
+    private void Parameters_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      foreach (IParameter param in e.OldItems)
+        RemoveParameter(param);
+      foreach (IParameter param in e.Items)
+        AddParameter(param);
+    }
+    private void Parameters_CollectionReset(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
+      foreach (IParameter param in e.OldItems)
+        RemoveParameter(param);
+      foreach (IParameter param in e.Items)
+        AddParameter(param);
+    }
+
+    private void RegisterOperatorParameterEvents(IValueParameter<IOperator> opParam) {
+      opParam.ValueChanged += new EventHandler(opParam_ValueChanged);
+    }
+    private void DeregisterOperatorParameterEvents(IValueParameter<IOperator> opParam) {
+      opParam.ValueChanged -= new EventHandler(opParam_ValueChanged);
+    }
+    #endregion
+
+
+
+
+
+
+
+
+    private static IConnection CreateConnection(IShape from, IShape to) {
+      IConnector parentConnector = from.Connectors.Where(c => c.Name == "Bottom connector").First();
+      IConnector operatorConnector = to.Connectors.Where(c => c.Name == "Top connector").First();
+
+      IConnection connection = new Connection(parentConnector.Point, operatorConnector.Point);
+
+      parentConnector.AttachConnector(connection.From);
+      operatorConnector.AttachConnector(connection.To);
+
+      return connection;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShape.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShape.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShape.cs	(revision 2853)
@@ -0,0 +1,87 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Netron.Diagramming.Core;
+using System.Drawing;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public class OperatorShape : ClassShape {
+
+    private BidirectionalLookup<string, IConnector> additionalConnectors;
+    public OperatorShape()
+      : base() {
+      this.additionalConnectors = new BidirectionalLookup<string,IConnector>();
+    }
+
+    private Connector predecessor;
+    public Connector Predecessor {
+      get { return this.predecessor; }
+    }
+
+    private Connector successor;
+    public Connector Successor {
+      get { return this.successor; }
+    }
+
+
+    public void AddConnector(string connectorName) {
+      Connector connector = new Connector(new Point(Rectangle.Right, Rectangle.Bottom));
+      connector.ConnectorStyle = ConnectorStyle.Square;
+      connector.Parent = this;
+      this.additionalConnectors.Add(connectorName, connector);
+      Connectors.Add(connector);
+    }
+
+    public void RemoveConnector(string connectorName) {
+      this.additionalConnectors.RemoveByFirst(connectorName);
+      this.UpdateConnectorLocation();
+    }
+
+    private void UpdateConnectorLocation() { 
+      //TODO set x position of connectors
+    }
+
+
+    protected override void Initialize() {
+      base.Initialize();
+
+      #region Connectors
+      this.Connectors.Clear();
+
+      predecessor = new Connector(new Point(Rectangle.Right, (int)(Rectangle.Top + Rectangle.Height / 2)));
+      predecessor.ConnectorStyle = ConnectorStyle.Square;
+      predecessor.Name = "Predecessor";
+      predecessor.Parent = this;
+      Connectors.Add(predecessor);
+
+      successor = new Connector(new Point(Rectangle.Left, (int)(Rectangle.Top + Rectangle.Height / 2)));
+      predecessor.ConnectorStyle = ConnectorStyle.Square;
+      successor.Name = "Successor";
+      successor.Parent = this;
+      Connectors.Add(successor);
+      #endregion
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShapeInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShapeInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/OperatorShapeInfo.cs	(revision 2853)
@@ -0,0 +1,99 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using System.Drawing;
+using Netron.Diagramming.Core;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  internal class OperatorShapeInfo : ShapeInfo {
+
+    private HashSet<string> connectorNames;
+    public OperatorShapeInfo()
+      : base(typeof(OperatorShape)) {
+      this.connectorNames = new HashSet<string>();
+    }
+
+    public OperatorShapeInfo(IEnumerable<string> connectorNames)
+      : this() {
+      foreach (string connectorName in connectorNames)
+        this.connectorNames.Add(connectorName);
+    }
+
+    public void AddConnector(string connectorName) {
+      if (this.connectorNames.Add(connectorName))
+        this.OnChanged();
+    }
+
+    public void RemoveConnector(string connectorName) {
+      if (this.connectorNames.Remove(connectorName))
+        this.OnChanged();
+    }
+
+
+    private string title;
+    public string Title {
+      get { return this.title; }
+      set {
+        if (this.title != value) {
+          this.title = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    private string text;
+    public string Text {
+      get { return this.text; }
+      set {
+        if (this.text != value) {
+          this.text = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    private Color headColor;
+    public Color HeadColor {
+      get { return this.headColor; }
+      set {
+        if (this.headColor != value) {
+          this.headColor = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    public override IShape CreateShape() {
+      OperatorShape shape = (OperatorShape)base.CreateShape();
+      shape.Title = this.Title;
+      shape.SubTitle = this.Text;
+      shape.HeadColor = this.HeadColor;
+      foreach (string connectorName in this.connectorNames)
+        shape.AddConnector(connectorName);
+      return shape;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfo.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfo.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfo.cs	(revision 2853)
@@ -0,0 +1,75 @@
+﻿#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.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using System.Drawing;
+using Netron.Diagramming.Core;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  internal abstract class ShapeInfo : Item, IShapeInfo {
+
+
+    protected ShapeInfo(Type shapeType) {
+      if (!typeof(IShape).IsAssignableFrom(shapeType))
+        throw new ArgumentException("The passed shape type " + shapeType + " must be derived from IShape.");
+      this.shapeType = shapeType;
+    }
+
+    private Type shapeType;
+    public Type ShapeType {
+      get { return this.shapeType; }
+    }
+
+    private Point location;
+    public Point Location {
+      get { return this.location; }
+      set {
+        if (this.location != value) {
+          this.location = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    private Size size;
+    public Size Size {
+      get { return this.size; }
+      set {
+        if (this.size != value) {
+          this.size = value;
+          this.OnChanged();
+        }
+      }
+    }
+
+    public virtual IShape CreateShape() {
+      IShape shape = (IShape)Activator.CreateInstance(this.shapeType);
+      shape.Location = this.Location;
+      shape.Height = this.Size.Height;
+      shape.Width = this.Size.Width;
+      return shape;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfoFactory.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfoFactory.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/Model/ShapeInfoFactory.cs	(revision 2853)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  public static class ShapeInfoFactory {
+    public static IShapeInfo CreateShapeInfo(IOperator op) {
+      OperatorShapeInfo operatorShapeInfo = new OperatorShapeInfo();
+      operatorShapeInfo.Title = op.Name;
+      operatorShapeInfo.Text = op.GetType().ToString();
+
+      return operatorShapeInfo;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.Designer.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.Designer.cs	(revision 2853)
@@ -0,0 +1,74 @@
+﻿namespace HeuristicLab.Operators.Views.GraphVisualization {
+  partial class OperatorGraphView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OperatorGraphView));
+      this.graphVisualization = new HeuristicLab.Netron.NetronVisualization();
+      ((System.ComponentModel.ISupportInitialize)(this.graphVisualization)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // graphVisualization
+      // 
+      this.graphVisualization.AllowDrop = false;
+      this.graphVisualization.AutoScroll = true;
+      this.graphVisualization.BackColor = System.Drawing.Color.DarkGray;
+      this.graphVisualization.BackgroundType = global::Netron.Diagramming.Core.CanvasBackgroundTypes.FlatColor;
+      this.graphVisualization.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.graphVisualization.Document = ((global::Netron.Diagramming.Core.Document)(resources.GetObject("graphVisualization.Document")));
+      this.graphVisualization.EnableAddConnection = true;
+      this.graphVisualization.FileName = "";
+      this.graphVisualization.Location = new System.Drawing.Point(0, 0);
+      this.graphVisualization.Magnification = new System.Drawing.SizeF(71F, 71F);
+      this.graphVisualization.Name = "graphVisualization";
+      this.graphVisualization.Origin = new System.Drawing.Point(0, 0);
+      this.graphVisualization.PageSettings = ((System.Drawing.Printing.PageSettings)(resources.GetObject("graphVisualization.PageSettings")));
+      this.graphVisualization.ShowConnectors = true;
+      this.graphVisualization.ShowRulers = false;
+      this.graphVisualization.Size = new System.Drawing.Size(665, 444);
+      this.graphVisualization.TabIndex = 0;
+      this.graphVisualization.OnEntityRemoved += new System.EventHandler<global::Netron.Diagramming.Core.EntityEventArgs>(this.graphVisualization_OnEntityRemoved);
+      // 
+      // OperatorGraphView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.graphVisualization);
+      this.Name = "OperatorGraphView";
+      this.Size = new System.Drawing.Size(665, 444);
+      this.DragDrop += new System.Windows.Forms.DragEventHandler(this.OperatorGraphView_DragDrop);
+      this.DragEnter += new System.Windows.Forms.DragEventHandler(this.OperatorGraphView_DragEnter);
+      ((System.ComponentModel.ISupportInitialize)(this.graphVisualization)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Netron.NetronVisualization graphVisualization;
+
+
+
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.cs	(revision 2853)
@@ -0,0 +1,321 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using Netron.Diagramming.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Operators.Views.GraphVisualization {
+  [Content(typeof(OperatorGraph), false)]
+  public partial class OperatorGraphView : ContentView {
+    private BidirectionalLookup<IShapeInfo, IShape> shapeMapping;
+    private BidirectionalLookup<IConnectionInfo, IConnection> connectionMapping;
+
+    private bool causedUpdateOfShapeInfo;
+    public OperatorGraphView() {
+      InitializeComponent();
+      this.causedUpdateOfShapeInfo = false;
+      Caption = "Operator Graph";
+      this.shapeMapping = new BidirectionalLookup<IShapeInfo, IShape>();
+      this.connectionMapping = new BidirectionalLookup<IConnectionInfo, IConnection>();
+    }
+
+    public OperatorGraphView(OperatorGraph content)
+      : this() {
+      this.Content = content;
+    }
+
+    public new OperatorGraph Content {
+      get { return (OperatorGraph)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      if (this.VisualizationInfo == null)
+        this.VisualizationInfo = new OperatorGraphVisualizationInfo(this.Content);
+      this.UpdateVisualizationInfo();
+    }
+
+    private OperatorGraphVisualizationInfo VisualizationInfo {
+      get { return Content.VisualizationInfo as OperatorGraphVisualizationInfo; }
+      set { this.Content.VisualizationInfo = value; }
+    }
+
+    private void UpdateVisualizationInfo() {
+      foreach (IShapeInfo shapeInfo in this.shapeMapping.FirstValues)
+        this.RemoveShapeInfo(shapeInfo);
+      this.shapeMapping.Clear();
+
+      foreach (IShapeInfo shapeInfo in this.VisualizationInfo.ShapeInfos)
+        this.AddShapeInfo(shapeInfo);
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      this.VisualizationInfo.ObserveableShapeInfos.ItemsAdded += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_ItemsAdded);
+      this.VisualizationInfo.ObserveableShapeInfos.ItemsRemoved += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_ItemsRemoved);
+      this.VisualizationInfo.ObserveableShapeInfos.CollectionReset += new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_CollectionReset);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      this.VisualizationInfo.ObserveableShapeInfos.ItemsAdded -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_ItemsAdded);
+      this.VisualizationInfo.ObserveableShapeInfos.ItemsRemoved -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_ItemsRemoved);
+      this.VisualizationInfo.ObserveableShapeInfos.CollectionReset -= new HeuristicLab.Collections.CollectionItemsChangedEventHandler<IShapeInfo>(ShapeInfos_CollectionReset);
+    }
+
+
+    private void ShapeInfos_CollectionReset(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IShapeInfo> e) {
+      foreach (IShapeInfo shapeInfo in e.OldItems)
+        this.RemoveShapeInfo(shapeInfo);
+      foreach (IShapeInfo shapeInfo in e.Items)
+        this.AddShapeInfo(shapeInfo);
+      this.graphVisualization.Invalidate();
+    }
+
+    private void ShapeInfos_ItemsAdded(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IShapeInfo> e) {
+      foreach (IShapeInfo shapeInfo in e.Items)
+        this.AddShapeInfo(shapeInfo);
+      this.graphVisualization.Invalidate();
+    }
+
+    private void ShapeInfos_ItemsRemoved(object sender, HeuristicLab.Collections.CollectionItemsChangedEventArgs<IShapeInfo> e) {
+      foreach (IShapeInfo shapeInfo in e.Items)
+        this.RemoveShapeInfo(shapeInfo);
+      this.graphVisualization.Invalidate();
+    }
+
+    private void AddShapeInfo(IShapeInfo shapeInfo) {
+      IShape shape = shapeInfo.CreateShape();
+      this.graphVisualization.Controller.Model.AddShape(shape);
+      this.shapeMapping.Add(shapeInfo, shape);
+
+      shape.OnEntityChange += new EventHandler<EntityEventArgs>(shape_OnEntityChange);
+      shapeInfo.Changed += new ChangedEventHandler(shapeInfo_Changed);
+    }
+
+    private void RemoveShapeInfo(IShapeInfo shapeInfo) {
+      IShape shape = this.shapeMapping.GetByFirst(shapeInfo);
+      shape.OnEntityChange -= new EventHandler<EntityEventArgs>(shape_OnEntityChange);
+      shapeInfo.Changed -= new ChangedEventHandler(shapeInfo_Changed);
+
+      this.shapeMapping.RemoveByFirst(shapeInfo);
+      if (this.graphVisualization.Controller.Model.Shapes.Contains(shape))
+        this.graphVisualization.Controller.Model.RemoveShape(shape);
+    }
+
+    private void shapeInfo_Changed(object sender, ChangedEventArgs e) {
+      IShapeInfo shapeInfo = (IShapeInfo)sender;
+      this.UpdateShape(shapeInfo);
+    }
+
+    private void shape_OnEntityChange(object sender, EntityEventArgs e) {
+      this.causedUpdateOfShapeInfo = true;
+      IShape shape = e.Entity as IShape;
+      IShapeInfo shapeInfo = this.shapeMapping.GetBySecond(shape);
+
+      shapeInfo.Location = shape.Location;
+      this.graphVisualization.Invalidate();
+      this.causedUpdateOfShapeInfo = false;
+    }
+
+    private void UpdateShape(IShapeInfo shapeInfo) {
+      if (!this.causedUpdateOfShapeInfo) {
+        IShape shape = this.shapeMapping.GetByFirst(shapeInfo);
+        shape.Location = shapeInfo.Location;
+      }
+    }
+
+    private void graphVisualization_OnEntityRemoved(object sender, EntityEventArgs e) {
+      IShape shape = (IShape)e.Entity;
+      if (this.shapeMapping.ContainsSecond(shape)) {
+        IShapeInfo shapeInfo = this.shapeMapping.GetBySecond(shape);
+        this.VisualizationInfo.RemoveShapeInfo(shapeInfo);
+      }
+    }
+
+
+
+
+    //protected override void OnContentChanged() {
+    //  base.OnContentChanged();
+    //  this.ClearGraph();
+
+    //  this.CreateGraph(null, new OperatorParameter(string.Empty, this.Content));
+    //  foreach (IShape shape in this.operatorShapeMapping.Values)
+    //    this.GraphModel.AddShape(shape);
+
+    //  foreach (IConnection connection in this.connectionMapping.Values)
+    //    this.GraphModel.AddConnection(connection);
+
+    //  if (this.Content == null)
+    //    this.graphVisualization.Controller.Model.LayoutRoot = null;
+    //  else
+    //    this.graphVisualization.Controller.Model.LayoutRoot = this.operatorShapeMapping[this.Content];
+    //  this.RelayoutOperatorGraph();
+    //}
+
+    //private void opParam_ValueChanged(object sender, EventArgs e) {
+    //  if (InvokeRequired)
+    //    Invoke(new EventHandler(opParam_ValueChanged), sender, e);
+    //  else {
+    //    this.OnContentChanged();
+    //  }
+    //}
+
+    //private void ClearGraph() {
+    //  this.GraphModel.Clear();
+    //  foreach (IValueParameter<IOperator> opParam in this.parameters)
+    //    opParam.ValueChanged -= opParam_ValueChanged;
+
+    //  this.operatorShapeMapping.Clear();
+    //  this.parameters.Clear();
+    //  this.connectionMapping.Clear();
+    //}
+
+
+
+    //private void CreateGraph(IOperator parent, IValueParameter<IOperator> op) {
+    //  if (op == null || op.Value == null)
+    //    return;
+
+    //  IShape shape;
+    //  if (!this.operatorShapeMapping.ContainsKey(op.Value)) {
+    //    //shape = GraphVisualizationInfo.CreateShape(op.Value);
+    //    //this.operatorShapeMapping[op.Value] = shape;
+
+    //    foreach (IParameter param in op.Value.Parameters) {
+    //      IValueParameter<IOperator> opParam = param as IValueParameter<IOperator>;
+    //      if (opParam != null) {
+    //        HandleOperatorParameter(opParam);
+    //        this.CreateGraph(op.Value, opParam);
+    //      }
+    //    }
+    //  }
+
+    //  if (parent != null) {
+    //    IShape from = this.operatorShapeMapping[parent];
+    //    IShape to = this.operatorShapeMapping[op.Value];
+    //    //IConnection connection = GraphVisualizationInfo.CreateConnection(from,to);
+    //    //this.connectionMapping[new KeyValuePair<IOperator, IValueParameter<IOperator>>(parent, op)] = connection;
+    //  }
+    //}
+
+    //private void DeleteGraph(IOperator parent, IValueParameter<IOperator> op) {
+
+    //}
+
+    //private void HandleOperatorParameter(IValueParameter<IOperator> opParam) {
+    //  if (opParam == null)
+    //    return;
+    //  opParam.ValueChanged += new EventHandler(opParam_ValueChanged);
+    //  parameters.Add(opParam);
+    //}
+
+    //private void Model_OnEntityRemoved(object sender, EntityEventArgs e) {
+    //  IShape shape = e.Entity as IShape;
+    //  if (shape != null) {
+    //    IOperator op = operatorShapeMapping.Where(os => os.Value == shape).First().Key;
+    //    if (op == this.Content)
+    //      this.Content = null;
+    //    else {
+    //      //clear all connections to the removed operator
+    //      IEnumerable<IValueParameter<IOperator>> parentOperator = this.connectionMapping.Where(cs => cs.Key.Value.Value == op).Select(x => x.Key.Value);
+    //      foreach (IValueParameter<IOperator> opParam in parentOperator.ToArray())
+    //        opParam.Value = null;
+
+    //      //remove connections from graph view
+    //      IEnumerable<IConnection> connections = this.connectionMapping.Where(cs => cs.Key.Value.Value == op).Select(x => x.Value);
+    //      foreach (IConnection connection in connections)
+    //        this.GraphModel.Remove(connection);
+
+    //      this.graphVisualization.Invalidate();
+    //    }
+
+
+    //  }
+    //}
+
+    #region methods for toolbar items
+
+    internal void RelayoutOperatorGraph() {
+      //if (this.operatorShapeMapping.Count > 0 && this.connectionMapping.Count > 0) { //otherwise the layout does not work
+      this.graphVisualization.Controller.RunActivity("Standard TreeLayout");
+      this.graphVisualization.Invalidate();
+      //}
+    }
+
+    internal void ActivateZoomAreaTool() {
+      this.graphVisualization.Controller.ActivateTool(ControllerBase.ZoomAreaToolName);
+    }
+
+    internal void ActivateZoomInTool() {
+      this.graphVisualization.Controller.ActivateTool(ControllerBase.ZoomInToolName);
+    }
+
+    internal void ActivateZoomOutTool() {
+      this.graphVisualization.Controller.ActivateTool(ControllerBase.ZoomOutToolName);
+    }
+
+    internal void ActivatePanTool() {
+      this.graphVisualization.Controller.ActivateTool(ControllerBase.PanToolName);
+    }
+
+    internal void ActivateSelectTool() {
+      this.graphVisualization.Controller.ActivateTool(ControllerBase.SelectionToolName);
+    }
+
+    #endregion
+
+    #region drag and drop
+    private void OperatorGraphView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      Type type = e.Data.GetData("Type") as Type;
+      if ((type != null) && (typeof(IOperator).IsAssignableFrom(type))) {
+        e.Effect = DragDropEffects.Copy;
+      }
+    }
+
+    private void OperatorGraphView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IOperator op = e.Data.GetData("Value") as IOperator;
+        IShapeInfo shapeInfo = ShapeInfoFactory.CreateShapeInfo(op);
+        Point controlCoordinates = this.PointToClient(new Point(e.X, e.Y));
+        PointF viewCoordinates = this.graphVisualization.Controller.View.DeviceToView(controlCoordinates);
+        shapeInfo.Location = new Point((int)viewCoordinates.X, (int)viewCoordinates.Y);
+        this.VisualizationInfo.AddShapeInfo(op, shapeInfo);
+      }
+    }
+
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.resx
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.resx	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/OperatorGraphView.resx	(revision 2853)
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <data name="graphVisualization.Document" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAHBOZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS0zLjAuMjY3Mi4xMjQ0
+        NiwgVmVyc2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1i
+        YTQ4OTYxZDZmNjVkY2VjBQEAAAAgTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuRG9jdW1lbnQDAAAAD0Rv
+        Y3VtZW50VmVyc2lvbgtJbmZvcm1hdGlvbgVNb2RlbAAEBAYrTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUu
+        RG9jdW1lbnRJbmZvcm1hdGlvbgIAAAAdTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuTW9kZWwCAAAAAgAA
+        AAAAAAAAAPA/CQMAAAAJBAAAAAUDAAAAK05ldHJvbi5EaWFncmFtbWluZy5Db3JlLkRvY3VtZW50SW5m
+        b3JtYXRpb24FAAAAE0RvY3VtZW50SW5mb1ZlcnNpb24GQXV0aG9yDENyZWF0aW9uRGF0ZQtEZXNjcmlw
+        dGlvbgVUaXRsZQABAAEBBg0CAAAAAAAAAAAA8D8GBQAAAAAArfOH/YHMCAkFAAAACQUAAAAFBAAAAB1O
+        ZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS5Nb2RlbAIAAAAMTW9kZWxWZXJzaW9uBVBhZ2VzAAQGuwFOZXRy
+        b24uRGlhZ3JhbW1pbmcuQ29yZS5Db2xsZWN0aW9uQmFzZWAxW1tOZXRyb24uRGlhZ3JhbW1pbmcuQ29y
+        ZS5JUGFnZSwgTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUtMy4wLjI2NzIuMTI0NDYsIFZlcnNpb249My4w
+        LjI2NzIuMTI0NDYsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YmE0ODk2MWQ2ZjY1ZGNl
+        Y11dAgAAAAIAAAAAAAAAAADwPwkGAAAABQYAAAC7AU5ldHJvbi5EaWFncmFtbWluZy5Db3JlLkNvbGxl
+        Y3Rpb25CYXNlYDFbW05ldHJvbi5EaWFncmFtbWluZy5Db3JlLklQYWdlLCBOZXRyb24uRGlhZ3JhbW1p
+        bmcuQ29yZS0zLjAuMjY3Mi4xMjQ0NiwgVmVyc2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1uZXV0
+        cmFsLCBQdWJsaWNLZXlUb2tlbj1iYTQ4OTYxZDZmNjVkY2VjXV0BAAAACUlubmVyTGlzdAO0AVN5c3Rl
+        bS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuSVBhZ2Us
+        IE5ldHJvbi5EaWFncmFtbWluZy5Db3JlLTMuMC4yNjcyLjEyNDQ2LCBWZXJzaW9uPTMuMC4yNjcyLjEy
+        NDQ2LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWJhNDg5NjFkNmY2NWRjZWNdXQIAAAAJ
+        BwAAAAQHAAAAtAFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW05ldHJvbi5EaWFncmFt
+        bWluZy5Db3JlLklQYWdlLCBOZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS0zLjAuMjY3Mi4xMjQ0NiwgVmVy
+        c2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iYTQ4OTYx
+        ZDZmNjVkY2VjXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAB9OZXRyb24uRGlhZ3JhbW1pbmcu
+        Q29yZS5JUGFnZVtdAgAAAAgICQgAAAABAAAAAQAAAAcIAAAAAAEAAAAEAAAABB1OZXRyb24uRGlhZ3Jh
+        bW1pbmcuQ29yZS5JUGFnZQIAAAAJCQAAAA0DDAoAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249Mi4w
+        LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQkAAAAc
+        TmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuUGFnZQYAAAALUGFnZVZlcnNpb24IQW1iaWVuY2UGTGF5ZXJz
+        BE5hbWUNTWFnbmlmaWNhdGlvbgZPcmlnaW4ABAQBBAQGIE5ldHJvbi5EaWFncmFtbWluZy5Db3JlLkFt
+        YmllbmNlAgAAALwBTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuQ29sbGVjdGlvbkJhc2VgMVtbTmV0cm9u
+        LkRpYWdyYW1taW5nLkNvcmUuSUxheWVyLCBOZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS0zLjAuMjY3Mi4x
+        MjQ0NiwgVmVyc2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tl
+        bj1iYTQ4OTYxZDZmNjVkY2VjXV0CAAAAFFN5c3RlbS5EcmF3aW5nLlNpemVGCgAAABRTeXN0ZW0uRHJh
+        d2luZy5Qb2ludAoAAAACAAAAAAAAAAAA8D8JCwAAAAkMAAAABg0AAAAMRGVmYXVsdCBQYWdlBfL///8U
+        U3lzdGVtLkRyYXdpbmcuU2l6ZUYCAAAABXdpZHRoBmhlaWdodAAACwsKAAAAAACOQgAAjkIF8f///xRT
+        eXN0ZW0uRHJhd2luZy5Qb2ludAIAAAABeAF5AAAICAoAAAAAAAAAAAAAAAULAAAAIE5ldHJvbi5EaWFn
+        cmFtbWluZy5Db3JlLkFtYmllbmNlCQAAAA9BbWJpZW5jZVZlcnNpb24PQmFja2dyb3VuZENvbG9yDkJh
+        Y2tncm91bmRUeXBlGEJhY2tncm91bmRHcmFkaWVudENvbG9yMRhCYWNrZ3JvdW5kR3JhZGllbnRDb2xv
+        cjITUGFnZUJhY2tncm91bmRDb2xvchJQYWdlQmFja2dyb3VuZFR5cGUcUGFnZUJhY2tncm91bmRHcmFk
+        aWVudENvbG9yMRxQYWdlQmFja2dyb3VuZEdyYWRpZW50Q29sb3IyAAQEBAQEBAQEBhRTeXN0ZW0uRHJh
+        d2luZy5Db2xvcgoAAAAtTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuQ2FudmFzQmFja2dyb3VuZFR5cGVz
+        AgAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgoAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IKAAAAFFN5c3Rl
+        bS5EcmF3aW5nLkNvbG9yCgAAAC1OZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS5DYW52YXNCYWNrZ3JvdW5k
+        VHlwZXMCAAAAFFN5c3RlbS5EcmF3aW5nLkNvbG9yCgAAABRTeXN0ZW0uRHJhd2luZy5Db2xvcgoAAAAC
+        AAAAAAAAAAAA8D8F8P///xRTeXN0ZW0uRHJhd2luZy5Db2xvcgQAAAAEbmFtZQV2YWx1ZQprbm93bkNv
+        bG9yBXN0YXRlAQAAAAkHBwoAAAAKAAAAAAAAAAA0AAEABe////8tTmV0cm9uLkRpYWdyYW1taW5nLkNv
+        cmUuQ2FudmFzQmFja2dyb3VuZFR5cGVzAQAAAAd2YWx1ZV9fAAgCAAAAAAAAAAHu////8P///woAAAAA
+        AAAAAAAAAAAB7f////D///8KAAAAAAAAAAAAAAAAAez////w////CgAAAAAAAAAApAABAAHr////7///
+        /wAAAAAB6v////D///8KAAAAAAAAAAAAAAAAAen////w////CgAAAAAAAAAAAAAAAAUMAAAAvAFOZXRy
+        b24uRGlhZ3JhbW1pbmcuQ29yZS5Db2xsZWN0aW9uQmFzZWAxW1tOZXRyb24uRGlhZ3JhbW1pbmcuQ29y
+        ZS5JTGF5ZXIsIE5ldHJvbi5EaWFncmFtbWluZy5Db3JlLTMuMC4yNjcyLjEyNDQ2LCBWZXJzaW9uPTMu
+        MC4yNjcyLjEyNDQ2LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWJhNDg5NjFkNmY2NWRj
+        ZWNdXQEAAAAJSW5uZXJMaXN0A7UBU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tOZXRy
+        b24uRGlhZ3JhbW1pbmcuQ29yZS5JTGF5ZXIsIE5ldHJvbi5EaWFncmFtbWluZy5Db3JlLTMuMC4yNjcy
+        LjEyNDQ2LCBWZXJzaW9uPTMuMC4yNjcyLjEyNDQ2LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv
+        a2VuPWJhNDg5NjFkNmY2NWRjZWNdXQIAAAAJGAAAAAQYAAAAtQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2Vu
+        ZXJpYy5MaXN0YDFbW05ldHJvbi5EaWFncmFtbWluZy5Db3JlLklMYXllciwgTmV0cm9uLkRpYWdyYW1t
+        aW5nLkNvcmUtMy4wLjI2NzIuMTI0NDYsIFZlcnNpb249My4wLjI2NzIuMTI0NDYsIEN1bHR1cmU9bmV1
+        dHJhbCwgUHVibGljS2V5VG9rZW49YmE0ODk2MWQ2ZjY1ZGNlY11dAwAAAAZfaXRlbXMFX3NpemUIX3Zl
+        cnNpb24EAAAgTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuSUxheWVyW10CAAAACAgJGQAAAAEAAAABAAAA
+        BxkAAAAAAQAAAAQAAAAEHk5ldHJvbi5EaWFncmFtbWluZy5Db3JlLklMYXllcgIAAAAJGgAAAA0DBRoA
+        AAAdTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuTGF5ZXIEAAAADExheWVyVmVyc2lvbgROYW1lCUlzVmlz
+        aWJsZQhFbnRpdGllcwABAAQGAcQBTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuQ29sbGVjdGlvbkJhc2Vg
+        MVtbTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuSURpYWdyYW1FbnRpdHksIE5ldHJvbi5EaWFncmFtbWlu
+        Zy5Db3JlLTMuMC4yNjcyLjEyNDQ2LCBWZXJzaW9uPTMuMC4yNjcyLjEyNDQ2LCBDdWx0dXJlPW5ldXRy
+        YWwsIFB1YmxpY0tleVRva2VuPWJhNDg5NjFkNmY2NWRjZWNdXQIAAAACAAAAAAAAAAAA8D8GGwAAAA1E
+        ZWZhdWx0IExheWVyAQkcAAAABRwAAADEAU5ldHJvbi5EaWFncmFtbWluZy5Db3JlLkNvbGxlY3Rpb25C
+        YXNlYDFbW05ldHJvbi5EaWFncmFtbWluZy5Db3JlLklEaWFncmFtRW50aXR5LCBOZXRyb24uRGlhZ3Jh
+        bW1pbmcuQ29yZS0zLjAuMjY3Mi4xMjQ0NiwgVmVyc2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1u
+        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iYTQ4OTYxZDZmNjVkY2VjXV0BAAAACUlubmVyTGlzdAO9AVN5
+        c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbTmV0cm9uLkRpYWdyYW1taW5nLkNvcmUuSURp
+        YWdyYW1FbnRpdHksIE5ldHJvbi5EaWFncmFtbWluZy5Db3JlLTMuMC4yNjcyLjEyNDQ2LCBWZXJzaW9u
+        PTMuMC4yNjcyLjEyNDQ2LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWJhNDg5NjFkNmY2
+        NWRjZWNdXQIAAAAJHQAAAAQdAAAAvQFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW05l
+        dHJvbi5EaWFncmFtbWluZy5Db3JlLklEaWFncmFtRW50aXR5LCBOZXRyb24uRGlhZ3JhbW1pbmcuQ29y
+        ZS0zLjAuMjY3Mi4xMjQ0NiwgVmVyc2lvbj0zLjAuMjY3Mi4xMjQ0NiwgQ3VsdHVyZT1uZXV0cmFsLCBQ
+        dWJsaWNLZXlUb2tlbj1iYTQ4OTYxZDZmNjVkY2VjXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQA
+        AChOZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS5JRGlhZ3JhbUVudGl0eVtdAgAAAAgICR4AAAAAAAAAAAAA
+        AAceAAAAAAEAAAAAAAAABCZOZXRyb24uRGlhZ3JhbW1pbmcuQ29yZS5JRGlhZ3JhbUVudGl0eQIAAAAL
+</value>
+  </data>
+  <data name="graphVisualization.PageSettings" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0yLjAuMC4wLCBDdWx0
+        dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACRTeXN0ZW0uRHJh
+        d2luZy5QcmludGluZy5QYWdlU2V0dGluZ3MHAAAAD3ByaW50ZXJTZXR0aW5ncwVjb2xvcglwYXBlclNp
+        emULcGFwZXJTb3VyY2URcHJpbnRlclJlc29sdXRpb24JbGFuZHNjYXBlB21hcmdpbnMEBAQEBAQEJ1N5
+        c3RlbS5EcmF3aW5nLlByaW50aW5nLlByaW50ZXJTZXR0aW5ncwIAAAAgU3lzdGVtLkRyYXdpbmcuUHJp
+        bnRpbmcuVHJpU3RhdGUCAAAAIVN5c3RlbS5EcmF3aW5nLlByaW50aW5nLlBhcGVyU2l6ZQIAAAAjU3lz
+        dGVtLkRyYXdpbmcuUHJpbnRpbmcuUGFwZXJTb3VyY2UCAAAAKVN5c3RlbS5EcmF3aW5nLlByaW50aW5n
+        LlByaW50ZXJSZXNvbHV0aW9uAgAAACBTeXN0ZW0uRHJhd2luZy5QcmludGluZy5UcmlTdGF0ZQIAAAAf
+        U3lzdGVtLkRyYXdpbmcuUHJpbnRpbmcuTWFyZ2lucwIAAAACAAAACQMAAAAF/P///yBTeXN0ZW0uRHJh
+        d2luZy5QcmludGluZy5UcmlTdGF0ZQEAAAAFdmFsdWUAAgIAAAAACQUAAAAKCgH6/////P///wIJBwAA
+        AAUDAAAAJ1N5c3RlbS5EcmF3aW5nLlByaW50aW5nLlByaW50ZXJTZXR0aW5ncxIAAAALcHJpbnRlck5h
+        bWUKZHJpdmVyTmFtZQpvdXRwdXRQb3J0C3ByaW50VG9GaWxlFHByaW50RGlhbG9nRGlzcGxheWVkCmV4
+        dHJhYnl0ZXMJZXh0cmFpbmZvBmNvcGllcwZkdXBsZXgHY29sbGF0ZRNkZWZhdWx0UGFnZVNldHRpbmdz
+        CGZyb21QYWdlBnRvUGFnZQdtYXhQYWdlB21pblBhZ2UKcHJpbnRSYW5nZQxkZXZtb2RlYnl0ZXMNY2Fj
+        aGVkRGV2bW9kZQEBAQAAAAcABAQEAAAAAAQABwEBBwIHHlN5c3RlbS5EcmF3aW5nLlByaW50aW5nLkR1
+        cGxleAIAAAAgU3lzdGVtLkRyYXdpbmcuUHJpbnRpbmcuVHJpU3RhdGUCAAAAJFN5c3RlbS5EcmF3aW5n
+        LlByaW50aW5nLlBhZ2VTZXR0aW5ncwIAAAAICAgIIlN5c3RlbS5EcmF3aW5nLlByaW50aW5nLlByaW50
+        UmFuZ2UCAAAABwICAAAACgYIAAAAAAkIAAAAAAAAAAr//wX3////HlN5c3RlbS5EcmF3aW5nLlByaW50
+        aW5nLkR1cGxleAEAAAAHdmFsdWVfXwAIAgAAAP////8B9v////z///8ACQsAAAAAAAAAAAAAAA8nAAAA
+        AAAABfT///8iU3lzdGVtLkRyYXdpbmcuUHJpbnRpbmcuUHJpbnRSYW5nZQEAAAAHdmFsdWVfXwAIAgAA
+        AAAAAAAAAAoFBQAAACFTeXN0ZW0uRHJhd2luZy5QcmludGluZy5QYXBlclNpemUFAAAABGtpbmQEbmFt
+        ZQV3aWR0aAZoZWlnaHQbY3JlYXRlZEJ5RGVmYXVsdENvbnN0cnVjdG9yBAEAAAAhU3lzdGVtLkRyYXdp
+        bmcuUHJpbnRpbmcuUGFwZXJLaW5kAgAAAAgIAQIAAAAF8////yFTeXN0ZW0uRHJhd2luZy5QcmludGlu
+        Zy5QYXBlcktpbmQBAAAAB3ZhbHVlX18ACAIAAAAAAAAABg4AAAAGTGV0dGVyUgMAAEwEAAAABQcAAAAf
+        U3lzdGVtLkRyYXdpbmcuUHJpbnRpbmcuTWFyZ2lucwQAAAAEbGVmdAVyaWdodAN0b3AGYm90dG9tAAAA
+        AAgICAgCAAAAZAAAAGQAAABkAAAAZAAAAAELAAAAAQAAAAkDAAAAAfD////8////AAoKCgHv/////P//
+        /wAJEgAAAAESAAAABwAAAGQAAABkAAAAZAAAAGQAAAAL
+</value>
+  </data>
+</root>
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/PanToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/PanToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/PanToolBarItem.cs	(revision 2853)
@@ -42,9 +42,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.ActivatePanTool();
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/RelayoutToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/RelayoutToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/RelayoutToolBarItem.cs	(revision 2853)
@@ -40,9 +40,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.RelayoutOperatorGraph();
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/SelectToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/SelectToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/SelectToolBarItem.cs	(revision 2853)
@@ -42,9 +42,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.ActivateSelectTool();
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ToolBarItemSeparator.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ToolBarItemSeparator.cs	(revision 2853)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ToolBarItemSeparator.cs	(revision 2853)
@@ -0,0 +1,28 @@
+﻿#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.Operators.Views.GraphVisualization {
+  internal class ToolBarItemSeparator : HeuristicLab.MainForm.ToolBarSeparatorItem, HeuristicLab.Optimizer.IOptimizerUserInterfaceItemProvider {
+    public override int Position {
+      get { return 100; }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomInToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomInToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomInToolBarItem.cs	(revision 2853)
@@ -42,9 +42,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.ActivateZoomInTool();
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomOutToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomOutToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomOutToolBarItem.cs	(revision 2853)
@@ -42,9 +42,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.ActivateZoomOutTool();
Index: trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomToolBarItem.cs
===================================================================
--- trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomToolBarItem.cs	(revision 2852)
+++ trunk/sources/HeuristicLab.Operators.Views.GraphVisualization/3.3/ToolBarItems/ZoomToolBarItem.cs	(revision 2853)
@@ -42,9 +42,9 @@
     protected override void OnActiveViewChanged(object sender, System.EventArgs e) {
       base.OnActiveViewChanged(sender, e);
-      this.ToolStripItem.Visible = MainFormManager.MainForm.ActiveView is OperatorGraphVisualizationView;
+      this.ToolStripItem.Enabled = MainFormManager.MainForm.ActiveView is OperatorGraphView;
     }
 
     public override void Execute() {
-      OperatorGraphVisualizationView view = MainFormManager.MainForm.ActiveView as OperatorGraphVisualizationView;
+      OperatorGraphView view = MainFormManager.MainForm.ActiveView as OperatorGraphView;
       if (view != null)
         view.ActivateZoomAreaTool();
