Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs	(revision 3869)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs	(revision 3870)
@@ -33,7 +33,5 @@
     public override bool CanChangeDescription { get { return false; } }
 
-    private CodedInputStream inputStream;
     private Stream input;
-    private CodedOutputStream outputStream;
     private Stream output;
 
@@ -42,8 +40,6 @@
       : base() {
       if (!input.CanRead) throw new ArgumentException("Input stream cannot be read", "input");
-      this.inputStream = CodedInputStream.CreateInstance(input);
       this.input = input;
       if (!output.CanWrite) throw new ArgumentException("Output stream cannot be written", "output");
-      this.outputStream = CodedOutputStream.CreateInstance(output);
       this.output = output;
     }
@@ -51,23 +47,24 @@
     #region Overrides
     public override QualityMessage Evaluate(SolutionMessage solution) {
-      solution.WriteTo(outputStream);
-      outputStream.Flush();
-      output.Flush();
-      QualityMessage message = QualityMessage.ParseFrom(inputStream);
+      Send(solution);
+      QualityMessage message = QualityMessage.ParseDelimitedFrom(input);
       return message;
     }
 
     public override void EvaluateAsync(SolutionMessage solution, Action<QualityMessage> callback) {
-      solution.WriteTo(outputStream);
-      outputStream.Flush();
-      output.Flush();
+      Send(solution);
       System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveAsync), callback);
+    }
+
+    private void Send(SolutionMessage solution) {
+      lock (output) {
+        solution.WriteDelimitedTo(output);
+        output.Flush();
+      }
     }
 
     public override void Stop() {
       base.Stop();
-      inputStream = null;
       input.Close();
-      outputStream = null;
       output.Close();
     }
@@ -76,6 +73,6 @@
     private void ReceiveAsync(object callback) {
       QualityMessage message;
-      lock (inputStream) { // only one thread can read from the stream at one time
-        message = QualityMessage.ParseFrom(inputStream);
+      lock (input) { // only one thread can read from the stream at one time
+        message = QualityMessage.ParseDelimitedFrom(input);
       }
       ((Action<QualityMessage>)callback).Invoke(message);
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationCrossover.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationCrossover.cs	(revision 3870)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationCrossover.cs	(revision 3870)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("ExternalEvaluationCrossover", "A crossover that can be customized with operators which it will execute one after another.")]
+  [StorableClass]
+  public class ExternalEvaluationCrossover : CheckedMultiOperator<IOperator>, ICrossover {
+    public override IOperation Apply() {
+      OperationCollection result = new OperationCollection();
+      foreach (IOperator op in Operators.CheckedItems.OrderBy(x => x.Index).Select(x => x.Value)) {
+        result.Add(ExecutionContext.CreateOperation(op));
+      }
+      result.Add(base.Apply());
+      return result;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationManipulator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationManipulator.cs	(revision 3870)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationManipulator.cs	(revision 3870)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("ExternalEvaluationManipulator", "A manipulator that can be customized with operators which it will execute one after another.")]
+  [StorableClass]
+  public class ExternalEvaluationManipulator : CheckedMultiOperator<IOperator>, IManipulator {
+    public override IOperation Apply() {
+      OperationCollection result = new OperationCollection();
+      foreach (IOperator op in Operators.CheckedItems.OrderBy(x => x.Index).Select(x => x.Value)) {
+        result.Add(ExecutionContext.CreateOperation(op));
+      }
+      result.Add(base.Apply());
+      return result;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/HeuristicLab.Problems.ExternalEvaluation-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/HeuristicLab.Problems.ExternalEvaluation-3.3.csproj	(revision 3869)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/HeuristicLab.Problems.ExternalEvaluation-3.3.csproj	(revision 3870)
@@ -84,7 +84,9 @@
     <Compile Include="Analyzers\BestExternalEvaluationSolutionAnalyzer.cs" />
     <None Include="HeuristicLabProblemsExternalEvaluationPlugin.cs.frame" />
+    <Compile Include="ExternalEvaluationManipulator.cs" />
     <Compile Include="Drivers\ExternalEvaluationDriver.cs" />
     <Compile Include="Drivers\ExternalEvaluationProcessDriver.cs" />
     <Compile Include="Drivers\ExternalEvaluationStreamDriver.cs" />
+    <Compile Include="ExternalEvaluationCrossover.cs" />
     <Compile Include="ExternalEvaluationProblem.cs" />
     <Compile Include="ExternalEvaluationSolutionCreator.cs" />
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilding.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilding.cs	(revision 3869)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/SolutionMessageBuilding.cs	(revision 3870)
@@ -87,5 +87,5 @@
       tmp.SetName(name);
       for (int i = 0; i < valueTypeArray.Length; i++)
-        tmp.SetData(i, valueTypeArray[i]);
+        tmp.AddData(valueTypeArray[i]);
       builder.AddIntegerArrayVars(tmp.Build());
     }
@@ -94,5 +94,5 @@
       tmp.SetName(name);
       for (int i = 0; i < valueTypeArray.Length; i++)
-        tmp.SetData(i, valueTypeArray[i]);
+        tmp.AddData(valueTypeArray[i]);
       builder.AddDoubleArrayVars(tmp.Build());
     }
@@ -101,5 +101,5 @@
       tmp.SetName(name);
       for (int i = 0; i < valueTypeArray.Length; i++)
-        tmp.SetData(i, valueTypeArray[i]);
+        tmp.AddData(valueTypeArray[i]);
       builder.AddBoolArrayVars(tmp.Build());
     }
