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 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/HeuristicLab.Optimization.Networks-3.3.csproj	(revision 11520)
@@ -109,4 +109,5 @@
     <Compile Include="### obsolete\ServiceParameterCollection.cs" />
     <Compile Include="IHookOperator.cs" />
+    <Compile Include="Nodes\KSPTSPNetwork.cs" />
     <Compile Include="Nodes\KSPTSPConnector.cs" />
     <Compile Include="Nodes\GenericNode.cs" />
@@ -163,4 +164,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Algorithms.GeneticAlgorithm\3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.csproj">
+      <Project>{a51da44f-cb35-4f6f-99f5-2a2e904ab93b}</Project>
+      <Name>HeuristicLab.Algorithms.GeneticAlgorithm-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
@@ -198,4 +203,8 @@
       <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
@@ -207,4 +216,16 @@
       <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540e29e-4793-49e7-8ee2-fea7f61c3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Knapsack\3.3\HeuristicLab.Problems.Knapsack-3.3.csproj">
+      <Project>{e10f395f-c8a6-48ad-b470-9aa7a1f43809}</Project>
+      <Name>HeuristicLab.Problems.Knapsack-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.TravelingSalesman\3.3\HeuristicLab.Problems.TravelingSalesman-3.3.csproj">
+      <Project>{d767c38d-8014-46b0-9a32-03a3aecce34a}</Project>
+      <Name>HeuristicLab.Problems.TravelingSalesman-3.3</Name>
     </ProjectReference>
   </ItemGroup>
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 11520)
@@ -25,4 +25,5 @@
 using HeuristicLab.Encodings.BinaryVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.TravelingSalesman;
 using System.Linq;
 
@@ -33,16 +34,27 @@
     [StorableConstructor]
     protected KSPTSPConnector(bool deserializing) : base(deserializing) { }
-    protected KSPTSPConnector(KSPTSPConnector original, Cloner cloner) : base(original, cloner) { }
+    protected KSPTSPConnector(KSPTSPConnector original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
     public KSPTSPConnector()
       : base("KSPTSPConnector") {
       Initialize();
+      RegisterEvents();
     }
     public KSPTSPConnector(string name)
       : base(name) {
       Initialize();
+      RegisterEvents();
     }
     public KSPTSPConnector(string name, string description)
       : base(name, description) {
       Initialize();
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
     }
 
@@ -62,10 +74,16 @@
       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;
+      ksp.Parameters.Add(new PortParameter<PathTSPTour>("Route") { Type = PortParameterType.Output });
 
       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 });
+      tsp.Parameters.Add(new PortParameter<PathTSPTour>("Best TSP Solution") { Type = PortParameterType.Input });
+      tsp.Parameters.Add(new PortParameter<DoubleValue>("BestQuality") { Type = PortParameterType.Input });
+    }
+
+    protected virtual void RegisterEvents() {
+      var ksp = (IGenericPort)Ports["KSP Connector"];
+      ksp.MessageReceived += Knapsack_MessageReceived;
     }
 
@@ -97,4 +115,5 @@
       tspMsg["Coordinates"] = coords;
       tspConnectorPort.SendMessage(tspMsg, e.Value2);
+      var tspSolution = (PathTSPTour)tspMsg["Best TSP Solution"];
       var tspQuality = ((DoubleValue)tspMsg["BestQuality"]).Value;
 
@@ -102,4 +121,5 @@
       ((DoubleValue)kspMsg["Quality"]).Value = kspQuality - factor * tspQuality;
       kspMsg["TransportCosts"] = new DoubleValue(factor * tspQuality);
+      kspMsg["Route"] = tspSolution;
     }
   }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPNetwork.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPNetwork.cs	(revision 11520)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/KSPTSPNetwork.cs	(revision 11520)
