Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11430)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputPortView.cs	(revision 11431)
@@ -39,9 +39,16 @@
     }
 
+    private void UpdateOutputPortTextBoxText() {
+      if ((Content == null) || (Content.OutputPort == null)) {
+        outputPortTextBox.Text = string.Empty;
+      } else {
+        outputPortTextBox.Text = Content.OutputPort.Path + "." + Content.OutputPort.ToString();
+      }
+    }
+
     protected override void DeregisterContentEvents() {
       Content.OutputPortChanged -= Content_OutputPortChanged;
       base.DeregisterContentEvents();
     }
-
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
@@ -51,5 +58,5 @@
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      outputPortTextBox.Text = ((Content == null) || (Content.OutputPort == null)) ? string.Empty : Content.OutputPort.ToString();
+      UpdateOutputPortTextBoxText();
     }
 
@@ -58,9 +65,10 @@
       outputPortTextBox.Enabled = Content != null && !ReadOnly;
     }
+
     protected virtual void Content_OutputPortChanged(object sender, EventArgs e) {
       if (InvokeRequired)
         Invoke(new EventHandler(Content_OutputPortChanged), sender, e);
       else {
-        outputPortTextBox.Text = Content.OutputPort == null ? string.Empty : Content.OutputPort.ToString();
+        UpdateOutputPortTextBoxText();
       }
     }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeCollectionView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeCollectionView.cs	(revision 11430)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeCollectionView.cs	(revision 11431)
@@ -47,5 +47,7 @@
       if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          return (INode)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          var n = (INode)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          n.Name = GetUniqueName(n.Name);
+          return n;
         }
         catch (Exception ex) {
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortCollectionView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortCollectionView.cs	(revision 11430)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortCollectionView.cs	(revision 11431)
@@ -47,5 +47,7 @@
       if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
-          return (IPort)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          var p = (IPort)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
+          p.Name = GetUniqueName(p.Name);
+          return p;
         }
         catch (Exception ex) {
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IPort.cs	(revision 11430)
+++ /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 11430)
+++ /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 11430)
+++ /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 11430)
+++ /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
