Index: /branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 11822)
+++ /branches/OptimizationNetworks/HeuristicLab.Modeler/3.3/HeuristicLab.Modeler-3.3.csproj	(revision 11823)
@@ -26,5 +26,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -39,5 +39,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x64\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -47,5 +47,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
-    <OutputPath>bin\x64\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -57,5 +57,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -65,5 +65,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
Index: /branches/OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj	(revision 11822)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks.Views/3.3/HeuristicLab.Networks.Views-3.3.csproj	(revision 11823)
@@ -27,5 +27,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -41,5 +41,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x64\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -50,5 +50,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
-    <OutputPath>bin\x64\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -61,5 +61,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -70,5 +70,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj	(revision 11822)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/HeuristicLab.Networks-3.3.csproj	(revision 11823)
@@ -27,5 +27,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -41,5 +41,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x64\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -50,5 +50,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
-    <OutputPath>bin\x64\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -61,5 +61,5 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
     <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\x86\Debug\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DebugType>full</DebugType>
@@ -70,5 +70,5 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
-    <OutputPath>bin\x86\Release\</OutputPath>
+    <OutputPath>..\..\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <Optimize>true</Optimize>
@@ -97,8 +97,14 @@
     <Compile Include="IExecutionPort.cs" />
     <Compile Include="IUserDefinedMessagePort.cs" />
-    <Compile Include="KSPTSPConnector.cs" />
     <EmbeddedResource Include="KSPTSPConnectorCode.cs" />
+    <Compile Include="KSPTSPConcurrentControlNetwork.cs" />
+    <Compile Include="KSPTSPConnector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="KSPTSPControl.cs" />
+    <EmbeddedResource Include="KSPTSPControlCode.cs" />
     <Compile Include="KSPTSPNetwork.cs" />
     <EmbeddedResource Include="KSPTSPNetworkCode.cs" />
+    <EmbeddedResource Include="KSPTSPConcurrentControlNetworkCode.cs" />
     <Compile Include="Plugin.cs" />
     <Compile Include="Programmable\IProgrammableNetwork.cs" />
@@ -124,4 +130,20 @@
   </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.Algorithms.LocalSearch\3.3\HeuristicLab.Algorithms.LocalSearch-3.3.csproj">
+      <Project>{4ae3fc69-c575-42d2-bc46-0fad5850efc5}</Project>
+      <Name>HeuristicLab.Algorithms.LocalSearch-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Algorithms.VariableNeighborhoodSearch\3.3\HeuristicLab.Algorithms.VariableNeighborhoodSearch-3.3.csproj">
+      <Project>{e4cfb0c3-0589-4893-b38e-8bedf885c765}</Project>
+      <Name>HeuristicLab.Algorithms.VariableNeighborhoodSearch-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
@@ -149,4 +171,12 @@
       <Private>False</Private>
     </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>
@@ -174,7 +204,23 @@
       <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>
     <ProjectReference Include="..\..\HeuristicLab.Scripting\3.3\HeuristicLab.Scripting-3.3.csproj">
       <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
       <Name>HeuristicLab.Scripting-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Selection\3.3\HeuristicLab.Selection-3.3.csproj">
