Index: branches/OptimizationNetworks/HeuristicLab 3.3.sln
===================================================================
--- branches/OptimizationNetworks/HeuristicLab 3.3.sln	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab 3.3.sln	(revision 11423)
@@ -1,5 +1,7 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
+# Visual Studio 2013
+VisualStudioVersion = 12.0.21005.1
+MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{96396439-A764-4022-A8D2-BE021449B8D1}"
 	ProjectSection(SolutionItems) = preProject
@@ -1942,26 +1944,38 @@
 		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.ActiveCfg = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x64.Build.0 = Debug|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.ActiveCfg = Debug|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Debug|x86.Build.0 = Debug|x86
 		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|Any CPU.Build.0 = Release|Any CPU
-		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.ActiveCfg = Release|Any CPU
-		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.ActiveCfg = Release|Any CPU
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.ActiveCfg = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x64.Build.0 = Release|x64
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.ActiveCfg = Release|x86
+		{37B08E61-93B1-4184-AE21-F2B5DE8A40F8}.Release|x86.Build.0 = Release|x86
 		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.ActiveCfg = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x64.Build.0 = Debug|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.ActiveCfg = Debug|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Debug|x86.Build.0 = Debug|x86
 		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.ActiveCfg = Release|Any CPU
-		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.ActiveCfg = Release|Any CPU
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.ActiveCfg = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x64.Build.0 = Release|x64
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.ActiveCfg = Release|x86
+		{7CF51332-0E37-447C-8017-82A258C59EF2}.Release|x86.Build.0 = Release|x86
 		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.ActiveCfg = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x64.Build.0 = Debug|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.ActiveCfg = Debug|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Debug|x86.Build.0 = Debug|x86
 		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|Any CPU.Build.0 = Release|Any CPU
-		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.ActiveCfg = Release|Any CPU
-		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.ActiveCfg = Release|Any CPU
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.ActiveCfg = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x64.Build.0 = Release|x64
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.ActiveCfg = Release|x86
+		{792B263D-92BA-453A-BFDF-261511C2F63B}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 11423)
@@ -36,4 +36,40 @@
   <PropertyGroup>
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <ItemGroup>
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 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11423)
@@ -37,4 +37,40 @@
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11423)
@@ -51,5 +51,5 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      outputPortTextBox.Text = ((Content == null) || (Content.OutputPort == null)) ? string.Empty : Content.OutputPort.Name;
+      outputPortTextBox.Text = ((Content == null) || (Content.OutputPort == null)) ? string.Empty : Content.OutputPort.ToString();
     }
 
@@ -62,5 +62,5 @@
         Invoke(new EventHandler(Content_OutputPortChanged), sender, e);
       else {
-        outputPortTextBox.Text = Content.OutputPort == null ? string.Empty : Content.OutputPort.Name;
+        outputPortTextBox.Text = Content.OutputPort == null ? string.Empty : Content.OutputPort.ToString();
       }
     }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs	(revision 11423)
@@ -116,21 +116,21 @@
 
     #region Ports Events
-    private void RegisterPortsEvents() {
-      Ports.ItemsAdded += Ports_ItemsAdded;
-      Ports.ItemsRemoved += Ports_ItemsRemoved;
-      Ports.ItemsReplaced += Ports_ItemsReplaced;
-      Ports.CollectionReset += Ports_CollectionReset;
+    protected override void RegisterPortsEvents() {
+      base.RegisterPortsEvents();
       foreach (var p in Ports)
         RegisterPortEvents(p);
     }
-    void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      foreach (var p in e.Items)
-        RegisterPortEvents(p);
-    }
-    void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsAdded(sender, e);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsRemoved(sender, e);
       foreach (var p in e.Items)
         DeregisterPortEvents(p);
     }
-    void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsReplaced(sender, e);
       foreach (var p in e.OldItems)
         DeregisterPortEvents(p);
@@ -138,5 +138,6 @@
         RegisterPortEvents(p);
     }
