Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/### obsolete/ServiceParameterView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/### obsolete/ServiceParameterView.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/### obsolete/ServiceParameterView.cs	(revision 11519)
@@ -112,6 +112,6 @@
         typeSelectorDialog = new TypeSelectorDialog();
         typeSelectorDialog.Caption = "Select Value";
-        typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
       }
+      typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
       if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.Designer.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.Designer.cs	(revision 11519)
@@ -34,4 +34,5 @@
     /// </summary>
     private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmNodeView));
       this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
       this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
@@ -42,4 +43,6 @@
       this.clearAlgorithmButton = new System.Windows.Forms.Button();
       this.setAlgorithmButton = new System.Windows.Forms.Button();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -47,4 +50,5 @@
       this.algorithmTabPage.SuspendLayout();
       this.algorithmPanel.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -56,6 +60,6 @@
       // portCollectionView
       // 
-      this.portCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
+      this.portCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
             | System.Windows.Forms.AnchorStyles.Right)));
       this.portCollectionView.Caption = "PortCollection View";
@@ -70,9 +74,11 @@
       // tabControl
       // 
-      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
+      this.tabControl.AllowDrop = true;
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
             | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.portsTabPage);
       this.tabControl.Controls.Add(this.algorithmTabPage);
+      this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Location = new System.Drawing.Point(0, 26);
       this.tabControl.Name = "tabControl";
@@ -108,6 +114,6 @@
       // 
       this.algorithmPanel.AllowDrop = true;
-      this.algorithmPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
+      this.algorithmPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
             | System.Windows.Forms.AnchorStyles.Right)));
       this.algorithmPanel.Controls.Add(this.algorithmViewHost);
@@ -153,4 +159,27 @@
       this.setAlgorithmButton.UseVisualStyleBackColor = true;
       this.setAlgorithmButton.Click += new System.EventHandler(this.setAlgorithmButton_Click);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionView);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Size = new System.Drawing.Size(637, 465);
+      this.runsTabPage.TabIndex = 2;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runCollectionView
+      // 
+      this.runCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.runCollectionView.Caption = "RunCollection View";
+      this.runCollectionView.Content = null;
+      this.runCollectionView.Location = new System.Drawing.Point(3, 3);
+      this.runCollectionView.Name = "runCollectionView";
+      this.runCollectionView.ReadOnly = false;
+      this.runCollectionView.Size = new System.Drawing.Size(631, 459);
+      this.runCollectionView.TabIndex = 0;
       // 
       // AlgorithmNodeView
@@ -168,4 +197,5 @@
       this.algorithmTabPage.ResumeLayout(false);
       this.algorithmPanel.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -183,4 +213,6 @@
     protected System.Windows.Forms.TabPage algorithmTabPage;
     protected MainForm.WindowsForms.ViewHost algorithmViewHost;
+    protected System.Windows.Forms.TabPage runsTabPage;
+    protected Optimization.Views.RunCollectionView runCollectionView;
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmNodeView.cs	(revision 11519)
@@ -64,8 +64,10 @@
         portCollectionView.Content = null;
         algorithmViewHost.Content = null;
+        runCollectionView.Content = null;
       } else {
         portCollectionView.Content = Content.Ports;
         algorithmViewHost.ViewType = null;
         algorithmViewHost.Content = Content.Algorithm;
+        runCollectionView.Content = Content.Runs;
       }
     }
@@ -77,4 +79,5 @@
       clearAlgorithmButton.Enabled = Content != null && Content.Algorithm != null && !ReadOnly;
       algorithmPanel.Enabled = Content != null;
