Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 13351)
@@ -60,4 +60,8 @@
     }
 
+    ISolutionCreator IEncoding.SolutionCreator {
+      get { return solutionCreator; }
+    }
+
     [Storable]
     private ISolutionCreator<TSolution> solutionCreator;
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs	(revision 13350)
+++ 	(revision )
@@ -1,76 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2015 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;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Optimization {
-  public sealed class MultiEncodingIndividual : Individual {
-    private new MultiEncoding Encoding {
-      get { return (MultiEncoding)base.Encoding; }
-    }
-
-    private readonly IEnumerable<Individual> individuals;
-
-    public MultiEncodingIndividual(MultiEncoding encoding, IScope scope)
-      : base(encoding, scope) {
-      individuals = encoding.Encodings.Select(e => e.GetIndividual(scope)).ToArray();
-    }
-
-    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 TEncoding GetEncoding<TEncoding>() {
-      TEncoding encoding;
-      try {
-        encoding = (TEncoding)Encoding.Encodings.SingleOrDefault(e => e is TEncoding);
-      } catch (InvalidOperationException) {
-        throw new InvalidOperationException(string.Format("The individual uses multiple {0} .", typeof(TEncoding).GetPrettyName()));
-      }
-      if (encoding == null) throw new InvalidOperationException(string.Format("The individual does not use a {0}.", typeof(TEncoding).GetPrettyName()));
-      return encoding;
-    }
-
-    public override Individual CopyToScope(IScope scope) {
-      var copies = individuals.Select(i => i.CopyToScope(scope)).ToArray();
-      return new MultiEncodingIndividual(Encoding, scope, copies);
-    }
-  }
-}
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs	(revision 13351)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs	(revision 13351)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("MultiSolution", "A solution that consists of other solutions.")]
+  [StorableClass]
+  public sealed class MultiSolution : Item, ISolution {
+
+    private MultiEncoding Encoding { get; set; }
+    protected IScope Scope { get; private set; }
+
+    private readonly Dictionary<string, ISolution> solutions;
+
+    [StorableConstructor]
+    private MultiSolution(bool deserializing) : base(deserializing) { }
+
+    private MultiSolution(MultiSolution original, Cloner cloner)
+      : base(original, cloner) {
+      Encoding = cloner.Clone(original.Encoding);
+      Scope = cloner.Clone(original.Scope);
+      solutions = original.solutions.ToDictionary(x => x.Key, x => cloner.Clone(x.Value));
+    }
+    public MultiSolution(MultiEncoding encoding, IScope scope) {
+      Encoding = encoding;
+      Scope = scope;
+      solutions = encoding.Encodings.Select(e => new { Name = e.Name, Solution = ScopeUtil.GetSolution(scope, e) })
+                                    .ToDictionary(x => x.Name, x => x.Solution);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiSolution(this, cloner);
+    }
+
+    public ISolution this[string name] {
+      get {
+        ISolution result;
+        if (!solutions.TryGetValue(name, out result)) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
+        return result;
+      }
+      set {
+        if (!solutions.ContainsKey(name)) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
+        solutions[name] = value;
+      }
+    }
+
+    public TEncoding GetEncoding<TEncoding>() where TEncoding : IEncoding {
+      TEncoding encoding;
+      try {
+        encoding = (TEncoding)Encoding.Encodings.SingleOrDefault(e => e is TEncoding);
+      } catch (InvalidOperationException) {
+        throw new InvalidOperationException(string.Format("The solution uses multiple {0} .", typeof(TEncoding).GetPrettyName()));
+      }
+      if (encoding == null) throw new InvalidOperationException(string.Format("The solution does not use a {0}.", typeof(TEncoding).GetPrettyName()));
+      return encoding;
+    }
+
+    public TSolution GetSolution<TSolution>() where TSolution : class, ISolution {
+      TSolution solution;
+      try {
+        solution = (TSolution)solutions.SingleOrDefault(s => s.Value is TSolution).Value;
+      } catch (InvalidOperationException) {
+        throw new InvalidOperationException(string.Format("The solution uses multiple {0} .", typeof(TSolution).GetPrettyName()));
+      }
+      if (solution == null) throw new InvalidOperationException(string.Format("The solution does not use a {0}.", typeof(TSolution).GetPrettyName()));
+      return solution;
+    }
+  }
+}
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 13351)
@@ -25,7 +25,6 @@
 
 namespace HeuristicLab.Optimization {
-  public interface IEncoding<TSolution> : IParameterizedNamedItem
-    where TSolution : class, ISolution {
-    ISolutionCreator<TSolution> SolutionCreator { get; set; }
+  public interface IEncoding : IParameterizedNamedItem {
+    ISolutionCreator SolutionCreator { get; }
     IEnumerable<IOperator> Operators { get; set; }
 
@@ -37,4 +36,7 @@
   }
 
-
+  public interface IEncoding<TSolution> : IEncoding
+    where TSolution : class, ISolution {
+    new ISolutionCreator<TSolution> SolutionCreator { get; set; }
+  }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 13351)
@@ -23,7 +23,7 @@
 
 namespace HeuristicLab.Optimization {
-  public interface IMultiEncodingOperator<TSolution> : IOperator where TSolution : class,ISolution {
-    void AddEncoding(IEncoding<TSolution> encoding);
-    bool RemoveEncoding(IEncoding<TSolution> encoding);
+  public interface IMultiEncodingOperator : IOperator {
+    void AddEncoding(IEncoding encoding);
+    bool RemoveEncoding(IEncoding encoding);
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 13351)
@@ -31,5 +31,5 @@
   [Item("MultiEncoding", "Describes a combined encoding consisting of multiple simpler encodings.")]
   [StorableClass]
-  public sealed class MultiEncoding : Encoding<MultiEncodingCreator> {
+  public sealed class MultiEncoding : Encoding<MultiSolution> {
 
     private readonly List<IEncoding> encodings;
@@ -57,8 +57,4 @@
       foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>())
         AddOperator(@operator);
-    }
-
-    public override Individual GetIndividual(IScope scope) {
-      return new MultiEncodingIndividual(this, scope);
     }
 
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 13351)
@@ -29,8 +29,7 @@
   [Item("MultiEncodingCreator", "Contains solution creators that together create a multi-encoding.")]
   [StorableClass]
-  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator {
+  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator<MultiSolution> {
     [StorableConstructor]
     private MultiEncodingCreator(bool deserializing) : base(deserializing) { }
-
     private MultiEncodingCreator(MultiEncodingCreator original, Cloner cloner) : base(original, cloner) { }
     public MultiEncodingCreator() { }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 13351)
@@ -31,5 +31,5 @@
 namespace HeuristicLab.Optimization {
   [StorableClass]
-  public abstract class MultiEncodingOperator<T> : Operator, IMultiEncodingOperator where T : class,IOperator {
+  public abstract class MultiEncodingOperator<T> : Operator, IMultiEncodingOperator where T : class, IOperator {
     private List<IEncoding> encodings = new List<IEncoding>();
     [Storable(Name = "Encodings")]
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/ScopeUtil.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/ScopeUtil.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/ScopeUtil.cs	(revision 13351)
@@ -46,4 +46,12 @@
     }
 
+    public static ISolution GetSolution(IScope scope, IEncoding encoding) {
+      var name = encoding.Name;
+      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 as ISolution;
+      if (value == null) throw new InvalidOperationException(string.Format("Value of {0} is null.", name));
+      return value;
+    }
+
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 13351)
@@ -121,5 +121,11 @@
   <ItemGroup>
     <Compile Include="Algorithms\BasicAlgorithm.cs" />
+    <Compile Include="BasicProblems\Individuals\MultiSolution.cs" />
     <Compile Include="BasicProblems\Interfaces\ISingleObjectiveProblem.cs" />
+    <Compile Include="BasicProblems\MultiEncoding.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingCreator.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingCrossover.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingManipulator.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingOperator.cs" />
     <Compile Include="BasicProblems\Problem.cs" />
     <Compile Include="BasicProblems\Encoding.cs" />
@@ -323,7 +329,5 @@
     </BootstrapperPackage>
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="BasicProblems\Individuals\" />
-  </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs	(revision 13351)
@@ -25,4 +25,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -49,4 +50,28 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new MultiObjectiveBinaryVectorProgrammableProblem(this, cloner);
+    }
+  }
+
+  [Item("Multi Solution Programmable Problem (multi-objective)", "Represents a multi solution multi-objective problem that can be programmed with a script.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
+  [StorableClass]
+  public sealed class MultiObjectiveMultiSolutionProgrammableProblem : MultiObjectiveProgrammableProblem<MultiEncoding, MultiSolution> {
+
+    [StorableConstructor]
+    private MultiObjectiveMultiSolutionProgrammableProblem(bool deserializing) : base(deserializing) { }
+    private MultiObjectiveMultiSolutionProgrammableProblem(MultiObjectiveMultiSolutionProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
+
+    public MultiObjectiveMultiSolutionProgrammableProblem()
+      : base() {
+      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
+      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "MultiEncoding");
+      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "MultiSolution");
+      ProblemScript.Code = codeTemplate;
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveMultiSolutionProgrammableProblem(this, cloner);
     }
   }
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs	(revision 13350)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs	(revision 13351)
@@ -25,4 +25,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -49,4 +50,28 @@
     public override IDeepCloneable Clone(Cloner cloner) {
       return new SingleObjectiveBinaryVectorProgrammableProblem(this, cloner);
+    }
+  }
+
+  [Item("Multi Solution Programmable Problem (single-objective)", "Represents a multi solution single-objective problem that can be programmed with a script.")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
+  [StorableClass]
+  public sealed class SingleObjectiveMultiSolutionProgrammableProblem : SingleObjectiveProgrammableProblem<MultiEncoding, MultiSolution> {
+
+    [StorableConstructor]
+    private SingleObjectiveMultiSolutionProgrammableProblem(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveMultiSolutionProgrammableProblem(SingleObjectiveMultiSolutionProgrammableProblem original, Cloner cloner) : base(original, cloner) { }
+
+    public SingleObjectiveMultiSolutionProgrammableProblem()
+      : base() {
+      var codeTemplate = ScriptTemplates.CompiledSingleObjectiveProblemDefinition_Template;
+      codeTemplate = codeTemplate.Replace(ENCODING_NAMESPACE, "HeuristicLab.Encodings.BinaryVectorEncoding");
+      codeTemplate = codeTemplate.Replace(ENCODING_CLASS, "MultiEncoding");
+      codeTemplate = codeTemplate.Replace(SOLUTION_CLASS, "MultiSolution");
+      ProblemScript.Code = codeTemplate;
+    }
+
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveMultiSolutionProgrammableProblem(this, cloner);
     }
   }