-    void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_CollectionReset(sender, e);
       foreach (var p in e.OldItems)
         DeregisterPortEvents(p);
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 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11423)
@@ -36,4 +36,40 @@
   <PropertyGroup>
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <ItemGroup>
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11423)
@@ -24,5 +24,5 @@
 namespace HeuristicLab.Optimization.Networks {
   public interface IPort : INamedItem {
-    INode Node { get; set; }
+    INode Parent { get; set; }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11423)
@@ -88,4 +88,5 @@
       if (outputPort != null) {
         outputPort.ValueChanged += OutputPort_ValueChanged;
+        outputPort.ToStringChanged += OutputPort_ToStringChanged;
       }
     }
@@ -93,4 +94,5 @@
       if (outputPort != null) {
         outputPort.ValueChanged -= OutputPort_ValueChanged;
+        outputPort.ToStringChanged -= OutputPort_ToStringChanged;
       }
     }
@@ -100,4 +102,7 @@
       //DISCUSS: switch threads to decouple value propagation and to make communication asynchronous -> should be done in Node?
     }
+    protected void OutputPort_ToStringChanged(object sender, EventArgs e) {
+      OnOutputPortChanged();
+    }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Node.cs	(revision 11423)
@@ -52,20 +52,33 @@
       : base(original, cloner) {
       ports = cloner.Clone(original.ports);
+      foreach (var p in Ports)
+        p.Parent = this;
       readOnlyPorts = null;
+      RegisterPortsEvents();
     }
     public Node()
       : base("Node") {
-      ports = new PortCollection(this);
+      ports = new PortCollection();
       readOnlyPorts = null;
+      RegisterPortsEvents();
     }
     public Node(string name)
       : base(name) {
-      ports = new PortCollection(this);
+      ports = new PortCollection();
       readOnlyPorts = null;
+      RegisterPortsEvents();
     }
     public Node(string name, string description)
       : base(name, description) {
-      ports = new PortCollection(this);
+      ports = new PortCollection();
       readOnlyPorts = null;
+      RegisterPortsEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var p in Ports)
+        p.Parent = this;
+      RegisterPortsEvents();
     }
 
@@ -73,4 +86,33 @@
       return new Node(this, cloner);
     }
+
+    #region Ports Events
+    protected virtual void RegisterPortsEvents() {
+      ports.ItemsAdded += Ports_ItemsAdded;
+      ports.ItemsRemoved += Ports_ItemsRemoved;
+      ports.ItemsReplaced += Ports_ItemsReplaced;
+      ports.CollectionReset += Ports_CollectionReset;
+    }
+    protected virtual void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    protected virtual void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.Items)
+        p.Parent = null;
+    }
+    protected virtual void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.OldItems)
+        p.Parent = null;
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    protected virtual void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      foreach (var p in e.OldItems)
+        p.Parent = null;
+      foreach (var p in e.Items)
+        p.Parent = this;
+    }
+    #endregion
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11423)
@@ -34,14 +34,19 @@
     }
 
