Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.Designer.cs	(revision 11468)
@@ -48,11 +48,12 @@
       this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
       this.portsTabPage = new System.Windows.Forms.TabPage();
-      this.callsTabPage = new System.Windows.Forms.TabPage();
+      this.serviceCallsTabPage = new System.Windows.Forms.TabPage();
       this.serviceParameterCollectionCollectionView = new HeuristicLab.Optimization.Networks.Views.ServiceParameterCollectionCollectionView();
-      this.callButton = new System.Windows.Forms.Button();
+      this.callServicesButton = new System.Windows.Forms.Button();
+      this.cancelServicesButton = new System.Windows.Forms.Button();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.portsTabPage.SuspendLayout();
-      this.callsTabPage.SuspendLayout();
+      this.serviceCallsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -83,10 +84,10 @@
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.portsTabPage);
-      this.tabControl.Controls.Add(this.callsTabPage);
+      this.tabControl.Controls.Add(this.serviceCallsTabPage);
       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;
+      this.tabControl.TabIndex = 5;
       // 
       // portsTabPage
@@ -101,13 +102,13 @@
       this.portsTabPage.UseVisualStyleBackColor = true;
       // 
-      // callsTabPage
+      // serviceCallsTabPage
       // 
-      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;
+      this.serviceCallsTabPage.Controls.Add(this.serviceParameterCollectionCollectionView);
+      this.serviceCallsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.serviceCallsTabPage.Name = "serviceCallsTabPage";
+      this.serviceCallsTabPage.Size = new System.Drawing.Size(637, 428);
+      this.serviceCallsTabPage.TabIndex = 2;
+      this.serviceCallsTabPage.Text = "Service Calls";
+      this.serviceCallsTabPage.UseVisualStyleBackColor = true;
       // 
       // serviceParameterCollectionCollectionView
@@ -125,20 +126,29 @@
       this.serviceParameterCollectionCollectionView.TabIndex = 0;
       // 
-      // callButton
+      // callServicesButton
       // 
-      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);
+      this.callServicesButton.Location = new System.Drawing.Point(69, 26);
+      this.callServicesButton.Name = "callServicesButton";
+      this.callServicesButton.Size = new System.Drawing.Size(101, 23);
+      this.callServicesButton.TabIndex = 3;
+      this.callServicesButton.Text = "&Call Services";
+      this.callServicesButton.UseVisualStyleBackColor = true;
+      this.callServicesButton.Click += new System.EventHandler(this.callServicesButton_Click);
+      // 
+      // cancelServicesButton
+      // 
+      this.cancelServicesButton.Location = new System.Drawing.Point(176, 26);
+      this.cancelServicesButton.Name = "cancelServicesButton";
+      this.cancelServicesButton.Size = new System.Drawing.Size(101, 23);
+      this.cancelServicesButton.TabIndex = 4;
+      this.cancelServicesButton.Text = "&Cancel Services";
+      this.cancelServicesButton.UseVisualStyleBackColor = true;
+      this.cancelServicesButton.Click += new System.EventHandler(this.cancelServicesButton_Click);
       // 
       // ClientNodeView
       // 
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.callButton);
+      this.Controls.Add(this.cancelServicesButton);
+      this.Controls.Add(this.callServicesButton);
       this.Controls.Add(this.tabControl);
       this.Name = "ClientNodeView";
@@ -147,9 +157,10 @@
       this.Controls.SetChildIndex(this.infoLabel, 0);
       this.Controls.SetChildIndex(this.tabControl, 0);
-      this.Controls.SetChildIndex(this.callButton, 0);
+      this.Controls.SetChildIndex(this.callServicesButton, 0);
+      this.Controls.SetChildIndex(this.cancelServicesButton, 0);
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
       this.tabControl.ResumeLayout(false);
       this.portsTabPage.ResumeLayout(false);
-      this.callsTabPage.ResumeLayout(false);
+      this.serviceCallsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -162,7 +173,8 @@
     protected System.Windows.Forms.TabPage portsTabPage;
     protected HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
-    protected System.Windows.Forms.TabPage callsTabPage;
+    protected System.Windows.Forms.TabPage serviceCallsTabPage;
     protected ServiceParameterCollectionCollectionView serviceParameterCollectionCollectionView;
-    protected System.Windows.Forms.Button callButton;
+    protected System.Windows.Forms.Button callServicesButton;
+    protected System.Windows.Forms.Button cancelServicesButton;
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/ClientNodeView.cs	(revision 11468)
@@ -20,8 +20,7 @@
 #endregion
 