+      runCollectionView.Enabled = Content != null && !ReadOnly;
     }
 
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmServiceNodeView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmServiceNodeView.Designer.cs	(revision 11518)
+++ 	(revision )
@@ -1,220 +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
-
-namespace HeuristicLab.Optimization.Networks.Views {
-  partial class AlgorithmServiceNodeView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AlgorithmServiceNodeView));
-      this.portCollectionView = new HeuristicLab.Optimization.Networks.Views.PortCollectionView();
-      this.tabControl = new HeuristicLab.MainForm.WindowsForms.DragOverTabControl();
-      this.portsTabPage = new System.Windows.Forms.TabPage();
-      this.templateTabPage = new System.Windows.Forms.TabPage();
-      this.templatePanel = new System.Windows.Forms.Panel();
-      this.templateViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
-      this.clearTemplateButton = new System.Windows.Forms.Button();
-      this.setTemplateButton = new System.Windows.Forms.Button();
-      this.runsTabPage = new System.Windows.Forms.TabPage();
-      this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
-      this.tabControl.SuspendLayout();
-      this.portsTabPage.SuspendLayout();
-      this.templateTabPage.SuspendLayout();
-      this.templatePanel.SuspendLayout();
-      this.runsTabPage.SuspendLayout();
-      this.SuspendLayout();
-      // 
-      // nameTextBox
-      // 
-      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
-      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
-      // 
-      // portCollectionView
-      // 
-      this.portCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.portCollectionView.Caption = "PortCollection View";
-      this.portCollectionView.Content = null;
-      this.portCollectionView.Location = new System.Drawing.Point(6, 6);
-      this.portCollectionView.Name = "portCollectionView";
-      this.portCollectionView.ReadOnly = false;
-      this.portCollectionView.ShowDetails = true;
-      this.portCollectionView.Size = new System.Drawing.Size(625, 453);
-      this.portCollectionView.TabIndex = 0;
-      // 
-      // tabControl
-      // 
-      this.tabControl.AllowDrop = true;
-      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.tabControl.Controls.Add(this.portsTabPage);
-      this.tabControl.Controls.Add(this.templateTabPage);
-      this.tabControl.Controls.Add(this.runsTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 26);
-      this.tabControl.Name = "tabControl";
-      this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(645, 491);
-      this.tabControl.TabIndex = 3;
-      // 
-      // portsTabPage
-      // 
-      this.portsTabPage.Controls.Add(this.portCollectionView);
-      this.portsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.portsTabPage.Name = "portsTabPage";
-      this.portsTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.portsTabPage.Size = new System.Drawing.Size(637, 465);
-      this.portsTabPage.TabIndex = 0;
-      this.portsTabPage.Text = "Ports";
-      this.portsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // templateTabPage
-      // 
-      this.templateTabPage.Controls.Add(this.templatePanel);
-      this.templateTabPage.Controls.Add(this.clearTemplateButton);
-      this.templateTabPage.Controls.Add(this.setTemplateButton);
-      this.templateTabPage.Location = new System.Drawing.Point(4, 22);
-      this.templateTabPage.Name = "templateTabPage";
-      this.templateTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.templateTabPage.Size = new System.Drawing.Size(637, 465);
-      this.templateTabPage.TabIndex = 1;
-      this.templateTabPage.Text = "Algorithm Template";
-      this.templateTabPage.UseVisualStyleBackColor = true;
-      // 
-      // templatePanel
-      // 
-      this.templatePanel.AllowDrop = true;
-      this.templatePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.templatePanel.Controls.Add(this.templateViewHost);
-      this.templatePanel.Location = new System.Drawing.Point(6, 36);
-      this.templatePanel.Name = "templatePanel";
-      this.templatePanel.Size = new System.Drawing.Size(625, 423);
-      this.templatePanel.TabIndex = 2;
-      this.templatePanel.DragDrop += new System.Windows.Forms.DragEventHandler(this.templatePanel_DragDrop);
-      this.templatePanel.DragEnter += new System.Windows.Forms.DragEventHandler(this.templatePanel_DragEnterOver);
-      this.templatePanel.DragOver += new System.Windows.Forms.DragEventHandler(this.templatePanel_DragEnterOver);
-      // 
-      // templateViewHost
-      // 
-      this.templateViewHost.Caption = "View";
-      this.templateViewHost.Content = null;
-      this.templateViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.templateViewHost.Enabled = false;
-      this.templateViewHost.Location = new System.Drawing.Point(0, 0);
-      this.templateViewHost.Name = "templateViewHost";
-      this.templateViewHost.ReadOnly = false;
-      this.templateViewHost.Size = new System.Drawing.Size(625, 423);
-      this.templateViewHost.TabIndex = 0;
-      this.templateViewHost.ViewsLabelVisible = true;
-      this.templateViewHost.ViewType = null;
-      // 
-      // clearTemplateButton
-      // 
-      this.clearTemplateButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
-      this.clearTemplateButton.Location = new System.Drawing.Point(36, 6);
-      this.clearTemplateButton.Name = "clearTemplateButton";
-      this.clearTemplateButton.Size = new System.Drawing.Size(24, 24);
-      this.clearTemplateButton.TabIndex = 1;
-      this.clearTemplateButton.UseVisualStyleBackColor = true;
-      this.clearTemplateButton.Click += new System.EventHandler(this.clearTemplateButton_Click);
-      // 
-      // setTemplateButton
-      // 
-      this.setTemplateButton.Image =HeuristicLab.Common.Resources.VSImageLibrary.Edit;
-      this.setTemplateButton.Location = new System.Drawing.Point(6, 6);
-      this.setTemplateButton.Name = "setTemplateButton";
-      this.setTemplateButton.Size = new System.Drawing.Size(24, 24);
-      this.setTemplateButton.TabIndex = 0;
-      this.setTemplateButton.UseVisualStyleBackColor = true;
-      this.setTemplateButton.Click += new System.EventHandler(this.setTemplateButton_Click);
-      // 
-      // runsTabPage
-      // 
-      this.runsTabPage.Controls.Add(this.runCollectionView);
-      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
-      this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Size = new System.Drawing.Size(637, 465);
-      this.runsTabPage.TabIndex = 2;
-      this.runsTabPage.Text = "Runs";
-      this.runsTabPage.UseVisualStyleBackColor = true;
-      // 
-      // runCollectionView
-      // 
-      this.runCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
-            | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.runCollectionView.Caption = "RunCollection View";
-      this.runCollectionView.Content = null;
-      this.runCollectionView.Location = new System.Drawing.Point(3, 3);
-      this.runCollectionView.Name = "runCollectionView";
-      this.runCollectionView.ReadOnly = false;
-      this.runCollectionView.Size = new System.Drawing.Size(631, 459);
-      this.runCollectionView.TabIndex = 0;
-      // 
-      // AlgorithmServiceNodeView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.tabControl);
-      this.Name = "AlgorithmServiceNodeView";
-      this.Controls.SetChildIndex(this.nameLabel, 0);
-      this.Controls.SetChildIndex(this.nameTextBox, 0);
-      this.Controls.SetChildIndex(this.infoLabel, 0);
-      this.Controls.SetChildIndex(this.tabControl, 0);
-      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
-      this.tabControl.ResumeLayout(false);
-      this.portsTabPage.ResumeLayout(false);
-      this.templateTabPage.ResumeLayout(false);
-      this.templatePanel.ResumeLayout(false);
-      this.runsTabPage.ResumeLayout(false);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    protected PortCollectionView portCollectionView;
-    protected System.Windows.Forms.TabPage portsTabPage;
-    protected System.Windows.Forms.Button setTemplateButton;
-    protected System.Windows.Forms.Button clearTemplateButton;
-    protected System.Windows.Forms.Panel templatePanel;
-    protected HeuristicLab.MainForm.WindowsForms.DragOverTabControl tabControl;
-    protected System.Windows.Forms.TabPage templateTabPage;
-    protected MainForm.WindowsForms.ViewHost templateViewHost;
-    protected System.Windows.Forms.TabPage runsTabPage;
-    protected Optimization.Views.RunCollectionView runCollectionView;
-
-
-  }
-}
Index: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmServiceNodeView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/AlgorithmServiceNodeView.cs	(revision 11518)
+++ 	(revision )
@@ -1,130 +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.Core.Views;
-using HeuristicLab.MainForm;
-using HeuristicLab.PluginInfrastructure;
-using System;
-using System.Windows.Forms;
-
-namespace HeuristicLab.Optimization.Networks.Views {
-  [View("AlgorithmServiceNode View")]
-  [Content(typeof(AlgorithmServiceNode), true)]
-  [Content(typeof(IAlgorithmServiceNode), false)]
-  public partial class AlgorithmServiceNodeView : EntityView {
-    protected TypeSelectorDialog typeSelectorDialog;
-
-    public new IAlgorithmServiceNode Content {
-      get { return (IAlgorithmServiceNode)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public AlgorithmServiceNodeView() {
-      InitializeComponent();
-    }
-
-    protected override void Dispose(bool disposing) {
-      if (disposing) {
-        if (typeSelectorDialog != null) typeSelectorDialog.Dispose();
-        if (components != null) components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    protected override void DeregisterContentEvents() {
-      Content.TemplateChanged -= Content_TemplateChanged;
-      base.DeregisterContentEvents();
-    }
-    protected override void RegisterContentEvents() {
-      base.RegisterContentEvents();
-      Content.TemplateChanged += Content_TemplateChanged;
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        portCollectionView.Content = null;
-        templateViewHost.Content = null;
-        runCollectionView.Content = null;
-      } else {
-        portCollectionView.Content = Content.Ports;
-        templateViewHost.ViewType = null;
-        templateViewHost.Content = Content.Template;
-        runCollectionView.Content = Content.Runs;
-      }
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-      portCollectionView.Enabled = Content != null && !ReadOnly;
-      setTemplateButton.Enabled = Content != null && !ReadOnly;
-      clearTemplateButton.Enabled = Content != null && Content.Template != null && !ReadOnly;
-      templatePanel.Enabled = Content != null;
-      runCollectionView.Enabled = Content != null && !ReadOnly;
-    }
-
-    protected virtual void Content_TemplateChanged(object sender, System.EventArgs e) {
-      if (InvokeRequired)
-        Invoke(new EventHandler(Content_TemplateChanged), sender, e);
-      else {
-        clearTemplateButton.Enabled = Content.Template != null && !ReadOnly;
-        templateViewHost.ViewType = null;
-        templateViewHost.Content = Content.Template;
-      }
-    }
-
-    protected virtual void setTemplateButton_Click(object sender, EventArgs e) {
-      if (typeSelectorDialog == null) {
-        typeSelectorDialog = new TypeSelectorDialog();
-        typeSelectorDialog.Caption = "Select Algorithm Template";
-        typeSelectorDialog.TypeSelector.Configure(typeof(IAlgorithm), false, true);
-      }
-      if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
-        try {
-          Content.Template = (IAlgorithm)typeSelectorDialog.TypeSelector.CreateInstanceOfSelectedType();
-        }
-        catch (Exception ex) {
-          ErrorHandling.ShowErrorDialog(this, ex);
-        }
-      }
-    }
-    protected virtual void clearTemplateButton_Click(object sender, EventArgs e) {
-      Content.Template = null;
-    }
-    protected virtual void templatePanel_DragEnterOver(object sender, DragEventArgs e) {
-      e.Effect = DragDropEffects.None;
-      if (!ReadOnly && (e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) is IAlgorithm)) {
-        if ((e.KeyState & 32) == 32) e.Effect = DragDropEffects.Link;  // ALT key
-        else if ((e.KeyState & 4) == 4) e.Effect = DragDropEffects.Move;  // SHIFT key
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Copy)) e.Effect = DragDropEffects.Copy;
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Move)) e.Effect = DragDropEffects.Move;
-        else if (e.AllowedEffect.HasFlag(DragDropEffects.Link)) e.Effect = DragDropEffects.Link;
-      }
-    }
-    protected virtual void templatePanel_DragDrop(object sender, DragEventArgs e) {
-      if (e.Effect != DragDropEffects.None) {
-        IAlgorithm alg = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IAlgorithm;
-        if (e.Effect.HasFlag(DragDropEffects.Copy)) alg = (IAlgorithm)alg.Clone();
-        Content.Template = alg;
-      }
-    }
-  }
-}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.Designer.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.Designer.cs	(revision 11519)
@@ -43,4 +43,5 @@
       this.portParameterCollectionView = new HeuristicLab.Optimization.Networks.Views.PortParameterCollectionView();
       this.messageCollectionView = new HeuristicLab.Optimization.Networks.Views.MessageCollectionView();
