Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/CachedExternalEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/CachedExternalEvaluator.cs	(revision 6188)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/CachedExternalEvaluator.cs	(revision 6189)
@@ -44,7 +44,4 @@
       set { QualityParameter.ActualValue = value; }
     }
-    protected IEvaluationServiceClient Client {
-      get { return ClientParameter.ActualValue; }
-    }
     protected EvaluationCache Cache {
       get { return CacheParameter.ActualValue; }
@@ -71,5 +68,5 @@
 
       if (Quality == null) Quality = new DoubleValue(0);
-      Quality.Value = Cache.GetValue(BuildSolutionMessage(), m => Client.Evaluate(m).Quality);
+      Quality.Value = Cache.GetValue(BuildSolutionMessage(), m => EvaluateOnNextAvailableClient(m).Quality);
       if (Successor != null)
         return ExecutionContext.CreateOperation(Successor);
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 6188)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 6189)
@@ -53,6 +53,6 @@
 
     #region Parameters
-    public IValueParameter<IEvaluationServiceClient> ClientParameter {
-      get { return (IValueParameter<IEvaluationServiceClient>)Parameters["Client"]; }
+    public IValueParameter<CheckedItemCollection<IEvaluationServiceClient>> ClientsParameter {
+      get { return (IValueParameter<CheckedItemCollection<IEvaluationServiceClient>>)Parameters["Clients"]; }
     }
     public IValueParameter<IExternalEvaluationProblemEvaluator> EvaluatorParameter {
@@ -144,5 +144,5 @@
       UserDefinedSolutionCreator solutionCreator = new UserDefinedSolutionCreator();
 
-      Parameters.Add(new ValueParameter<IEvaluationServiceClient>("Client", "The client that is used to communicate with the external application.", new EvaluationServiceClient()));
+      Parameters.Add(new ValueParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "The clients that are used to communicate with the external application.", new CheckedItemCollection<IEvaluationServiceClient>() { new EvaluationServiceClient() }));
       Parameters.Add(new ValueParameter<IExternalEvaluationProblemEvaluator>("Evaluator", "The evaluator that collects the values to exchange.", evaluator));
       Parameters.Add(new ValueParameter<ISolutionCreator>("SolutionCreator", "An operator to create the solution components.", solutionCreator));
@@ -155,4 +155,19 @@
       InitializeOperators();
       AttachEventHandlers();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("Clients")) {
+        Parameters.Add(new ValueParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "The clients that are used to communicate with the external application.", new CheckedItemCollection<IEvaluationServiceClient>() { new EvaluationServiceClient() }));
+        if (Parameters.ContainsKey("Client")) {
+          var client = ((IValueParameter<IEvaluationServiceClient>)Parameters["Client"]).Value;
+          if (client != null)
+            ClientsParameter.Value = new CheckedItemCollection<IEvaluationServiceClient>() { client };
+          Parameters.Remove("Client");
+        }
+      }
+      #endregion
     }
 
@@ -227,5 +242,5 @@
     }
     private void ParameterizeEvaluator() {
-      Evaluator.ClientParameter.ActualName = ClientParameter.Name;
+      Evaluator.ClientsParameter.ActualName = ClientsParameter.Name;
     }
     private void ParameterizeOperators() {
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs	(revision 6188)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluator.cs	(revision 6189)
@@ -21,4 +21,7 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -33,37 +36,64 @@
   public class ExternalEvaluator : ValuesCollector, IExternalEvaluationProblemEvaluator {
 
+    #region Parameters
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
     }
-    public IValueLookupParameter<IEvaluationServiceClient> ClientParameter {
-      get { return (IValueLookupParameter<IEvaluationServiceClient>)Parameters["Client"]; }
+    public IValueLookupParameter<CheckedItemCollection<IEvaluationServiceClient>> ClientsParameter {
+      get { return (ValueLookupParameter<CheckedItemCollection<IEvaluationServiceClient>>)Parameters["Clients"]; }
     }
-
     public IValueParameter<SolutionMessageBuilder> MessageBuilderParameter {
       get { return (IValueParameter<SolutionMessageBuilder>)Parameters["MessageBuilder"]; }
     }
+    #endregion
 
+    #region Parameter Values
     protected SolutionMessageBuilder MessageBuilder {
       get { return MessageBuilderParameter.Value; }
     }
+    protected CheckedItemCollection<IEvaluationServiceClient> Clients {
+      get { return ClientsParameter.ActualValue; }
+    }
+    #endregion
 
+    #region Fields
+    protected HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
+    protected object clientLock = new object();
+    protected AutoResetEvent clientAvailable = new AutoResetEvent(false);
+    #endregion
+
+    #region Construction & Cloning
     [StorableConstructor]
     protected ExternalEvaluator(bool deserializing) : base(deserializing) { }
     protected ExternalEvaluator(ExternalEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public ExternalEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the current solution."));
+      Parameters.Add(new ValueLookupParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "Collection of clients which communicate the the external process. These clients my be contacted in parallel."));
+      Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()));
+    }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ExternalEvaluator(this, cloner);
     }