-using HeuristicLab.Core.Views;
 using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
 using System;
+using System.Threading;
 using System.Windows.Forms;
 
@@ -31,4 +30,6 @@
   [Content(typeof(IClientNode), false)]
   public partial class ClientNodeView : EntityView {
+    protected CancellationTokenSource tokenSource = new CancellationTokenSource();
+
     public new IClientNode Content {
       get { return (IClientNode)base.Content; }
@@ -53,11 +54,14 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      callButton.Enabled = Content != null && !ReadOnly;
+      callServicesButton.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();
+    protected virtual void callServicesButton_Click(object sender, EventArgs e) {
+      Content.CallServicesAsync(tokenSource.Token);
+    }
+    protected virtual void cancelServicesButton_Click(object sender, EventArgs e) {
+      tokenSource.Cancel();
     }
   }
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 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11468)
@@ -10,5 +10,5 @@
     <RootNamespace>HeuristicLab.Optimization.Networks.Views</RootNamespace>
     <AssemblyName>HeuristicLab.Optimization.Networks.Views-3.3</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
@@ -22,4 +22,5 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -30,4 +31,5 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup>
@@ -45,4 +47,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
@@ -54,4 +57,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
@@ -63,4 +67,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
@@ -72,4 +77,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/AlgorithmServiceNode.cs	(revision 11468)
@@ -93,5 +93,5 @@
     }
 
-    protected virtual void Execute(ServiceParameterCollection parameters) {
+    protected virtual void Execute(ServiceParameterCollection parameters, CancellationToken token) {
       if (Template == null) throw new InvalidOperationException("Template is null");
 
@@ -120,18 +120,24 @@
       algorithm.Stopped += Algorithm_Stopped;
       algorithm.Start();
-      waitHandles[algorithm].WaitOne();
-
-      // retrieve results
-      foreach (var p in parameters.Where(x => x.Type == ServiceParameterType.Output)) {
-        IResult result = null;
-        if (algorithm.Results.TryGetValue(p.Name, out result)) {
-          p.Value = result.Value;
-        }
-      }
-
-      lock (locker) {
-        waitHandles[algorithm].Dispose();
-        waitHandles.Remove(algorithm);
-        Runs.Add(algorithm.Runs.ToArray()[0]);
+      if (WaitHandle.WaitAny(new WaitHandle[] { waitHandles[algorithm], token.WaitHandle }) == 1) {
+        // retrieve results
+        foreach (var p in parameters.Where(x => x.Type == ServiceParameterType.Output)) {
+          IResult result = null;
+          if (algorithm.Results.TryGetValue(p.Name, out result)) {
+            p.Value = result.Value;
+          }
+        }
+
+        lock (locker) {
+          waitHandles[algorithm].Dispose();
+          waitHandles.Remove(algorithm);
+          Runs.Add(algorithm.Runs.ToArray()[0]);
+        }
+      } else {  // cancellation
+        algorithm.Stop();
+        lock (locker) {
+          waitHandles[algorithm].Dispose();
+          waitHandles.Remove(algorithm);
+        }
       }
     }
@@ -191,5 +197,5 @@
       IServicePort s = port as IServicePort;
       if (s != null) {
-        s.Called += ServicePort_Called;
+        s.ProcessParameters += ServicePort_ProcessParameters;
       }
     }
@@ -203,5 +209,5 @@
       IServicePort s = port as IServicePort;
       if (s != null) {
-        s.Called -= ServicePort_Called;
+        s.ProcessParameters -= ServicePort_ProcessParameters;
       }
     }
@@ -212,6 +218,6 @@
       UpdateParameter((IInputPort)sender);
     }
