Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/GenericPortView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/GenericPortView.Designer.cs	(revision 11529)
+++ 	(revision )
@@ -1,237 +1,0 @@
-#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.Core.Networks.Views {
-  partial class GenericPortView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    #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.connectedPortGroupBox = new System.Windows.Forms.GroupBox();
-      this.setConnectedPortButton = new System.Windows.Forms.Button();
-      this.clearConnectedPortButton = new System.Windows.Forms.Button();
-      this.connectedPortView = new HeuristicLab.Core.Networks.Views.PortView();
-      this.cloneConnectedPortParametersButton = new System.Windows.Forms.Button();
-      this.sendMessageButton = new System.Windows.Forms.Button();
-      this.splitContainer = new System.Windows.Forms.SplitContainer();
-      this.portParameterCollectionView = new HeuristicLab.Core.Networks.Views.PortParameterCollectionView();
-      this.messageCollectionView = new HeuristicLab.Core.Networks.Views.MessageCollectionView();
-      this.logMessagesCheckBox = new System.Windows.Forms.CheckBox();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.connectedPortGroupBox.SuspendLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
-      this.splitContainer.Panel1.SuspendLayout();
-      this.splitContainer.Panel2.SuspendLayout();
-      this.splitContainer.SuspendLayout();
-      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(47, 0);
-      this.nameTextBox.Size = new System.Drawing.Size(573, 20);
-      // 
-      // connectedPortGroupBox
-      // 
-      this.connectedPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.connectedPortGroupBox.Controls.Add(this.setConnectedPortButton);
-      this.connectedPortGroupBox.Controls.Add(this.clearConnectedPortButton);
-      this.connectedPortGroupBox.Controls.Add(this.connectedPortView);
-      this.connectedPortGroupBox.Location = new System.Drawing.Point(47, 26);
-      this.connectedPortGroupBox.Name = "connectedPortGroupBox";
-      this.connectedPortGroupBox.Size = new System.Drawing.Size(598, 50);
-      this.connectedPortGroupBox.TabIndex = 4;
-      this.connectedPortGroupBox.TabStop = false;
-      this.connectedPortGroupBox.Text = "&Connected Port";
-      // 
-      // setConnectedPortButton
-      // 
-      this.setConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
-      this.setConnectedPortButton.Location = new System.Drawing.Point(6, 19);
-      this.setConnectedPortButton.Name = "setConnectedPortButton";
-      this.setConnectedPortButton.Size = new System.Drawing.Size(24, 24);
-      this.setConnectedPortButton.TabIndex = 0;
-      this.toolTip.SetToolTip(this.setConnectedPortButton, "Set Connected Port");
-      this.setConnectedPortButton.UseVisualStyleBackColor = true;
-      this.setConnectedPortButton.Click += new System.EventHandler(this.setConnectedPortButton_Click);
-      // 
-      // clearConnectedPortButton
-      // 
-      this.clearConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
-      this.clearConnectedPortButton.Location = new System.Drawing.Point(36, 19);
-      this.clearConnectedPortButton.Name = "clearConnectedPortButton";
-      this.clearConnectedPortButton.Size = new System.Drawing.Size(24, 24);
-      this.clearConnectedPortButton.TabIndex = 1;
-      this.toolTip.SetToolTip(this.clearConnectedPortButton, "Remove Connected Port");
-      this.clearConnectedPortButton.UseVisualStyleBackColor = true;
-      this.clearConnectedPortButton.Click += new System.EventHandler(this.clearConnectedPortButton_Click);
-      // 
-      // connectedPortView
-      // 
-      this.connectedPortView.AllowDrop = true;
-      this.connectedPortView.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.connectedPortView.Caption = "Connected Port View";
-      this.connectedPortView.Content = null;
-      this.connectedPortView.Location = new System.Drawing.Point(66, 21);
-      this.connectedPortView.Name = "connectedPortView";
-      this.connectedPortView.ReadOnly = true;
-      this.connectedPortView.Size = new System.Drawing.Size(507, 23);
-      this.connectedPortView.TabIndex = 2;
-      this.connectedPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragDrop);
-      this.connectedPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
-      this.connectedPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
-      // 
-      // cloneConnectedPortParametersButton
-      // 
-      this.cloneConnectedPortParametersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Clone;
-      this.cloneConnectedPortParametersButton.Location = new System.Drawing.Point(156, 101);
-      this.cloneConnectedPortParametersButton.Name = "cloneConnectedPortParametersButton";
-      this.cloneConnectedPortParametersButton.Size = new System.Drawing.Size(24, 24);
-      this.cloneConnectedPortParametersButton.TabIndex = 5;
-      this.toolTip.SetToolTip(this.cloneConnectedPortParametersButton, "Clone Parameters from Connected Port");
-      this.cloneConnectedPortParametersButton.UseVisualStyleBackColor = true;
-      this.cloneConnectedPortParametersButton.Click += new System.EventHandler(this.cloneConnectedPortParametersButton_Click);
-      // 
-      // sendMessageButton
-      // 
-      this.sendMessageButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Exception;
-      this.sendMessageButton.Location = new System.Drawing.Point(6, 45);
-      this.sendMessageButton.Name = "sendMessageButton";
-      this.sendMessageButton.Size = new System.Drawing.Size(24, 24);
-      this.sendMessageButton.TabIndex = 3;
-      this.toolTip.SetToolTip(this.sendMessageButton, "Send Message");
-      this.sendMessageButton.UseVisualStyleBackColor = true;
-      this.sendMessageButton.Click += new System.EventHandler(this.sendMessageButton_Click);
-      // 
-      // splitContainer
-      // 
-      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 82);
-      this.splitContainer.Name = "splitContainer";
-      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
-      // 
-      // splitContainer.Panel1
-      // 
-      this.splitContainer.Panel1.Controls.Add(this.portParameterCollectionView);
-      // 
-      // splitContainer.Panel2
-      // 
-      this.splitContainer.Panel2.Controls.Add(this.logMessagesCheckBox);
-      this.splitContainer.Panel2.Controls.Add(this.messageCollectionView);
-      this.splitContainer.Size = new System.Drawing.Size(645, 435);
-      this.splitContainer.SplitterDistance = 218;
-      this.splitContainer.TabIndex = 7;
-      // 
-      // portParameterCollectionView
-      // 
-      this.portParameterCollectionView.Caption = "PortParameterCollection View";
-      this.portParameterCollectionView.Content = null;
-      this.portParameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.portParameterCollectionView.Location = new System.Drawing.Point(0, 0);
-      this.portParameterCollectionView.Name = "portParameterCollectionView";
-      this.portParameterCollectionView.ReadOnly = false;
-      this.portParameterCollectionView.ShowDetails = true;
-      this.portParameterCollectionView.Size = new System.Drawing.Size(645, 218);
-      this.portParameterCollectionView.TabIndex = 0;
-      // 
-      // messageCollectionView
-      // 
-      this.messageCollectionView.Caption = "MessageCollection View";
-      this.messageCollectionView.Content = null;
-      this.messageCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.messageCollectionView.Location = new System.Drawing.Point(0, 0);
-      this.messageCollectionView.Name = "messageCollectionView";
-      this.messageCollectionView.ReadOnly = false;
-      this.messageCollectionView.ShowDetails = true;
-      this.messageCollectionView.Size = new System.Drawing.Size(645, 213);
-      this.messageCollectionView.TabIndex = 0;
-      // 
-      // logMessagesCheckBox
-      // 
-      this.logMessagesCheckBox.AutoSize = true;
-      this.logMessagesCheckBox.Location = new System.Drawing.Point(156, 24);
-      this.logMessagesCheckBox.Name = "logMessagesCheckBox";
-      this.logMessagesCheckBox.Size = new System.Drawing.Size(95, 17);
-      this.logMessagesCheckBox.TabIndex = 1;
-      this.logMessagesCheckBox.Text = "&Log Messages";
-      this.logMessagesCheckBox.UseVisualStyleBackColor = true;
-      this.logMessagesCheckBox.CheckedChanged += new System.EventHandler(this.logMessagesCheckBox_CheckedChanged);
-      // 
-      // GenericPortView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.sendMessageButton);
-      this.Controls.Add(this.cloneConnectedPortParametersButton);
-      this.Controls.Add(this.connectedPortGroupBox);
-      this.Controls.Add(this.splitContainer);
-      this.Name = "GenericPortView";
-      this.Controls.SetChildIndex(this.splitContainer, 0);
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      this.Controls.SetChildIndex(this.connectedPortGroupBox, 0);
-      this.Controls.SetChildIndex(this.cloneConnectedPortParametersButton, 0);
-      this.Controls.SetChildIndex(this.sendMessageButton, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.connectedPortGroupBox.ResumeLayout(false);
-      this.splitContainer.Panel1.ResumeLayout(false);
-      this.splitContainer.Panel2.ResumeLayout(false);
-      this.splitContainer.Panel2.PerformLayout();
-      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
-      this.splitContainer.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    protected System.Windows.Forms.GroupBox connectedPortGroupBox;
-    protected PortView connectedPortView;
-    protected System.Windows.Forms.Button clearConnectedPortButton;
-    protected System.Windows.Forms.Button setConnectedPortButton;
-    protected System.Windows.Forms.Button cloneConnectedPortParametersButton;
-    protected System.Windows.Forms.Button sendMessageButton;
-    protected System.Windows.Forms.SplitContainer splitContainer;
-    protected PortParameterCollectionView portParameterCollectionView;
-    protected MessageCollectionView messageCollectionView;
-    protected System.Windows.Forms.CheckBox logMessagesCheckBox;
-
-
-
-
-
-  }
-}
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/GenericPortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/GenericPortView.cs	(revision 11529)
+++ 	(revision )
@@ -1,166 +1,0 @@
-#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.MainForm;
-using HeuristicLab.PluginInfrastructure;
-using System;
-using System.Windows.Forms;
-
-namespace HeuristicLab.Core.Networks.Views {
-  [View("GenericPort View")]
-  [Content(typeof(GenericPort), true)]
-  [Content(typeof(IGenericPort), false)]
-  public partial class GenericPortView : PortView {
-    protected NetworkItemSelectorDialog networkItemSelectorDialog;
-
-    public new IGenericPort Content {
-      get { return (IGenericPort)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public GenericPortView() {
-      InitializeComponent();
-      errorProvider.SetIconAlignment(connectedPortView, ErrorIconAlignment.MiddleRight);
-      errorProvider.SetIconPadding(connectedPortView, 2);
-    }
-
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (networkItemSelectorDialog != null) networkItemSelectorDialog.Dispose();
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.ConnectedPortChanged -= Content_ConnectedPortChanged;
-      Content.PortConnectionValidChanged -= Content_PortConnectionValidChanged;
-      Content.LogMessagesChanged -= Content_LogMessagesChanged;
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.ConnectedPortChanged += Content_ConnectedPortChanged;
-      Content.PortConnectionValidChanged += Content_PortConnectionValidChanged;
-      Content.LogMessagesChanged += Content_LogMessagesChanged;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
-      connectedPortView.Content = Content == null ? null : Content.ConnectedPort;
-      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
-      logMessagesCheckBox.Checked = Content == null ? false : Content.LogMessages;
-      messageCollectionView.Content = Content == null ? null : Content.Messages;
-      errorProvider.SetError(connectedPortView, ((Content == null) || Content.PortConnectionValid) ? string.Empty : "Port connection is not valid");
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      sendMessageButton.Enabled = Content != null;
-      connectedPortGroupBox.Enabled = Content != null && !ReadOnly;
-      setConnectedPortButton.Enabled = Content != null && !ReadOnly;
-      clearConnectedPortButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
-      portParameterCollectionView.Enabled = Content != null && !ReadOnly;
-      cloneConnectedPortParametersButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
-      logMessagesCheckBox.Enabled = Content != null && !ReadOnly;
-      messageCollectionView.Enabled = Content != null && !ReadOnly;
-    }
-
-    protected virtual void Content_ConnectedPortChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_ConnectedPortChanged), sender, e);
-      else {
-        clearConnectedPortButton.Enabled = Content.ConnectedPort != null && !ReadOnly;
-        cloneConnectedPortParametersButton.Enabled = Content.ConnectedPort != null && !ReadOnly;
-        connectedPortView.Content = Content.ConnectedPort;
-      }
-    }
-    protected virtual void Content_PortConnectionValidChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_PortConnectionValidChanged), sender, e);
-      else {
-        errorProvider.SetError(connectedPortView, Content.PortConnectionValid ? string.Empty : "Port connection is not valid");
-      }
-    }
-    protected virtual void Content_LogMessagesChanged(object sender, EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_LogMessagesChanged), sender, e);
-      else {
-        logMessagesCheckBox.Checked = Content.LogMessages;
-      }
-    }
-
-    protected virtual void sendMessageButton_Click(object sender, EventArgs e) {
-      Content.SendMessageAsync(Content.PrepareMessage());
-    }
-
-    protected virtual void setConnectedPortButton_Click(object sender, EventArgs e) {
-      if (networkItemSelectorDialog == null) {
-        networkItemSelectorDialog = new NetworkItemSelectorDialog();
-        networkItemSelectorDialog.Caption = "Select Connected Port";
-        networkItemSelectorDialog.NetworkItemSelector.Caption = "Available Ports";
-      }
-
-      try {
-        INetworkItem root = Content;
-        while (root.Parent != null)
-          root = root.Parent;
-        networkItemSelectorDialog.NetworkItemSelector.Configure(
-          root,
-          Content.ConnectedPort,
-          typeof(IConnectedPort)
-        );
-
-        if (networkItemSelectorDialog.ShowDialog(this) == DialogResult.OK) {
-          Content.ConnectedPort = networkItemSelectorDialog.NetworkItemSelector.SelectedNetworkItem as IConnectedPort;
-        }
-      }
-      catch (Exception ex) {
-        ErrorHandling.ShowErrorDialog(this, ex);
-      }
-    }
-    protected virtual void clearConnectedPortButton_Click(object sender, EventArgs e) {
-      Content.ConnectedPort = null;
-    }
-
-    protected virtual void connectedPortView_DragEnterOver(object sender, DragEventArgs e) {
-      e.Effect = DragDropEffects.None;
-      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IConnectedPort;
-
-      if (!ReadOnly && (data != null) && (Content.CanConnectToPort(data))) {
-        e.Effect = DragDropEffects.Link;
-      }
-    }
-    protected virtual void connectedPortView_DragDrop(object sender, DragEventArgs e) {
-      if (e.Effect != DragDropEffects.None) {
-        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IConnectedPort;
-        Content.ConnectedPort = port;
-      }
-    }
-    protected virtual void cloneConnectedPortParametersButton_Click(object sender, EventArgs e) {
-      Content.CloneConnectedPortParameters();
-    }
-    protected virtual void logMessagesCheckBox_CheckedChanged(object sender, EventArgs e) {
-      Content.LogMessages = logMessagesCheckBox.Checked;
-    }
-  }
-}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.Designer.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.Designer.cs	(revision 11530)
@@ -0,0 +1,237 @@
+#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.Core.Networks.Views {
+  partial class MessagePortView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    #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.connectedPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setConnectedPortButton = new System.Windows.Forms.Button();
+      this.clearConnectedPortButton = new System.Windows.Forms.Button();
+      this.connectedPortView = new HeuristicLab.Core.Networks.Views.PortView();
+      this.cloneConnectedPortParametersButton = new System.Windows.Forms.Button();
+      this.sendMessageButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.portParameterCollectionView = new HeuristicLab.Core.Networks.Views.PortParameterCollectionView();
+      this.messageCollectionView = new HeuristicLab.Core.Networks.Views.MessageCollectionView();
+      this.logMessagesCheckBox = new System.Windows.Forms.CheckBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.connectedPortGroupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      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(47, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(573, 20);
+      // 
+      // connectedPortGroupBox
+      // 
+      this.connectedPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.connectedPortGroupBox.Controls.Add(this.setConnectedPortButton);
+      this.connectedPortGroupBox.Controls.Add(this.clearConnectedPortButton);
+      this.connectedPortGroupBox.Controls.Add(this.connectedPortView);
+      this.connectedPortGroupBox.Location = new System.Drawing.Point(47, 26);
+      this.connectedPortGroupBox.Name = "connectedPortGroupBox";
+      this.connectedPortGroupBox.Size = new System.Drawing.Size(598, 50);
+      this.connectedPortGroupBox.TabIndex = 4;
+      this.connectedPortGroupBox.TabStop = false;
+      this.connectedPortGroupBox.Text = "&Connected Port";
+      // 
+      // setConnectedPortButton
+      // 
+      this.setConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setConnectedPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setConnectedPortButton.Name = "setConnectedPortButton";
+      this.setConnectedPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setConnectedPortButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.setConnectedPortButton, "Set Connected Port");
+      this.setConnectedPortButton.UseVisualStyleBackColor = true;
+      this.setConnectedPortButton.Click += new System.EventHandler(this.setConnectedPortButton_Click);
+      // 
+      // clearConnectedPortButton
+      // 
+      this.clearConnectedPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearConnectedPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearConnectedPortButton.Name = "clearConnectedPortButton";
+      this.clearConnectedPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearConnectedPortButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.clearConnectedPortButton, "Remove Connected Port");
+      this.clearConnectedPortButton.UseVisualStyleBackColor = true;
+      this.clearConnectedPortButton.Click += new System.EventHandler(this.clearConnectedPortButton_Click);
+      // 
+      // connectedPortView
+      // 
+      this.connectedPortView.AllowDrop = true;
+      this.connectedPortView.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.connectedPortView.Caption = "Connected Port View";
+      this.connectedPortView.Content = null;
+      this.connectedPortView.Location = new System.Drawing.Point(66, 21);
+      this.connectedPortView.Name = "connectedPortView";
+      this.connectedPortView.ReadOnly = true;
+      this.connectedPortView.Size = new System.Drawing.Size(507, 23);
+      this.connectedPortView.TabIndex = 2;
+      this.connectedPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragDrop);
+      this.connectedPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
+      this.connectedPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.connectedPortView_DragEnterOver);
+      // 
+      // cloneConnectedPortParametersButton
+      // 
+      this.cloneConnectedPortParametersButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Clone;
+      this.cloneConnectedPortParametersButton.Location = new System.Drawing.Point(156, 101);
+      this.cloneConnectedPortParametersButton.Name = "cloneConnectedPortParametersButton";
+      this.cloneConnectedPortParametersButton.Size = new System.Drawing.Size(24, 24);
+      this.cloneConnectedPortParametersButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.cloneConnectedPortParametersButton, "Clone Parameters from Connected Port");
+      this.cloneConnectedPortParametersButton.UseVisualStyleBackColor = true;
+      this.cloneConnectedPortParametersButton.Click += new System.EventHandler(this.cloneConnectedPortParametersButton_Click);
+      // 
+      // sendMessageButton
+      // 
+      this.sendMessageButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Exception;
+      this.sendMessageButton.Location = new System.Drawing.Point(6, 45);
+      this.sendMessageButton.Name = "sendMessageButton";
+      this.sendMessageButton.Size = new System.Drawing.Size(24, 24);
+      this.sendMessageButton.TabIndex = 3;
+      this.toolTip.SetToolTip(this.sendMessageButton, "Send Message");
+      this.sendMessageButton.UseVisualStyleBackColor = true;
+      this.sendMessageButton.Click += new System.EventHandler(this.sendMessageButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.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.splitContainer.Location = new System.Drawing.Point(0, 82);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.portParameterCollectionView);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.logMessagesCheckBox);
+      this.splitContainer.Panel2.Controls.Add(this.messageCollectionView);
+      this.splitContainer.Size = new System.Drawing.Size(645, 435);
+      this.splitContainer.SplitterDistance = 218;
+      this.splitContainer.TabIndex = 7;
+      // 
+      // portParameterCollectionView
+      // 
+      this.portParameterCollectionView.Caption = "PortParameterCollection View";
+      this.portParameterCollectionView.Content = null;
+      this.portParameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portParameterCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.portParameterCollectionView.Name = "portParameterCollectionView";
+      this.portParameterCollectionView.ReadOnly = false;
+      this.portParameterCollectionView.ShowDetails = true;
+      this.portParameterCollectionView.Size = new System.Drawing.Size(645, 218);
+      this.portParameterCollectionView.TabIndex = 0;
+      // 
+      // messageCollectionView
+      // 
+      this.messageCollectionView.Caption = "MessageCollection View";
+      this.messageCollectionView.Content = null;
+      this.messageCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.messageCollectionView.Location = new System.Drawing.Point(0, 0);
+      this.messageCollectionView.Name = "messageCollectionView";
+      this.messageCollectionView.ReadOnly = false;
+      this.messageCollectionView.ShowDetails = true;
+      this.messageCollectionView.Size = new System.Drawing.Size(645, 213);
+      this.messageCollectionView.TabIndex = 0;
+      // 
+      // logMessagesCheckBox
+      // 
+      this.logMessagesCheckBox.AutoSize = true;
+      this.logMessagesCheckBox.Location = new System.Drawing.Point(156, 24);
+      this.logMessagesCheckBox.Name = "logMessagesCheckBox";
+      this.logMessagesCheckBox.Size = new System.Drawing.Size(95, 17);
+      this.logMessagesCheckBox.TabIndex = 1;
+      this.logMessagesCheckBox.Text = "&Log Messages";
+      this.logMessagesCheckBox.UseVisualStyleBackColor = true;
+      this.logMessagesCheckBox.CheckedChanged += new System.EventHandler(this.logMessagesCheckBox_CheckedChanged);
+      // 
+      // MessagePortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.sendMessageButton);
+      this.Controls.Add(this.cloneConnectedPortParametersButton);
+      this.Controls.Add(this.connectedPortGroupBox);
+      this.Controls.Add(this.splitContainer);
+      this.Name = "MessagePortView";
+      this.Controls.SetChildIndex(this.splitContainer, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.connectedPortGroupBox, 0);
+      this.Controls.SetChildIndex(this.cloneConnectedPortParametersButton, 0);
+      this.Controls.SetChildIndex(this.sendMessageButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.connectedPortGroupBox.ResumeLayout(false);
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox connectedPortGroupBox;
+    protected PortView connectedPortView;
+    protected System.Windows.Forms.Button clearConnectedPortButton;
+    protected System.Windows.Forms.Button setConnectedPortButton;
+    protected System.Windows.Forms.Button cloneConnectedPortParametersButton;
+    protected System.Windows.Forms.Button sendMessageButton;
+    protected System.Windows.Forms.SplitContainer splitContainer;
+    protected PortParameterCollectionView portParameterCollectionView;
+    protected MessageCollectionView messageCollectionView;
+    protected System.Windows.Forms.CheckBox logMessagesCheckBox;
+
+
+
+
+
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/MessagePortView.cs	(revision 11530)
@@ -0,0 +1,166 @@
+#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.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("MessagePort View")]
+  [Content(typeof(MessagePort), true)]
+  [Content(typeof(IMessagePort), false)]
+  public partial class MessagePortView : PortView {
+    protected NetworkItemSelectorDialog networkItemSelectorDialog;
+
+    public new IMessagePort Content {
+      get { return (IMessagePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MessagePortView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(connectedPortView, ErrorIconAlignment.MiddleRight);
+      errorProvider.SetIconPadding(connectedPortView, 2);
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (networkItemSelectorDialog != null) networkItemSelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ConnectedPortChanged -= Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged -= Content_PortConnectionValidChanged;
+      Content.LogMessagesChanged -= Content_LogMessagesChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ConnectedPortChanged += Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged += Content_PortConnectionValidChanged;
+      Content.LogMessagesChanged += Content_LogMessagesChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+      connectedPortView.Content = Content == null ? null : Content.ConnectedPort;
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+      logMessagesCheckBox.Checked = Content == null ? false : Content.LogMessages;
+      messageCollectionView.Content = Content == null ? null : Content.Messages;
+      errorProvider.SetError(connectedPortView, ((Content == null) || Content.PortConnectionValid) ? string.Empty : "Port connection is not valid");
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      sendMessageButton.Enabled = Content != null;
+      connectedPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setConnectedPortButton.Enabled = Content != null && !ReadOnly;
+      clearConnectedPortButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
+      portParameterCollectionView.Enabled = Content != null && !ReadOnly;
+      cloneConnectedPortParametersButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
+      logMessagesCheckBox.Enabled = Content != null && !ReadOnly;
+      messageCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void Content_ConnectedPortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ConnectedPortChanged), sender, e);
+      else {
+        clearConnectedPortButton.Enabled = Content.ConnectedPort != null && !ReadOnly;
+        cloneConnectedPortParametersButton.Enabled = Content.ConnectedPort != null && !ReadOnly;
+        connectedPortView.Content = Content.ConnectedPort;
+      }
+    }
+    protected virtual void Content_PortConnectionValidChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_PortConnectionValidChanged), sender, e);
+      else {
+        errorProvider.SetError(connectedPortView, Content.PortConnectionValid ? string.Empty : "Port connection is not valid");
+      }
+    }
+    protected virtual void Content_LogMessagesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_LogMessagesChanged), sender, e);
+      else {
+        logMessagesCheckBox.Checked = Content.LogMessages;
+      }
+    }
+
+    protected virtual void sendMessageButton_Click(object sender, EventArgs e) {
+      Content.SendMessageAsync(Content.PrepareMessage());
+    }
+
+    protected virtual void setConnectedPortButton_Click(object sender, EventArgs e) {
+      if (networkItemSelectorDialog == null) {
+        networkItemSelectorDialog = new NetworkItemSelectorDialog();
+        networkItemSelectorDialog.Caption = "Select Connected Port";
+        networkItemSelectorDialog.NetworkItemSelector.Caption = "Available Ports";
+      }
+
+      try {
+        INetworkItem root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        networkItemSelectorDialog.NetworkItemSelector.Configure(
+          root,
+          Content.ConnectedPort,
+          typeof(IMessagePort)
+        );
+
+        if (networkItemSelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.ConnectedPort = networkItemSelectorDialog.NetworkItemSelector.SelectedNetworkItem as IMessagePort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearConnectedPortButton_Click(object sender, EventArgs e) {
+      Content.ConnectedPort = null;
+    }
+
+    protected virtual void connectedPortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IMessagePort;
+
+      if (!ReadOnly && (data != null) && (Content.CanConnectToPort(data))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void connectedPortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IMessagePort;
+        Content.ConnectedPort = port;
+      }
+    }
+    protected virtual void cloneConnectedPortParametersButton_Click(object sender, EventArgs e) {
+      Content.CloneParametersFromPort(Content.ConnectedPort);
+    }
+    protected virtual void logMessagesCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.LogMessages = logMessagesCheckBox.Checked;
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.Designer.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.Designer.cs	(revision 11530)
@@ -46,5 +46,12 @@
     private void InitializeComponent() {
       this.nodeCollectionView = new HeuristicLab.Core.Networks.Views.NodeCollectionView();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.nodesTabPage = new System.Windows.Forms.TabPage();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.portCollectionView = new HeuristicLab.Core.Networks.Views.PortCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.nodesTabPage.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -53,36 +60,78 @@
       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);
       // 
       // nodeCollectionView
       // 
-      this.nodeCollectionView.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.nodeCollectionView.Caption = "NodeCollection View";
       this.nodeCollectionView.Content = null;
-      this.nodeCollectionView.Location = new System.Drawing.Point(6, 26);
+      this.nodeCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.nodeCollectionView.Location = new System.Drawing.Point(3, 3);
       this.nodeCollectionView.Name = "nodeCollectionView";
       this.nodeCollectionView.ReadOnly = false;
       this.nodeCollectionView.ShowDetails = true;
-      this.nodeCollectionView.Size = new System.Drawing.Size(639, 491);
-      this.nodeCollectionView.TabIndex = 3;
+      this.nodeCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.nodeCollectionView.TabIndex = 0;
+      // 
+      // tabControl
+      // 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.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.tabControl.Controls.Add(this.nodesTabPage);
+      this.tabControl.Controls.Add(this.portsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 491);
+      this.tabControl.TabIndex = 3;
+      // 
+      // nodesTabPage
+      // 
+      this.nodesTabPage.Controls.Add(this.nodeCollectionView);
+      this.nodesTabPage.Location = new System.Drawing.Point(4, 22);
+      this.nodesTabPage.Name = "nodesTabPage";
+      this.nodesTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.nodesTabPage.Size = new System.Drawing.Size(637, 465);
+      this.nodesTabPage.TabIndex = 0;
+      this.nodesTabPage.Text = "Nodes";
+      this.nodesTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portsTabPage
+      // 
+      this.portsTabPage.Controls.Add(this.portCollectionView);
+      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.portsTabPage.Name = "portsTabPage";
+      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.portsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.portsTabPage.TabIndex = 1;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // portCollectionView
+      // 
+      this.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.portCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.portCollectionView.TabIndex = 0;
       // 
       // NetworkView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.nodeCollectionView);
+      this.Controls.Add(this.tabControl);
       this.Name = "NetworkView";
-      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.nodeCollectionView, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.nodesTabPage.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -93,4 +142,8 @@
 
     protected NodeCollectionView nodeCollectionView;
+    protected MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage nodesTabPage;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected PortCollectionView portCollectionView;
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/NetworkView.cs	(revision 11530)
@@ -50,4 +50,5 @@
       base.OnContentChanged();
       nodeCollectionView.Content = Content == null ? null : Content.Nodes;
+      portCollectionView.Content = Content == null ? null : Content.Ports;
     }
 
@@ -55,4 +56,5 @@
       base.SetEnabledStateOfControls();
       nodeCollectionView.Enabled = Content != null;
+      portCollectionView.Enabled = Content != null;
     }
   }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.Designer.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.Designer.cs	(revision 11530)