-    [Storable]
-    private INode node;
-    public INode Node {
-      get { return node; }
+    private INode parent;
+    public INode Parent {
+      get { return parent; }
       set {
-        if ((value != null) && !value.Ports.Contains(this))
-          throw new InvalidOperationException("Port is not contained in port collection of node.");
-        if ((value == null) && node.Ports.Contains(this))
-          throw new InvalidOperationException("Port is still contained in port collection of node.");
-        node = value;
+        if (value != parent) {
+          // NOTE: never call setter directly as the Parent property is set by the node which contains the port
+          if ((value != null) && !value.Ports.Contains(this))
+            throw new InvalidOperationException("Port is not contained in port collection of node.");
+          if ((value == null) && parent.Ports.Contains(this))
+            throw new InvalidOperationException("Port is still contained in port collection of node.");
+          DeregisterParentEvents();
+          parent = value;
+          RegisterParentEvents();
+          OnToStringChanged();
+        }
       }
     }
@@ -49,11 +54,31 @@
     [StorableConstructor]
     protected Port(bool deserializing) : base(deserializing) { }
-    protected Port(Port original, Cloner cloner)
-      : base(original, cloner) {
-      node = (INode)cloner.GetClone(original.node);  // NOTE: original node is NOT automatically cloned
-    }
+    protected Port(Port original, Cloner cloner) : base(original, cloner) { }
     protected Port() : base("Port") { }
     protected Port(string name) : base(name) { }
     protected Port(string name, string description) : base(name, description) { }
+
+    public override string ToString() {
+      if (parent != null) {
+        return string.Concat(parent.ToString(), " -> ", base.ToString());
+      }
+      return base.ToString();
+    }
+
+    #region Parent Events
+    protected virtual void RegisterParentEvents() {
+      if (parent != null) {
+        parent.ToStringChanged += Parent_ToStringChanged;
+      }
+    }
+    protected virtual void DeregisterParentEvents() {
+      if (parent != null) {
+        parent.ToStringChanged -= Parent_ToStringChanged;
+      }
+    }
+    void Parent_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
+    #endregion
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/PortCollection.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/PortCollection.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/PortCollection.cs	(revision 11423)
@@ -30,58 +30,12 @@
   [Item("PortCollection", "Represents a collection of ports in an optimization network node.")]
   public class PortCollection : NamedItemCollection<IPort> {
-    [Storable]
-    private INode node;
-    public INode Node {
-      get { return node; }
-    }
-
     [StorableConstructor]
     protected PortCollection(bool deserializing) : base(deserializing) { }
-    protected PortCollection(PortCollection original, Cloner cloner)
-      : base(original, cloner) {
-      if (!cloner.ClonedObjectRegistered(original.node))
-        // NOTE: cannot clone port collection alone if referenced node is not cloned
-        throw new InvalidOperationException("Node of port collection is not cloned.");
-      node = cloner.Clone(original.node);
-    }
-    public PortCollection(INode node)
-      : base() {
-      this.node = node;
-    }
-    public PortCollection(INode node, int capacity)
-      : base(capacity) {
-      this.node = node;
-    }
-    public PortCollection(INode node, IEnumerable<IPort> collection)
-      : base(collection) {
-      this.node = node;
-    }
+    protected PortCollection(PortCollection original, Cloner cloner) : base(original, cloner) { }
+    public PortCollection() : base() { }
+    public PortCollection(INode node, int capacity) : base(capacity) { }
+    public PortCollection(INode node, IEnumerable<IPort> collection) : base(collection) { }
 
     public override IDeepCloneable Clone(Cloner cloner) { return new PortCollection(this, cloner); }
-
-    protected override void OnItemsAdded(IEnumerable<IPort> items) {
-      foreach (var p in items)
-        p.Node = node;
-      base.OnItemsAdded(items);
-    }
-    protected override void OnItemsRemoved(IEnumerable<IPort> items) {
-      foreach (var p in items)
-        p.Node = null;
-      base.OnItemsRemoved(items);
-    }
-    protected override void OnItemsReplaced(IEnumerable<IPort> items, IEnumerable<IPort> oldItems) {
-      foreach (var p in oldItems)
-        p.Node = null;
-      foreach (var p in items)
-        p.Node = node;
-      base.OnItemsReplaced(items, oldItems);
-    }
-    protected override void OnCollectionReset(IEnumerable<IPort> items, IEnumerable<IPort> oldItems) {
-      foreach (var p in oldItems)
-        p.Node = null;
-      foreach (var p in items)
-        p.Node = node;
-      base.OnCollectionReset(items, oldItems);
-    }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11421)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11423)
@@ -101,21 +101,21 @@
 
     #region Ports Events
-    private void RegisterPortsEvents() {
-      Ports.ItemsAdded += Ports_ItemsAdded;
-      Ports.ItemsRemoved += Ports_ItemsRemoved;
-      Ports.ItemsReplaced += Ports_ItemsReplaced;
-      Ports.CollectionReset += Ports_CollectionReset;
+    protected override void RegisterPortsEvents() {
+      base.RegisterPortsEvents();
       foreach (var p in Ports)
         RegisterPortEvents(p);
     }
-    void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      foreach (var p in e.Items)
-        RegisterPortEvents(p);
-    }
-    void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsAdded(sender, e);
+      foreach (var p in e.Items)
+        RegisterPortEvents(p);
+    }
+    protected override void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsRemoved(sender, e);
       foreach (var p in e.Items)
         DeregisterPortEvents(p);
     }
-    void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_ItemsReplaced(sender, e);
       foreach (var p in e.OldItems)
         DeregisterPortEvents(p);
@@ -123,5 +123,6 @@
         RegisterPortEvents(p);
     }
-    void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+    protected override void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
+      base.Ports_CollectionReset(sender, e);
       foreach (var p in e.OldItems)
         DeregisterPortEvents(p);