-    private void ServicePort_Called(object sender, EventArgs<ServiceParameterCollection> e) {
-      Execute(e.Value);
+    private void ServicePort_ProcessParameters(object sender, EventArgs<ServiceParameterCollection, CancellationToken> e) {
+      Execute(e.Value, e.Value2);
     }
     #endregion
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClassDiagram.cd
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClassDiagram.cd	(revision 11468)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClassDiagram.cd	(revision 11468)
@@ -0,0 +1,357 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Optimization.Networks.AlgorithmNode" Collapsed="true">
+    <Position X="14" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>BICABACCABFAgBAQBAEAQACwIQCAAhIAAAAAACUoABQ=</HashCode>
+      <FileName>AlgorithmNode.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.AlgorithmServiceNode" Collapsed="true">
+    <Position X="16.25" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AIAEBAASAFEAMBRQBAAAAAAQAAGAAAAAAEAAAAAIABw=</HashCode>
+      <FileName>AlgorithmServiceNode.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ClientNode" Collapsed="true">
+    <Position X="18.5" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAADABAAAgAAAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>ClientNode.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ClientPort" Collapsed="true">
+    <Position X="0.5" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AEAAQAAAAAgAAAAQAkBAAAAAAAAAABAAAAEADAIBgBQ=</HashCode>
+      <FileName>ClientPort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ClientServicePort" Collapsed="true">
+    <Position X="1.75" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>gEQAIIACAAAAAEAAAABEAAAAAAAAgRAAAIAQAACAAAA=</HashCode>
+      <FileName>ClientServicePort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.Entity" Collapsed="true">
+    <Position X="14" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAiAACAAAAAQAJAAAAEQQAAAAAAQAAAAAAAAAAEAEQ=</HashCode>
+      <FileName>Entity.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.OutputInputPortEventArgs&lt;TOut, TIn&gt;" Collapsed="true">
+    <Position X="33.5" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>EventArgs.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.InputOutputPort&lt;TIn, TOut&gt;" Collapsed="true">
+    <Position X="9.5" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAQAAAQAAAAAAQgAAEQBAAABBAAAAQAAAAIABA=</HashCode>
+      <FileName>InputOutputPort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.InputPort&lt;T&gt;" Collapsed="true">
+    <Position X="11.75" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>QAABAACAAAAACIAAAAAgAAAAgAAAABAAAEAAAAAQARA=</HashCode>
+      <FileName>InputPort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.MultiplierNode" Collapsed="true">
+    <Position X="20.75" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AEAAEAAAAAAAAQABAQAAAAAQEAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>MultiplierNode.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.Network" Collapsed="true">
+    <Position X="23" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAgAACAgAAAQIAAAAAEAAAAEAAAABACAAAAAAAAIBA=</HashCode>
+      <FileName>Network.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.Node" Collapsed="true">
+    <Position X="19.75" Y="2" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>QAAAAACCABEEAAAABAAEQAAAAACAABAAAACAAAAAABQ=</HashCode>
+      <FileName>Node.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.NodeCollection" Collapsed="true">
+    <Position X="31.75" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>NodeCollection.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.OutputInputPort&lt;TOut, TIn&gt;" Collapsed="true">
+    <Position X="5" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AEAAAAAAAAAAAAAAAQAAAAAAAAAAAAgAAAAAAAAAABA=</HashCode>
+      <FileName>OutputInputPort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.OutputPort&lt;T&gt;" Collapsed="true">
+    <Position X="7.25" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAABA=</HashCode>
+      <FileName>OutputPort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.HeuristicLabOptimizationNetworksPlugin" Collapsed="true">
+    <Position X="30" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Plugin.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.Port" Collapsed="true">
+    <Position X="6.25" Y="2" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAACAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Port.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.PortCollection" Collapsed="true">
+    <Position X="30" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>PortCollection.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ServiceParameter&lt;T&gt;" Collapsed="true">
+    <Position X="27.5" Y="2" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAACAAAqAACBUAAAAQAAAAECBADEAAQAgAAQAABA=</HashCode>
+      <FileName>ServiceParameter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ServiceParameterCollection" Collapsed="true">
+    <Position X="31.75" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>ServiceParameterCollection.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ServiceParameterCollectionCollection" Collapsed="true">
+    <Position X="33.5" Y="1.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA=</HashCode>
+      <FileName>ServiceParameterCollectionCollection.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ServicePort" Collapsed="true">
+    <Position X="2.75" Y="4.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIQABA=</HashCode>
+      <FileName>ServicePort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.ValuePort&lt;T&gt;" Collapsed="true">
+    <Position X="8.5" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAKAAIAUAAAAAAAAAEAAADEAAAAgAAQAAAA=</HashCode>
+      <FileName>ValuePort.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Optimization.Networks.VariablesNode" Collapsed="true">
+    <Position X="25.25" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AICARAECQBEAKEAABAAAAQAQAQCAABAQAAQABAAMABU=</HashCode>
+      <FileName>VariablesNode.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Interface Name="HeuristicLab.Optimization.Networks.IAlgorithmNode" Collapsed="true">
+    <Position X="0.5" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAABAAAQAAAAAAAAAAAAAAAAAQAAAA=</HashCode>
+      <FileName>IAlgorithmNode.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IAlgorithmServiceNode" Collapsed="true">
+    <Position X="2.75" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAEAAEAAABAAAAAAAAAAAAAAAAAAAAAAAAAg=</HashCode>
+      <FileName>IAlgorithmServiceNode.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IClientNode" Collapsed="true">
+    <Position X="5" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAABABAAAgAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IClientNode.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IClientPort" Collapsed="true">
+    <Position X="25.25" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAQAAAAAgAAAAAAgBAAAAAAAAAAAAAAAAADAABAAA=</HashCode>
+      <FileName>IClientPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IClientServicePort" Collapsed="true">
+    <Position X="24.25" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAA=</HashCode>
+      <FileName>IClientServicePort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IEntity" Collapsed="true">
+    <Position X="14" Y="6.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAIAAAAEQAAAAAAAAAAAAAAAAAAAAAQ=</HashCode>
+      <FileName>IEntity.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IInputOutputPort" Collapsed="true">
+    <Position X="20.75" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IInputOutputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IInputOutputPort&lt;TIn, TOut&gt;" Collapsed="true">
+    <Position X="20.75" Y="12.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IInputOutputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IInputPort" Collapsed="true">
+    <Position X="14" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAABAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IInputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IInputPort&lt;T&gt;" Collapsed="true">
+    <Position X="18.25" Y="12.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IInputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.INetwork" Collapsed="true">
+    <Position X="7.25" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>INetwork.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.INode" Collapsed="true">
+    <Position X="5" Y="8" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAABAAAQAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>INode.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IOutputInputPort" Collapsed="true">
+    <Position X="11.75" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA=</HashCode>
+      <FileName>IOutputInputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IOutputInputPort&lt;TOut, TIn&gt;" Collapsed="true">
+    <Position X="15.25" Y="12.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA=</HashCode>
+      <FileName>IOutputInputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IOutputPort" Collapsed="true">
+    <Position X="16.25" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>IOutputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IOutputPort&lt;T&gt;" Collapsed="true">
+    <Position X="17.5" Y="14.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>IOutputPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IPort" Collapsed="true">
+    <Position X="18.5" Y="8" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>IPort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IServiceParameter" Collapsed="true">
+    <Position X="27.5" Y="8" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAIAAAAAAAAAQAAAAECAAAAAAQAgAAAAAAA=</HashCode>
+      <FileName>IServiceParameter.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IServiceParameter&lt;T&gt;" Collapsed="true">
+    <Position X="27.5" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>IServiceParameter.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IServicePort" Collapsed="true">
+    <Position X="23" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAQAAA=</HashCode>
+      <FileName>IServicePort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IValuePort" Collapsed="true">
+    <Position X="16.25" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAIAAAAAAAAAAAAAAEAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>IValuePort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IValuePort&lt;T&gt;" Collapsed="true">
+    <Position X="18.5" Y="10.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA=</HashCode>
+      <FileName>IValuePort.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Optimization.Networks.IVariablesNode" Collapsed="true">
+    <Position X="9.5" Y="9.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAQAAAAAAAA=</HashCode>
+      <FileName>IVariablesNode.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Enum Name="HeuristicLab.Optimization.Networks.ServiceParameterType" Collapsed="true">
+    <Position X="30" Y="2.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>ServiceParameterType.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientNode.cs	(revision 11468)
@@ -68,33 +68,33 @@
     }
 