+      this.logMessagesCheckBox = new System.Windows.Forms.CheckBox();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.connectedPortGroupBox.SuspendLayout();
@@ -79,4 +80,5 @@
       this.setConnectedPortButton.Size = new System.Drawing.Size(24, 24);
       this.setConnectedPortButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.setConnectedPortButton, "Set Connected Port");
       this.setConnectedPortButton.UseVisualStyleBackColor = true;
       this.setConnectedPortButton.Click += new System.EventHandler(this.setConnectedPortButton_Click);
@@ -89,4 +91,5 @@
       this.clearConnectedPortButton.Size = new System.Drawing.Size(24, 24);
       this.clearConnectedPortButton.TabIndex = 1;
+      this.toolTip.SetToolTip(this.clearConnectedPortButton, "Remove Connected Port");
       this.clearConnectedPortButton.UseVisualStyleBackColor = true;
       this.clearConnectedPortButton.Click += new System.EventHandler(this.clearConnectedPortButton_Click);
@@ -146,4 +149,5 @@
       // splitContainer.Panel2
       // 
+      this.splitContainer.Panel2.Controls.Add(this.logMessagesCheckBox);
       this.splitContainer.Panel2.Controls.Add(this.messageCollectionView);
       this.splitContainer.Size = new System.Drawing.Size(645, 435);
