Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.Designer.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.Designer.cs	(revision 11449)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Networks.Views {
+  partial class EntitySelector {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.treeView = new System.Windows.Forms.TreeView();
+      this.SuspendLayout();
+      // 
+      // treeView
+      // 
+      this.treeView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.treeView.Location = new System.Drawing.Point(0, 0);
+      this.treeView.Name = "treeView";
+      this.treeView.Size = new System.Drawing.Size(345, 288);
+      this.treeView.TabIndex = 0;
+      this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect);
+      // 
+      // EntitySelector
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.treeView);
+      this.Name = "EntitySelector";
+      this.Size = new System.Drawing.Size(345, 288);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TreeView treeView;
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelector.cs	(revision 11449)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  public partial class EntitySelector : UserControl {
+    private IEntity root;
+    public IEntity Root {
+      get { return root; }
+      set {
+        root = value;
+        PopulateTreeView();
+      }
+    }
+    private IEntity selectedEntity;
+    public IEntity SelectedEntity {
+      get {
+        return selectedEntity;
+      }
+      private set {
+        if (selectedEntity != value) {
+          selectedEntity = value;
+          OnSelectedEntityChanged();
+        }
+      }
+    }
+    public TreeView EntitiesTreeView {
+      get { return treeView; }
+    }
+
+    public EntitySelector() {
+      InitializeComponent();
+    }
+    public EntitySelector(IEntity root) : this() {
+      Root = root;
+    }
+
+    public event EventHandler SelectedEntityChanged;
+    protected virtual void OnSelectedEntityChanged() {
+      var handler = SelectedEntityChanged;
+      if (handler != null) SelectedEntityChanged(this, EventArgs.Empty);
+    }
+
+
+    private void PopulateTreeView() {
+      treeView.Nodes.Clear();
+      treeView.Nodes.Add(CreateTreeNode(Root));
+    }
+    private TreeNode CreateTreeNode(IEntity entity) {
+      if (entity == null)
+        return new TreeNode("null");
+      else {
+        TreeNode node = new TreeNode(entity.Name);
+        node.Tag = entity;
+        foreach (var child in entity.Children)
+          node.Nodes.Add(CreateTreeNode(child));
+        return node;
+      }
+    }
+
+    private void treeView_AfterSelect(object sender, TreeViewEventArgs e) {
+      if (treeView.SelectedNode != null)
+        SelectedEntity = (IEntity)treeView.SelectedNode.Tag;
+      else
+        SelectedEntity = null;
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.Designer.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.Designer.cs	(revision 11449)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Networks.Views {
+  partial class EntitySelectorDialog {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.entitySelector = new HeuristicLab.Optimization.Networks.Views.EntitySelector();
+      this.SuspendLayout();
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(320, 409);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 0;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(401, 409);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 0;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // entitySelector
+      // 
+      this.entitySelector.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.entitySelector.Location = new System.Drawing.Point(12, 12);
+      this.entitySelector.Name = "entitySelector";
+      this.entitySelector.Root = null;
+      this.entitySelector.Size = new System.Drawing.Size(464, 391);
+      this.entitySelector.TabIndex = 1;
+      this.entitySelector.SelectedEntityChanged += new System.EventHandler(this.entitySelector_SelectedEntityChanged);
+      // 
+      // EntitySelectorDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(488, 444);
+      this.Controls.Add(this.entitySelector);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "EntitySelectorDialog";
+      this.ShowIcon = false;
+      this.ShowInTaskbar = false;
+      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+      this.Text = "Select Entity";
+      this.Load += new System.EventHandler(this.EntitySelectorDialog_Load);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button okButton;
+    protected System.Windows.Forms.Button cancelButton;
+    protected EntitySelector entitySelector;
+
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntitySelectorDialog.cs	(revision 11449)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  public partial class EntitySelectorDialog : Form {
+    public string Caption {
+      get { return Text; }
+      set {
+        if (InvokeRequired)
+          Invoke(new Action<string>(s => { Caption = s; }), value);
+        else
+          Text = value;
+      }
+    }
+    public EntitySelector EntitySelector {
+      get { return entitySelector; }
+    }
+
+    public EntitySelectorDialog() {
+      InitializeComponent();
+      okButton.Enabled = entitySelector.SelectedEntity != null;
+    }
+    protected virtual void EntitySelectorDialog_Load(object sender, EventArgs e) {
+      this.entitySelector.EntitiesTreeView.DoubleClick += new System.EventHandler(EntitiesTreeView_DoubleClick);
+    }
+    protected virtual void entitySelector_SelectedEntityChanged(object sender, EventArgs e) {
+      okButton.Enabled = entitySelector.SelectedEntity != null;
+    }
+    protected virtual void EntitiesTreeView_DoubleClick(object sender, System.EventArgs e) {
+      if (entitySelector.SelectedEntity != null) {
+        DialogResult = DialogResult.OK;
+        Close();
+      }
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.Designer.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.Designer.cs	(revision 11449)
@@ -0,0 +1,77 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Networks.Views {
+  partial class EntityView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(69, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(551, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(626, 3);
+      // 
+      // EntityView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "EntityView";
+      this.Size = new System.Drawing.Size(645, 517);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+
+
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/EntityView.cs	(revision 11449)
@@ -0,0 +1,63 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("Entity View")]
+  [Content(typeof(Entity), true)]
+  [Content(typeof(IEntity), false)]
+  public partial class EntityView : NamedItemView {
+    public new IEntity Content {
+      get { return (IEntity)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EntityView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PathChanged -= Content_PathChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PathChanged += Content_PathChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      toolTip.SetToolTip(nameTextBox, Content != null ? Content.Path : string.Empty);
+    }
+
+    protected virtual void Content_PathChanged(object sender, System.EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_PathChanged), sender, e);
+      else {
+        toolTip.SetToolTip(nameTextBox, Content != null ? Content.Path : string.Empty);
+      }
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11449)
@@ -85,4 +85,22 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="EntitySelector.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EntitySelector.Designer.cs">
+      <DependentUpon>EntitySelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EntitySelectorDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="EntitySelectorDialog.Designer.cs">
+      <DependentUpon>EntitySelectorDialog.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EntityView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EntityView.Designer.cs">
+      <DependentUpon>EntityView.cs</DependentUpon>
+    </Compile>
     <Compile Include="PortView.cs">
       <SubType>UserControl</SubType>
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.Designer.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.Designer.cs	(revision 11449)
@@ -27,15 +27,4 @@
     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
 
@@ -45,5 +34,8 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputPortView));
       this.outputPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setOutputPortButton = new System.Windows.Forms.Button();
+      this.clearOutputPortButton = new System.Windows.Forms.Button();
       this.outputPortView = new HeuristicLab.Optimization.Networks.Views.PortView();
       this.valueGroupBox.SuspendLayout();
@@ -55,20 +47,15 @@
       // valueGroupBox
       // 
-      this.valueGroupBox.Location = new System.Drawing.Point(0, 129);
-      this.valueGroupBox.Size = new System.Drawing.Size(645, 388);
-      this.valueGroupBox.TabIndex = 6;
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 82);
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 435);
+      this.valueGroupBox.TabIndex = 4;
       // 
       // valuePanel
       // 
-      this.valuePanel.Size = new System.Drawing.Size(633, 363);
+      this.valuePanel.Size = new System.Drawing.Size(633, 410);
       // 
       // valueViewHost
       // 
-      this.valueViewHost.Size = new System.Drawing.Size(633, 363);
-      // 
-      // pathTextBox
-      // 
-      this.pathTextBox.Location = new System.Drawing.Point(71, 26);
-      this.pathTextBox.Size = new System.Drawing.Size(549, 20);
+      this.valueViewHost.Size = new System.Drawing.Size(633, 410);
       // 
       // nameTextBox
@@ -83,25 +70,50 @@
       this.outputPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
             | System.Windows.Forms.AnchorStyles.Right)));
+      this.outputPortGroupBox.Controls.Add(this.setOutputPortButton);
+      this.outputPortGroupBox.Controls.Add(this.clearOutputPortButton);
       this.outputPortGroupBox.Controls.Add(this.outputPortView);
-      this.outputPortGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.outputPortGroupBox.Location = new System.Drawing.Point(0, 26);
       this.outputPortGroupBox.Name = "outputPortGroupBox";
-      this.outputPortGroupBox.Size = new System.Drawing.Size(645, 71);
-      this.outputPortGroupBox.TabIndex = 5;
+      this.outputPortGroupBox.Size = new System.Drawing.Size(645, 50);
+      this.outputPortGroupBox.TabIndex = 3;
       this.outputPortGroupBox.TabStop = false;
       this.outputPortGroupBox.Text = "&Output Port";
-      this.outputPortGroupBox.DragDrop += new System.Windows.Forms.DragEventHandler(this.outputPortGroupBox_DragDrop);
-      this.outputPortGroupBox.DragEnter += new System.Windows.Forms.DragEventHandler(this.outputPortGroupBox_DragEnterOver);
-      this.outputPortGroupBox.DragOver += new System.Windows.Forms.DragEventHandler(this.outputPortGroupBox_DragEnterOver);
+      // 
+      // setOutputPortButton
+      // 
+      this.setOutputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setOutputPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setOutputPortButton.Name = "setOutputPortButton";
+      this.setOutputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setOutputPortButton.TabIndex = 0;
+      this.setOutputPortButton.UseVisualStyleBackColor = true;
+      this.setOutputPortButton.Click += new System.EventHandler(this.setOutputPortButton_Click);
+      // 
+      // clearOutputPortButton
+      // 
+      this.clearOutputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearOutputPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearOutputPortButton.Name = "clearOutputPortButton";
+      this.clearOutputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearOutputPortButton.TabIndex = 1;
+      this.clearOutputPortButton.UseVisualStyleBackColor = true;
+      this.clearOutputPortButton.Click += new System.EventHandler(this.clearOutputPortButton_Click);
       // 
       // outputPortView
       // 
-      this.outputPortView.Caption = "Port View";
+      this.outputPortView.AllowDrop = true;
+      this.outputPortView.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.outputPortView.Caption = "Output Port View";
       this.outputPortView.Content = null;
-      this.outputPortView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.outputPortView.Location = new System.Drawing.Point(3, 16);
+      this.outputPortView.Location = new System.Drawing.Point(66, 21);
       this.outputPortView.Name = "outputPortView";
       this.outputPortView.ReadOnly = true;
-      this.outputPortView.Size = new System.Drawing.Size(639, 52);
-      this.outputPortView.TabIndex = 0;
+      this.outputPortView.Size = new System.Drawing.Size(573, 23);
+      this.outputPortView.TabIndex = 2;
+      this.outputPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragDrop);
+      this.outputPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragEnterOver);
+      this.outputPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.outputPortView_DragEnterOver);
       // 
       // InputPortView