@@ -0,0 +1,52 @@
+#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.Core.Networks.Views {
+  partial class UserDefinedMessagePortView {
+    /// <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.components = new System.ComponentModel.Container();
+    }
+
+    #endregion
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedMessagePortView.cs	(revision 11530)
@@ -0,0 +1,44 @@
+#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.MainForm;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Core.Networks.Views {
+  [View("UserDefinedMessagePort View")]
+  [Content(typeof(UserDefinedMessagePort), true)]
+  [Content(typeof(IUserDefinedMessagePort), false)]
+  public partial class UserDefinedMessagePortView : MessagePortView {
+    public new IUserDefinedMessagePort Content {
+      get { return (IUserDefinedMessagePort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public UserDefinedMessagePortView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedNetworkView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedNetworkView.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Core.Networks.Views/UserDefinedNetworkView.cs	(revision 11530)
@@ -40,4 +40,5 @@
       base.OnContentChanged();
       nodeCollectionView.Content = Content == null ? null : Content.Nodes;
+      portCollectionView.Content = Content == null ? null : Content.Ports;
     }
   }
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 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11530)
@@ -91,10 +91,4 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Core.Networks.Views\GenericPortView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Core.Networks.Views\GenericPortView.Designer.cs">
-      <DependentUpon>GenericPortView.cs</DependentUpon>
-    </Compile>
     <Compile Include="Core.Networks.Views\MessageCollectionView.cs">
       <SubType>UserControl</SubType>
@@ -103,4 +97,10 @@
       <DependentUpon>MessageCollectionView.cs</DependentUpon>
     </Compile>
+    <Compile Include="Core.Networks.Views\MessagePortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core.Networks.Views\MessagePortView.Designer.cs">
+      <DependentUpon>MessagePortView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Core.Networks.Views\MessageValueCollectionView.cs">
       <SubType>UserControl</SubType>
@@ -192,4 +192,10 @@
     <Compile Include="Core.Networks.Views\UserDefinedNetworkView.Designer.cs">
       <DependentUpon>UserDefinedNetworkView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Core.Networks.Views\UserDefinedMessagePortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Core.Networks.Views\UserDefinedMessagePortView.Designer.cs">
+      <DependentUpon>UserDefinedMessagePortView.cs</DependentUpon>
     </Compile>
     <Compile Include="Core.Networks.Views\UserDefinedNodeView.cs">
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Operators.Views/HookOperatorView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Operators.Views/HookOperatorView.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Operators.Views/HookOperatorView.cs	(revision 11530)
@@ -76,5 +76,5 @@
     protected virtual void portView_DragEnterOver(object sender, DragEventArgs e) {
       e.Effect = DragDropEffects.None;
-      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IGenericPort;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IMessagePort;
 
       if (!ReadOnly && (data != null)) {
@@ -84,5 +84,5 @@
     protected virtual void portView_DragDrop(object sender, DragEventArgs e) {
       if (e.Effect != DragDropEffects.None) {
-        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IGenericPort;
+        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IMessagePort;
         Content.Port = port;
       }
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/GenericPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/GenericPort.cs	(revision 11529)
+++ 	(revision )
@@ -1,273 +1,0 @@
-#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.Persistence.Default.CompositeSerializers.Storable;
-using System;
-using System.Drawing;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace HeuristicLab.Core.Networks {
-  [Item("GenericPort", "A generic port of an optimization network node.")]
-  [StorableClass]
-  public class GenericPort : ParameterizedPort, IGenericPort, IConnectedPort {
-    public override Image ItemImage {
-      get {
-        if (PortConnectionValid) return base.ItemImage;
-        else return HeuristicLab.Common.Resources.VSImageLibrary.Error;
-      }
-    }
-
-    new public PortParameterCollection Parameters {
-      get { return base.Parameters; }
-    }
-
-    [Storable]
-    protected IConnectedPort connectedPort;
-    public IConnectedPort ConnectedPort {
-      get { return connectedPort; }
-      set {
-        if (connectedPort != value) {
-          DeregisterConnectedPortEvents();
-          connectedPort = value;
-          RegisterConnectedPortEvents();
-          OnConnectedPortChanged();
-          OnInterfaceChanged();
-        }
-      }
-    }
-    [Storable]
-    protected bool portConnectionValid;
-    public bool PortConnectionValid {
-      get { return portConnectionValid; }
-      protected set {
-        if (value != portConnectionValid) {
-          portConnectionValid = value;
-          OnPortConnectionValidChanged();
-          OnItemImageChanged();
-        }
-      }
-    }
-    [Storable]
-    protected bool logMessages;
-    public bool LogMessages {
-      get { return logMessages; }
-      set {
-        if (value != logMessages) {
-          logMessages = value;
-          OnLogMessagesChanged();
-        }
-      }
-    }
-    [Storable]
-    protected MessageCollection messages;
-    public MessageCollection Messages {
-      get { return messages; }
-    }
-
-    [StorableConstructor]
-    protected GenericPort(bool deserializing) : base(deserializing) { }
-    protected GenericPort(GenericPort original, Cloner cloner)
-      : base(original, cloner) {
-      connectedPort = cloner.Clone(original.connectedPort);
-      portConnectionValid = original.portConnectionValid;
-      logMessages = original.logMessages;
-      messages = cloner.Clone(original.messages);
-      RegisterConnectedPortEvents();
-    }
-    public GenericPort()
-      : base("GenericPort") {
-      portConnectionValid = true;
-      logMessages = false;
-      messages = new MessageCollection();
-    }
-    public GenericPort(string name)
-      : base(name) {
-      portConnectionValid = true;
-      logMessages = false;
-      messages = new MessageCollection();
-    }
-    public GenericPort(string name, string description)
-      : base(name, description) {
-      portConnectionValid = true;
-      logMessages = false;
-      messages = new MessageCollection();
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterConnectedPortEvents();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new GenericPort(this, cloner);
-    }
-
-    public bool CanConnectToPort(IPort port) {
-      if (port == null) return true;
-
-      var cp = port as IConnectedPort;
-      if (cp == null) return false;
-
-      // check connected port input parameters
-      foreach (var input in cp.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
-        IPortParameter param;
-        Parameters.TryGetValue(input.Name, out param);
-        if ((param == null) && (input.DefaultValue == null)) return false;
-        if (!param.Type.HasFlag(PortParameterType.Output)) return false;
-        if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
-      }
-      // check local port input parameters
-      foreach (var input in Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
-        IPortParameter param;
-        cp.Parameters.TryGetValue(input.Name, out param);
-        if ((param == null) && (input.DefaultValue == null)) return false;
-        if (!param.Type.HasFlag(PortParameterType.Output)) return false;
-        if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
-      }
-      return true;
-    }
-    public void CloneConnectedPortParameters() {
-      Parameters.Clear();
-      foreach (var p in connectedPort.Parameters) {
-        var param = (IPortParameter)p.Clone();
-        if (!(param.Type.HasFlag(PortParameterType.Input) && param.Type.HasFlag(PortParameterType.Output))) {
-          param.Type = ~param.Type;  // bitwise negation: input -> output, output -> input
-        }
-        Parameters.Add(param);
-      }
-    }
-
-    public IMessage PrepareMessage() {
-      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
-      var message = new Message();
-
-      // collect output parameters from local port
-      message.Values.AddRange(
-        Parameters
-          .Where(p => p.Type.HasFlag(PortParameterType.Output))
-          .Select(p => p.CreateMessageValue())
-      );
-
-      // collect remaining input parameters from connected port
-      if (ConnectedPort != null) {
-        message.Values.AddRange(
-          ConnectedPort.Parameters
-            .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))
-            .Select(p => p.CreateMessageValue())
-        );
-      }
-
-      // collect output parameters from connected port
-      if (ConnectedPort != null) {
-        message.Values.AddRange(
-          ConnectedPort.Parameters
-            .Where(p => p.Type.HasFlag(PortParameterType.Output) && !message.Values.ContainsKey(p.Name))
-            .Select(p => p.CreateMessageValue())
-        );
-      }
-
-      // collect remaining input parameters from local port
-      message.Values.AddRange(
-        Parameters
-          .Where(p => p.Type.HasFlag(PortParameterType.Input) && !message.Values.ContainsKey(p.Name))
-          .Select(p => p.CreateMessageValue())
-      );
-
-      return message;
-    }
-    public void SendMessage(IMessage message) {
-      SendMessage(message, CancellationToken.None);
-    }
-    public void SendMessage(IMessage message, CancellationToken token) {
-      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
-      if (LogMessages) Messages.Add(message);
-      if (ConnectedPort != null) ConnectedPort.ReceiveMessage(message, token);
-      OnMessageSent(message, token);
-    }
-    public async Task SendMessageAsync(IMessage message) {
-      await SendMessageAsync(message, CancellationToken.None);
-    }
-    public async Task SendMessageAsync(IMessage message, CancellationToken token) {
-      await Task.Run(() => { SendMessage(message, token); }, token);
-    }
-    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
-    protected virtual void OnMessageSent(IMessage message, CancellationToken token) {
-      var handler = MessageSent;
-      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
-    }
-
-    public void ReceiveMessage(IMessage message, CancellationToken token) {
-      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
-      if (LogMessages) Messages.Add(message);
-      OnMessageReceived(message, token);
-    }
-    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
-    protected virtual void OnMessageReceived(IMessage message, CancellationToken token) {
-      var handler = MessageReceived;
-      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
-    }
-
-    public event EventHandler ConnectedPortChanged;
-    protected virtual void OnConnectedPortChanged() {
-      var handler = ConnectedPortChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler PortConnectionValidChanged;
-    protected virtual void OnPortConnectionValidChanged() {
-      var handler = PortConnectionValidChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-    public event EventHandler LogMessagesChanged;
-    protected virtual void OnLogMessagesChanged() {
-      var handler = LogMessagesChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    protected override void OnInterfaceChanged() {
-      PortConnectionValid = CanConnectToPort(connectedPort);
-      base.OnInterfaceChanged();
-    }
-
-    #region ConnectedPort Events
-    protected virtual void RegisterConnectedPortEvents() {
-      if (connectedPort != null) {
-        connectedPort.InterfaceChanged += ConnectedPort_InterfaceChanged;
-        connectedPort.MessageSent += ConnectedPort_MessageSent;
-      }
-    }
-    protected virtual void DeregisterConnectedPortEvents() {
-      if (connectedPort != null) {
-        connectedPort.InterfaceChanged -= ConnectedPort_InterfaceChanged;
-        connectedPort.MessageSent -= ConnectedPort_MessageSent;
-      }
-    }
-    protected virtual void ConnectedPort_InterfaceChanged(object sender, EventArgs e) {
-      OnInterfaceChanged();
-    }
-    protected virtual void ConnectedPort_MessageSent(object sender, EventArgs<IMessage, CancellationToken> e) {
-      ReceiveMessage(e.Value, e.Value2);
-    }
-    #endregion
-  }
-}
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IConnectedPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IConnectedPort.cs	(revision 11529)
+++ 	(revision )
@@ -1,31 +1,0 @@
-#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 System;
-using System.Threading;
-
-namespace HeuristicLab.Core.Networks {
-  public interface IConnectedPort : IParameterizedPort {
-    void ReceiveMessage(IMessage message, CancellationToken token);
-    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
-  }
-}
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IGenericPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IGenericPort.cs	(revision 11529)
+++ 	(revision )
@@ -1,51 +1,0 @@
-#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 System;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace HeuristicLab.Core.Networks {
-  public interface IGenericPort : IParameterizedPort {
-    new PortParameterCollection Parameters { get; }
-
-    IConnectedPort ConnectedPort { get; set; }
-    bool PortConnectionValid { get; }
-    bool LogMessages { get; set; }
-    MessageCollection Messages { get; }
-
-    event EventHandler ConnectedPortChanged;
-    event EventHandler PortConnectionValidChanged;
-    event EventHandler LogMessagesChanged;
-
-    bool CanConnectToPort(IPort port);
-    void CloneConnectedPortParameters();
-
-    IMessage PrepareMessage();
-    void SendMessage(IMessage message);
-    void SendMessage(IMessage message, CancellationToken token);
-    Task SendMessageAsync(IMessage message);
-    Task SendMessageAsync(IMessage message, CancellationToken token);
-
-    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
-  }
-}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IMessagePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IMessagePort.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IMessagePort.cs	(revision 11530)
@@ -0,0 +1,50 @@
+#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 System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Core.Networks {
+  public interface IMessagePort : IParameterizedPort {
+    IMessagePort ConnectedPort { get; set; }
+    bool PortConnectionValid { get; }
+    bool LogMessages { get; set; }
+    MessageCollection Messages { get; }
+
+    bool CanConnectToPort(IPort port);
+
+    event EventHandler ConnectedPortChanged;
+    event EventHandler PortConnectionValidChanged;
+    event EventHandler LogMessagesChanged;
+
+    IMessage PrepareMessage();
+    void SendMessage(IMessage message);
+    void SendMessage(IMessage message, CancellationToken token);
+    Task SendMessageAsync(IMessage message);
+    Task SendMessageAsync(IMessage message, CancellationToken token);
+    void ReceiveMessage(IMessage message, CancellationToken token);
+
+    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
+    event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IParameterizedPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IParameterizedPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IParameterizedPort.cs	(revision 11530)
@@ -26,4 +26,6 @@
     IKeyedItemCollection<string, IPortParameter> Parameters { get; }
 
+    void CloneParametersFromPort(IParameterizedPort port);
+
     event EventHandler InterfaceChanged;
   }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IUserDefinedMessagePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IUserDefinedMessagePort.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/IUserDefinedMessagePort.cs	(revision 11530)
@@ -0,0 +1,27 @@
+#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.Core.Networks {
+  public interface IUserDefinedMessagePort : IMessagePort {
+    new PortParameterCollection Parameters { get; }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/MessagePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/MessagePort.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/MessagePort.cs	(revision 11530)
@@ -0,0 +1,249 @@
+#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.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("MessagePort", "A port of a network node for sending and receiving messages.")]
+  [StorableClass]
+  public class MessagePort : ParameterizedPort, IMessagePort {
+    public override Image ItemImage {
+      get {
+        if (PortConnectionValid) return base.ItemImage;
+        else return HeuristicLab.Common.Resources.VSImageLibrary.Error;
+      }
+    }
+
+    new public PortParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [Storable]
+    protected IMessagePort connectedPort;
+    public IMessagePort ConnectedPort {
+      get { return connectedPort; }
+      set {
+        if (connectedPort != value) {
+          DeregisterConnectedPortEvents();
+          connectedPort = value;
+          RegisterConnectedPortEvents();
+          OnConnectedPortChanged();
+          OnInterfaceChanged();
+        }
+      }
+    }
+    [Storable]
+    protected bool portConnectionValid;
+    public bool PortConnectionValid {
+      get { return portConnectionValid; }
+      protected set {
+        if (value != portConnectionValid) {
+          portConnectionValid = value;
+          OnPortConnectionValidChanged();
+          OnItemImageChanged();
+        }
+      }
+    }
+    [Storable]
+    protected bool logMessages;
+    public bool LogMessages {
+      get { return logMessages; }
+      set {
+        if (value != logMessages) {
+          logMessages = value;
+          OnLogMessagesChanged();
+        }
+      }
+    }
+    [Storable]
+    protected MessageCollection messages;
+    public MessageCollection Messages {
+      get { return messages; }
+    }
+
+    [StorableConstructor]
+    protected MessagePort(bool deserializing) : base(deserializing) { }
+    protected MessagePort(MessagePort original, Cloner cloner)
+      : base(original, cloner) {
+      connectedPort = cloner.Clone(original.connectedPort);
+      portConnectionValid = original.portConnectionValid;
+      logMessages = original.logMessages;
+      messages = cloner.Clone(original.messages);
+      RegisterConnectedPortEvents();
+    }
+    public MessagePort()
+      : base("MessagePort") {
+      portConnectionValid = true;
+      logMessages = false;
+      messages = new MessageCollection();
+    }
+    public MessagePort(string name)
+      : base(name) {
+      portConnectionValid = true;
+      logMessages = false;
+      messages = new MessageCollection();
+    }
+    public MessagePort(string name, string description)
+      : base(name, description) {
+      portConnectionValid = true;
+      logMessages = false;
+      messages = new MessageCollection();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterConnectedPortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MessagePort(this, cloner);
+    }
+
+    public bool CanConnectToPort(IPort port) {
+      if (port == null) return true;
+
+      var p = port as IMessagePort;
+      if (p == null) return false;
+
+      // check if the local parameters are compatible to the input parameters of the port
+      if (!ParametersCompatibleToTarget(Parameters, p.Parameters)) return false;
+      // check if the parameters of the port are compatible to the local input parameters
+      if (!ParametersCompatibleToTarget(p.Parameters, Parameters)) return false;
+
+      return true;
+    }
+
+    public IMessage PrepareMessage() {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      var message = new Message();
+
+      // collect parameters from local port
+      message.Values.AddRange(Parameters.Select(p => p.CreateMessageValue()));
+
+      // collect remaining parameters from connected port
+      if (ConnectedPort != null) {
+        message.Values.AddRange(
+          ConnectedPort.Parameters
+            .Where(p => !message.Values.ContainsKey(p.Name))
+            .Select(p => p.CreateMessageValue())
+        );
+      }
+
+      return message;
+    }
+    public void SendMessage(IMessage message) {
+      SendMessage(message, CancellationToken.None);
+    }
+    public void SendMessage(IMessage message, CancellationToken token) {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      if (LogMessages) Messages.Add(message);
+      if (ConnectedPort != null) ConnectedPort.ReceiveMessage(message, token);
+      OnMessageSent(message, token);
+    }
+    public async Task SendMessageAsync(IMessage message) {
+      await SendMessageAsync(message, CancellationToken.None);
+    }
+    public async Task SendMessageAsync(IMessage message, CancellationToken token) {
+      await Task.Run(() => { SendMessage(message, token); }, token);
+    }
+    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageSent;
+    protected virtual void OnMessageSent(IMessage message, CancellationToken token) {
+      var handler = MessageSent;
+      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
+    }
+
+    public void ReceiveMessage(IMessage message, CancellationToken token) {
+      if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
+      if (LogMessages) Messages.Add(message);
+      OnMessageReceived(message, token);
+    }
+    public event EventHandler<EventArgs<IMessage, CancellationToken>> MessageReceived;
+    protected virtual void OnMessageReceived(IMessage message, CancellationToken token) {
+      var handler = MessageReceived;
+      if (handler != null) handler(this, new EventArgs<IMessage, CancellationToken>(message, token));
+    }
+
+    public event EventHandler ConnectedPortChanged;
+    protected virtual void OnConnectedPortChanged() {
+      var handler = ConnectedPortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PortConnectionValidChanged;
+    protected virtual void OnPortConnectionValidChanged() {
+      var handler = PortConnectionValidChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler LogMessagesChanged;
+    protected virtual void OnLogMessagesChanged() {
+      var handler = LogMessagesChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    protected override void OnInterfaceChanged() {
+      PortConnectionValid = CanConnectToPort(connectedPort);
+      base.OnInterfaceChanged();
+    }
+
+    #region ConnectedPort Events
+    protected virtual void RegisterConnectedPortEvents() {
+      if (connectedPort != null) {
+        connectedPort.InterfaceChanged += ConnectedPort_InterfaceChanged;
+        connectedPort.MessageSent += ConnectedPort_MessageSent;
+      }
+    }
+    protected virtual void DeregisterConnectedPortEvents() {
+      if (connectedPort != null) {
+        connectedPort.InterfaceChanged -= ConnectedPort_InterfaceChanged;
+        connectedPort.MessageSent -= ConnectedPort_MessageSent;
+      }
+    }
+    protected virtual void ConnectedPort_InterfaceChanged(object sender, EventArgs e) {
+      OnInterfaceChanged();
+    }
+    protected virtual void ConnectedPort_MessageSent(object sender, EventArgs<IMessage, CancellationToken> e) {
+      ReceiveMessage(e.Value, e.Value2);
+    }
+    #endregion
+
+    #region Helpers
+    protected virtual bool ParametersCompatibleToTarget(IEnumerable<IPortParameter> source, IEnumerable<IPortParameter> target) {
+      // checks if the source parameters are compatible to the input parameters of the target
+      foreach (var input in target.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
+        var param = source.Where(p => input.Name == p.Name).FirstOrDefault();
+        if (param == null) {
+          if (input.DefaultValue == null) return false;
+        } else {
+          if (!param.Type.HasFlag(PortParameterType.Output)) return false;
+          if (!input.DataType.IsAssignableFrom(param.DataType)) return false;
+        }
+      }
+      return true;
+    }
+    #endregion
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ParameterizedPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ParameterizedPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/ParameterizedPort.cs	(revision 11530)
@@ -83,4 +83,15 @@
     }
 
+    public virtual void CloneParametersFromPort(IParameterizedPort port) {
+      Parameters.Clear();
+      foreach (var p in port.Parameters) {
+        var param = (IPortParameter)p.Clone();
+        if (!(param.Type.HasFlag(PortParameterType.Input) && param.Type.HasFlag(PortParameterType.Output))) {
+          param.Type = ~param.Type;  // bitwise negation: input -> output, output -> input
+        }
+        Parameters.Add(param);
+      }
+    }
+
     public event EventHandler InterfaceChanged;
     protected virtual void OnInterfaceChanged() {
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/UserDefinedMessagePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/UserDefinedMessagePort.cs	(revision 11530)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Core.Networks/UserDefinedMessagePort.cs	(revision 11530)
@@ -0,0 +1,44 @@
+#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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Core.Networks {
+  [Item("User-Defined Message Port", "A message port of a network which can be defined by the user.")]
+  [StorableClass]
+  public sealed class UserDefinedMessagePort : MessagePort, IUserDefinedMessagePort {
+    new public PortParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [StorableConstructor]
+    private UserDefinedMessagePort(bool deserializing) : base(deserializing) { }
+    private UserDefinedMessagePort(UserDefinedMessagePort original, Cloner cloner) : base(original, cloner) { }
+    public UserDefinedMessagePort() : base("UserDefinedMessagePort") { }
+    public UserDefinedMessagePort(string name) : base(name) { }
+    public UserDefinedMessagePort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UserDefinedMessagePort(this, cloner);
+    }
+  }
+}
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 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11530)
@@ -90,10 +90,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Core.Networks\IUserDefinedMessagePort.cs" />
+    <Compile Include="Core.Networks\IMessagePort.cs" />
     <Compile Include="Core.Networks\IUserDefinedNetwork.cs" />
     <Compile Include="Core.Networks\IUserDefinedNode.cs" />
+    <Compile Include="Core.Networks\MessagePort.cs" />
     <Compile Include="Core.Networks\UserDefinedNetwork.cs" />
-    <Compile Include="Core.Networks\GenericPort.cs" />
-    <Compile Include="Core.Networks\IConnectedPort.cs" />
-    <Compile Include="Core.Networks\IGenericPort.cs" />
     <Compile Include="Core.Networks\IMessage.cs" />
     <Compile Include="Core.Networks\IMessageValue.cs" />
@@ -118,4 +118,5 @@
     <Compile Include="Core.Networks\PortParameterCollection.cs" />
     <Compile Include="Core.Networks\PortParameterType.cs" />
+    <Compile Include="Core.Networks\UserDefinedMessagePort.cs" />
     <Compile Include="Core.Networks\UserDefinedNode.cs" />
     <Compile Include="Operators\HookOperator.cs" />
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/HookOperator.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/HookOperator.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/HookOperator.cs	(revision 11530)
@@ -36,6 +36,6 @@
 
     [Storable]
-    protected IGenericPort port;
-    public IGenericPort Port {
+    protected IMessagePort port;
+    public IMessagePort Port {
       get { return port; }
       set {
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/IHookOperator.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/IHookOperator.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Operators/IHookOperator.cs	(revision 11530)
@@ -27,5 +27,5 @@
   public interface IHookOperator : IOperator {
     new ParameterCollection Parameters { get; }
-    IGenericPort Port { get; set; }
+    IMessagePort Port { get; set; }
 
     event EventHandler PortChanged;
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPConnector.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPConnector.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPConnector.cs	(revision 11530)
@@ -65,10 +65,10 @@
 
     protected virtual void Initialize() {
-      var parameters = new GenericPort("Parameters");
+      var parameters = new MessagePort("Parameters");
       Ports.Add(parameters);
       parameters.Parameters.Add(new PortParameter<DoubleMatrix>("Cities") { Type = PortParameterType.Input });
       parameters.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") { Type = PortParameterType.Input });
 
-      var ksp = new GenericPort("KSP Connector");
+      var ksp = new MessagePort("KSP Connector");
       Ports.Add(ksp);
       ksp.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") { Type = PortParameterType.Input });
@@ -77,5 +77,5 @@
       ksp.Parameters.Add(new PortParameter<PathTSPTour>("Route") { Type = PortParameterType.Output });
 
-      var tsp = new GenericPort("TSP Connector");
+      var tsp = new MessagePort("TSP Connector");
       Ports.Add(tsp);
       tsp.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") { Type = PortParameterType.Output });
@@ -85,5 +85,5 @@
 
     protected virtual void RegisterEvents() {
-      var ksp = (IGenericPort)Ports["KSP Connector"];
+      var ksp = (IMessagePort)Ports["KSP Connector"];
       ksp.MessageReceived += Knapsack_MessageReceived;
     }
@@ -91,5 +91,5 @@
     protected virtual void Knapsack_MessageReceived(object sender, EventArgs<IMessage, System.Threading.CancellationToken> e) {
       // get parameters
-      var parametersPort = (IGenericPort)Ports["Parameters"];
+      var parametersPort = (IMessagePort)Ports["Parameters"];
       var parameters = parametersPort.PrepareMessage();
       parametersPort.SendMessage(parameters, e.Value2);
@@ -112,5 +112,5 @@
 
       // solve TSP
-      var tspConnectorPort = (IGenericPort)Ports["TSP Connector"];
+      var tspConnectorPort = (IMessagePort)Ports["TSP Connector"];
       var tspMsg = tspConnectorPort.PrepareMessage();
       tspMsg["Coordinates"] = coords;
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPNetwork.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPNetwork.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks.KSPTSP/KSPTSPNetwork.cs	(revision 11530)
@@ -63,5 +63,5 @@
       Nodes.Add(paramsNode);
 
-      var paramsPort = new GenericPort("Parameters");
+      var paramsPort = new MessagePort("Parameters");
       paramsNode.Ports.Add(paramsPort);
 
@@ -111,5 +111,5 @@
       });
 
-      var evaluatePort = new GenericPort("EvaluateRoute");
+      var evaluatePort = new MessagePort("EvaluateRoute");
       kspNode.Ports.Add(evaluatePort);
 
@@ -175,7 +175,7 @@
       hook.Port = evaluatePort;
       configPort.ConnectedPort = paramsPort;
-      evaluatePort.ConnectedPort = (IConnectedPort)ksptspConnector.Ports["KSP Connector"];
-      ((IGenericPort)ksptspConnector.Ports["Parameters"]).ConnectedPort = paramsPort;
-      ((IGenericPort)ksptspConnector.Ports["TSP Connector"]).ConnectedPort = executePort;
+      evaluatePort.ConnectedPort = (IMessagePort)ksptspConnector.Ports["KSP Connector"];
+      ((IMessagePort)ksptspConnector.Ports["Parameters"]).ConnectedPort = paramsPort;
+      ((IMessagePort)ksptspConnector.Ports["TSP Connector"]).ConnectedPort = executePort;
 
       paramsPort.SendMessage(paramsPort.PrepareMessage());
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ConfigurationPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ConfigurationPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ConfigurationPort.cs	(revision 11530)
@@ -28,5 +28,5 @@
   [Item("ConfigurationPort", "A port of an optimization network node which triggers configuration changes.")]
   [StorableClass]
-  public class ConfigurationPort : GenericPort, IConfigurationPort {
+  public class ConfigurationPort : MessagePort, IConfigurationPort {
     [StorableConstructor]
     protected ConfigurationPort(bool deserializing) : base(deserializing) { }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ExecutionPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ExecutionPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/ExecutionPort.cs	(revision 11530)
@@ -28,5 +28,5 @@
   [Item("ExecutionPort", "A port of an optimization network node which triggers execution.")]
   [StorableClass]
-  public class ExecutionPort : GenericPort, IExecutionPort {
+  public class ExecutionPort : MessagePort, IExecutionPort {
     [StorableConstructor]
     protected ExecutionPort(bool deserializing) : base(deserializing) { }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IConfigurationPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IConfigurationPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IConfigurationPort.cs	(revision 11530)
@@ -23,4 +23,4 @@
 
 namespace HeuristicLab.Optimization.Networks {
-  public interface IConfigurationPort : IGenericPort { }
+  public interface IConfigurationPort : IMessagePort { }
 }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IExecutionPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IExecutionPort.cs	(revision 11529)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Optimization.Networks/IExecutionPort.cs	(revision 11530)
@@ -23,4 +23,4 @@
 
 namespace HeuristicLab.Optimization.Networks {
-  public interface IExecutionPort : IGenericPort { }
+  public interface IExecutionPort : IMessagePort { }
 }