@@ -174,4 +178,15 @@
       this.messageCollectionView.Size = new System.Drawing.Size(645, 213);
       this.messageCollectionView.TabIndex = 0;
+      // 
+      // logMessagesCheckBox
+      // 
+      this.logMessagesCheckBox.AutoSize = true;
+      this.logMessagesCheckBox.Location = new System.Drawing.Point(156, 24);
+      this.logMessagesCheckBox.Name = "logMessagesCheckBox";
+      this.logMessagesCheckBox.Size = new System.Drawing.Size(95, 17);
+      this.logMessagesCheckBox.TabIndex = 1;
+      this.logMessagesCheckBox.Text = "&Log Messages";
+      this.logMessagesCheckBox.UseVisualStyleBackColor = true;
+      this.logMessagesCheckBox.CheckedChanged += new System.EventHandler(this.logMessagesCheckBox_CheckedChanged);
       // 
       // GenericPortView
@@ -194,4 +209,5 @@
       this.splitContainer.Panel1.ResumeLayout(false);
       this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.Panel2.PerformLayout();
       ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
       this.splitContainer.ResumeLayout(false);
@@ -212,4 +228,5 @@
     protected PortParameterCollectionView portParameterCollectionView;
     protected MessageCollectionView messageCollectionView;
+    protected System.Windows.Forms.CheckBox logMessagesCheckBox;
 
 
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/GenericPortView.cs	(revision 11519)
@@ -52,12 +52,14 @@
 
     protected override void DeregisterContentEvents() {
-      Content.InterfaceChanged -= Content_InterfaceChanged;
       Content.ConnectedPortChanged -= Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged -= Content_PortConnectionValidChanged;
+      Content.LogMessagesChanged -= Content_LogMessagesChanged;
       base.DeregisterContentEvents();
     }
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.InterfaceChanged += Content_InterfaceChanged;
       Content.ConnectedPortChanged += Content_ConnectedPortChanged;
