Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorMultiObjectiveProblem.cs	(revision 16948)
@@ -28,7 +28,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.BinaryVectorEncoding {
@@ -38,8 +36,4 @@
       get { return Encoding.Length; }
       set { Encoding.Length = value; }
-    }
-
-    private IFixedValueParameter<IntValue> LengthParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters["Length"]; }
     }
 
@@ -56,8 +50,7 @@
     }
 
-    protected BinaryVectorMultiObjectiveProblem() : base(new BinaryVectorEncoding()) {
-      var lengthParameter = new FixedValueParameter<IntValue>("Length", "The length of the BinaryVector.", new IntValue(10));
-      Parameters.Add(lengthParameter);
-      Encoding.LengthParameter = lengthParameter;
+    protected BinaryVectorMultiObjectiveProblem() : this(new BinaryVectorEncoding() { Length = 10 }) { }
+    protected BinaryVectorMultiObjectiveProblem(BinaryVectorEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -75,5 +68,4 @@
     protected override void OnEncodingChanged() {
       base.OnEncodingChanged();
-      Encoding.LengthParameter = LengthParameter;
       Parameterize();
     }
@@ -87,5 +79,5 @@
 
     private void RegisterEventHandlers() {
-      LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorProblem.cs	(revision 16948)
@@ -28,8 +28,6 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 using HeuristicLab.Optimization.Operators;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.BinaryVectorEncoding {
@@ -39,8 +37,4 @@
       get { return Encoding.Length; }
       set { Encoding.Length = value; }
-    }
-
-    private IFixedValueParameter<IntValue> LengthParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters["Length"]; }
     }
 
@@ -57,8 +51,7 @@
     }
 
-    protected BinaryVectorProblem() : base(new BinaryVectorEncoding()) {
-      var lengthParameter = new FixedValueParameter<IntValue>("Length", "The length of the BinaryVector.", new IntValue(10));
-      Parameters.Add(lengthParameter);
-      Encoding.LengthParameter = lengthParameter;
+    protected BinaryVectorProblem() : this(new BinaryVectorEncoding() { Length = 10 }) { }
+    protected BinaryVectorProblem(BinaryVectorEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -75,13 +68,9 @@
       var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
 
-      if (!results.ContainsKey("Best Solution")) {
-        results.Add(new Result("Best Solution", typeof(BinaryVector)));
-      }
-      results["Best Solution"].Value = (IItem)best.Clone();
+      results.AddOrUpdateResult("Best Solution", (IItem)best.Clone());
     }
 
     protected override void OnEncodingChanged() {
       base.OnEncodingChanged();
-      Encoding.LengthParameter = LengthParameter;
       Parameterize();
     }
@@ -95,5 +84,5 @@
 
     private void RegisterEventHandlers() {
-      LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorMultiObjectiveProblem.cs	(revision 16948)
@@ -28,7 +28,5 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.IntegerVectorEncoding {
@@ -38,8 +36,4 @@
       get { return Encoding.Length; }
       set { Encoding.Length = value; }
-    }
-
-    private IFixedValueParameter<IntValue> LengthParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters["Length"]; }
     }
 
@@ -56,8 +50,7 @@
     }
 
-    protected IntegerVectorMultiObjectiveProblem() : base(new IntegerVectorEncoding()) {
-      var lengthParameter = new FixedValueParameter<IntValue>("Length", "The length of the IntegerVector.", new IntValue(10));
-      Parameters.Add(lengthParameter);
-      Encoding.LengthParameter = lengthParameter;
+    protected IntegerVectorMultiObjectiveProblem() : this(new IntegerVectorEncoding() { Length = 10 }) { }
+    protected IntegerVectorMultiObjectiveProblem(IntegerVectorEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -75,5 +68,4 @@
     protected override void OnEncodingChanged() {
       base.OnEncodingChanged();
-      Encoding.LengthParameter = LengthParameter;
       Parameterize();
     }
@@ -87,5 +79,5 @@
 
     private void RegisterEventHandlers() {
-      LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorProblem.cs	(revision 16948)
@@ -28,8 +28,6 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 using HeuristicLab.Optimization.Operators;
-using HeuristicLab.Parameters;
 
 namespace HeuristicLab.Encodings.IntegerVectorEncoding {
@@ -39,8 +37,4 @@
       get { return Encoding.Length; }
       set { Encoding.Length = value; }
-    }
-
-    private IFixedValueParameter<IntValue> LengthParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters["Length"]; }
     }
 
@@ -57,8 +51,7 @@
     }
 
