Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 11452)
@@ -30,5 +30,5 @@
   [Content(typeof(AlgorithmNode), true)]
   [Content(typeof(IAlgorithmNode), false)]
-  public partial class AlgorithmNodeView : NodeView {
+  public partial class AlgorithmNodeView : EntityView {
     protected TypeSelectorDialog typeSelectorDialog;
 
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 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11452)
@@ -103,4 +103,10 @@
       <DependentUpon>EntityView.cs</DependentUpon>
     </Compile>
+    <Compile Include="InputOutputPortView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="InputOutputPortView.Designer.cs">
+      <DependentUpon>InputOutputPortView.cs</DependentUpon>
+    </Compile>
     <Compile Include="PortView.cs">
       <SubType>UserControl</SubType>
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.Designer.cs	(revision 11452)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.Designer.cs	(revision 11452)
@@ -0,0 +1,150 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  partial class InputOutputPortView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputPortView));
+      this.outputInputPortGroupBox = new System.Windows.Forms.GroupBox();
+      this.setOutputInputPortButton = new System.Windows.Forms.Button();
+      this.clearOutputInputPortButton = new System.Windows.Forms.Button();
+      this.outputInputPortView = new HeuristicLab.Optimization.Networks.Views.PortView();
+      this.valueGroupBox.SuspendLayout();
+      this.valuePanel.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.outputInputPortGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // valueGroupBox
+      // 
+      this.valueGroupBox.Location = new System.Drawing.Point(0, 82);
+      this.valueGroupBox.Size = new System.Drawing.Size(645, 435);
+      this.valueGroupBox.TabIndex = 4;
+      // 
+      // valuePanel
+      // 
+      this.valuePanel.Size = new System.Drawing.Size(633, 410);
+      // 
+      // valueViewHost
+      // 
+      this.valueViewHost.Size = new System.Drawing.Size(633, 410);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(71, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(549, 20);
+      // 
+      // outputInputPortGroupBox
+      // 
+      this.outputInputPortGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.outputInputPortGroupBox.Controls.Add(this.setOutputInputPortButton);
+      this.outputInputPortGroupBox.Controls.Add(this.clearOutputInputPortButton);
+      this.outputInputPortGroupBox.Controls.Add(this.outputInputPortView);
+      this.outputInputPortGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.outputInputPortGroupBox.Name = "outputInputPortGroupBox";
+      this.outputInputPortGroupBox.Size = new System.Drawing.Size(645, 50);
+      this.outputInputPortGroupBox.TabIndex = 3;
+      this.outputInputPortGroupBox.TabStop = false;
+      this.outputInputPortGroupBox.Text = "&Output/Input Port";
+      // 
+      // setOutputInputPortButton
+      // 
+      this.setOutputInputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Edit;
+      this.setOutputInputPortButton.Location = new System.Drawing.Point(6, 19);
+      this.setOutputInputPortButton.Name = "setOutputInputPortButton";
+      this.setOutputInputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.setOutputInputPortButton.TabIndex = 0;
+      this.setOutputInputPortButton.UseVisualStyleBackColor = true;
+      this.setOutputInputPortButton.Click += new System.EventHandler(this.setOutputInputPortButton_Click);
+      // 
+      // clearOutputInputPortButton
+      // 
+      this.clearOutputInputPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearOutputInputPortButton.Location = new System.Drawing.Point(36, 19);
+      this.clearOutputInputPortButton.Name = "clearOutputInputPortButton";
+      this.clearOutputInputPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearOutputInputPortButton.TabIndex = 1;
+      this.clearOutputInputPortButton.UseVisualStyleBackColor = true;
+      this.clearOutputInputPortButton.Click += new System.EventHandler(this.clearOutputInputPortButton_Click);
+      // 
+      // outputInputPortView
+      // 
+      this.outputInputPortView.AllowDrop = true;
+      this.outputInputPortView.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.outputInputPortView.Caption = "Output/Input Port View";
+      this.outputInputPortView.Content = null;
+      this.outputInputPortView.Location = new System.Drawing.Point(66, 21);
+      this.outputInputPortView.Name = "outputInputPortView";
+      this.outputInputPortView.ReadOnly = true;
+      this.outputInputPortView.Size = new System.Drawing.Size(573, 23);
+      this.outputInputPortView.TabIndex = 2;
+      this.outputInputPortView.DragDrop += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragDrop);
+      this.outputInputPortView.DragEnter += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragEnterOver);
+      this.outputInputPortView.DragOver += new System.Windows.Forms.DragEventHandler(this.outputInputPortView_DragEnterOver);
+      // 
+      // InputOutputPortView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.outputInputPortGroupBox);
+      this.Name = "InputOutputPortView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.valueGroupBox, 0);
+      this.Controls.SetChildIndex(this.outputInputPortGroupBox, 0);
+      this.valueGroupBox.ResumeLayout(false);
+      this.valuePanel.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.outputInputPortGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox outputInputPortGroupBox;
+    protected PortView outputInputPortView;
+    protected System.Windows.Forms.Button clearOutputInputPortButton;
+    protected System.Windows.Forms.Button setOutputInputPortButton;
+
+
+
+
+
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.cs	(revision 11452)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/InputOutputPortView.cs	(revision 11452)
@@ -0,0 +1,127 @@
+#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.Optimization.Networks.Views {
+  [View("InputOutputPort View")]
+  [Content(typeof(InputOutputPort<,>), true)]
+  [Content(typeof(IInputOutputPort<,>), false)]
+  [Content(typeof(IInputOutputPort), false)]
+  public partial class InputOutputPortView : ValuePortView {
+    protected EntitySelectorDialog entitySelectorDialog;
+
+    public new IInputOutputPort Content {
+      get { return (IInputOutputPort)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public InputOutputPortView() {
+      InitializeComponent();
+    }
+
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (entitySelectorDialog != null) entitySelectorDialog.Dispose();
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.OutputInputPortChanged -= Content_OutputInputPortChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.OutputInputPortChanged += Content_OutputInputPortChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      outputInputPortView.Content = Content == null ? null : Content.OutputInputPort;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      outputInputPortGroupBox.Enabled = Content != null && !ReadOnly;
+      setOutputInputPortButton.Enabled = Content != null && !ReadOnly;
+      clearOutputInputPortButton.Enabled = Content != null && Content.OutputInputPort != null && !ReadOnly;
+    }
+
+    protected virtual void Content_OutputInputPortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_OutputInputPortChanged), sender, e);
+      else {
+        clearOutputInputPortButton.Enabled = Content.OutputInputPort != null && !ReadOnly;
+        outputInputPortView.Content = Content.OutputInputPort;
+      }
+    }
+
+    protected virtual void setOutputInputPortButton_Click(object sender, EventArgs e) {
+      if (entitySelectorDialog == null) {
+        entitySelectorDialog = new EntitySelectorDialog();
+        entitySelectorDialog.Caption = "Select Output/Input Port";
+        entitySelectorDialog.EntitySelector.Caption = "Available Output/Input Ports";
+      }
+
+      try {
+        IEntity root = Content;
+        while (root.Parent != null)
+          root = root.Parent;
+        entitySelectorDialog.EntitySelector.Configure(
+          root,
+          Content.OutputInputPort,
+          typeof(IOutputInputPort<,>).MakeGenericType(Content.GetType().GetGenericArguments()[0], Content.GetType().GetGenericArguments()[1])
+        );
+
+        if (entitySelectorDialog.ShowDialog(this) == DialogResult.OK) {
+          Content.OutputInputPort = entitySelectorDialog.EntitySelector.SelectedEntity as IOutputInputPort;
+        }
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, ex);
+      }
+    }
+    protected virtual void clearOutputInputPortButton_Click(object sender, EventArgs e) {
+      Content.OutputInputPort = null;
+    }
+
+    protected virtual void outputInputPortView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
+      var type = typeof(IOutputInputPort<,>).MakeGenericType(Content.GetType().GetGenericArguments()[0], Content.GetType().GetGenericArguments()[1]);
+
+      if (!ReadOnly && (type.IsAssignableFrom(data.GetType()))) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void outputInputPortView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        IOutputInputPort port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IOutputInputPort;
+        Content.OutputInputPort = port;
+      }
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.Designer.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.Designer.cs	(revision 11452)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.SuspendLayout();
@@ -52,16 +53,28 @@
       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
