Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs	(revision 11465)
@@ -0,0 +1,170 @@
+#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 ClientNodeView {
+    /// <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) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #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.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
+      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
+      this.portsTabPage = new System.Windows.Forms.TabPage();
+      this.callsTabPage = new System.Windows.Forms.TabPage();
+      this.serviceParameterCollectionCollectionView = new HeuristicLab.Optimization.Networks.Views.ServiceParameterCollectionCollectionView();
+      this.callButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.tabControl.SuspendLayout();
+      this.portsTabPage.SuspendLayout();
+      this.callsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portCollectionView
+      // 
+      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(6, 6);
+      this.portCollectionView.Name = "portCollectionView";
+      this.portCollectionView.ReadOnly = false;
+      this.portCollectionView.ShowDetails = true;
+      this.portCollectionView.Size = new System.Drawing.Size(625, 416);
+      this.portCollectionView.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.portsTabPage);
+      this.tabControl.Controls.Add(this.callsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 63);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(645, 454);
+      this.tabControl.TabIndex = 4;
+      // 
+      // 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, 428);
+      this.portsTabPage.TabIndex = 0;
+      this.portsTabPage.Text = "Ports";
+      this.portsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // callsTabPage
+      // 
+      this.callsTabPage.Controls.Add(this.serviceParameterCollectionCollectionView);
+      this.callsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.callsTabPage.Name = "callsTabPage";
+      this.callsTabPage.Size = new System.Drawing.Size(637, 428);
+      this.callsTabPage.TabIndex = 2;
+      this.callsTabPage.Text = "Calls";
+      this.callsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // serviceParameterCollectionCollectionView
+      // 
+      this.serviceParameterCollectionCollectionView.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.serviceParameterCollectionCollectionView.Caption = "ServiceParameterCollectionCollection View";
+      this.serviceParameterCollectionCollectionView.Content = null;
+      this.serviceParameterCollectionCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.serviceParameterCollectionCollectionView.Name = "serviceParameterCollectionCollectionView";
+      this.serviceParameterCollectionCollectionView.ReadOnly = false;
+      this.serviceParameterCollectionCollectionView.ShowDetails = true;
+      this.serviceParameterCollectionCollectionView.Size = new System.Drawing.Size(631, 422);
+      this.serviceParameterCollectionCollectionView.TabIndex = 0;
+      // 
+      // callButton
+      // 
+      this.callButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.callButton.Location = new System.Drawing.Point(69, 26);
+      this.callButton.Name = "callButton";
+      this.callButton.Size = new System.Drawing.Size(551, 23);
+      this.callButton.TabIndex = 3;
+      this.callButton.Text = "&Call Services";
+      this.callButton.UseVisualStyleBackColor = true;
+      this.callButton.Click += new System.EventHandler(this.callButton_Click);
+      // 
+      // ClientNodeView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.callButton);
+      this.Controls.Add(this.tabControl);
+      this.Name = "ClientNodeView";
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      this.Controls.SetChildIndex(this.callButton, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.tabControl.ResumeLayout(false);
+      this.portsTabPage.ResumeLayout(false);
+      this.callsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected PortCollectionView portCollectionView;
+    protected System.Windows.Forms.TabPage portsTabPage;
+    protected HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
+    protected System.Windows.Forms.TabPage callsTabPage;
+    protected ServiceParameterCollectionCollectionView serviceParameterCollectionCollectionView;
+    protected System.Windows.Forms.Button callButton;
+
+
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs	(revision 11465)
@@ -0,0 +1,64 @@
+#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.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ClientNode View")]
+  [Content(typeof(ClientNode), true)]
+  [Content(typeof(IClientNode), false)]
+  public partial class ClientNodeView : EntityView {
+    public new IClientNode Content {
+      get { return (IClientNode)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ClientNodeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        portCollectionView.Content = null;
+        serviceParameterCollectionCollectionView.Content = null;
+      } else {
+        portCollectionView.Content = Content.Ports;
+        serviceParameterCollectionCollectionView.Content = Content.Calls;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      callButton.Enabled = Content != null && !ReadOnly;
+      portCollectionView.Enabled = Content != null && !ReadOnly;
+      serviceParameterCollectionCollectionView.Enabled = Content != null && !ReadOnly;
+    }
+
+    protected virtual void callButton_Click(object sender, EventArgs e) {
+      Content.CallAsync();
+    }
+  }
+}
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 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11465)
@@ -85,4 +85,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ClientNodeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ClientNodeView.Designer.cs">
+      <DependentUpon>ClientNodeView.cs</DependentUpon>
+    </Compile>
     <Compile Include="AlgorithmServiceNodeView.cs">
       <SubType>UserControl</SubType>
