Index: branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 11576)
+++ branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj	(revision 11577)
@@ -18,5 +18,5 @@
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <TargetFrameworkProfile>
     </TargetFrameworkProfile>
@@ -48,4 +48,5 @@
     </DocumentationFile>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -60,4 +61,5 @@
     <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
@@ -69,4 +71,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
@@ -80,4 +83,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
@@ -89,4 +93,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
@@ -100,4 +105,5 @@
     <ErrorReport>prompt</ErrorReport>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
@@ -113,4 +119,6 @@
     <Compile Include="CheckedMultiOperator.cs" />
     <Compile Include="CombinedOperator.cs" />
+    <Compile Include="HookOperator.cs" />
+    <Compile Include="IHookOperator.cs" />
     <Compile Include="Operator.InstrumentedOperatorWrapper.cs" />
     <None Include="Plugin.cs.frame" />
Index: branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HookOperator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HookOperator.cs	(revision 11577)
+++ branches/OptimizationNetworks/HeuristicLab.Operators/3.3/HookOperator.cs	(revision 11577)
@@ -0,0 +1,93 @@
+#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.Core.Networks;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Linq;
+
+namespace HeuristicLab.Operators {
+  [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 IMessagePort port;
+    public IMessagePort 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) {
+      port = cloner.Clone(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;
+          } else if (output.DefaultValue == null) {
+            throw new InvalidOperationException(string.Format("Cannot determine value for output parameter \"{0}\".", output.Name));
+          }
+        }
+
+        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];
+          } else {
+            throw new InvalidOperationException(string.Format("Cannot find operator parameter for input parameter \"{0}\".", input.Name));
+          }
+        }
+      }
+      return null;
+    }
+  }
+}
Index: branches/OptimizationNetworks/HeuristicLab.Operators/3.3/IHookOperator.cs
===================================================================
--- branches/OptimizationNetworks/HeuristicLab.Operators/3.3/IHookOperator.cs	(revision 11577)
+++ branches/OptimizationNetworks/HeuristicLab.Operators/3.3/IHookOperator.cs	(revision 11577)
@@ -0,0 +1,33 @@
+#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 HeuristicLab.Core.Networks;
+using System;
+
+namespace HeuristicLab.Operators {
+  public interface IHookOperator : IOperator {
+    new ParameterCollection Parameters { get; }
+    IMessagePort Port { get; set; }
+
+    event EventHandler PortChanged;
+  }
+}