-    public virtual void CallAsync() {
-      Task.Factory.StartNew(() => {
+    public virtual async Task CallServicesAsync() {
+      await CallServicesAsync(new CancellationToken());
+    }
+    public virtual async Task CallServicesAsync(CancellationToken token) {
+      foreach (var clientPort in Ports.OfType<IClientPort>()) {
+        var parameters = clientPort.PrepareParameters();
 
-        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();
+        }
 
-          // 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 = await clientPort.CallServiceAsync(parameters, token);
+
+        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();
           }
 
-          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);
-          }
+          Calls.Add(parameters);
         }
-      });
+      }
     }
   }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientPort.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ClientPort.cs	(revision 11468)
@@ -26,4 +26,6 @@
 using System.Drawing;
 using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -127,7 +129,19 @@
       return parameters;
     }
-    public ServiceParameterCollection Call(ServiceParameterCollection parameters) {
+    public ServiceParameterCollection CallService(ServiceParameterCollection parameters) {
       if (!Valid) throw new InvalidOperationException("Port configurations do not match");
-      return ServicePort.Call(parameters);
+      return ServicePort.Process(parameters);
+    }
+    public ServiceParameterCollection CallService(ServiceParameterCollection parameters, CancellationToken token) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return ServicePort.Process(parameters, token);
+    }
+    public async Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return await ServicePort.ProcessAsync(parameters);
+    }
+    public async Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters, CancellationToken token) {
+      if (!Valid) throw new InvalidOperationException("Port configurations do not match");
+      return await ServicePort.ProcessAsync(parameters, token);
     }
 
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 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11468)
@@ -10,5 +10,5 @@
     <RootNamespace>HeuristicLab.Optimization.Networks</RootNamespace>
     <AssemblyName>HeuristicLab.Optimization.Networks-3.3</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