-    public ExternalEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the current solution."));
-      Parameters.Add(new ValueLookupParameter<IEvaluationServiceClient>("Client", "The client that communicates with the external process."));
-      Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()));
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (!Parameters.ContainsKey("Clients")) {
+        Parameters.Add(new ValueLookupParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "Collection of clients which communicate the the external process. These clients my be contacted in parallel."));
+        if (Parameters.ContainsKey("Client")) {
+          var client = ((IValueLookupParameter<IEvaluationServiceClient>)Parameters["Client"]).Value;
+          if (client != null)
+            ClientsParameter.Value = new CheckedItemCollection<IEvaluationServiceClient>() { client };
+          Parameters.Remove("Client");
+        }
+      }
+      #endregion
     }
+    #endregion
 
     public override IOperation Apply() {
-      SolutionMessage message = BuildSolutionMessage();
 
-      IEvaluationServiceClient client = ClientParameter.ActualValue;
-      QualityMessage answer = client.Evaluate(message);
+      QualityMessage answer = EvaluateOnNextAvailableClient(BuildSolutionMessage());
 
       if (QualityParameter.ActualValue == null)
@@ -74,21 +104,47 @@
     }
 
-    protected virtual SolutionMessage BuildSolutionMessage() {
-      SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
-      protobufBuilder.SolutionId = 0;
-      foreach (IParameter param in CollectedValues) {
-        IItem value = param.ActualValue;
-        if (value != null) {
-          ILookupParameter lookupParam = param as ILookupParameter;
-          string name = lookupParam != null ? lookupParam.TranslatedName : param.Name;
-          try {
-            MessageBuilder.AddToMessage(value, name, protobufBuilder);
-          } catch (ArgumentException ex) {
-            throw new InvalidOperationException("ERROR in " + Name + ": Parameter " + name + " cannot be added to the message.", ex);
+    protected QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
+      IEvaluationServiceClient client = null;
+      lock (clientLock) {
+        client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        while (client == null && Clients.Count > 0) {
+          Monitor.Exit(clientLock);
+          clientAvailable.WaitOne();
+          Monitor.Enter(clientLock);
+          client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        }
+        if (client != null)
+          activeClients.Add(client);
+      }
+      try {
+        return client.Evaluate(message);
+      } finally {
+        lock (clientLock) {
+          activeClients.Remove(client);
+          clientAvailable.Set();
+        }
+      }
+    }
+
+    protected SolutionMessage BuildSolutionMessage() {
+      lock (clientLock) {
+        SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
+        protobufBuilder.SolutionId = 0;
+        foreach (IParameter param in CollectedValues) {
+          IItem value = param.ActualValue;
+          if (value != null) {
+            ILookupParameter lookupParam = param as ILookupParameter;
+            string name = lookupParam != null ? lookupParam.TranslatedName : param.Name;
+            try {
+              MessageBuilder.AddToMessage(value, name, protobufBuilder);
+            } catch (ArgumentException ex) {
+              throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", name), ex);
+            }
           }
         }
+        return protobufBuilder.Build();
       }
-      return protobufBuilder.Build();
     }
+
   }
 }
Index: /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Interfaces/IExternalEvaluationProblemEvaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Interfaces/IExternalEvaluationProblemEvaluator.cs	(revision 6188)
+++ /trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Interfaces/IExternalEvaluationProblemEvaluator.cs	(revision 6189)
@@ -25,5 +25,5 @@
 namespace HeuristicLab.Problems.ExternalEvaluation {
   public interface IExternalEvaluationProblemEvaluator : ISingleObjectiveEvaluator {
-    IValueLookupParameter<IEvaluationServiceClient> ClientParameter { get; }
+    IValueLookupParameter<CheckedItemCollection<IEvaluationServiceClient>> ClientsParameter { get; }
   }
 }