@@ -110,6 +122,4 @@
       this.Controls.Add(this.outputPortGroupBox);
       this.Name = "InputPortView";
-      this.Controls.SetChildIndex(this.pathLabel, 0);
-      this.Controls.SetChildIndex(this.pathTextBox, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
@@ -130,4 +140,6 @@
     protected System.Windows.Forms.GroupBox outputPortGroupBox;
     protected PortView outputPortView;
+    protected System.Windows.Forms.Button clearOutputPortButton;
+    protected System.Windows.Forms.Button setOutputPortButton;
 
 
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11449)
@@ -30,4 +30,6 @@
   [Content(typeof(IInputPort), false)]
   public partial class InputPortView : ValuePortView {
+    protected EntitySelectorDialog entitySelectorDialog;
+
     public new IInputPort Content {
       get { return (IInputPort)base.Content; }
@@ -37,4 +39,12 @@
     public InputPortView() {
       InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (entitySelectorDialog != null) entitySelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
     }
 
@@ -56,4 +66,6 @@
       base.SetEnabledStateOfControls();
       outputPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setOutputPortButton.Enabled = Content != null && !ReadOnly;
+      clearOutputPortButton.Enabled = Content != null && Content.OutputPort != null && !ReadOnly;
     }
 
@@ -62,9 +74,29 @@
         Invoke(new EventHandler(Content_OutputPortChanged), sender, e);
       else {
+        clearOutputPortButton.Enabled = Content.OutputPort != null && !ReadOnly;
         outputPortView.Content = Content.OutputPort;
       }
     }
 