+      Content.PortConnectionValidChanged += Content_PortConnectionValidChanged;
+      Content.LogMessagesChanged += Content_LogMessagesChanged;
     }
 
@@ -66,4 +68,5 @@
       connectedPortView.Content = Content == null ? null : Content.ConnectedPort;
       portParameterCollectionView.Content = Content == null ? null : Content.Parameters;
+      logMessagesCheckBox.Checked = Content == null ? false : Content.LogMessages;
       messageCollectionView.Content = Content == null ? null : Content.Messages;
       errorProvider.SetError(connectedPortView, ((Content == null) || Content.PortConnectionValid) ? string.Empty : "Port connection is not valid");
@@ -78,4 +81,5 @@
       portParameterCollectionView.Enabled = Content != null && !ReadOnly;
       cloneConnectedPortParametersButton.Enabled = Content != null && Content.ConnectedPort != null && !ReadOnly;
+      logMessagesCheckBox.Enabled = Content != null && !ReadOnly;
       messageCollectionView.Enabled = Content != null && !ReadOnly;
     }
@@ -90,9 +94,16 @@
       }
     }
-    protected virtual void Content_InterfaceChanged(object sender, EventArgs e) {
+    protected virtual void Content_PortConnectionValidChanged(object sender, EventArgs e) {
       if (InvokeRequired)
-        Invoke(new EventHandler(Content_InterfaceChanged), sender, e);
+        Invoke(new EventHandler(Content_PortConnectionValidChanged), sender, e);
       else {
         errorProvider.SetError(connectedPortView, Content.PortConnectionValid ? string.Empty : "Port connection is not valid");
+      }
+    }
+    protected virtual void Content_LogMessagesChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_LogMessagesChanged), sender, e);
+      else {
+        logMessagesCheckBox.Checked = Content.LogMessages;
       }
     }
