Index: /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs	(revision 15115)
+++ /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs	(revision 15116)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Core;
 
@@ -27,5 +29,4 @@
     protected IEncoding Encoding { get; private set; }
     protected IScope Scope { get; private set; }
-
     public string Name { get { return Encoding.Name; } }
 
@@ -35,14 +36,22 @@
     }
 
-    public abstract IItem this[string name] { get; set; }
+    public IItem this[string name] {
+      get { return ExtractScopeValue(name, Scope); }
+      set { SetScopeValue(name, Scope, value); }
+    }
+
+    public IEnumerable<KeyValuePair<string, IItem>> Values {
+      get { return Scope.Variables.Select(v => new KeyValuePair<string, IItem>(v.Name, v.Value)); }
+    }
     public abstract TEncoding GetEncoding<TEncoding>() where TEncoding : class, IEncoding;
 
-    public Individual Copy() {
-      return CopyToScope(new Scope());
+    public abstract Individual Copy();
+    internal void CopyToScope(IScope scope) {
+      foreach (var val in Values)
+        SetScopeValue(val.Key, scope, val.Value);
     }
 
-    public abstract Individual CopyToScope(IScope scope);
-
-    protected static IItem ExtractScopeValue(string name, IScope scope) {
+    private static IItem ExtractScopeValue(string name, IScope scope) {
+      if (scope == null) throw new ArgumentNullException("scope");
       if (!scope.Variables.ContainsKey(name)) throw new ArgumentException(string.Format(" {0} cannot be found in the provided scope.", name));
       var value = scope.Variables[name].Value;
@@ -51,6 +60,8 @@
     }
 
-    protected static void SetScopeValue(string name, IScope scope, IItem value) {
+    private static void SetScopeValue(string name, IScope scope, IItem value) {
+      if (scope == null) throw new ArgumentNullException("scope");
       if (value == null) throw new ArgumentNullException("value");
+
       if (!scope.Variables.ContainsKey(name)) scope.Variables.Add(new Variable(name, value));
       else scope.Variables[name].Value = value;
Index: /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs	(revision 15115)
+++ /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs	(revision 15116)
@@ -32,28 +32,12 @@
     }
 
-    private readonly IEnumerable<Individual> individuals;
+    public MultiEncodingIndividual(MultiEncoding encoding, IScope scope)
+      : base(encoding, scope) { }
 
-    public MultiEncodingIndividual(MultiEncoding encoding, IScope scope)
-      : base(encoding, scope) {
-      individuals = encoding.Encodings.Select(e => e.GetIndividual(scope)).ToArray();
+    private MultiEncodingIndividual(MultiEncodingIndividual copy) : base(copy.Encoding, new Scope()) {
+      copy.CopyToScope(Scope);
     }
-
-    private MultiEncodingIndividual(MultiEncoding encoding, IScope scope, IEnumerable<Individual> individuals)
-      : base(encoding, scope) {
-      this.individuals = individuals;
-    }
-
-
-    public override IItem this[string name] {
-      get {
-        var individual = individuals.SingleOrDefault(i => i.Name == name);
-        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
-        return individual[name];
-      }
-      set {
-        var individual = individuals.SingleOrDefault(i => i.Name == name);
-        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
-        individual[name] = value;
-      }
+    public override Individual Copy() {
+      return new MultiEncodingIndividual(this);
     }
 
@@ -62,5 +46,6 @@
       try {
         encoding = (TEncoding)Encoding.Encodings.SingleOrDefault(e => e is TEncoding);
-      } catch (InvalidOperationException) {
+      }
+      catch (InvalidOperationException) {
         throw new InvalidOperationException(string.Format("The individual uses multiple {0} .", typeof(TEncoding).GetPrettyName()));
       }
@@ -68,9 +53,4 @@
       return encoding;
     }
-
-    public override Individual CopyToScope(IScope scope) {
-      var copies = individuals.Select(i => i.CopyToScope(scope)).ToArray();
-      return new MultiEncodingIndividual(Encoding, scope, copies);
-    }
   }
 }
Index: /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs
===================================================================
--- /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs	(revision 15115)
+++ /stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs	(revision 15116)
@@ -32,13 +32,9 @@
     }
 
-    public override IItem this[string name] {
-      get {
-        if (Name != name) throw new ArgumentException(string.Format("{0} is not part of the individual.", name));
-        return ExtractScopeValue(Name, Scope);
-      }
-      set {
-        if (Name != name) throw new ArgumentException(string.Format("{0} is not part of the individual.", name));
-        SetScopeValue(Name, Scope, value);
-      }
+    private SingleEncodingIndividual(SingleEncodingIndividual copy) : base(copy.Encoding, new Scope()) {
+      copy.CopyToScope(Scope);
+    }
+    public override Individual Copy() {
+      return new SingleEncodingIndividual(this);
     }
 
@@ -48,9 +44,4 @@
       return encoding;
     }
-
-    public override Individual CopyToScope(IScope scope) {
-      SetScopeValue(Name, scope, (IItem)this[Name].Clone());
-      return new SingleEncodingIndividual(Encoding, scope);
-    }
   }
 
Index: /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 15115)
+++ /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 15116)
@@ -158,5 +158,6 @@
       try {
         return client.Evaluate(message, GetQualityMessageExtensions());
-      } finally {
+      }
+      finally {
         lock (clientLock) {
           activeClients.Remove(client);
@@ -170,10 +171,9 @@
         SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
         protobufBuilder.SolutionId = solutionId;
-        var scope = new Scope();
-        individual.CopyToScope(scope);
-        foreach (var variable in scope.Variables) {
+        foreach (var variable in individual.Values) {
           try {
-            MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
-          } catch (ArgumentException ex) {
+            MessageBuilder.AddToMessage(variable.Value, variable.Key, protobufBuilder);
+          }
+          catch (ArgumentException ex) {
             throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", Name), ex);
           }
Index: /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs	(revision 15115)
+++ /stable/HeuristicLab.Problems.ExternalEvaluation/3.4/MultiObjectiveExternalEvaluationProblem.cs	(revision 15116)
@@ -155,5 +155,6 @@
       try {
         return client.Evaluate(message, GetQualityMessageExtensions());
-      } finally {
+      }
+      finally {
         lock (clientLock) {
           activeClients.Remove(client);
@@ -167,10 +168,9 @@
         SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
         protobufBuilder.SolutionId = solutionId;
-        var scope = new Scope();
-        individual.CopyToScope(scope);
-        foreach (var variable in scope.Variables) {
+        foreach (var variable in individual.Values) {
           try {
-            MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
-          } catch (ArgumentException ex) {
+            MessageBuilder.AddToMessage(variable.Value, variable.Key, protobufBuilder);
+          }
+          catch (ArgumentException ex) {
             throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", Name), ex);
           }