@@ -126,4 +132,10 @@
     <Compile Include="ClientPortView.Designer.cs">
       <DependentUpon>ClientPortView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ServiceParameterCollectionCollectionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ServiceParameterCollectionCollectionView.Designer.cs">
+      <DependentUpon>ServiceParameterCollectionCollectionView.cs</DependentUpon>
     </Compile>
     <Compile Include="ServiceParameterCollectionView.cs">
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.Designer.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.Designer.cs	(revision 11465)
@@ -0,0 +1,53 @@
+﻿#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 ServiceParameterCollectionCollectionView {
+    /// <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) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #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() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+    }
+
+    #endregion
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ServiceParameterCollectionCollectionView.cs	(revision 11465)
@@ -0,0 +1,43 @@
+﻿#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.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("ServiceParameterCollectionCollection View")]
+  [Content(typeof(ServiceParameterCollectionCollection), true)]
+  [Content(typeof(IItemCollection<ServiceParameterCollection>), false)]
+  public partial class ServiceParameterCollectionCollectionView : ItemCollectionView<ServiceParameterCollection> {
+    public ServiceParameterCollectionCollectionView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Service Parameter Collections";
+    }
+
+    protected override ServiceParameterCollection CreateItem() {
+      return new ServiceParameterCollection();
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmNode.cs	(revision 11465)
@@ -52,23 +52,12 @@
       : base(original, cloner) {
       algorithm = cloner.Clone(original.algorithm);
-      RegisterPortsEvents();
       RegisterAlgorithmEvents();
     }
-    public AlgorithmNode()
-      : base("AlgorithmNode") {
-      RegisterPortsEvents();
-    }
-    public AlgorithmNode(string name)
-      : base(name) {
-      RegisterPortsEvents();
-    }
-    public AlgorithmNode(string name, string description)
-      : base(name, description) {
-      RegisterPortsEvents();
-    }
+    public AlgorithmNode() : base("AlgorithmNode") { }
+    public AlgorithmNode(string name) : base(name) { }
+    public AlgorithmNode(string name, string description) : base(name, description) { }
 
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      RegisterPortsEvents();
       RegisterAlgorithmEvents();
     }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs	(revision 11465)
@@ -63,25 +63,16 @@
       template = cloner.Clone(original.template);
       runs = cloner.Clone(original.runs);
-      RegisterPortsEvents();
     }
     public AlgorithmServiceNode()
       : base("AlgorithmServiceNode") {
       runs = new RunCollection();
-      RegisterPortsEvents();
     }
     public AlgorithmServiceNode(string name)
       : base(name) {
       runs = new RunCollection();
-      RegisterPortsEvents();
     }
     public AlgorithmServiceNode(string name, string description)
       : base(name, description) {
       runs = new RunCollection();
-      RegisterPortsEvents();
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterPortsEvents();
     }
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs	(revision 11465)
@@ -0,0 +1,101 @@
+#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.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ClientNode", "A node of an optimization network which calls service nodes.")]
+  [StorableClass]
+  public class ClientNode : Node, IClientNode {
+    private object locker = new object();
+
+    new public PortCollection Ports {
+      get { return base.Ports; }
+    }
+
+    [Storable]
+    private IItemCollection<ServiceParameterCollection> calls;
+    public IItemCollection<ServiceParameterCollection> Calls {
+      get { return calls; }
+    }
+
+    [StorableConstructor]
+    protected ClientNode(bool deserializing) : base(deserializing) { }
+    protected ClientNode(ClientNode original, Cloner cloner)
+      : base(original, cloner) {
+      calls = cloner.Clone(original.calls);
+    }
+    public ClientNode()
+      : base("ClientNode") {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+    public ClientNode(string name)
+      : base(name) {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+    public ClientNode(string name, string description)
+      : base(name, description) {
+      calls = new ItemCollection<ServiceParameterCollection>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClientNode(this, cloner);
+    }
+
+    public virtual void CallAsync() {
+      Task.Factory.StartNew(() => {
+
+        foreach (var clientPort in Ports.OfType<IClientPort>()) {
+          var parameters = clientPort.PrepareParameters();
+
+          // retrieve inputs
+          foreach (var inputPort in Ports.OfType<IInputPort>().
+                                          Where(x => parameters.ContainsKey(x.Name) &&
+                                                     parameters[x.Name].Type == ServiceParameterType.Input &&
+                                                     parameters[x.Name].DataType.IsAssignableFrom(x.DataType))) {
+            parameters[inputPort.Name].Value = (IItem)inputPort.Value.Clone();
+          }
+
+          parameters = clientPort.Call(parameters);
+
+          lock (locker) {
+            // set outputs
+            foreach (var outputPort in Ports.OfType<IOutputPort>().
+                                             Where(x => parameters.ContainsKey(x.Name) &&
+                                                        parameters[x.Name].Type == ServiceParameterType.Output &&
+                                                        x.DataType.IsAssignableFrom(parameters[x.Name].DataType))) {
+              outputPort.Value = (IItem)parameters[outputPort.Name].Value.Clone();
+            }
+
+            Calls.Add(parameters);
+          }
+        }
+      });
+    }
+  }
+}
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 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11465)
@@ -84,9 +84,12 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ClientNode.cs" />
     <Compile Include="AlgorithmServiceNode.cs" />
