Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiSolution.cs	(revision 13356)
@@ -28,7 +28,7 @@
 
 namespace HeuristicLab.Optimization {
-  [Item("MultiSolution", "A solution that consists of other solutions.")]
+  [Item("CombinedSolution", "A solution that consists of other solutions.")]
   [StorableClass]
-  public sealed class MultiSolution : Item, ISolution {
+  public sealed class CombinedSolution : Item, ISolution {
 
     private MultiEncoding Encoding { get; set; }
@@ -38,7 +38,7 @@
 
     [StorableConstructor]
-    private MultiSolution(bool deserializing) : base(deserializing) { }
+    private CombinedSolution(bool deserializing) : base(deserializing) { }
 
-    private MultiSolution(MultiSolution original, Cloner cloner)
+    private CombinedSolution(CombinedSolution original, Cloner cloner)
       : base(original, cloner) {
       Encoding = cloner.Clone(original.Encoding);
@@ -46,5 +46,5 @@
       solutions = original.solutions.ToDictionary(x => x.Key, x => cloner.Clone(x.Value));
     }
-    public MultiSolution(MultiEncoding encoding, IScope scope) {
+    public CombinedSolution(IScope scope, MultiEncoding encoding) {
       Encoding = encoding;
       Scope = scope;
@@ -54,5 +54,5 @@
 
     public override IDeepCloneable Clone(Cloner cloner) {
-      return new MultiSolution(this, cloner);
+      return new CombinedSolution(this, cloner);
     }
 
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 13356)
@@ -24,6 +24,5 @@
 namespace HeuristicLab.Optimization {
   public interface IMultiEncodingOperator : IOperator {
-    void AddEncoding(IEncoding encoding);
-    bool RemoveEncoding(IEncoding encoding);
+    MultiEncoding Encoding { get; set; }
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 13356)
@@ -31,11 +31,16 @@
   [Item("MultiEncoding", "Describes a combined encoding consisting of multiple simpler encodings.")]
   [StorableClass]
-  public sealed class MultiEncoding : Encoding<MultiSolution> {
+  public sealed class MultiEncoding : Encoding<CombinedSolution> {
 
-    private readonly List<IEncoding> encodings;
+    private readonly ItemCollection<IEncoding> encodings;
+
     [Storable]
-    public IEnumerable<IEncoding> Encodings {
+    private IEnumerable<IEncoding> StorableEncodings {
       get { return encodings; }
-      private set { encodings.AddRange(value); }
+      set { encodings.AddRange(value); }
+    }
+
+    public ReadOnlyItemCollection<IEncoding> Encodings {
+      get { return encodings.AsReadOnly(); }
     }
 
@@ -43,18 +48,19 @@
     private MultiEncoding(bool deserializing)
       : base(deserializing) {
-      encodings = new List<IEncoding>();
+      encodings = new ItemCollection<IEncoding>();
     }
     public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncoding(this, cloner); }
     private MultiEncoding(MultiEncoding original, Cloner cloner)
       : base(original, cloner) {
-      encodings = new List<IEncoding>(original.Encodings.Select(cloner.Clone));
+      encodings = new ItemCollection<IEncoding>(original.Encodings.Select(cloner.Clone));
     }
     public MultiEncoding()
       : base("MultiEncoding") {
-      encodings = new List<IEncoding>();
-      SolutionCreator = new MultiEncodingCreator();
-
-      foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>())
+      encodings = new ItemCollection<IEncoding>();
+      SolutionCreator = new MultiEncodingCreator() { Encoding = this };
+      foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>()) {
+        @operator.Encoding = this;
         AddOperator(@operator);
+      }
     }
 
@@ -63,11 +69,5 @@
       if (Encodings.Any(e => e.Name == encoding.Name)) throw new ArgumentException("Encoding name must be unique", "encoding.Name");
       encodings.Add(encoding);
-
       Parameters.AddRange(encoding.Parameters);
-
-      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
-        @operator.AddEncoding(encoding);
-      }
-      OnEncodingsChanged();
       return this;
     }
@@ -76,19 +76,8 @@
       var success = encodings.Remove(encoding);
       Parameters.RemoveRange(encoding.Parameters);
-      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
-        @operator.RemoveEncoding(encoding);
-      }
-      OnEncodingsChanged();
       return success;
     }
 
-    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
-    }
-
-    public event EventHandler EncodingsChanged;
-    private void OnEncodingsChanged() {
-      var handler = EncodingsChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) { }
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 13356)
@@ -24,4 +24,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -29,9 +30,10 @@
   [Item("MultiEncodingCreator", "Contains solution creators that together create a multi-encoding.")]
   [StorableClass]
