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 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11519)
@@ -108,6 +108,12 @@
     <Compile Include="### obsolete\ServiceParameter.cs" />
     <Compile Include="### obsolete\ServiceParameterCollection.cs" />
+    <Compile Include="IHookOperator.cs" />
+    <Compile Include="Nodes\KSPTSPConnector.cs" />
     <Compile Include="Nodes\GenericNode.cs" />
     <Compile Include="Nodes\IGenericNode.cs" />
+    <Compile Include="Ports\ConfigurationPort.cs" />
+    <Compile Include="Ports\ExecutionPort.cs" />
+    <Compile Include="Ports\IConfigurationPort.cs" />
+    <Compile Include="Ports\IExecutionPort.cs" />
     <Compile Include="Ports\MessageCollection.cs" />
     <Compile Include="### obsolete\ServiceParameterCollectionCollection.cs" />
@@ -116,8 +122,6 @@
     <Compile Include="### obsolete\ValuePort.cs" />
     <Compile Include="Nodes\AlgorithmNode.cs" />
-    <Compile Include="Nodes\AlgorithmServiceNode.cs" />
     <Compile Include="Nodes\ClientNode.cs" />
     <Compile Include="Nodes\IAlgorithmNode.cs" />
-    <Compile Include="Nodes\IAlgorithmServiceNode.cs" />
     <Compile Include="Nodes\IClientNode.cs" />
     <Compile Include="Nodes\INetwork.cs" />
@@ -150,4 +154,5 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="HookOperator.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -177,4 +182,16 @@
       <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
       <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.BinaryVectorEncoding\3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj">