-    protected IntegerVectorProblem() : base(new IntegerVectorEncoding()) {
-      var lengthParameter = new FixedValueParameter<IntValue>("Length", "The length of the IntegerVector.", new IntValue(10));
-      Parameters.Add(lengthParameter);
-      Encoding.LengthParameter = lengthParameter;
+    protected IntegerVectorProblem() : this(new IntegerVectorEncoding() { Length = 10 }) { }
+    protected IntegerVectorProblem(IntegerVectorEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
 
       Operators.Add(new HammingSimilarityCalculator());
@@ -75,13 +68,9 @@
       var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
 
-      if (!results.ContainsKey("Best Solution")) {
-        results.Add(new Result("Best Solution", typeof(IntegerVector)));
-      }
-      results["Best Solution"].Value = (IItem)best.Clone();
+      results.AddOrUpdateResult("Best Solution", (IItem)best.Clone());
     }
 
     protected override void OnEncodingChanged() {
       base.OnEncodingChanged();
-      Encoding.LengthParameter = LengthParameter;
       Parameterize();
     }
@@ -95,5 +84,5 @@
 
     private void RegisterEventHandlers() {
-      LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
     }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/HeuristicLab.Encodings.LinearLinkageEncoding-3.4.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/HeuristicLab.Encodings.LinearLinkageEncoding-3.4.csproj	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/HeuristicLab.Encodings.LinearLinkageEncoding-3.4.csproj	(revision 16948)
@@ -88,4 +88,9 @@
   </PropertyGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
@@ -164,4 +169,6 @@
     <Compile Include="Crossovers\MultiLLECrossover.cs" />
     <Compile Include="Crossovers\SinglePointCrossover.cs" />
+    <Compile Include="LinearLinkageMultiObjectiveProblem.cs" />
+    <Compile Include="LinearLinkageProblem.cs" />
     <Compile Include="Interfaces\ILinearLinkageMoveOperator.cs" />
     <Compile Include="Interfaces\ILinearLinkageEMSSMoveOperator.cs" />
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageMultiObjectiveProblem.cs	(revision 16948)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageMultiObjectiveProblem.cs	(revision 16948)
@@ -0,0 +1,88 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.LinearLinkageEncoding {
+  [StorableType("ad8b6097-a26b-440c-bfd4-92e5ecf17894")]
+  public abstract class LinearLinkageMultiObjectiveProblem : MultiObjectiveProblem<LinearLinkageEncoding, LinearLinkage> {
+    public int Length {
+      get { return Encoding.Length; }
+      set { Encoding.Length = value; }
+    }
+
+    [StorableConstructor]
+    protected LinearLinkageMultiObjectiveProblem(StorableConstructorFlag _) : base(_) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected LinearLinkageMultiObjectiveProblem(LinearLinkageMultiObjectiveProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected LinearLinkageMultiObjectiveProblem() : this(new LinearLinkageEncoding() { Length = 10 }) { }
+    protected LinearLinkageMultiObjectiveProblem(LinearLinkageEncoding encoding) : base(new LinearLinkageEncoding()) {
+      EncodingParameter.ReadOnly = true;
+
+      Operators.Add(new HammingSimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
+      Parameterize();
+      RegisterEventHandlers();
+    }
+
+    public override void Analyze(LinearLinkage[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+
+      var result = DominationCalculator<LinearLinkage>.CalculateBestParetoFront(individuals, qualities, Maximization);
+      // TODO: Add results
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualitiesParameter.ActualName;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+    }
+
+    protected virtual void LengthParameter_ValueChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageProblem.cs	(revision 16948)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.LinearLinkageEncoding/3.4/LinearLinkageProblem.cs	(revision 16948)
@@ -0,0 +1,91 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+
+namespace HeuristicLab.Encodings.LinearLinkageEncoding {
+  [StorableType("fb4cfc7c-dc7c-4da6-843f-0dad7d3d7981")]
+  public abstract class LinearLinkageProblem : SingleObjectiveProblem<LinearLinkageEncoding, LinearLinkage> {
+    public int Length {
+      get { return Encoding.Length; }
+      set { Encoding.Length = value; }
+    }
+
+    [StorableConstructor]
+    protected LinearLinkageProblem(StorableConstructorFlag _) : base(_) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected LinearLinkageProblem(LinearLinkageProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected LinearLinkageProblem() : this(new LinearLinkageEncoding() { Length = 10 }) { }
+    protected LinearLinkageProblem(LinearLinkageEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
+
+      Operators.Add(new HammingSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
+      Parameterize();
+      RegisterEventHandlers();
+    }
+
+    public override void Analyze(LinearLinkage[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+      var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
+
+      results.AddOrUpdateResult("Best Solution", (Item)best.Clone());
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualityParameter.ActualName;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+    }
+
+    protected virtual void LengthParameter_ValueChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 16948)
@@ -115,4 +115,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="PermutationMultiObjectiveProblem.cs" />
+    <Compile Include="PermutationProblem.cs" />
     <Compile Include="Creators\RandomPermutationCreator.cs" />
     <Compile Include="Crossovers\CosaCrossover.cs" />
@@ -218,4 +220,9 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
       <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationMultiObjectiveProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationMultiObjectiveProblem.cs	(revision 16948)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationMultiObjectiveProblem.cs	(revision 16948)
@@ -0,0 +1,93 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [StorableType("7bc5215b-c181-40d0-a758-d7c19a356e18")]
+  public abstract class PermutationMultiObjectiveProblem : MultiObjectiveProblem<PermutationEncoding, Permutation> {
+    public int Length {
+      get { return Encoding.Length; }
+      set { Encoding.Length = value; }
+    }
+
+    public PermutationTypes Type {
+      get { return Encoding.Type; }
+      set { Encoding.Type = value; }
+    }
+
+    [StorableConstructor]
+    protected PermutationMultiObjectiveProblem(StorableConstructorFlag _) : base(_) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected PermutationMultiObjectiveProblem(PermutationMultiObjectiveProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected PermutationMultiObjectiveProblem() : this(new PermutationEncoding() { Length = 10, Type = PermutationTypes.Absolute }) { }
+    protected PermutationMultiObjectiveProblem(PermutationEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
+
+      Operators.Add(new HammingSimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
+      Parameterize();
+      RegisterEventHandlers();
+    }
+
+    public override void Analyze(Permutation[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      // TODO: Calculate Pareto front and add to results
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualitiesParameter.ActualName;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.PermutationTypeParameter.Value.ValueChanged += TypeParameter_ValueChanged;
+    }
+
+    protected virtual void LengthParameter_ValueChanged(object sender, EventArgs e) { }
+    protected virtual void TypeParameter_ValueChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationProblem.cs	(revision 16948)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationProblem.cs	(revision 16948)
@@ -0,0 +1,98 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [StorableType("aceff7a2-0666-4055-b698-6ea3628713b6")]
+  public abstract class PermutationProblem : SingleObjectiveProblem<PermutationEncoding, Permutation> {
+    public int Length {
+      get { return Encoding.Length; }
+      set { Encoding.Length = value; }
+    }
+
+    public PermutationTypes Type {
+      get { return Encoding.Type; }
+      set { Encoding.Type = value; }
+    }
+
+    [StorableConstructor]
+    protected PermutationProblem(StorableConstructorFlag _) : base(_) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected PermutationProblem(PermutationProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected PermutationProblem() : this(new PermutationEncoding() { Length = 10, Type = PermutationTypes.Absolute }) { }
+    protected PermutationProblem(PermutationEncoding encoding) : base(encoding) {
+      EncodingParameter.ReadOnly = true;
+
+      Operators.Add(new HammingSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator());
+      Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+
+      Parameterize();
+      RegisterEventHandlers();
+    }
+
+    public override void Analyze(Permutation[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+      var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
+
+      results.AddOrUpdateResult("Best Solution", (IItem)best.Clone());
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Parameterize();
+    }
+
+    private void Parameterize() {
+      foreach (var similarityCalculator in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        similarityCalculator.SolutionVariableName = Encoding.Name;
+        similarityCalculator.QualityVariableName = Evaluator.QualityParameter.ActualName;
+      }
+    }
+
+    private void RegisterEventHandlers() {
+      Encoding.LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+      Encoding.PermutationTypeParameter.Value.ValueChanged += TypeParameter_ValueChanged;
+    }
+
+    protected virtual void LengthParameter_ValueChanged(object sender, EventArgs e) { }
+    protected virtual void TypeParameter_ValueChanged(object sender, EventArgs e) { }
+  }
+}
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/BasicProblems/Problem.cs	(revision 16948)
@@ -96,7 +96,7 @@
     protected Problem()
       : base() {
-      Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));
-      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution."));
-
+      Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any.") { Hidden = true });
+      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution.") { Hidden = true });
+      
       if (Encoding != null) {
         oldEncoding = Encoding;
@@ -107,6 +107,6 @@
     protected Problem(TEncoding encoding) {
       if (encoding == null) throw new ArgumentNullException("encoding");
-      Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any.", encoding));
-      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution."));
+      Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any.", encoding) { Hidden = true });
+      Parameters.Add(new ValueParameter<TEvaluator>("Evaluator", "The operator used to evaluate a solution.") { Hidden = true });
 
       oldEncoding = Encoding;
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.GraphColoring/3.3/GraphColoringProblem.cs	(revision 16948)
@@ -39,5 +39,5 @@
   [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 135)]
   [StorableType("007BD5F0-196C-4045-AC5D-BF287927C3DC")]
-  public sealed class GraphColoringProblem : SingleObjectiveProblem<LinearLinkageEncoding, LinearLinkage>,
+  public sealed class GraphColoringProblem : LinearLinkageProblem,
     IProblemInstanceConsumer<GCPData>, IProblemInstanceExporter<GCPData> {
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 16948)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
@@ -31,5 +32,4 @@
 using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 
 namespace HeuristicLab.Problems.Knapsack {
@@ -37,5 +37,5 @@
   [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 200)]
   [StorableType("8CEDAFA2-6E0A-4D4B-B6C6-F85CC58B824E")]
-  public sealed class KnapsackProblem : SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector> {
+  public sealed class KnapsackProblem : BinaryVectorProblem {
     public override bool Maximization { get { return true; } }
 
Index: /branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- /branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 16947)
+++ /branches/2521_ProblemRefactoring/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 16948)
@@ -24,4 +24,5 @@
 using System.Drawing;
 using System.Linq;
+using HEAL.Attic;
 using HeuristicLab.Analysis;
 using HeuristicLab.Common;
@@ -32,5 +33,4 @@
 using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
-using HEAL.Attic;
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Problems.Instances;
@@ -40,5 +40,5 @@
   [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 140)]
   [StorableType("A86B1F49-D8E6-45E4-8EFB-8F5CCA2F9DC7")]
-  public sealed class QuadraticAssignmentProblem : SingleObjectiveProblem<PermutationEncoding, Permutation>,
+  public sealed class QuadraticAssignmentProblem : PermutationProblem,
     IProblemInstanceConsumer<QAPData>,
     IProblemInstanceConsumer<TSPData> {