+      <Project>{2c36cd4f-e5f5-43a4-801a-201ea895fe17}</Project>
+      <Name>HeuristicLab.Selection-3.3</Name>
     </ProjectReference>
   </ItemGroup>
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs	(revision 11823)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetwork.cs	(revision 11823)
@@ -0,0 +1,52 @@
+﻿#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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSP Concurrent-Control Network", "An optimization network which connects a KSP and a TSP.")]
+  [Creatable("Optimization Networks")]
+  [StorableClass]
+  public class KSPTSPConcurrentControlNetwork : ProgrammableNetwork {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    protected override string CodeTemplate {
+      get { return ReadCodeTemplate("HeuristicLab.Networks.KSPTSPConcurrentControlNetworkCode.cs"); }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPConcurrentControlNetwork(bool deserializing) : base(deserializing) { }
+    protected KSPTSPConcurrentControlNetwork(KSPTSPConcurrentControlNetwork original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPConcurrentControlNetwork() : base("KSPTSPConcurrentControlNetwork") { }
+    public KSPTSPConcurrentControlNetwork(string name) : base(name) { }
+    public KSPTSPConcurrentControlNetwork(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPConcurrentControlNetwork(this, cloner);
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs	(revision 11823)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPConcurrentControlNetworkCode.cs	(revision 11823)
@@ -0,0 +1,222 @@
+#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.Drawing;
+using System.Linq;
+using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+using HeuristicLab.Selection;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSP Concurrent-Control Network", "An optimization network which connects a KSP and a TSP.")]
+  public class CompiledKSPTSPConcurrentControlNetwork : ProgrammableNetwork.CompiledProgrammableNetwork {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Module; }
+    }
+
+    protected CompiledKSPTSPConcurrentControlNetwork(CompiledKSPTSPConcurrentControlNetwork original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPConcurrentControlNetwork(ProgrammableNetwork context)
+      : base(context) {
+      if (Nodes.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPConcurrentControlNetwork(this, cloner);
+    }
+
+    public void Initialize() {
+      #region ParametersNode
+      var paramsNode = new UserDefinedNode("ParametersNode");
+      Nodes.Add(paramsNode);
+
+      var paramsPort = new MessagePort("Parameters");
+      paramsNode.Ports.Add(paramsPort);
+
+      paramsPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        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 ControlNode
+      var controlNode = new KSPTSPControl("KSPTSP Control");
+      Nodes.Add(controlNode);
+      #endregion
+
+      #region KSPNode
+      var kspNode = new AlgorithmNode("KSPNode");
+      Nodes.Add(kspNode);
+
+      var kspConfigPort = new ConfigurationPort("ConfigureKSP");
+      kspNode.Ports.Add(kspConfigPort);
+
+      kspConfigPort.Parameters.Add(new PortParameter<IntValue>("KnapsackCapacity") {
+        Type = PortParameterType.Input
+      });
+      kspConfigPort.Parameters.Add(new PortParameter<IntArray>("Values") {
+        Type = PortParameterType.Input
+      });
+      kspConfigPort.Parameters.Add(new PortParameter<IntArray>("Weights") {
+        Type = PortParameterType.Input
+      });
+
+      var kspControlPort = new MessagePort("ControlPort");
+      kspNode.Ports.Add(kspControlPort);
+
+      kspControlPort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Output
+      });
+      kspControlPort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Input
+      });
+
+      var kspReportPort = new MessagePort("ReportPort");
+      kspNode.Ports.Add(kspReportPort);
+
+      kspReportPort.Parameters.Add(new PortParameter<KnapsackSolution>("BestSolution") {
+        Type = PortParameterType.Output
+      });
+
+      var kspGa = new GeneticAlgorithm {
+        Problem = new KnapsackProblem(),
+        MaximumGenerations = { Value = 500 },
+        PopulationSize = { Value = 200 }
+      };
+      kspGa.Mutator = kspGa.MutatorParameter.ValidValues.First(x => x.Name == "SinglePositionBitflipManipulator");
+      kspGa.Crossover = kspGa.CrossoverParameter.ValidValues.First(x => x.Name == "SinglePointCrossover");
+      kspGa.Selector = kspGa.SelectorParameter.ValidValues.First(x => x.Name == "TournamentSelector");
+      kspNode.Algorithm = kspGa;
+
+      var kspEvalHook = new HookOperator() { Name = "KSP Eval Hook" };
+      kspEvalHook.Parameters.Add(new LookupParameter<BinaryVector>("KnapsackSolution") { Hidden = false });
+      kspEvalHook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = false });
+      ((InstrumentedOperator)kspGa.Problem.Evaluator).AfterExecutionOperators.Add(kspEvalHook);
+
+      var kspIterHook = new HookOperator() { Name = "KSP Iter Hook" };
+      kspIterHook.Parameters.Add(new LookupParameter<KnapsackSolution>("BestSolution") { Hidden = false });
+      kspGa.Analyzer.AfterExecutionOperators.Add(kspIterHook);
+      #endregion
+
+      #region TSPNode
+      var tspNode = new AlgorithmNode("TSPNode");
+      Nodes.Add(tspNode);
+
+      var tspConfigPort = new ConfigurationPort("ConfigureTSP");
+      tspNode.Ports.Add(tspConfigPort);
+
+      tspConfigPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+
+      var tspControlPort = new MessagePort("ControlPort");
+      tspNode.Ports.Add(tspControlPort);
+
+      tspControlPort.Parameters.Add(new PortParameter<Permutation>("TSPTour") {
+        Type = PortParameterType.Output
+      });
+      tspControlPort.Parameters.Add(new PortParameter<DoubleValue>("TSPTourLength") {
+        Type = PortParameterType.Input
+      });
+
+      var tspReportPort = new MessagePort("ReportPort");
+      tspNode.Ports.Add(tspReportPort);
+
+      tspReportPort.Parameters.Add(new PortParameter<PathTSPTour>("BestSolution") {
+        Type = PortParameterType.Output
+      });
+
+      var tspGa = new GeneticAlgorithm {
+        Problem = new TravelingSalesmanProblem(),
+        MaximumGenerations = { Value = 500 },
+        PopulationSize = { Value = 200 }
+      };
+      ((IValueParameter<BoolValue>)tspGa.Problem.MaximizationParameter).Value.Value = true;
+      tspGa.Crossover = tspGa.CrossoverParameter.ValidValues.First(x => x.Name == "EdgeRecombinationCrossover");
+      tspGa.Mutator = tspGa.MutatorParameter.ValidValues.First(x => x.Name == "InversionManipulator");
+      tspGa.Selector = tspGa.SelectorParameter.ValidValues.First(x => x.Name == "TournamentSelector");
+      ((TournamentSelector)tspGa.Selector).GroupSizeParameter.Value.Value = 3;
+      tspNode.Algorithm = tspGa;
+
+      var tspEvalHook = new HookOperator() { Name = "TSP Eval Hook" };
+      tspEvalHook.Parameters.Add(new LookupParameter<Permutation>("TSPTour") { Hidden = false });
+      tspEvalHook.Parameters.Add(new LookupParameter<DoubleValue>("TSPTourLength") { Hidden = false });
+      ((InstrumentedOperator)tspGa.Problem.Evaluator).AfterExecutionOperators.Add(tspEvalHook);
+
+      var tspIterHook = new HookOperator() { Name = "TSP Iter Hook" };
+      tspIterHook.Parameters.Add(new LookupParameter<PathTSPTour>("BestSolution") { Hidden = false });
+      tspGa.Analyzer.AfterExecutionOperators.Add(tspIterHook);
+      #endregion
+
+
+      #region Wire Ports
+      ((ConfigurationPort)((INode)controlNode).Ports["Configure"]).ConnectedPort = paramsPort;
+      kspConfigPort.ConnectedPort = paramsPort;
+      tspConfigPort.ConnectedPort = paramsPort;
+
+      kspEvalHook.Port = kspControlPort;
+      kspControlPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Evaluate KSP"];
+      tspEvalHook.Port = tspControlPort;
+      tspControlPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Evaluate TSP"];
+
+      kspIterHook.Port = kspReportPort;
+      kspReportPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Add KSP Solution"];
+      tspIterHook.Port = tspReportPort;
+      tspReportPort.ConnectedPort = (IMessagePort)((INode)controlNode).Ports["Add TSP Solution"];
+      #endregion
+
+      paramsPort.SendMessage(paramsPort.PrepareMessage());
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs	(revision 11823)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControl.cs	(revision 11823)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPControl", "A node of an optimization network which connects a KSP and a TSP.")]
+  [StorableClass]
+  public class KSPTSPControl : ProgrammableNode {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+    public object Locker = new object();
+
+    [Storable]
+    public List<BinaryVector> SelectedCities = new List<BinaryVector>();
+    [Storable]
+    public List<Permutation> PredefinedTrip = new List<Permutation>();
+
+    public AutoResetEvent TspWait = new AutoResetEvent(false);
+    public AutoResetEvent KspWait = new AutoResetEvent(false);
+
+    [Storable]
+    public DoubleMatrix Coordinates, Distances;
+    [Storable]
+    public IntArray CityValues, CityWeights;
+    [Storable]
+    public DoubleValue TransportCostFactor;
+    [Storable]
+    public IntValue CityLimit;
+
+    protected override string CodeTemplate {
+      get { return ReadCodeTemplate("HeuristicLab.Networks.KSPTSPControlCode.cs"); }
+    }
+
+    [StorableConstructor]
+    protected KSPTSPControl(bool deserializing) : base(deserializing) { }
+    protected KSPTSPControl(KSPTSPControl original, Cloner cloner) : base(original, cloner) { }
+    public KSPTSPControl() : base("KSPTSPControl") { }
+    public KSPTSPControl(string name) : base(name) { }
+    public KSPTSPControl(string name, string description) : base(name, description) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new KSPTSPControl(this, cloner);
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs	(revision 11823)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPControlCode.cs	(revision 11823)
@@ -0,0 +1,222 @@
+#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;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Networks;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Networks.Programmable;
+using HeuristicLab.Problems.Knapsack;
+using HeuristicLab.Problems.TravelingSalesman;
+
+namespace HeuristicLab.Networks {
+  [Item("KSPTSPControl", "A node of an optimization network which connects a KSP and a TSP.")]
+  public class CompiledKSPTSPControl : ProgrammableNode.CompiledProgrammableNode {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.RadialChart; }
+    }
+
+    new protected KSPTSPControl Context {
+      get { return (KSPTSPControl)base.Context; }
+    }
+
+    protected CompiledKSPTSPControl(CompiledKSPTSPControl original, Cloner cloner) : base(original, cloner) { }
+    public CompiledKSPTSPControl(ProgrammableNode context)
+      : base(context) {
+      if (Ports.Count == 0)
+        Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new CompiledKSPTSPControl(this, cloner);
+    }
+
+    public override void Initialize() {
+      base.Initialize();
+      var configPort = new ConfigurationPort("Configure");
+      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
+      });
+      configPort.Parameters.Add(new PortParameter<DoubleMatrix>("Coordinates") {
+        Type = PortParameterType.Input
+      });
+      configPort.Parameters.Add(new PortParameter<DoubleValue>("TransportCostsFactor") {
+        Type = PortParameterType.Input
+      });
+
+      var evalKspPort = new MessagePort("Evaluate KSP");
+      Ports.Add(evalKspPort);
+      evalKspPort.Parameters.Add(new PortParameter<BinaryVector>("KnapsackSolution") {
+        Type = PortParameterType.Input
+      });
+      evalKspPort.Parameters.Add(new PortParameter<DoubleValue>("Quality") {
+        Type = PortParameterType.Output
+      });
+
+      var evalTspPort = new MessagePort("Evaluate TSP");
+      Ports.Add(evalTspPort);
+      evalTspPort.Parameters.Add(new PortParameter<Permutation>("TSPTour") {
+        Type = PortParameterType.Input
+      });
+      evalTspPort.Parameters.Add(new PortParameter<DoubleValue>("TSPTourLength") {
+        Type = PortParameterType.Output
+      });
+
+      var addKspSolultionPort = new MessagePort("Add KSP Solution");
+      Ports.Add(addKspSolultionPort);
+      addKspSolultionPort.Parameters.Add(new PortParameter<KnapsackSolution>("BestSolution") {
+        Type = PortParameterType.Input
+      });
+
+      var addTspSolutionPort = new MessagePort("Add TSP Solution");
+      Ports.Add(addTspSolutionPort);
+      addTspSolutionPort.Parameters.Add(new PortParameter<PathTSPTour>("BestSolution") {
+        Type = PortParameterType.Input
+      });
+    }
+
+    private void AddKspSolultionPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var cities = (KnapsackSolution)(e.Value.Values["BestSolution"]).Value;
+      AddSelectedCities(cities.BinaryVector);
+    }
+
+    private void AddTspSolutionPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var trip = (PathTSPTour)(e.Value.Values["BestSolution"]).Value;
+      AddPredefinedTrip(trip.Permutation);
+    }
+
+    private void ConfigPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      Context.TransportCostFactor = (DoubleValue)(e.Value["TransportCostsFactor"]);
+      Context.Coordinates = (DoubleMatrix)(e.Value["Coordinates"]);
+      Context.Distances = CalculateEuclidean(Context.Coordinates);
+      Context.CityValues = (IntArray)(e.Value["Values"]);
+      Context.CityWeights = (IntArray)(e.Value["Weights"]);
+      Context.CityLimit = (IntValue)(e.Value["KnapsackCapacity"]);
+    }
+
+    private void EvalKspPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var cities = (BinaryVector)(e.Value.Values["KnapsackSolution"]).Value;
+      e.Value.Values["Quality"].Value = new DoubleValue(EvaluatePredefinedTrip(cities));
+    }
+
+    private void EvalTspPortOnMessageReceived(object sender, EventArgs<IMessage, CancellationToken> e) {
+      var trip = (Permutation)(e.Value.Values["TSPTour"]).Value;
+      e.Value.Values["TSPTourLength"].Value = new DoubleValue(EvaluateSelectedCities(trip));
+    }
+
+    public override void RegisterEvents() {
+      base.RegisterEvents();
+      ((IMessagePort)Ports["Configure"]).MessageReceived += ConfigPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate KSP"]).MessageReceived += EvalKspPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate TSP"]).MessageReceived += EvalTspPortOnMessageReceived;
+      ((IMessagePort)Ports["Add KSP Solution"]).MessageReceived += AddKspSolultionPortOnMessageReceived;
+      ((IMessagePort)Ports["Add TSP Solution"]).MessageReceived += AddTspSolutionPortOnMessageReceived;
+
+    }
+    public override void DeregisterEvents() {
+      ((IMessagePort)Ports["Configure"]).MessageReceived -= ConfigPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate KSP"]).MessageReceived -= EvalKspPortOnMessageReceived;
+      ((IMessagePort)Ports["Evaluate TSP"]).MessageReceived -= EvalTspPortOnMessageReceived;
+      ((IMessagePort)Ports["Add KSP Solution"]).MessageReceived -= AddKspSolultionPortOnMessageReceived;
+      ((IMessagePort)Ports["Add TSP Solution"]).MessageReceived -= AddTspSolutionPortOnMessageReceived;
+      base.DeregisterEvents();
+    }
+
+    public double EvaluatePredefinedTrip(BinaryVector cities) {
+      if (Context.SelectedCities.Count == 0) {
+        Context.SelectedCities.Add(cities);
+        Context.KspWait.Set();
+        Context.TspWait.WaitOne();
+      }
+      return EvaluateBoth(cities, Context.PredefinedTrip.Last());
+    }
+
+    public double EvaluateSelectedCities(Permutation trip) {
+      if (Context.PredefinedTrip.Count == 0) {
+        Context.PredefinedTrip.Add(trip);
+        Context.TspWait.Set();
+        Context.KspWait.WaitOne();
+      }
+      return EvaluateBoth(Context.SelectedCities.Last(), trip);
+    }
+
+    public double EvaluateBoth(BinaryVector cities, Permutation trip) {
+      var cityValues = cities.Select((v, i) => v ? Context.CityValues[i] : 0).Sum();
+      var cityWeights = cities.Select((v, i) => v ? Context.CityWeights[i] : 0).Sum();
+      var subtour = trip.Where(x => cities[x]).ToArray();
+      var tourLength = 0.0;
+      for (var i = 1; i < subtour.Length; i++)
+        tourLength += Context.Distances[subtour[i - 1], subtour[i]];
+      tourLength += Context.Distances[subtour.Last(), subtour[0]];
+      if (cityWeights > Context.CityLimit.Value) // infeasible solution
+        return Context.CityLimit.Value - cityWeights - tourLength * Context.TransportCostFactor.Value;
+      return cityValues - tourLength * Context.TransportCostFactor.Value;
+    }
+
+    public void AddPredefinedTrip(Permutation trip) {
+      Context.TspWait.Set();
+      Context.KspWait.WaitOne();
+      lock (Context.Locker) {
+        Context.PredefinedTrip.Add(trip);
+      }
+    }
+
+    public void AddSelectedCities(BinaryVector cities) {
+      Context.KspWait.Set();
+      Context.TspWait.WaitOne();
+      lock (Context.Locker) {
+        Context.SelectedCities.Add(cities);
+      }
+    }
+
+    public static DoubleMatrix CalculateEuclidean(DoubleMatrix cities) {
+      var len = cities.Rows;
+      var distances = new DoubleMatrix(len, len);
+      for (var i = 0; i < len - 1; i++) {
+        var sX = cities[i, 0];
+        var sY = cities[i, 1];
+        for (var j = i + 1; j < len; j++) {
+          var tX = cities[j, 0];
+          var tY = cities[j, 1];
+          distances[i, j] = Math.Sqrt((sX - tX) * (sX - tX) + (sY - tY) * (sY - tY));
+          distances[j, i] = distances[i, j];
+        }
+      }
+      return distances;
+    }
+
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs	(revision 11822)
+++ /branches/OptimizationNetworks/HeuristicLab.Networks/3.3/KSPTSPNetworkCode.cs	(revision 11823)
@@ -121,4 +121,5 @@
       var kspGA = new GeneticAlgorithm();
       kspGA.Problem = new KnapsackProblem();
+      ((KnapsackProblem)kspGA.Problem).Penalty.Value = 100;
       kspGA.MaximumGenerations.Value = 50;
       kspGA.PopulationSize.Value = 10;