@@ -148,4 +159,7 @@
       Content.CloneConnectedPortParameters();
     }
+    protected virtual void logMessagesCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.LogMessages = logMessagesCheckBox.Checked;
+    }
   }
 }
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HeuristicLab.Optimization.Networks.Views-3.3.csproj	(revision 11519)
@@ -151,10 +151,4 @@
       <DependentUpon>ClientNodeView.cs</DependentUpon>
     </Compile>
-    <Compile Include="AlgorithmServiceNodeView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="AlgorithmServiceNodeView.Designer.cs">
-      <DependentUpon>AlgorithmServiceNodeView.cs</DependentUpon>
-    </Compile>
     <Compile Include="GenericPortView.cs">
       <SubType>UserControl</SubType>
@@ -180,4 +174,10 @@
     <Compile Include="GenericNodeView.Designer.cs">
       <DependentUpon>GenericNodeView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HookOperatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HookOperatorView.Designer.cs">
+      <DependentUpon>HookOperatorView.cs</DependentUpon>
     </Compile>
     <Compile Include="ParameterizedPortView.cs">
@@ -306,4 +306,12 @@
       <Name>HeuristicLab.MainForm-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators.Views\3.3\HeuristicLab.Operators.Views-3.3.csproj">
+      <Project>{c49cb749-8b24-4628-8003-e86475749410}</Project>
+      <Name>HeuristicLab.Operators.Views-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.Networks\3.3\HeuristicLab.Optimization.Networks-3.3.csproj">
       <Project>{7cf51332-0e37-447c-8017-82a258c59ef2}</Project>
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.Designer.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.Designer.cs	(revision 11519)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.Designer.cs	(revision 11519)
@@ -0,0 +1,138 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  partial class HookOperatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.portGroupBox = new System.Windows.Forms.GroupBox();
+      this.clearPortButton = new System.Windows.Forms.Button();
+      this.portView = new HeuristicLab.Optimization.Networks.Views.PortView();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.portGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // breakpointCheckBox
+      // 
+      this.toolTip.SetToolTip(this.breakpointCheckBox, "Check if an engine should stop execution each time after this operator has been p" +
+        "rocessed.");
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 101);
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 252);
+      this.parameterCollectionView.TabIndex = 6;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // portGroupBox
+      // 
+      this.portGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.portGroupBox.Controls.Add(this.clearPortButton);
+      this.portGroupBox.Controls.Add(this.portView);
+      this.portGroupBox.Location = new System.Drawing.Point(0, 46);
+      this.portGroupBox.Name = "portGroupBox";
+      this.portGroupBox.Size = new System.Drawing.Size(490, 49);
+      this.portGroupBox.TabIndex = 5;
+      this.portGroupBox.TabStop = false;
+      this.portGroupBox.Text = "Port:";
+      // 
+      // clearPortButton
+      // 
+      this.clearPortButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Remove;
+      this.clearPortButton.Location = new System.Drawing.Point(6, 19);
+      this.clearPortButton.Name = "clearPortButton";
+      this.clearPortButton.Size = new System.Drawing.Size(24, 24);
+      this.clearPortButton.TabIndex = 0;
+      this.clearPortButton.UseVisualStyleBackColor = true;
+      this.clearPortButton.Click += new System.EventHandler(this.clearPortButton_Click);
+      // 
+      // portView
+      // 
+      this.portView.AllowDrop = true;
+      this.portView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.portView.Caption = "Port View";
+      this.portView.Content = null;
+      this.portView.Location = new System.Drawing.Point(36, 21);
+      this.portView.Name = "portView";
+      this.portView.ReadOnly = true;
+      this.portView.Size = new System.Drawing.Size(429, 24);
+      this.portView.TabIndex = 1;
+      this.portView.DragDrop += new System.Windows.Forms.DragEventHandler(this.portView_DragDrop);
+      this.portView.DragEnter += new System.Windows.Forms.DragEventHandler(this.portView_DragEnterOver);
+      this.portView.DragOver += new System.Windows.Forms.DragEventHandler(this.portView_DragEnterOver);
+      // 
+      // HookOperatorView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.portGroupBox);
+      this.Name = "HookOperatorView";
+      this.Controls.SetChildIndex(this.breakpointCheckBox, 0);
+      this.Controls.SetChildIndex(this.breakpointLabel, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      this.Controls.SetChildIndex(this.portGroupBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.portGroupBox.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.GroupBox portGroupBox;
+    protected PortView portView;
+    protected System.Windows.Forms.Button clearPortButton;
+
+
+
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.cs	(revision 11519)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/HookOperatorView.cs	(revision 11519)
@@ -0,0 +1,91 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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.MainForm;
+using HeuristicLab.Operators.Views;
+using System;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Optimization.Networks.Views {
+  [View("HookOperator View")]
+  [Content(typeof(HookOperator), true)]
+  [Content(typeof(IHookOperator), false)]
+  public partial class HookOperatorView : OperatorView {
+    public new IHookOperator Content {
+      get { return (IHookOperator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HookOperatorView() {
+      InitializeComponent();
+      errorProvider.SetIconAlignment(portView, ErrorIconAlignment.MiddleRight);
+      errorProvider.SetIconPadding(portView, 2);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PortChanged -= Content_PortChanged;
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PortChanged += Content_PortChanged;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      portView.Content = Content == null ? null : Content.Port;
+      parameterCollectionView.Content = Content == null ? null : Content.Parameters;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      portGroupBox.Enabled = Content != null && !ReadOnly && !Locked;
+      clearPortButton.Enabled = Content != null && Content.Port != null && !ReadOnly && !Locked;
+    }
+
+    protected virtual void Content_PortChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_PortChanged), sender, e);
+      else {
+        clearPortButton.Enabled = Content.Port != null && !ReadOnly && !Locked;
+        portView.Content = Content.Port;
+      }
+    }
+
+    protected virtual void clearPortButton_Click(object sender, EventArgs e) {
+      Content.Port = null;
+    }
+    protected virtual void portView_DragEnterOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IGenericPort;
+
+      if (!ReadOnly && (data != null)) {
+        e.Effect = DragDropEffects.Link;
+      }
+    }
+    protected virtual void portView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        var port = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat) as IGenericPort;
+        Content.Port = port;
+      }
+    }
+  }
+}
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Plugin.cs.frame	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/Plugin.cs.frame	(revision 11519)
@@ -36,4 +36,6 @@
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Operators.Views", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
   [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
Index: /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortParameterView.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortParameterView.cs	(revision 11518)
+++ /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks.Views/3.3/PortParameterView.cs	(revision 11519)
@@ -119,6 +119,6 @@
         typeSelectorDialog = new TypeSelectorDialog();
         typeSelectorDialog.Caption = "Select Default Value";
-        typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
       }
+      typeSelectorDialog.TypeSelector.Configure(Content.DataType, false, true);
       if (typeSelectorDialog.ShowDialog(this) == DialogResult.OK) {
         try {
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 11518)
+++ /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 11518)
+++ /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: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmServiceNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/AlgorithmServiceNode.cs	(revision 11518)
+++ 	(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 11518)
+++ /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: anches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmServiceNode.cs
===================================================================
--- /branches/OptimizationNetworks/HeuristicLab.Optimization.Networks/3.3/Nodes/IAlgorithmServiceNode.cs	(revision 11518)
+++ 	(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 11518)
+++ /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 11518)
+++ /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 11518)
+++ /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 11518)
+++ /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 11518)
+++ /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; }
     }
 