-  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator<MultiSolution> {
+  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator<CombinedSolution> {
+
     [StorableConstructor]
     private MultiEncodingCreator(bool deserializing) : base(deserializing) { }
     private MultiEncodingCreator(MultiEncodingCreator original, Cloner cloner) : base(original, cloner) { }
-    public MultiEncodingCreator() { }
+    public MultiEncodingCreator() : base() { }
 
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -39,5 +41,5 @@
     }
 
-    public override void AddEncoding(IEncoding encoding) {
+    protected override void AddEncoding(IEncoding encoding) {
       base.AddEncoding(encoding);
       var parameter = GetParameter(encoding);
@@ -46,5 +48,5 @@
     }
 
-    public override bool RemoveEncoding(IEncoding encoding) {
+    protected override bool RemoveEncoding(IEncoding encoding) {
       var success = base.RemoveEncoding(encoding);
       encoding.SolutionCreatorChanged -= Encoding_SolutionCreatorChanged;
@@ -61,4 +63,10 @@
       parameter.Value = encoding.SolutionCreator;
     }
+
+
+    public override IOperation InstrumentedApply() {
+      CombinedSolutionParameter.ActualValue = new CombinedSolution(ExecutionContext.Scope, Encoding);
+      return base.Apply();
+    }
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs	(revision 13356)
@@ -22,4 +22,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 
@@ -28,10 +29,17 @@
   [StorableClass]
   public sealed class MultiEncodingCrossover : MultiEncodingOperator<ICrossover>, ICrossover {
+
     [StorableConstructor]
     private MultiEncodingCrossover(bool deserializing) : base(deserializing) { }
     private MultiEncodingCrossover(MultiEncodingCrossover original, Cloner cloner) : base(original, cloner) { }
-    public MultiEncodingCrossover() { }
+    public MultiEncodingCrossover() : base() { }
 
     public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingCrossover(this, cloner); }
+
+
+    public override IOperation InstrumentedApply() {
+      CombinedSolutionParameter.ActualValue = new CombinedSolution(ExecutionContext.Scope, Encoding);
+      return base.Apply();
+    }
   }
 }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs	(revision 13356)
@@ -30,7 +30,6 @@
     [StorableConstructor]
     private MultiEncodingManipulator(bool deserializing) : base(deserializing) { }
-    private MultiEncodingManipulator(MultiEncodingManipulator original, Cloner cloner)
-      : base(original, cloner) { }
-    public MultiEncodingManipulator() { }
+    private MultiEncodingManipulator(MultiEncodingManipulator original, Cloner cloner) : base(original, cloner) { }
+    public MultiEncodingManipulator() : base() { }
 
     public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingManipulator(this, cloner); }
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 13356)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -31,42 +32,76 @@
 namespace HeuristicLab.Optimization {
   [StorableClass]
-  public abstract class MultiEncodingOperator<T> : Operator, IMultiEncodingOperator where T : class, IOperator {
-    private List<IEncoding> encodings = new List<IEncoding>();
-    [Storable(Name = "Encodings")]
-    private IEnumerable<IEncoding> StorableEncodings {
-      get { return encodings; }
-      set { encodings = new List<IEncoding>(value); }
+  public abstract class MultiEncodingOperator<T> : InstrumentedOperator, IMultiEncodingOperator where T : class, IOperator {
+    [Storable]
+    private MultiEncoding encoding;
+    public MultiEncoding Encoding {
+      get { return encoding; }
+      set {
+        if (value == null) throw new ArgumentNullException("Encoding must not be null.");
+        if (value == encoding) return;
+        if (encoding != null) DeregisterEventHandlers();
+        encoding = value;
+        CombinedSolutionParameter.ActualName = encoding.Name;
+        RegisterEventHandlers();
+      }
+    }
+
+    public ILookupParameter<CombinedSolution> CombinedSolutionParameter {
+      get { return (ILookupParameter<CombinedSolution>)Parameters["CombinedSolution"]; }
     }
 
     [StorableConstructor]
-    protected MultiEncodingOperator(bool deserializing)
-      : base(deserializing) {
-    }
-
+    protected MultiEncodingOperator(bool deserializing) : base(deserializing) { }
     protected MultiEncodingOperator(MultiEncodingOperator<T> original, Cloner cloner)
       : base(original, cloner) {
-      encodings = new List<IEncoding>(original.encodings.Select(cloner.Clone));
-      foreach (var encoding in encodings)
-        encoding.OperatorsChanged += Encoding_OperatorsChanged;
+      encoding = cloner.Clone(original.encoding);
+      RegisterEventHandlers();
     }
-
-    protected MultiEncodingOperator() : base() { }
+    protected MultiEncodingOperator()
+      : base() {
+      Parameters.Add(new LookupParameter<CombinedSolution>("CombinedSolution", "The combined solution that gets created."));
+    }
 
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      foreach (var encoding in encodings)
-        encoding.OperatorsChanged += Encoding_OperatorsChanged;
+      RegisterEventHandlers();
     }
 
+    private void RegisterEventHandlers() {
+      encoding.Encodings.ItemsAdded += EncodingsOnItemsChanged;
+      encoding.Encodings.CollectionReset += EncodingsOnItemsChanged;
+      encoding.Encodings.ItemsRemoved += EncodingsOnItemsRemoved;
+      foreach (var enc in encoding.Encodings)
+        enc.OperatorsChanged += Encoding_OperatorsChanged;
+    }
 
-    public override IOperation Apply() {
+    private void DeregisterEventHandlers() {
+      encoding.Encodings.ItemsAdded -= EncodingsOnItemsChanged;
+      encoding.Encodings.CollectionReset -= EncodingsOnItemsChanged;
+      encoding.Encodings.ItemsRemoved -= EncodingsOnItemsRemoved;
+      foreach (var enc in encoding.Encodings)
+        enc.OperatorsChanged -= Encoding_OperatorsChanged;
+    }
+
+    private void EncodingsOnItemsChanged(object sender, CollectionItemsChangedEventArgs<IEncoding> e) {
+      foreach (var enc in e.Items)
+        AddEncoding(enc);
+      foreach (var enc in e.OldItems)
+        RemoveEncoding(enc);
+    }
+
+    private void EncodingsOnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IEncoding> e) {
+      foreach (var enc in e.Items)
+        RemoveEncoding(enc);
+    }
+
+    public override IOperation InstrumentedApply() {
       var operations = Parameters.Select(p => p.ActualValue).OfType<IOperator>().Select(op => ExecutionContext.CreateOperation(op));
       return new OperationCollection(operations);
     }
 
-    public virtual void AddEncoding(IEncoding encoding) {
+    protected virtual void AddEncoding(IEncoding encoding) {
       if (Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was already added.", encoding.Name));
 
-      encodings.Add(encoding);
       encoding.OperatorsChanged += Encoding_OperatorsChanged;
 
@@ -76,6 +111,6 @@
     }
 
-    public virtual bool RemoveEncoding(IEncoding encoding) {
-      if (!encodings.Remove(encoding)) throw new ArgumentException(string.Format("Encoding {0} was not added to the MultiEncoding.", encoding.Name));
+    protected virtual bool RemoveEncoding(IEncoding encoding) {
+      if (!Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was not added to the MultiEncoding.", encoding.Name));
       encoding.OperatorsChanged -= Encoding_OperatorsChanged;
       return Parameters.Remove(encoding.Name);
@@ -89,10 +124,10 @@
 
     private void Encoding_OperatorsChanged(object sender, EventArgs e) {
-      var encoding = (IEncoding)sender;
-      var param = GetParameter(encoding);
+      var enc = (IEncoding)sender;
+      var param = GetParameter(enc);
 
       var oldParameterValue = param.Value;
       param.ValidValues.Clear();
-      foreach (var op in encoding.Operators.OfType<T>())
+      foreach (var op in enc.Operators.OfType<T>())
         param.ValidValues.Add(op);
 
Index: branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 13356)
@@ -122,4 +122,5 @@
     <Compile Include="Algorithms\BasicAlgorithm.cs" />
     <Compile Include="BasicProblems\Individuals\MultiSolution.cs" />
+    <Compile Include="BasicProblems\Interfaces\IMultiEncodingOperator.cs" />
     <Compile Include="BasicProblems\Interfaces\ISingleObjectiveProblem.cs" />
     <Compile Include="BasicProblems\MultiEncoding.cs" />
@@ -132,5 +133,4 @@
     <Compile Include="BasicProblems\Interfaces\IEncoding.cs" />
     <Compile Include="BasicProblems\Interfaces\IEncodingOperator.cs" />
-    <Compile Include="BasicProblems\Interfaces\IMultiEncodingOperator.cs" />
     <Compile Include="BasicProblems\Interfaces\IMultiObjectiveProblemDefinition.cs" />
     <Compile Include="BasicProblems\Interfaces\internal\IMultiObjectiveAnalysisOperator.cs" />
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblems.cs	(revision 13356)
@@ -56,5 +56,5 @@
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
-  public sealed class MultiObjectiveMultiSolutionProgrammableProblem : MultiObjectiveProgrammableProblem<MultiEncoding, MultiSolution> {
+  public sealed class MultiObjectiveMultiSolutionProgrammableProblem : MultiObjectiveProgrammableProblem<MultiEncoding, CombinedSolution> {
 
     [StorableConstructor]
Index: branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs	(revision 13355)
+++ branches/ProblemRefactoring/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblems.cs	(revision 13356)
@@ -56,5 +56,5 @@
   [Creatable(CreatableAttribute.Categories.Problems, Priority = 100)]
   [StorableClass]
-  public sealed class SingleObjectiveMultiSolutionProgrammableProblem : SingleObjectiveProgrammableProblem<MultiEncoding, MultiSolution> {
+  public sealed class SingleObjectiveMultiSolutionProgrammableProblem : SingleObjectiveProgrammableProblem<MultiEncoding, CombinedSolution> {
 
     [StorableConstructor]