+      // portCollectionView
       // 
-      this.infoLabel.Location = new System.Drawing.Point(626, 3);
+      this.portCollectionView.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.portCollectionView.Caption = "PortCollection View";
+      this.portCollectionView.Content = null;
+      this.portCollectionView.Location = new System.Drawing.Point(0, 26);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(645, 491);
+      this.portCollectionView.TabIndex = 3;
       // 
       // NodeView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.portCollectionView);
       this.Name = "NodeView";
-      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.portCollectionView, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.ResumeLayout(false);
@@ -72,4 +85,7 @@
     #endregion
 
+    protected PortCollectionView portCollectionView;
+
+
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/NodeView.cs	(revision 11452)
@@ -38,22 +38,12 @@
     }
 
-    protected override void DeregisterContentEvents() {
-      // remove events here
-      base.DeregisterContentEvents();
-    }
-
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      // add events here
-    }
-
     protected override void OnContentChanged() {
       base.OnContentChanged();
-      //...
+      portCollectionView.Content = Content == null ? null : Content.Ports;
     }
 
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      //...
+      portCollectionView.Enabled = Content != null && !ReadOnly;
     }
   }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.Designer.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.Designer.cs	(revision 11452)
@@ -45,7 +45,7 @@
     /// </summary>
     private void InitializeComponent() {
-      this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
       this.splitContainer = new System.Windows.Forms.SplitContainer();
       this.variableCollectionView = new HeuristicLab.Core.Views.VariableCollectionView();
+      this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
@@ -59,16 +59,4 @@
       this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
       this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      // 
-      // 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(0, 0);
-      this.portCollectionView.Name = "portCollectionView";
-      this.portCollectionView.ReadOnly = false;
-      this.portCollectionView.ShowDetails = true;
-      this.portCollectionView.Size = new System.Drawing.Size(645, 238);
-      this.portCollectionView.TabIndex = 0;
       // 
       // splitContainer
@@ -89,5 +77,5 @@
       this.splitContainer.Panel2.Controls.Add(this.variableCollectionView);
       this.splitContainer.Size = new System.Drawing.Size(645, 491);
-      this.splitContainer.SplitterDistance = 238;
+      this.splitContainer.SplitterDistance = 237;
       this.splitContainer.TabIndex = 3;
       // 
@@ -101,6 +89,18 @@
       this.variableCollectionView.ReadOnly = false;
       this.variableCollectionView.ShowDetails = true;
-      this.variableCollectionView.Size = new System.Drawing.Size(645, 249);
+      this.variableCollectionView.Size = new System.Drawing.Size(645, 250);
       this.variableCollectionView.TabIndex = 0;
+      // 
+      // 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(0, 0);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(645, 237);
+      this.portCollectionView.TabIndex = 0;
       // 
       // VariablesNodeView
@@ -125,7 +125,7 @@
     #endregion
 
-    protected PortCollectionView portCollectionView;
     protected System.Windows.Forms.SplitContainer splitContainer;
     protected Core.Views.VariableCollectionView variableCollectionView;
+    private PortCollectionView portCollectionView;
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/VariablesNodeView.cs	(revision 11452)
@@ -30,5 +30,5 @@
   [Content(typeof(VariablesNode), true)]
   [Content(typeof(IVariablesNode), false)]
-  public partial class VariablesNodeView : NodeView {
+  public partial class VariablesNodeView : EntityView {
     public new IVariablesNode Content {
       get { return (IVariablesNode)base.Content; }
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 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11452)
@@ -89,4 +89,5 @@
     <Compile Include="Entity.cs" />
     <Compile Include="Port.cs" />
+    <Compile Include="MultiplierNode.cs" />
     <Compile Include="VariablesNode.cs" />
     <Compile Include="EventArgs.cs" />
@@ -134,4 +135,8 @@
       <Name>HeuristicLab.Core-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
       <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IInputOutputPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IInputOutputPort.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IInputOutputPort.cs	(revision 11452)
@@ -25,5 +25,5 @@
 namespace HeuristicLab.Optimization.Networks {
   public interface IInputOutputPort : IValuePort {
-    IOutputInputPort OutputInputPort { get; }
+    IOutputInputPort OutputInputPort { get; set; }
 
     event EventHandler OutputInputPortChanged;
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs	(revision 11452)
@@ -25,6 +25,4 @@
 namespace HeuristicLab.Optimization.Networks {
   public interface IValuePort : IPort {
-    //DISCUSS: Should there be a reference to the node of this port?
-
     object Value { get; }
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputOutputPort.cs	(revision 11452)
@@ -46,4 +46,13 @@
     IOutputInputPort IInputOutputPort.OutputInputPort {
       get { return outputInputPort; }
+      set {
+        var val = value as IOutputInputPort<TIn, TOut>;
+        if ((value != null) && (val == null))
+          throw new InvalidOperationException(
+            string.Format("Type mismatch. OutputInputPort is not a \"{0}\".",
+                          typeof(IOutputInputPort<TIn, TOut>).GetPrettyName())
+          );
+        OutputInputPort = val;
+      }
     }
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/InputPort.cs	(revision 11452)
@@ -44,4 +44,5 @@
           RegisterOutputPortEvents();
           OnOutputPortChanged();
+          UpdateValue();
         }
       }
@@ -79,4 +80,15 @@
     }
 
+    protected virtual void UpdateValue() {
+      if (OutputPort != null) {
+        var value = OutputPort.Value;
+        if (value != null)
+          value = (T)value.Clone();
+        Value = value;
+        //DISCUSS: clone value?
+        //DISCUSS: switch threads to decouple value propagation and to make communication asynchronous -> should be done in Node?
+      }
+    }
+
     public event EventHandler OutputPortChanged;
     protected void OnOutputPortChanged() {
@@ -96,10 +108,5 @@
     }
     protected void OutputPort_ValueChanged(object sender, EventArgs e) {
-      var value = OutputPort.Value;
-      if (value != null)
-        value = (T)value.Clone();
-      Value = value;
-      //DISCUSS: clone value?
-      //DISCUSS: switch threads to decouple value propagation and to make communication asynchronous -> should be done in Node?
+      UpdateValue();
     }
   }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs	(revision 11452)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs	(revision 11452)
@@ -0,0 +1,87 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("MultiplierNode", "A node for multiplying integer values.")]
+  [StorableClass]
+  public class MultiplierNode : Node {
+    protected static readonly string MultiplierPortName = "Multiplier";
+    protected static readonly string ValuePortName = "Value";
+
+    public IInputPort<IntValue> MultiplierPort {
+      get { return (IInputPort<IntValue>)Ports[MultiplierPortName]; }
+    }
+    public IInputOutputPort<IntValue, IntValue> ValuePort {
+      get { return (IInputOutputPort<IntValue, IntValue>)Ports[ValuePortName]; }
+    }
+
+    [StorableConstructor]
+    protected MultiplierNode(bool deserializing) : base(deserializing) { }
+    protected MultiplierNode(MultiplierNode original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterPortEvents();
+    }
+    public MultiplierNode()
+      : base("MultiplierNode") {
+      Initialize();
+    }
+    public MultiplierNode(string name)
+      : base(name) {
+      Initialize();
+    }
+    public MultiplierNode(string name, string description)
+      : base(name, description) {
+      Initialize();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterPortEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiplierNode(this, cloner);
+    }
+
+    protected virtual void Initialize() {
+      Ports.Add(new InputPort<IntValue>(MultiplierPortName));
+      Ports.Add(new InputOutputPort<IntValue, IntValue>(ValuePortName));
+      RegisterPortEvents();
+    }
+
+    protected virtual void RegisterPortEvents() {
+      ValuePort.ValueReceived += ValuePort_ValueReceived;
+    }
+
+    protected virtual void ValuePort_ValueReceived(object sender, OutputInputPortEventArgs<IntValue, IntValue> e) {
+      if (MultiplierPort.Value == null) throw new InvalidOperationException("Multiplier is null");
+      if (e.Value != null) {
+        e.Result = new IntValue(e.Value.Value * MultiplierPort.Value.Value);
+      }
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11452)
@@ -32,4 +32,5 @@
   [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
   [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11451)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11452)
@@ -77,15 +77,21 @@
 
     private void UpdateVariable(IInputPort port) {
-      IVariable var = null;
-      if (variables.TryGetValue(port.Name, out var)) {
-        var.Value = (IItem)port.Value;
-      }
+      if (!variables.ContainsKey(port.Name))
+        variables.Add(new Variable(port.Name));
+      variables[port.Name].Value = (IItem)port.Value;
     }
     private void UpdateOutputPort(IVariable variable) {
       IPort port = null;
       if (Ports.TryGetValue(variable.Name, out port)) {
-        IOutputPort p = port as IOutputPort;
-        if (p != null) {
-          p.Value = variable.Value;
+        IOutputPort o = port as IOutputPort;
+        if (o != null) {
+          o.Value = variable.Value;
+        }
+        IOutputInputPort oi = port as IOutputInputPort;
+        if (oi != null) {
+          var result = (IItem)oi.SendValue(variable.Value);
+          if (!variables.ContainsKey(oi.Name + "Result"))
+            variables.Add(new Variable(oi.Name + "Result"));
+          variables[oi.Name + "Result"].Value = result;
         }
       }
@@ -98,4 +104,16 @@
         port.Value = null;
       }
+    }
+    private void UpdateOutputInputPort(IOutputInputPort port) {
+      IVariable var = null;
+      IItem result = null;
+      if (variables.TryGetValue(port.Name, out var)) {
+        result = (IItem)port.SendValue(var.Value);
+      } else {
+        result = (IItem)port.SendValue(null);
+      }
+      if (!variables.ContainsKey(port.Name + "Result"))
+        variables.Add(new Variable(port.Name + "Result"));
+      variables[port.Name + "Result"].Value = result;
     }
 
@@ -145,4 +163,9 @@
         UpdateOutputPort(o);
       }
+      IOutputInputPort oi = port as IOutputInputPort;
+      if (oi != null) {
+        oi.NameChanged += OutputInputPort_NameChanged;
+        UpdateOutputInputPort(oi);
+      }
     }
     private void DeregisterPortEvents(IPort port) {
@@ -156,4 +179,8 @@
         o.NameChanged -= OutputPort_NameChanged;
       }
+      IOutputInputPort oi = port as IOutputInputPort;
+      if (oi != null) {
+        oi.NameChanged -= OutputInputPort_NameChanged;
+      }
     }
     private void InputPort_NameChanged(object sender, EventArgs e) {
@@ -165,4 +192,7 @@
     private void OutputPort_NameChanged(object sender, EventArgs e) {
       UpdateOutputPort((IOutputPort)sender);
+    }
+    private void OutputInputPort_NameChanged(object sender, EventArgs e) {
+      UpdateOutputInputPort((IOutputInputPort)sender);
     }
     #endregion