@@ -0,0 +1,183 @@
+#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.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+using System.Linq;
+
+namespace HeuristicLab.Optimization.Networks {
+  [Item("KSPTSPNetwork", "An optimization network which connects a KSP and a TSP.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public class KSPTSPNetwork : Network {
+    [StorableConstructor]
+    protected KSPTSPNetwork(bool deserializing) : base(deserializing) { }
+    protected KSPTSPNetwork(KSPTSPNetwork original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPNetwork()
+      : base("KSPTSPNetwork") {
+      Initialize();
+    }
+    public KSPTSPNetwork(string name)
+      : base(name) {
+      Initialize();
+    }
+    public KSPTSPNetwork(string name, string description)
+      : base(name, description) {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPNetwork(this, cloner);
+    }
+
+    protected virtual void Initialize() {
+      #region ParametersNode
+      var paramsNode = new GenericNode("ParametersNode");
+      Nodes.Add(paramsNode);
+
+      var paramsPort = new GenericPort("Parameters");
+      paramsNode.Ports.Add(paramsPort);
+
+      paramsPort.Parameters.Add(new PortParameter<DoubleMatrix>("Cities") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleMatrix(new double[,] {
+          {00, 00}, {10, 00}, {20, 00}, {30, 00}, {40, 00}, 
+          {00, 10}, {10, 10}, {20, 10}, {30, 10}, {40, 10}, 
+          {00, 20}, {10, 20}, {20, 20}, {30, 20}, {40, 20}, 
+          {00, 30}, {10, 30}, {20, 30}, {30, 30}, {40, 30}, 
+          {00, 40}, {10, 40}, {20, 40}, {30, 40}, {40, 40}
+        })
+      });
+      paramsPort.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") {
+        Type = PortParameterType.Output,
+        DefaultValue = new DoubleValue(0.1)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntValue(10)
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 })
+      });
+      paramsPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Output,
+        DefaultValue = new IntArray(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 })
+      });
+      #endregion
+
+      #region KSPNode
+      var kspNode = new AlgorithmNode("KSPNode");
+      Nodes.Add(kspNode);
+
+      var configPort = new ConfigurationPort("ConfigureKSP");
+      kspNode.Ports.Add(configPort);
+
+      configPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Input
+      });
+
+      var evaluatePort = new GenericPort("EvaluateRoute");
+      kspNode.Ports.Add(evaluatePort);
+
+      evaluatePort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Output
+      });
+      evaluatePort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Output | PortParameterType.Input
+      });
+      evaluatePort.Parameters.Add(new PortParameter<DoubleValue>("TransportCosts") {
+        Type = PortParameterType.Input
+      });
+      evaluatePort.Parameters.Add(new PortParameter<PathTSPTour>("Route") {
+        Type = PortParameterType.Input
+      });
+
+      var kspGA = new GeneticAlgorithm();
+      kspGA.Problem = new KnapsackProblem();
+      kspGA.MaximumGenerations.Value = 50;
+      kspGA.PopulationSize.Value = 10;
+      kspGA.Mutator = kspGA.MutatorParameter.ValidValues.Where(x => x.Name == "SinglePositionBitflipManipulator").First();
+      kspNode.Algorithm = kspGA;
+
+      var hook = new HookOperator();
+      hook.Parameters.Add(new LookupParameter<BinaryVector>("KnapsackSolution") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<DoubleValue>("TransportCosts") { Hidden = false });
+      hook.Parameters.Add(new LookupParameter<PathTSPTour>("Route") { Hidden = false });
+      ((FixedValueParameter<OperatorList>)kspGA.Problem.Evaluator.Parameters["AfterExecutionOperators"]).Value.Add(hook);
+      #endregion
+
+      #region TSPNode
+      var tspNode = new AlgorithmNode("TSPNode");
+      Nodes.Add(tspNode);
+
+      var executePort = new ExecutionPort("Execute");
+      tspNode.Ports.Add(executePort);
+
+      executePort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+      executePort.Parameters.Add(new PortParameter<DoubleValue>("BestQuality") {
+        Type = PortParameterType.Output
+      });
+      executePort.Parameters.Add(new PortParameter<PathTSPTour>("Best TSP Solution") {
+        Type = PortParameterType.Output
+      });
+
+      var tspGA = new GeneticAlgorithm();
+      tspGA.Problem = new TravelingSalesmanProblem();
+      tspGA.MaximumGenerations.Value = 100;
+      tspGA.PopulationSize.Value = 50;
+      tspGA.Mutator = tspGA.MutatorParameter.ValidValues.Where(x => x.Name == "InversionManipulator").First();
+      tspNode.Algorithm = tspGA;
+      #endregion
+
+      #region KSPTSPConnector
+      var ksptspConnector = (INode)new KSPTSPConnector();
+      Nodes.Add(ksptspConnector);
+      #endregion
+
+      #region Wire Ports
+      hook.Port = evaluatePort;
+      configPort.ConnectedPort = paramsPort;
+      evaluatePort.ConnectedPort = (IConnectedPort)ksptspConnector.Ports["KSP Connector"];
+      ((IGenericPort)ksptspConnector.Ports["Parameters"]).ConnectedPort = paramsPort;
+      ((IGenericPort)ksptspConnector.Ports["TSP Connector"]).ConnectedPort = executePort;
+
+      paramsPort.SendMessage(paramsPort.PrepareMessage());
+      #endregion
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Plugin.cs.frame	(revision 11520)
@@ -28,4 +28,5 @@
   [Plugin("HeuristicLab.Optimization.Networks", "3.3.11.$WCREV$")]
   [PluginFile("HeuristicLab.Optimization.Networks-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Algorithms.GeneticAlgorithm", "3.3")]
   [PluginDependency("HeuristicLab.Collections", "3.3")]
   [PluginDependency("HeuristicLab.Common", "3.3")]
@@ -37,5 +38,8 @@
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Knapsack", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.TravelingSalesman", "3.3")]
   public class HeuristicLabOptimizationNetworksPlugin : PluginBase {
   }
Index: branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs	(revision 11519)
+++ branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Ports/GenericPort.cs	(revision 11520)
@@ -180,5 +180,5 @@
         message.Values.AddRange(
           ConnectedPort.Parameters.
-          Where(p => p.Type.HasFlag(PortParameterType.Output)).
+          Where(p => p.Type.HasFlag(PortParameterType.Output) && !message.Values.ContainsKey(p.Name)).
           Select(p => p.CreateMessageValue())
         );