+      <Project>{66d249c3-a01d-42a8-82a2-919bc8ec3d83}</Project>
+      <Name>HeuristicLab.Encodings.BinaryVectorEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{dbecb8b0-b166-4133-baf1-ed67c3fd7fca}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HookOperator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HookOperator.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HookOperator.cs	(revision 11519)
@@ -0,0 +1,90 @@
+#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.Operators;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Linq;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("HookOperator", "An operator which interacts with an optimization network port.")]
+  [StorableClass]
+  public class HookOperator : Operator, IHookOperator {
+    public new ParameterCollection Parameters {
+      get { return base.Parameters; }
+    }
+
+    [Storable]
+    protected IGenericPort port;
+    public IGenericPort Port {
+      get { return port; }
+      set {
+        if (port != value) {
+          port = value;
+          OnPortChanged();
+        }
+      }
+    }
+
+    [StorableConstructor]
+    protected HookOperator(bool deserializing) : base(deserializing) { }
+    protected HookOperator(HookOperator original, Cloner cloner)
+      : base(original, cloner) {
+      // ATTENTION: port is intentionally NOT cloned
+      port = original.port;
+    }
+    public HookOperator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HookOperator(this, cloner);
+    }
+
+    public event EventHandler PortChanged;
+    protected virtual void OnPortChanged() {
+      var handler = PortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public override IOperation Apply() {
+      if (Port != null) {
+        var msg = Port.PrepareMessage();
+        foreach (var output in Port.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Output))) {
+          IParameter param;
+          if (Parameters.TryGetValue(output.Name, out param)) {
+            msg[output.Name] = param.ActualValue;
+          }
+        }
+
+        Port.SendMessage(msg, CancellationToken);
+
+        foreach (var input in Port.Parameters.Where(p => p.Type.HasFlag(PortParameterType.Input))) {
+          IParameter param;
+          if (Parameters.TryGetValue(input.Name, out param)) {
+            param.ActualValue = msg[input.Name];
+          }
+        }
+      }
+      return null;
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IHookOperator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IHookOperator.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/IHookOperator.cs	(revision 11519)
@@ -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 IHookOperator : IOperator {
+    new ParameterCollection Parameters { get; }
+    IGenericPort Port { get; set; }
+
+    event EventHandler PortChanged;
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmNode.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmNode.cs	(revision 11519)
@@ -24,4 +24,7 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
 
 namespace HeuristicLab.Optimization.Networks {
@@ -29,4 +32,8 @@
   [StorableClass]
   public class AlgorithmNode : Node, IAlgorithmNode {
+    private object locker = new object();
+    private Dictionary<IAlgorithm, AutoResetEvent> waitHandles = new Dictionary<IAlgorithm, AutoResetEvent>();
+    private Dictionary<IAlgorithm, Exception> exceptions = new Dictionary<IAlgorithm, Exception>();
+
     new public PortCollection Ports {
       get { return base.Ports; }
@@ -39,10 +46,14 @@
       set {
         if (value != algorithm) {
-          DeregisterAlgorithmEvents();
           algorithm = value;
-          RegisterAlgorithmEvents();
           OnAlgorithmChanged();
         }
       }
+    }
+
+    [Storable]
+    private RunCollection runs;
+    public RunCollection Runs {
+      get { return runs; }
     }
 
@@ -52,13 +63,17 @@
       : base(original, cloner) {
       algorithm = cloner.Clone(original.algorithm);
-      RegisterAlgorithmEvents();
-    }
-    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() {
-      RegisterAlgorithmEvents();
+      runs = cloner.Clone(original.runs);
+    }
+    public AlgorithmNode()
+      : base("AlgorithmNode") {
+      runs = new RunCollection();
+    }
+    public AlgorithmNode(string name)
+      : base(name) {
+      runs = new RunCollection();
+    }
+    public AlgorithmNode(string name, string description)
+      : base(name, description) {
+      runs = new RunCollection();
     }
 
@@ -67,32 +82,91 @@
     }
 
-    private void UpdateParameter(IInputPort port) {
-      if (algorithm != null) {
+    protected virtual void Configure(IConfigurationPort port, IMessage message, CancellationToken token) {
+      // set algorithm and problem parameters
+      lock (locker) {
+        if (algorithm != null) {
+          foreach (var v in message.Values) {
+            IParameter param = null;
+            if (Algorithm.Parameters.TryGetValue(v.Name, out param)) {
+              var vp = param as IValueParameter;
+              if (vp != null) vp.Value = v.Value;
+            }
+            if (Algorithm.Problem.Parameters.TryGetValue(v.Name, out param)) {
+              var vp = param as IValueParameter;
+              if (vp != null) vp.Value = v.Value;
+            }
+          }
+        }
+      }
+    }
+
+    protected virtual void Execute(IExecutionPort port, IMessage message, CancellationToken token) {
+      if (Algorithm == null) throw new InvalidOperationException("Algorithm is null");
+
+      IAlgorithm algorithm;
+      lock (locker) {
+        algorithm = (IAlgorithm)Algorithm.Clone();
+        waitHandles.Add(algorithm, new AutoResetEvent(false));
+      }
+
+      // set parameters
+      foreach (var v in message.Values) {
         IParameter param = null;
-        if (algorithm.Parameters.TryGetValue(port.Name, out param)) {
-          IValueParameter p = param as IValueParameter;
-          if ((p != null) && (port.Value != null)) {
-            p.Value = (IItem)port.Value;
-          }
-        }
-      }
-    }
-    private void UpdateOutputPort(IResult result) {
-      IPort port = null;
-      if (Ports.TryGetValue(result.Name, out port)) {
-        IOutputPort p = port as IOutputPort;
-        if (p != null) {
-          p.Value = result.Value;
-        }
-      }
-    }
-    private void UpdateOutputPort(IOutputPort port) {
-      if ((algorithm != null) && (algorithm.Results != null)) {
-        IResult result = null;
-        if (algorithm.Results.TryGetValue(port.Name, out result)) {
-          port.Value = result != null ? result.Value : null;
-        } else {
-          port.Value = null;
-        }
+        if (algorithm.Parameters.TryGetValue(v.Name, out param)) {
+          var vp = param as IValueParameter;
+          if (vp != null) vp.Value = v.Value;
+        }
+        if (algorithm.Problem.Parameters.TryGetValue(v.Name, out param)) {
+          var vp = param as IValueParameter;
+          if (vp != null) vp.Value = v.Value;
+        }
+      }
+
+      algorithm.StoreAlgorithmInEachRun = false;
+      algorithm.Runs.Clear();
+      algorithm.Prepare();
+      algorithm.ExceptionOccurred += Algorithm_ExceptionOccurred;
+      algorithm.Stopped += Algorithm_Stopped;
+
+      using (token.Register(() => { algorithm.Stop(); })) {
+        algorithm.Start();
+        waitHandles[algorithm].WaitOne();
+      }
+
+      lock (locker) {
+        waitHandles[algorithm].Dispose();
+        waitHandles.Remove(algorithm);
+
+        Exception ex = null;
+        if (exceptions.TryGetValue(algorithm, out ex)) {
+          exceptions.Remove(algorithm);
+          throw ex;
+        }
+      }
+
+      // retrieve results
+      var run = algorithm.Runs.First();
+      foreach (var v in message.Values) {
+        IItem result = null;
+        if (run.Results.TryGetValue(v.Name, out result)) {
+          v.Value = result;
+        }
+      }
+
+      lock (locker) {
+        Runs.Add(run);
+      }
+    }
+
+    private void Algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
+      var algorithm = (IAlgorithm)sender;
+      lock (locker) {
+        exceptions.Add(algorithm, e.Value);
+      }
+      algorithm.Stop();
+    }
+    private void Algorithm_Stopped(object sender, EventArgs e) {
+      lock (locker) {
+        waitHandles[(IAlgorithm)sender].Set();
       }
     }
@@ -138,119 +212,28 @@
     #region Port Events
     private void RegisterPortEvents(IPort port) {
-      IInputPort i = port as IInputPort;
-      if (i != null) {
-        i.NameChanged += InputPort_NameChanged;
-        i.ValueChanged += InputPort_ValueChanged;
-        UpdateParameter(i);
-      }
-      IOutputPort o = port as IOutputPort;
-      if (o != null) {
-        o.NameChanged += OutputPort_NameChanged;
-        UpdateOutputPort(o);
+      IConfigurationPort c = port as IConfigurationPort;
+      if (c != null) {
+        c.MessageReceived += ConfigurationPort_MessageReceived;
+      }
+      IExecutionPort e = port as IExecutionPort;
+      if (e != null) {
+        e.MessageReceived += ExecutionPort_MessageReceived;
       }
     }
     private void DeregisterPortEvents(IPort port) {
-      IInputPort i = port as IInputPort;
-      if (i != null) {
-        i.NameChanged -= InputPort_NameChanged;
-        i.ValueChanged -= InputPort_ValueChanged;
-      }
-      IOutputPort o = port as IOutputPort;
-      if (o != null) {
-        o.NameChanged -= OutputPort_NameChanged;
-      }
-    }
-    private void InputPort_NameChanged(object sender, EventArgs e) {
-      UpdateParameter((IInputPort)sender);
-    }
-    private void InputPort_ValueChanged(object sender, EventArgs e) {
-      UpdateParameter((IInputPort)sender);
-    }
-    private void OutputPort_NameChanged(object sender, EventArgs e) {
-      UpdateOutputPort((IOutputPort)sender);
-    }
-    #endregion
-
-    #region Algorithm Events
-    private void RegisterAlgorithmEvents() {
-      if (algorithm != null) {
-        algorithm.Prepared += Algorithm_Prepared;
-        RegisterResultsEvents();
-      }
-    }
-
-    private void DeregisterAlgorithmEvents() {
-      if (algorithm != null) {
-        algorithm.Prepared -= Algorithm_Prepared;
-        DeregisterResultsEvents();
-      }
-    }
-    private void Algorithm_Prepared(object sender, EventArgs e) {
-      RegisterResultsEvents();
-    }
-    #endregion
-
-    #region Results Events
-    private void RegisterResultsEvents() {
-      if ((algorithm != null) && (algorithm.Results != null)) {
-        algorithm.Results.ItemsAdded += Results_ItemsAdded;
-        algorithm.Results.ItemsRemoved += Results_ItemsRemoved;
-        algorithm.Results.ItemsReplaced += Results_ItemsReplaced;
-        algorithm.Results.CollectionReset += Results_CollectionReset;
-        foreach (var r in algorithm.Results)
-          RegisterResultEvents(r);
-      }
-    }
-    private void DeregisterResultsEvents() {
-      if ((algorithm != null) && (algorithm.Results != null)) {
-        algorithm.Results.ItemsAdded -= Results_ItemsAdded;
-        algorithm.Results.ItemsRemoved -= Results_ItemsRemoved;
-        algorithm.Results.ItemsReplaced -= Results_ItemsReplaced;
-        algorithm.Results.CollectionReset -= Results_CollectionReset;
-        foreach (var r in algorithm.Results)
-          DeregisterResultEvents(r);
-      }
-    }
-    private void Results_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IResult> e) {
-      foreach (var r in e.Items)
-        RegisterResultEvents(r);
-    }
-    private void Results_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IResult> e) {
-      foreach (var r in e.Items)
-        DeregisterResultEvents(r);
-    }
-    private void Results_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IResult> e) {
-      foreach (var r in e.OldItems)
-        DeregisterResultEvents(r);
-      foreach (var r in e.Items)
-        RegisterResultEvents(r);
-    }
-    private void Results_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IResult> e) {
-      foreach (var r in e.OldItems)
-        DeregisterResultEvents(r);
-      foreach (var r in e.Items)
-        RegisterResultEvents(r);
-    }
-    #endregion
-
-    #region Result Events
-    private void RegisterResultEvents(IResult result) {
-      if (result != null) {
-        result.ValueChanged += Result_ValueChanged;
-        result.ToStringChanged += Result_ToStringChanged;
-        UpdateOutputPort(result);
-      }
-    }
-    private void DeregisterResultEvents(IResult result) {
-      if (result != null) {
-        result.ValueChanged -= Result_ValueChanged;
-        result.ToStringChanged += Result_ToStringChanged;
-      }
-    }
-    private void Result_ValueChanged(object sender, EventArgs e) {
-      UpdateOutputPort((IResult)sender);
-    }
-    private void Result_ToStringChanged(object sender, EventArgs e) {
-      UpdateOutputPort((IResult)sender);
+      IConfigurationPort c = port as IConfigurationPort;
+      if (c != null) {
+        c.MessageReceived -= ConfigurationPort_MessageReceived;
+      }
+      IExecutionPort e = port as IExecutionPort;
+      if (e != null) {
+        e.MessageReceived -= ExecutionPort_MessageReceived;
+      }
+    }
+    protected virtual void ConfigurationPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Configure((IConfigurationPort)sender, e.Value, e.Value2);
+    }
+    protected virtual void ExecutionPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Execute((IExecutionPort)sender, e.Value, e.Value2);
     }
     #endregion
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmServiceNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmServiceNode.cs	(revision 11501)
+++ 	(revision )
@@ -1,234 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-
-namespace HeuristicLab.Optimization.Networks {
-  [Item("AlgorithmServiceNode", "A node of an optimization network which provides a HeuristicLab algorithm as a service.")]
-  [StorableClass]
-  public class AlgorithmServiceNode : Node, IAlgorithmServiceNode {
-    private object locker = new object();
-    private Dictionary<IAlgorithm, AutoResetEvent> waitHandles = new Dictionary<IAlgorithm,AutoResetEvent>();
-    private Dictionary<IAlgorithm, Exception> exceptions = new Dictionary<IAlgorithm, Exception>();
-
-    new public PortCollection Ports {
-      get { return base.Ports; }
-    }
-
-    [Storable]
-    private IAlgorithm template;
-    public IAlgorithm Template {
-      get { return template; }
-      set {
-        if (value != template) {
-          template = value;
-          OnTemplateChanged();
-        }
-      }
-    }
-
-    [Storable]
-    private RunCollection runs;
-    public RunCollection Runs {
-      get { return runs; }
-    }
-
-    [StorableConstructor]
-    protected AlgorithmServiceNode(bool deserializing) : base(deserializing) { }
-    protected AlgorithmServiceNode(AlgorithmServiceNode original, Cloner cloner)
-      : base(original, cloner) {
-      template = cloner.Clone(original.template);
-      runs = cloner.Clone(original.runs);
-    }
-    public AlgorithmServiceNode()
-      : base("AlgorithmServiceNode") {
-      runs = new RunCollection();
-    }
-    public AlgorithmServiceNode(string name)
-      : base(name) {
-      runs = new RunCollection();
-    }
-    public AlgorithmServiceNode(string name, string description)
-      : base(name, description) {
-      runs = new RunCollection();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new AlgorithmServiceNode(this, cloner);
-    }
-
-    protected virtual void UpdateParameters(IMessage message, CancellationToken token) {
-      // set template parameters
-      lock (locker) {
-        if (template != null) {
-          foreach (var v in message.Values) {
-            IParameter param = null;
-            if (Template.Parameters.TryGetValue(v.Name, out param)) {
-              var vp = param as IValueParameter;
-              if (vp != null) vp.Value = v.Value;
-            }
-            if (Template.Problem.Parameters.TryGetValue(v.Name, out param)) {
-              var vp = param as IValueParameter;
-              if (vp != null) vp.Value = v.Value;
-            }
-          }
-        }
-      }
-    }
-
-    protected virtual void Execute(IMessage message, CancellationToken token) {
-      if (Template == null) throw new InvalidOperationException("Template is null");
-
-      IAlgorithm algorithm;
-      lock (locker) {
-        algorithm = (IAlgorithm)Template.Clone();
-        waitHandles.Add(algorithm, new AutoResetEvent(false));
-      }
-
-      // set parameters
-      foreach (var v in message.Values) {
-        IParameter param = null;
-        if (algorithm.Parameters.TryGetValue(v.Name, out param)) {
-          var vp = param as IValueParameter;
-          if (vp != null) vp.Value = v.Value;
-        }
-        if (algorithm.Problem.Parameters.TryGetValue(v.Name, out param)) {
-          var vp = param as IValueParameter;
-          if (vp != null) vp.Value = v.Value;
-        }
-      }
-
-      algorithm.StoreAlgorithmInEachRun = false;
-      algorithm.Runs.Clear();
-      algorithm.Prepare();
-      algorithm.ExceptionOccurred += Algorithm_ExceptionOccurred;
-      algorithm.Stopped += Algorithm_Stopped;
-
-      using (token.Register(() => { algorithm.Stop(); })) {
-        algorithm.Start();
-        waitHandles[algorithm].WaitOne();
-      }
-
-      lock (locker) {
-        waitHandles[algorithm].Dispose();
-        waitHandles.Remove(algorithm);
-
-        Exception ex = null;
-        if (exceptions.TryGetValue(algorithm, out ex)) {
-          exceptions.Remove(algorithm);
-          throw ex;
-        }
-      }
-
-      // retrieve results
-      var run = algorithm.Runs.First();
-      foreach (var v in message.Values) {
-        IItem result = null;
-        if (run.Results.TryGetValue(v.Name, out result)) {
-          v.Value = result;
-        }
-      }
-
-      lock (locker) {
-        Runs.Add(run);
-      }
-    }
-
-    private void Algorithm_ExceptionOccurred(object sender, EventArgs<Exception> e) {
-      var algorithm = (IAlgorithm)sender;
-      lock (locker) {
-        exceptions.Add(algorithm, e.Value);
-      }
-      algorithm.Stop();
-    }
-    private void Algorithm_Stopped(object sender, EventArgs e) {
-      lock (locker) {
-        waitHandles[(IAlgorithm)sender].Set();
-      }
-    }
-
-    public event EventHandler TemplateChanged;
-    protected virtual void OnTemplateChanged() {
-      var handler = TemplateChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    #region Ports Events
-    protected override void RegisterPortsEvents() {
-      base.RegisterPortsEvents();
-      foreach (var p in Ports)
-        RegisterPortEvents(p);
-    }
-    protected override void Ports_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      base.Ports_ItemsAdded(sender, e);
-      foreach (var p in e.Items)
-        RegisterPortEvents(p);
-    }
-    protected override void Ports_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      base.Ports_ItemsRemoved(sender, e);
-      foreach (var p in e.Items)
-        DeregisterPortEvents(p);
-    }
-    protected override void Ports_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      base.Ports_ItemsReplaced(sender, e);
-      foreach (var p in e.OldItems)
-        DeregisterPortEvents(p);
-      foreach (var p in e.Items)
-        RegisterPortEvents(p);
-    }
-    protected override void Ports_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs<IPort> e) {
-      base.Ports_CollectionReset(sender, e);
-      foreach (var p in e.OldItems)
-        DeregisterPortEvents(p);
-      foreach (var p in e.Items)
-        RegisterPortEvents(p);
-    }
-    #endregion
-
-    #region Port Events
-    private void RegisterPortEvents(IPort port) {
-      IGenericPort g = port as IGenericPort;
-      if (g != null) {
-        g.MessageReceived += GenericPort_MessageReceived;
-      }
-    }
-    private void DeregisterPortEvents(IPort port) {
-      IGenericPort g = port as IGenericPort;
-      if (g != null) {
-        g.MessageReceived -= GenericPort_MessageReceived;
-      }
-    }
-    private void GenericPort_MessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
-      var port = (IGenericPort)sender;
-      if (port.Parameters.Any(p => p.Type.HasFlag(PortParameterType.Output)))
-        Execute(e.Value, e.Value2);  // execute algorithm to compute output
-      else
-        UpdateParameters(e.Value, e.Value2);  // update template parameters
-    }
-    #endregion
-  }
-}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmNode.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmNode.cs	(revision 11519)
@@ -26,4 +26,5 @@
     new PortCollection Ports { get; }
     IAlgorithm Algorithm { get; set; }