-    protected virtual void outputPortGroupBox_DragEnterOver(object sender, DragEventArgs e) {
+    protected virtual void setOutputPortButton_Click(object sender, EventArgs e) {
+      if (entitySelectorDialog == null) {
+        entitySelectorDialog = new EntitySelectorDialog();
+        entitySelectorDialog.Caption = "Select Output Port";
+      }
+
+      IEntity root = Content;
+      while (root.Parent != null)
+        root = root.Parent;
+      entitySelectorDialog.EntitySelector.Root = root;
+
+      if (entitySelectorDialog.ShowDialog(this) == DialogResult.OK) {
+        Content.OutputPort = entitySelectorDialog.EntitySelector.SelectedEntity as IOutputPort;
+      }
+    }
+    protected virtual void clearOutputPortButton_Click(object sender, EventArgs e) {
+      Content.OutputPort = null;
+    }
+
+    protected virtual void outputPortView_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
       if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IOutputPort)) {
@@ -72,5 +104,5 @@
       }
     }
-    protected virtual void outputPortGroupBox_DragDrop(object sender, DragEventArgs e) {
+    protected virtual void outputPortView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
         IOutputPort port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IOutputPort;
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NetworkView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NetworkView.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NetworkView.cs	(revision 11449)
@@ -28,5 +28,5 @@
   [Content(typeof(Network), true)]
   [Content(typeof(INetwork), false)]
-  public partial class NetworkView : NamedItemView {
+  public partial class NetworkView : EntityView {
     public new INetwork Content {
       get { return (INetwork)base.Content; }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs	(revision 11449)
@@ -28,5 +28,5 @@
   [Content(typeof(Node), true)]
   [Content(typeof(INode), false)]
-  public partial class NodeView : NamedItemView {
+  public partial class NodeView : EntityView {
     public new INode Content {
       get { return (INode)base.Content; }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.Designer.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.Designer.cs	(revision 11449)
@@ -45,6 +45,4 @@
     /// </summary>
     private void InitializeComponent() {
-      this.pathLabel = new System.Windows.Forms.Label();
-      this.pathTextBox = new System.Windows.Forms.TextBox();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -54,42 +52,9 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      this.nameTextBox.Location = new System.Drawing.Point(69, 0);
-      this.nameTextBox.Size = new System.Drawing.Size(551, 20);
-      // 
-      // infoLabel
-      // 
-      this.infoLabel.Location = new System.Drawing.Point(626, 3);
-      // 
-      // pathLabel
-      // 
-      this.pathLabel.AutoSize = true;
-      this.pathLabel.Location = new System.Drawing.Point(3, 29);
-      this.pathLabel.Name = "pathLabel";
-      this.pathLabel.Size = new System.Drawing.Size(32, 13);
-      this.pathLabel.TabIndex = 3;
-      this.pathLabel.Text = "&Path:";
-      // 
-      // pathTextBox
-      // 
-      this.pathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.pathTextBox.Location = new System.Drawing.Point(69, 26);
-      this.pathTextBox.Name = "pathTextBox";
-      this.pathTextBox.ReadOnly = true;
-      this.pathTextBox.Size = new System.Drawing.Size(551, 20);
-      this.pathTextBox.TabIndex = 4;
       // 
       // PortView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.pathTextBox);
-      this.Controls.Add(this.pathLabel);
       this.Name = "PortView";
-      this.Size = new System.Drawing.Size(645, 517);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      this.Controls.SetChildIndex(this.pathLabel, 0);
-      this.Controls.SetChildIndex(this.pathTextBox, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
@@ -100,6 +65,4 @@
     #endregion
 
-    protected System.Windows.Forms.Label pathLabel;
-    protected System.Windows.Forms.TextBox pathTextBox;
 
 
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortView.cs	(revision 11449)
@@ -29,5 +29,5 @@
   [Content(typeof(Port), true)]
   [Content(typeof(IPort), false)]
-  public partial class PortView : NamedItemView {
+  public partial class PortView : EntityView {
     public new IPort Content {
       get { return (IPort)base.Content; }
@@ -39,29 +39,10 @@
     }
 
-    protected override void DeregisterContentEvents() {
-      Content.PathChanged -= Content_PathChanged;
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.PathChanged += Content_PathChanged;
-    }
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      pathTextBox.Text = Content == null ? string.Empty : Content.Path;
     }
 
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      pathTextBox.Enabled = Content != null;
-    }
-
-    protected virtual void Content_PathChanged(object sender, System.EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_PathChanged), sender, e);
-      else {
-        pathTextBox.Text = Content.Path;
-      }
     }
   }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ValuePortView.Designer.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ValuePortView.Designer.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ValuePortView.Designer.cs	(revision 11449)
@@ -64,8 +64,8 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.valueGroupBox.Controls.Add(this.valuePanel);
-      this.valueGroupBox.Location = new System.Drawing.Point(0, 52);
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 26);
       this.valueGroupBox.Name = "valueGroupBox";
-      this.valueGroupBox.Size = new System.Drawing.Size(645, 465);
-      this.valueGroupBox.TabIndex = 5;
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 491);
+      this.valueGroupBox.TabIndex = 3;
       this.valueGroupBox.TabStop = false;
       this.valueGroupBox.Text = "Value";
@@ -79,5 +79,5 @@
       this.valuePanel.Location = new System.Drawing.Point(6, 19);
       this.valuePanel.Name = "valuePanel";
-      this.valuePanel.Size = new System.Drawing.Size(633, 440);
+      this.valuePanel.Size = new System.Drawing.Size(633, 466);
       this.valuePanel.TabIndex = 0;
       // 
@@ -91,5 +91,5 @@
       this.valueViewHost.Name = "valueViewHost";
       this.valueViewHost.ReadOnly = false;
-      this.valueViewHost.Size = new System.Drawing.Size(633, 440);
+      this.valueViewHost.Size = new System.Drawing.Size(633, 466);
       this.valueViewHost.TabIndex = 0;
       this.valueViewHost.ViewsLabelVisible = true;
@@ -101,6 +101,4 @@
       this.Controls.Add(this.valueGroupBox);
       this.Name = "ValuePortView";
-      this.Controls.SetChildIndex(this.pathLabel, 0);
-      this.Controls.SetChildIndex(this.pathTextBox, 0);
       this.Controls.SetChildIndex(this.nameLabel, 0);
       this.Controls.SetChildIndex(this.nameTextBox, 0);
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Entity.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Entity.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Entity.cs	(revision 11449)
@@ -0,0 +1,98 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("Entity", "Abstract base class for entities of an optimization network.")]
+  [StorableClass]
+  public abstract class Entity : NamedItem, IEntity {
+    public static readonly string PathSeparator = " => ";
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Class; }
+    }
+
+    private IEntity parent;
+    public IEntity Parent {
+      get { return parent; }
+      protected set {
+        if (value != parent) {
+          DeregisterParentEvents();
+          parent = value;
+          RegisterParentEvents();
+          OnPathChanged();
+        }
+      }
+    }
+    public virtual IEnumerable<IEntity> Children {
+      get { return Enumerable.Empty<IEntity>(); }
+    }
+    public string Path {
+      get {
+        return parent != null ? parent.Path + PathSeparator + Name : Name;
+      }
+    }
+
+    [StorableConstructor]
+    protected Entity(bool deserializing) : base(deserializing) { }
+    protected Entity(Entity original, Cloner cloner) : base(original, cloner) { }
+    protected Entity() : base("Entity") { }
+    protected Entity(string name) : base(name) { }
+    protected Entity(string name, string description) : base(name, description) { }
+
+    protected override void OnNameChanging(CancelEventArgs<string> e) {
+      base.OnNameChanging(e);
+      e.Cancel = e.Cancel || e.Value.Contains(PathSeparator);
+    }
+    protected override void OnNameChanged() {
+      base.OnNameChanged();
+      OnPathChanged();
+    }
+
+    public event EventHandler PathChanged;
+    protected virtual void OnPathChanged() {
+      var handler = PathChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #region Parent Events
+    protected virtual void RegisterParentEvents() {
+      if (parent != null) {
+        parent.PathChanged += Parent_PathChanged;
+      }
+    }
+    protected virtual void DeregisterParentEvents() {
+      if (parent != null) {
+        parent.PathChanged -= Parent_PathChanged;
+      }
+    }
+    void Parent_PathChanged(object sender, EventArgs e) {
+      OnPathChanged();
+    }
+    #endregion
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11449)
@@ -84,6 +84,8 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="IEntity.cs" />
     <Compile Include="IPort.cs" />
     <Compile Include="IVariablesNode.cs" />
+    <Compile Include="Entity.cs" />
     <Compile Include="Port.cs" />
     <Compile Include="VariablesNode.cs" />
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IEntity.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IEntity.cs	(revision 11449)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IEntity.cs	(revision 11449)
@@ -0,0 +1,33 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Core;
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IEntity : INamedItem {
+    IEntity Parent { get; }
+    IEnumerable<IEntity> Children { get; }
+    string Path { get; }
+    event EventHandler PathChanged;
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/INode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/INode.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/INode.cs	(revision 11449)
@@ -24,5 +24,6 @@
 
 namespace HeuristicLab.Optimization.Networks {
-  public interface INode : INamedItem {
+  public interface INode : IEntity {
+    new INetwork Parent { get; set; }
     IKeyedItemCollection<string, IPort> Ports { get; }
   }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11449)
@@ -24,9 +24,6 @@
 
 namespace HeuristicLab.Optimization.Networks {
-  public interface IPort : INamedItem {
-    INode Parent { get; set; }
-    string Path { get; }
-
-    event EventHandler PathChanged;
+  public interface IPort : IEntity {
+    new INode Parent { get; set; }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Network.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Network.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Network.cs	(revision 11449)
@@ -23,5 +23,7 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 using System.Drawing;
+using System.Linq;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -34,4 +36,8 @@
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    public override IEnumerable<IEntity> Children {
+      get { return base.Children.Concat(Nodes.AsEnumerable<IEntity>()); }
     }
 
@@ -47,16 +53,29 @@
       : base(original, cloner) {
       nodes = cloner.Clone(original.nodes);
+      foreach (var n in Nodes)
+        n.Parent = this;
+      RegisterNodesEvents();
     }
     public Network()
       : base("Network") {
       nodes = new NodeCollection();
+      RegisterNodesEvents();
     }
     public Network(string name)
       : base(name) {
       nodes = new NodeCollection();
+      RegisterNodesEvents();
     }
     public Network(string name, string description)
       : base(name, description) {
       nodes = new NodeCollection();
+      RegisterNodesEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var n in Nodes)
+        n.Parent = this;
+      RegisterNodesEvents();
     }
 
@@ -64,4 +83,33 @@
       return new Network(this, cloner);
     }
+
+    #region Nodes Events
+    protected virtual void RegisterNodesEvents() {
+      nodes.ItemsAdded += Nodes_ItemsAdded;
+      nodes.ItemsRemoved += Nodes_ItemsRemoved;
+      nodes.ItemsReplaced += Nodes_ItemsReplaced;
+      nodes.CollectionReset += Nodes_CollectionReset;
+    }
+    protected virtual void Nodes_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    protected virtual void Nodes_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.Items)
+        n.Parent = null;
+    }
+    protected virtual void Nodes_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.OldItems)
+        n.Parent = null;
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    protected virtual void Nodes_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<INode> e) {
+      foreach (var n in e.OldItems)
+        n.Parent = null;
+      foreach (var n in e.Items)
+        n.Parent = this;
+    }
+    #endregion
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs	(revision 11449)
@@ -25,11 +25,24 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace HeuristicLab.Optimization.Networks {
   [Item("Node", "A node of an optimization network.")]
   [StorableClass]
-  public class Node : NamedItem, INode {
+  public class Node : Entity, INode {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+
+    new public INetwork Parent {
+      get { return (INetwork)base.Parent; }
+      set {
+        // NOTE: never call setter directly as the Parent property is set by the network which contains the node
+        base.Parent = value;
+      }
+    }
+    public override IEnumerable<IEntity> Children {
+      get { return base.Children.Concat(Ports.AsEnumerable<IEntity>()); }
     }
 
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11438)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11449)
@@ -29,25 +29,14 @@
   [Item("Port", "Abstract base class for ports of an optimization network node.")]
   [StorableClass]
-  public abstract class Port : NamedItem, IPort {
+  public abstract class Port : Entity, IPort {
     public static new Image StaticItemImage {
       get { return HeuristicLab.Common.Resources.VSImageLibrary.Field; }
     }
 
-    private INode parent;
-    public INode Parent {
-      get { return parent; }
+    new public INode Parent {
+      get { return (INode)base.Parent; }
       set {
         // NOTE: never call setter directly as the Parent property is set by the node which contains the port
-        if (value != parent) {
-          DeregisterParentEvents();
-          parent = value;
-          RegisterParentEvents();
-          OnPathChanged();
-        }
-      }
-    }
-    public string Path {
-      get {
-        return parent != null ? parent.Name : string.Empty;
+        base.Parent = value;
       }
     }
@@ -59,26 +48,4 @@
     protected Port(string name) : base(name) { }
     protected Port(string name, string description) : base(name, description) { }
-
-    public event EventHandler PathChanged;
-    protected virtual void OnPathChanged() {
-      var handler = PathChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    #region Parent Events
-    protected virtual void RegisterParentEvents() {
-      if (parent != null) {
-        parent.NameChanged += Parent_NameChanged;
-      }
-    }
-    protected virtual void DeregisterParentEvents() {
-      if (parent != null) {
-        parent.NameChanged -= Parent_NameChanged;
-      }
-    }
-    void Parent_NameChanged(object sender, EventArgs e) {
-      OnPathChanged();
-    }
-    #endregion
   }
 }
