Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11423)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11431)
@@ -21,8 +21,12 @@
 
 using HeuristicLab.Core;
+using System;
 
 namespace HeuristicLab.Optimization.Networks {
   public interface IPort : INamedItem {
     INode Parent { get; set; }
+    string Path { get; }
+
+    event EventHandler PathChanged;
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs	(revision 11423)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs	(revision 11431)
@@ -92,5 +92,7 @@
     }
     protected void OutputInputPort_ValueSent(object sender, OutputInputPortEventArgs<TIn, TOut> e) {
-      var value = (TIn)e.Value.Clone();
+      var value = e.Value;
+      if (value != null)
+        value = (TIn)value.Clone();
       Value = value;
       e.Result = OnValueReceived(value);
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11423)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11431)
@@ -88,5 +88,5 @@
       if (outputPort != null) {
         outputPort.ValueChanged += OutputPort_ValueChanged;
-        outputPort.ToStringChanged += OutputPort_ToStringChanged;
+        outputPort.PathChanged += OutputPort_PathChanged;
       }
     }
@@ -94,13 +94,16 @@
       if (outputPort != null) {
         outputPort.ValueChanged -= OutputPort_ValueChanged;
-        outputPort.ToStringChanged -= OutputPort_ToStringChanged;
+        outputPort.PathChanged -= OutputPort_PathChanged;
       }
     }
     protected void OutputPort_ValueChanged(object sender, EventArgs e) {
-      Value = (T)OutputPort.Value.Clone();
+      var value = OutputPort.Value;
+      if (value != null)
+        value = (T)value.Clone();
+      Value = value;
       //DISCUSS: clone value?
       //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) {
+    protected void OutputPort_PathChanged(object sender, EventArgs e) {
       OnOutputPortChanged();
     }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11423)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Port.cs	(revision 11431)
@@ -38,15 +38,16 @@
       get { return parent; }
       set {
+        // NOTE: never call setter directly as the Parent property is set by the node which contains the port
         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();
+          OnPathChanged();
         }
+      }
+    }
+    public string Path {
+      get {
+        return parent != null ? parent.Name : string.Empty;
       }
     }
@@ -59,9 +60,8 @@
     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();
+    public event EventHandler PathChanged;
+    protected virtual void OnPathChanged() {
+      var handler = PathChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
     }
 
@@ -69,14 +69,14 @@
     protected virtual void RegisterParentEvents() {
       if (parent != null) {
-        parent.ToStringChanged += Parent_ToStringChanged;
+        parent.NameChanged += Parent_NameChanged;
       }
     }
     protected virtual void DeregisterParentEvents() {
       if (parent != null) {
-        parent.ToStringChanged -= Parent_ToStringChanged;
+        parent.NameChanged -= Parent_NameChanged;
       }
     }
-    void Parent_ToStringChanged(object sender, EventArgs e) {
-      OnToStringChanged();
+    void Parent_NameChanged(object sender, EventArgs e) {
+      OnPathChanged();
     }
     #endregion