+    <Compile Include="IClientNode.cs" />
     <Compile Include="IAlgorithmServiceNode.cs" />
     <Compile Include="IEntity.cs" />
     <Compile Include="IClientPort.cs" />
     <Compile Include="IClientServicePort.cs" />
+    <Compile Include="ServiceParameterCollectionCollection.cs" />
     <Compile Include="ServiceParameterType.cs" />
     <Compile Include="IServiceParameter.cs" />
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs	(revision 11465)
@@ -0,0 +1,32 @@
+#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.Core;
+using System;
+
+namespace HeuristicLab.Optimization.Networks {
+  public interface IClientNode : INode {
+    new PortCollection Ports { get; }
+    IItemCollection<ServiceParameterCollection> Calls { get; }
+
+    void CallAsync();
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IValuePort.cs	(revision 11465)
@@ -25,4 +25,5 @@
 namespace HeuristicLab.Optimization.Networks {
   public interface IValuePort : IPort {
+    Type DataType { get; }
     IItem Value { get; }
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/MultiplierNode.cs	(revision 11465)
@@ -42,8 +42,5 @@
     [StorableConstructor]
     protected MultiplierNode(bool deserializing) : base(deserializing) { }
-    protected MultiplierNode(MultiplierNode original, Cloner cloner)
-      : base(original, cloner) {
-      RegisterPortEvents();
-    }
+    protected MultiplierNode(MultiplierNode original, Cloner cloner) : base(original, cloner) { }
     public MultiplierNode()
       : base("MultiplierNode") {
@@ -57,9 +54,4 @@
       : base(name, description) {
       Initialize();
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterPortEvents();
     }
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServiceParameterCollectionCollection.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServiceParameterCollectionCollection.cs	(revision 11465)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServiceParameterCollectionCollection.cs	(revision 11465)
@@ -0,0 +1,40 @@
+#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 System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization.Networks {
+  [StorableClass]
+  [Item("ServiceParameterCollectionCollection", "Represents a collection of service parameter collections.")]
+  public class ServiceParameterCollectionCollection : ItemCollection<ServiceParameterCollection> {
+    [StorableConstructor]
+    protected ServiceParameterCollectionCollection(bool deserializing) : base(deserializing) { }
+    protected ServiceParameterCollectionCollection(ServiceParameterCollectionCollection original, Cloner cloner) : base(original, cloner) { }
+    public ServiceParameterCollectionCollection() : base() { }
+    public ServiceParameterCollectionCollection(int capacity) : base(capacity) { }
+    public ServiceParameterCollectionCollection(IEnumerable<ServiceParameterCollection> collection) : base(collection) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new ServiceParameterCollectionCollection(this, cloner); }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ValuePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ValuePort.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ValuePort.cs	(revision 11465)
@@ -29,4 +29,8 @@
   [StorableClass]
   public abstract class ValuePort<T> : Port, IValuePort<T> where T : class, IItem {
+    public Type DataType {
+      get { return typeof(T); }
+    }
+
     [Storable]
     protected T value;
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11464)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/VariablesNode.cs	(revision 11465)
@@ -44,5 +44,4 @@
       : base(original, cloner) {
       variables = cloner.Clone(original.variables);
-      RegisterPortsEvents();
       RegisterVariablesEvents();
     }
@@ -50,5 +49,4 @@
       : base("VariablesNode") {
       variables = new VariableCollection();
-      RegisterPortsEvents();
       RegisterVariablesEvents();
     }
@@ -56,5 +54,4 @@
       : base(name) {
       variables = new VariableCollection();
-      RegisterPortsEvents();
       RegisterVariablesEvents();
     }
@@ -62,5 +59,4 @@
       : base(name, description) {
       variables = new VariableCollection();
-      RegisterPortsEvents();
       RegisterVariablesEvents();
     }
@@ -68,5 +64,4 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      RegisterPortsEvents();
       RegisterVariablesEvents();
     }