@@ -22,4 +22,5 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -30,4 +31,5 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup>
@@ -45,4 +47,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
@@ -54,4 +57,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
@@ -63,4 +67,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
@@ -72,4 +77,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
@@ -129,4 +135,5 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="ClassDiagram.cd" />
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientNode.cs	(revision 11468)
@@ -22,4 +22,6 @@
 using HeuristicLab.Core;
 using System;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -28,5 +30,6 @@
     IItemCollection<ServiceParameterCollection> Calls { get; }
 
-    void CallAsync();
+    Task CallServicesAsync();
+    Task CallServicesAsync(CancellationToken token);
   }
 }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientPort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientPort.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IClientPort.cs	(revision 11468)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -31,5 +33,8 @@
     bool IsValidServicePort(IServicePort servicePort);
     ServiceParameterCollection PrepareParameters();
-    ServiceParameterCollection Call(ServiceParameterCollection parameters);
+    ServiceParameterCollection CallService(ServiceParameterCollection parameters);
+    ServiceParameterCollection CallService(ServiceParameterCollection parameters, CancellationToken token);
+    Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters);
+    Task<ServiceParameterCollection> CallServiceAsync(ServiceParameterCollection parameters, CancellationToken token);
   }
 }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IServicePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IServicePort.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IServicePort.cs	(revision 11468)
@@ -23,9 +23,14 @@
 using HeuristicLab.Core;
 using System;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Optimization.Networks {
   public interface IServicePort : IClientServicePort {
-    ServiceParameterCollection Call(ServiceParameterCollection parameters);
-    event EventHandler<EventArgs<ServiceParameterCollection>> Called;
+    ServiceParameterCollection Process(ServiceParameterCollection parameters);
+    ServiceParameterCollection Process(ServiceParameterCollection parameters, CancellationToken token);
+    Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters);
+    Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters, CancellationToken token);
+    event EventHandler<EventArgs<ServiceParameterCollection, CancellationToken>> ProcessParameters;
   }
 }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServicePort.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServicePort.cs	(revision 11467)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/ServicePort.cs	(revision 11468)
@@ -24,4 +24,6 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using System;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -40,12 +42,21 @@
     }
 
-    public ServiceParameterCollection Call(ServiceParameterCollection parameters) {
-      return OnCalled(parameters);
+    public ServiceParameterCollection Process(ServiceParameterCollection parameters) {
+      return Process(parameters, new CancellationToken());
+    }
+    public ServiceParameterCollection Process(ServiceParameterCollection parameters, CancellationToken token) {
+      return OnProcessParameters(parameters, token);
+    }
+    public async Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters) {
+      return await ProcessAsync(parameters, new CancellationToken());
+    }
+    public async Task<ServiceParameterCollection> ProcessAsync(ServiceParameterCollection parameters, CancellationToken token) {
+      return await Task.Run(() => { return Process(parameters, token); }, token);
     }
 
-    public event EventHandler<EventArgs<ServiceParameterCollection>> Called;
-    protected virtual ServiceParameterCollection OnCalled(ServiceParameterCollection parameters) {
-      var handler = Called;
-      if (handler != null) handler(this, new EventArgs<ServiceParameterCollection>(parameters));
+    public event EventHandler<EventArgs<ServiceParameterCollection, CancellationToken>> ProcessParameters;
+    protected virtual ServiceParameterCollection OnProcessParameters(ServiceParameterCollection parameters, CancellationToken token) {
+      var handler = ProcessParameters;
+      if (handler != null) handler(this, new EventArgs<ServiceParameterCollection, CancellationToken>(parameters, token));
       return parameters;
     }