+    RunCollection Runs { get; }
 
     event EventHandler AlgorithmChanged;
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmServiceNode.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmServiceNode.cs	(revision 11501)
+++ 	(revision )
@@ -1,32 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-
-namespace HeuristicLab.Optimization.Networks {
-  public interface IAlgorithmServiceNode : INode {
-    new PortCollection Ports { get; }
-    IAlgorithm Template { get; set; }
-    RunCollection Runs { get; }
-
-    event EventHandler TemplateChanged;
-  }
-}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPConnector.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPConnector.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPConnector.cs	(revision 11519)
@@ -0,0 +1,106 @@
+#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.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Linq;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("KSPTSPConnector", "A node of an optimization network which connects a KSP and a TSP.")]
+  [StorableClass]
+  public class KSPTSPConnector : Node {
+    [StorableConstructor]
+    protected KSPTSPConnector(bool deserializing) : base(deserializing) { }
+    protected KSPTSPConnector(KSPTSPConnector original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPConnector()
+      : base("KSPTSPConnector") {
+      Initialize();
+    }
+    public KSPTSPConnector(string name)
+      : base(name) {
+      Initialize();
+    }
+    public KSPTSPConnector(string name, string description)
+      : base(name, description) {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPConnector(this, cloner);
+    }
+
+    protected virtual void Initialize() {
+      var parameters = new GenericPort("Parameters");
+      Ports.Add(parameters);
+      parameters.Parameters.Add(new PortParameter<DoubleMatrix>("Cities") { Type = PortParameterType.Input });
+      parameters.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") { Type = PortParameterType.Input });
+
+      var ksp = new GenericPort("KSP Connector");
+      Ports.Add(ksp);
+      ksp.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") { Type = PortParameterType.Input });
+      ksp.Parameters.Add(new PortParameter<DoubleValue>("Quality") { Type = PortParameterType.Input | PortParameterType.Output });
+      ksp.Parameters.Add(new PortParameter<DoubleValue>("TransportCosts") { Type = PortParameterType.Output });
+      ksp.MessageReceived += Knapsack_MessageReceived;
+
+      var tsp = new GenericPort("TSP Connector");
+      Ports.Add(tsp);
+      tsp.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") { Type = PortParameterType.Output });
+      ksp.Parameters.Add(new PortParameter<DoubleValue>("BestQuality") { Type = PortParameterType.Input });
+    }
+
+    protected virtual void Knapsack_MessageReceived(object sender, EventArgs<IMessage, System.Threading.CancellationToken> e) {
+      // get parameters
+      var parametersPort = (IGenericPort)Ports["Parameters"];
+      var parameters = parametersPort.PrepareMessage();
+      parametersPort.SendMessage(parameters, e.Value2);
+      var cities = (DoubleMatrix)parameters["Cities"];
+      var factor = ((DoubleValue)parameters["TransportCostsFactor"]).Value;
+
+      // build coordinates
+      var kspMsg = e.Value;
+      var kspSolution = (BinaryVector)kspMsg["KnapsackSolution"];
+      var kspQuality = ((DoubleValue)kspMsg["Quality"]).Value;
+      var coords = new DoubleMatrix(kspSolution.Count(x => x), 2);
+      int j = 0;
+      for (int i = 0; i < kspSolution.Length; i++) {
+        if (kspSolution[i]) {
+          coords[j, 0] = cities[i, 0];
+          coords[j, 1] = cities[i, 1];
+          j++;
+        }
+      }
+
+      // solve TSP
+      var tspConnectorPort = (IGenericPort)Ports["TSP Connector"];
+      var tspMsg = tspConnectorPort.PrepareMessage();
+      tspMsg["Coordinates"] = coords;
+      tspConnectorPort.SendMessage(tspMsg, e.Value2);
+      var tspQuality = ((DoubleValue)tspMsg["BestQuality"]).Value;
+
+      // calculate transport costs
+      ((DoubleValue)kspMsg["Quality"]).Value = kspQuality - factor * tspQuality;
+      kspMsg["TransportCosts"] = new DoubleValue(factor * tspQuality);
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11519)
@@ -33,4 +33,7 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ConfigurationPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ConfigurationPort.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ConfigurationPort.cs	(revision 11519)
@@ -0,0 +1,42 @@
+#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;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ConfigurationPort", "A port of an optimization network node which triggers configuration changes.")]
+  [StorableClass]
+  public class ConfigurationPort : GenericPort, IConfigurationPort {
+    [StorableConstructor]
+    protected ConfigurationPort(bool deserializing) : base(deserializing) { }
+    protected ConfigurationPort(ConfigurationPort original, Cloner cloner) : base(original, cloner) { }
+    public ConfigurationPort() : base("ConfigurationPort") { }
+    public ConfigurationPort(string name) : base(name) { }
+    public ConfigurationPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConfigurationPort(this, cloner);
+    }
+
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ExecutionPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ExecutionPort.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/ExecutionPort.cs	(revision 11519)
@@ -0,0 +1,42 @@
+#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;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("ExecutionPort", "A port of an optimization network node which triggers execution.")]
+  [StorableClass]
+  public class ExecutionPort : GenericPort, IExecutionPort {
+    [StorableConstructor]
+    protected ExecutionPort(bool deserializing) : base(deserializing) { }
+    protected ExecutionPort(ExecutionPort original, Cloner cloner) : base(original, cloner) { }
+    public ExecutionPort() : base("ExecutionPort") { }
+    public ExecutionPort(string name) : base(name) { }
+    public ExecutionPort(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExecutionPort(this, cloner);
+    }
+
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs	(revision 11519)
@@ -61,5 +61,17 @@
         if (value != portConnectionValid) {
           portConnectionValid = value;
+          OnPortConnectionValidChanged();
           OnItemImageChanged();
+        }
+      }
+    }
+    [Storable]
+    protected bool logMessages;
+    public bool LogMessages {
+      get { return logMessages; }
+      set {
+        if (value != logMessages) {
+          logMessages = value;
+          OnLogMessagesChanged();
         }
       }
@@ -77,4 +89,5 @@
       connectedPort = cloner.Clone(original.connectedPort);
       portConnectionValid = original.portConnectionValid;
+      logMessages = original.logMessages;
       messages = cloner.Clone(original.messages);
       RegisterConnectedPortEvents();
@@ -83,4 +96,5 @@
       : base("GenericPort") {
       portConnectionValid = true;
+      logMessages = false;
       messages = new MessageCollection();
     }
@@ -88,4 +102,5 @@
       : base(name) {
       portConnectionValid = true;
+      logMessages = false;
       messages = new MessageCollection();
     }
@@ -93,4 +108,5 @@
       : base(name, description) {
       portConnectionValid = true;
+      logMessages = false;
       messages = new MessageCollection();
     }
@@ -183,5 +199,5 @@
     public void SendMessage(IMessage message, CancellationToken token) {
       if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
-      Messages.Add(message);
+      if (LogMessages) Messages.Add(message);
       if (ConnectedPort != null) ConnectedPort.ReceiveMessage(message, token);
       OnMessageSent(message, token);
@@ -201,5 +217,5 @@
     public void ReceiveMessage(IMessage message, CancellationToken token) {
       if (!PortConnectionValid) throw new InvalidOperationException("Port connection is not valid");
-      Messages.Add(message);
+      if (LogMessages) Messages.Add(message);
       OnMessageReceived(message, token);
     }
@@ -213,4 +229,14 @@
     protected virtual void OnConnectedPortChanged() {
       var handler = ConnectedPortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PortConnectionValidChanged;
+    protected virtual void OnPortConnectionValidChanged() {
+      var handler = PortConnectionValidChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler LogMessagesChanged;
+    protected virtual void OnLogMessagesChanged() {
+      var handler = LogMessagesChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IConfigurationPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IConfigurationPort.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IConfigurationPort.cs	(revision 11519)
@@ -0,0 +1,24 @@
+#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 {
+  public interface IConfigurationPort : IGenericPort { }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IExecutionPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IExecutionPort.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IExecutionPort.cs	(revision 11519)
@@ -0,0 +1,24 @@
+#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 {
+  public interface IExecutionPort : IGenericPort { }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IGenericPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IGenericPort.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IGenericPort.cs	(revision 11519)
@@ -29,7 +29,10 @@
     IConnectedPort ConnectedPort { get; set; }
     bool PortConnectionValid { get; }
+    bool LogMessages { get; set; }
     MessageCollection Messages { get; }
 
     event EventHandler ConnectedPortChanged;
+    event EventHandler PortConnectionValidChanged;
+    event EventHandler LogMessagesChanged;
 
     bool CanConnectToPort(IPort port);
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IMessage.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IMessage.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/IMessage.cs	(revision 11519)
@@ -25,5 +25,5 @@
   public interface IMessage : IItem {
     MessageValueCollection Values { get; }
-    IItem this[string valueName] { get; }
+    IItem this[string valueName] { get; set; }
   }
 }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/Message.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/Message.cs	(revision 11501)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/Message.cs	(revision 11519)
@@ -40,4 +40,5 @@
     public IItem this[string valueName] {
       get { return Values[valueName].Value; }
+      set { Values[valueName].Value = value; }
     }
 
