Index: trunk/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Algorithms.RAPGA/3.3/RAPGA.cs	(revision 12102)
@@ -103,6 +103,6 @@
       get { return (ValueParameter<IntValue>)Parameters["MaximumGenerations"]; }
     }
-    public IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator> SimilarityCalculatorParameter {
-      get { return (IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
+    public IConstrainedValueParameter<ISolutionSimilarityCalculator> SimilarityCalculatorParameter {
+      get { return (IConstrainedValueParameter<ISolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
     }
     #endregion
@@ -173,5 +173,5 @@
       set { MaximumGenerationsParameter.Value = value; }
     }
-    public ISingleObjectiveSolutionSimilarityCalculator SimilarityCalculator {
+    public ISolutionSimilarityCalculator SimilarityCalculator {
       get { return SimilarityCalculatorParameter.Value; }
       set { SimilarityCalculatorParameter.Value = value; }
@@ -204,4 +204,12 @@
       if (!Parameters.ContainsKey("ReevaluateElites")) {
         Parameters.Add(new FixedValueParameter<BoolValue>("ReevaluateElites", "Flag to determine if elite individuals should be reevaluated (i.e., if stochastic fitness functions are used.)", (BoolValue)new BoolValue(false).AsReadOnly()) { Hidden = true });
+      }
+      if (Parameters.ContainsKey("SimilarityCalculator")) {
+        var oldParameter = (IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"];
+        Parameters.Remove(oldParameter);
+        var newParameter = new ConstrainedValueParameter<ISolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions.", new ItemSet<ISolutionSimilarityCalculator>(oldParameter.ValidValues));
+        var selectedSimilarityCalculator = newParameter.ValidValues.SingleOrDefault(x => x.GetType() == oldParameter.Value.GetType());
+        newParameter.Value = selectedSimilarityCalculator;
+        Parameters.Add(newParameter);
       }
       #endregion
@@ -234,5 +242,5 @@
       Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer()));
       Parameters.Add(new ValueParameter<IntValue>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntValue(1000)));
-      Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions."));
+      Parameters.Add(new ConstrainedValueParameter<ISolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions."));
 
       RandomCreator randomCreator = new RandomCreator();
@@ -448,5 +456,5 @@
     }
     private void ParameterizeSimilarityCalculators() {
-      foreach (ISingleObjectiveSolutionSimilarityCalculator calc in SimilarityCalculatorParameter.ValidValues) {
+      foreach (ISolutionSimilarityCalculator calc in SimilarityCalculatorParameter.ValidValues) {
         calc.QualityVariableName = Problem.Evaluator.QualityParameter.ActualName;
       }
@@ -493,16 +501,13 @@
     }
     private void UpdateSimilarityCalculators() {
-      ISingleObjectiveSolutionSimilarityCalculator oldSimilarityCalculator = SimilarityCalculatorParameter.Value;
+      ISolutionSimilarityCalculator oldSimilarityCalculator = SimilarityCalculatorParameter.Value;
       SimilarityCalculatorParameter.ValidValues.Clear();
-      ISingleObjectiveSolutionSimilarityCalculator defaultSimilarityCalculator = Problem.Operators.OfType<ISingleObjectiveSolutionSimilarityCalculator>().FirstOrDefault();
-
-      SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator { QualityVariableName = Problem.Evaluator.QualityParameter.ActualName });
-      SimilarityCalculatorParameter.ValidValues.Add(new NoSimilarityCalculator());
-
-      foreach (ISingleObjectiveSolutionSimilarityCalculator similarityCalculator in Problem.Operators.OfType<ISingleObjectiveSolutionSimilarityCalculator>())
+      ISolutionSimilarityCalculator defaultSimilarityCalculator = Problem.Operators.OfType<ISolutionSimilarityCalculator>().FirstOrDefault();
+
+      foreach (ISolutionSimilarityCalculator similarityCalculator in Problem.Operators.OfType<ISolutionSimilarityCalculator>())
         SimilarityCalculatorParameter.ValidValues.Add(similarityCalculator);
 
       if (oldSimilarityCalculator != null) {
-        ISingleObjectiveSolutionSimilarityCalculator similarityCalculator = SimilarityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSimilarityCalculator.GetType());
+        ISolutionSimilarityCalculator similarityCalculator = SimilarityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSimilarityCalculator.GetType());
         if (similarityCalculator != null) SimilarityCalculatorParameter.Value = similarityCalculator;
         else oldSimilarityCalculator = null;
Index: trunk/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Algorithms.ScatterSearch/3.3/ScatterSearch.cs	(revision 12102)
@@ -88,6 +88,6 @@
       get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
     }
-    public IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator> SimilarityCalculatorParameter {
-      get { return (IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
+    public IConstrainedValueParameter<ISolutionSimilarityCalculator> SimilarityCalculatorParameter {
+      get { return (IConstrainedValueParameter<ISolutionSimilarityCalculator>)Parameters["SimilarityCalculator"]; }
     }
     #endregion
@@ -138,5 +138,5 @@
       set { SetSeedRandomlyParameter.Value = value; }
     }
-    public ISingleObjectiveSolutionSimilarityCalculator SimilarityCalculator {
+    public ISolutionSimilarityCalculator SimilarityCalculator {
       get { return SimilarityCalculatorParameter.Value; }
       set { SimilarityCalculatorParameter.Value = value; }
@@ -160,4 +160,15 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (Parameters.ContainsKey("SimilarityCalculator")) {
+        var oldParameter = (IConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>)Parameters["SimilarityCalculator"];
+        Parameters.Remove(oldParameter);
+        var newParameter = new ConstrainedValueParameter<ISolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions.", new ItemSet<ISolutionSimilarityCalculator>(oldParameter.ValidValues));
+        var selectedSimilarityCalculator = newParameter.ValidValues.SingleOrDefault(x => x.GetType() == oldParameter.Value.GetType());
+        newParameter.Value = selectedSimilarityCalculator;
+        Parameters.Add(newParameter);
+      }
+      #endregion
       Initialize();
     }
@@ -184,5 +195,5 @@
       Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
       Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
-      Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveSolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions."));
+      Parameters.Add(new ConstrainedValueParameter<ISolutionSimilarityCalculator>("SimilarityCalculator", "The operator used to calculate the similarity between two solutions."));
       #endregion
 
@@ -390,16 +401,13 @@
     }
     private void UpdateSimilarityCalculators() {
-      ISingleObjectiveSolutionSimilarityCalculator oldSimilarityCalculator = SimilarityCalculatorParameter.Value;
+      ISolutionSimilarityCalculator oldSimilarityCalculator = SimilarityCalculatorParameter.Value;
       SimilarityCalculatorParameter.ValidValues.Clear();
-      ISingleObjectiveSolutionSimilarityCalculator defaultSimilarityCalculator = Problem.Operators.OfType<ISingleObjectiveSolutionSimilarityCalculator>().FirstOrDefault();
-
-      SimilarityCalculatorParameter.ValidValues.Add(new QualitySimilarityCalculator { QualityVariableName = Problem.Evaluator.QualityParameter.ActualName });
-      SimilarityCalculatorParameter.ValidValues.Add(new NoSimilarityCalculator { QualityVariableName = Problem.Evaluator.QualityParameter.ActualName });
-
-      foreach (ISingleObjectiveSolutionSimilarityCalculator similarityCalculator in Problem.Operators.OfType<ISingleObjectiveSolutionSimilarityCalculator>())
+      ISolutionSimilarityCalculator defaultSimilarityCalculator = Problem.Operators.OfType<ISolutionSimilarityCalculator>().FirstOrDefault();
+
+      foreach (ISolutionSimilarityCalculator similarityCalculator in Problem.Operators.OfType<ISolutionSimilarityCalculator>())
         SimilarityCalculatorParameter.ValidValues.Add(similarityCalculator);
 
       if (oldSimilarityCalculator != null) {
-        ISingleObjectiveSolutionSimilarityCalculator similarityCalculator = SimilarityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSimilarityCalculator.GetType());
+        ISolutionSimilarityCalculator similarityCalculator = SimilarityCalculatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSimilarityCalculator.GetType());
         if (similarityCalculator != null) SimilarityCalculatorParameter.Value = similarityCalculator;
         else oldSimilarityCalculator = null;
@@ -447,5 +455,5 @@
     }
     private void ParameterizeSimilarityCalculators() {
-      foreach (ISingleObjectiveSolutionSimilarityCalculator calc in SimilarityCalculatorParameter.ValidValues) {
+      foreach (ISolutionSimilarityCalculator calc in SimilarityCalculatorParameter.ValidValues) {
         calc.QualityVariableName = Problem.Evaluator.QualityParameter.ActualName;
       }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 12101)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 12102)
@@ -148,9 +148,9 @@
       <DependentUpon>CreateNewSingleEncodingDialog.cs</DependentUpon>
     </Compile>
-    <Compile Include="ISingleObjectiveSolutionSimilarityCalculatorView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ISingleObjectiveSolutionSimilarityCalculatorView.Designer.cs">
-      <DependentUpon>ISingleObjectiveSolutionSimilarityCalculatorView.cs</DependentUpon>
+    <Compile Include="ISolutionSimilarityCalculatorView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ISolutionSimilarityCalculatorView.Designer.cs">
+      <DependentUpon>ISolutionSimilarityCalculatorView.cs</DependentUpon>
     </Compile>
     <Compile Include="ExperimentListView.cs">
@@ -159,10 +159,4 @@
     <Compile Include="ExperimentListView.Designer.cs">
       <DependentUpon>ExperimentListView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ISimilarityCalculatorView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ISimilarityCalculatorView.Designer.cs">
-      <DependentUpon>ISimilarityCalculatorView.cs</DependentUpon>
     </Compile>
     <Compile Include="MultiEncodingView.cs">
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISimilarityCalculatorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISimilarityCalculatorView.Designer.cs	(revision 12101)
+++ 	(revision )
@@ -1,53 +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
-
-namespace HeuristicLab.Optimization.Views {
-  partial class ISimilarityCalculatorView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      components = new System.ComponentModel.Container();
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-    }
-
-    #endregion
-  }
-}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISimilarityCalculatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISimilarityCalculatorView.cs	(revision 12101)
+++ 	(revision )
@@ -1,33 +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 HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Optimization.Views {
-  [View("ISimilarityCalculator View")]
-  [Content(typeof(ISolutionSimilarityCalculator), true)]
-  public partial class ISimilarityCalculatorView : AsynchronousContentView {
-    public ISimilarityCalculatorView() {
-      InitializeComponent();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISingleObjectiveSolutionSimilarityCalculatorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISingleObjectiveSolutionSimilarityCalculatorView.Designer.cs	(revision 12101)
+++ 	(revision )
@@ -1,112 +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
-
-namespace HeuristicLab.Optimization.Views {
-  partial class ISingleObjectiveSolutionSimilarityCalculatorView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.label1 = new System.Windows.Forms.Label();
-      this.label2 = new System.Windows.Forms.Label();
-      this.qualityVariableNameTextBox = new System.Windows.Forms.TextBox();
-      this.solutionVariableNameTextBox = new System.Windows.Forms.TextBox();
-      this.SuspendLayout();
-      // 
-      // label1
-      // 
-      this.label1.AutoSize = true;
-      this.label1.Location = new System.Drawing.Point(3, 6);
-      this.label1.Name = "label1";
-      this.label1.Size = new System.Drawing.Size(135, 13);
-      this.label1.TabIndex = 0;
-      this.label1.Text = "Variable Name of Solution: ";
-      // 
-      // label2
-      // 
-      this.label2.AutoSize = true;
-      this.label2.Location = new System.Drawing.Point(3, 32);
-      this.label2.Name = "label2";
-      this.label2.Size = new System.Drawing.Size(126, 13);
-      this.label2.TabIndex = 1;
-      this.label2.Text = "Variable Name of Quality:";
-      // 
-      // qualityVariableNameTextBox
-      // 
-      this.qualityVariableNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.qualityVariableNameTextBox.Location = new System.Drawing.Point(144, 29);
-      this.qualityVariableNameTextBox.Name = "qualityVariableNameTextBox";
-      this.qualityVariableNameTextBox.Size = new System.Drawing.Size(287, 20);
-      this.qualityVariableNameTextBox.TabIndex = 2;
-      this.qualityVariableNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.qualityVariableNameTextBox_Validating);
-      // 
-      // solutionVariableNameTextBox
-      // 
-      this.solutionVariableNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
-            | System.Windows.Forms.AnchorStyles.Right)));
-      this.solutionVariableNameTextBox.Location = new System.Drawing.Point(144, 3);
-      this.solutionVariableNameTextBox.Name = "solutionVariableNameTextBox";
-      this.solutionVariableNameTextBox.Size = new System.Drawing.Size(287, 20);
-      this.solutionVariableNameTextBox.TabIndex = 3;
-      this.solutionVariableNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.solutionVariableNameTextBox_Validating);
-      // 
-      // ISingleObjectiveSolutionSimilarityCalculatorView
-      // 
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
-      this.Controls.Add(this.solutionVariableNameTextBox);
-      this.Controls.Add(this.qualityVariableNameTextBox);
-      this.Controls.Add(this.label2);
-      this.Controls.Add(this.label1);
-      this.Name = "ISingleObjectiveSolutionSimilarityCalculatorView";
-      this.Size = new System.Drawing.Size(434, 53);
-      this.ResumeLayout(false);
-      this.PerformLayout();
-
-    }
-
-    #endregion
-
-    private System.Windows.Forms.Label label1;
-    private System.Windows.Forms.Label label2;
-    private System.Windows.Forms.TextBox qualityVariableNameTextBox;
-    private System.Windows.Forms.TextBox solutionVariableNameTextBox;
-  }
-}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISingleObjectiveSolutionSimilarityCalculatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISingleObjectiveSolutionSimilarityCalculatorView.cs	(revision 12101)
+++ 	(revision )
@@ -1,61 +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 HeuristicLab.MainForm;
-using HeuristicLab.MainForm.WindowsForms;
-
-namespace HeuristicLab.Optimization.Views {
-  [View("ISingleObjectiveSolutionSimilarityCalculator View")]
-  [Content(typeof(ISingleObjectiveSolutionSimilarityCalculator), true)]
-  public partial class ISingleObjectiveSolutionSimilarityCalculatorView : ISimilarityCalculatorView {
-    public ISingleObjectiveSolutionSimilarityCalculatorView() {
-      InitializeComponent();
-    }
-
-    public new ISingleObjectiveSolutionSimilarityCalculator Content {
-      get { return (ISingleObjectiveSolutionSimilarityCalculator)base.Content; }
-      set { base.Content = value; }
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content == null) {
-        solutionVariableNameTextBox.Clear();
-        qualityVariableNameTextBox.Clear();
-      } else {
-        solutionVariableNameTextBox.Text = Content.SolutionVariableName;
-        qualityVariableNameTextBox.Text = Content.QualityVariableName;
-      }
-    }
-
-    private void solutionVariableNameTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
-      if (Content != null && Content.SolutionVariableName != solutionVariableNameTextBox.Text) {
-        Content.SolutionVariableName = solutionVariableNameTextBox.Text;
-      }
-    }
-
-    private void qualityVariableNameTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
-      if (Content != null && Content.QualityVariableName != qualityVariableNameTextBox.Text) {
-        Content.QualityVariableName = qualityVariableNameTextBox.Text;
-      }
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.Designer.cs	(revision 12102)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.Designer.cs	(revision 12102)
@@ -0,0 +1,112 @@
+﻿#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
+
+namespace HeuristicLab.Optimization.Views {
+  partial class ISolutionSimilarityCalculatorView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.label1 = new System.Windows.Forms.Label();
+      this.label2 = new System.Windows.Forms.Label();
+      this.qualityVariableNameTextBox = new System.Windows.Forms.TextBox();
+      this.solutionVariableNameTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 6);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(135, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Variable Name of Solution: ";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 32);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(126, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Variable Name of Quality:";
+      // 
+      // qualityVariableNameTextBox
+      // 
+      this.qualityVariableNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.qualityVariableNameTextBox.Location = new System.Drawing.Point(144, 29);
+      this.qualityVariableNameTextBox.Name = "qualityVariableNameTextBox";
+      this.qualityVariableNameTextBox.Size = new System.Drawing.Size(287, 20);
+      this.qualityVariableNameTextBox.TabIndex = 2;
+      this.qualityVariableNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.qualityVariableNameTextBox_Validating);
+      // 
+      // solutionVariableNameTextBox
+      // 
+      this.solutionVariableNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.solutionVariableNameTextBox.Location = new System.Drawing.Point(144, 3);
+      this.solutionVariableNameTextBox.Name = "solutionVariableNameTextBox";
+      this.solutionVariableNameTextBox.Size = new System.Drawing.Size(287, 20);
+      this.solutionVariableNameTextBox.TabIndex = 3;
+      this.solutionVariableNameTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.solutionVariableNameTextBox_Validating);
+      // 
+      // ISingleObjectiveSolutionSimilarityCalculatorView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.solutionVariableNameTextBox);
+      this.Controls.Add(this.qualityVariableNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.label1);
+      this.Name = "ISingleObjectiveSolutionSimilarityCalculatorView";
+      this.Size = new System.Drawing.Size(434, 53);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox qualityVariableNameTextBox;
+    private System.Windows.Forms.TextBox solutionVariableNameTextBox;
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.cs	(revision 12102)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/ISolutionSimilarityCalculatorView.cs	(revision 12102)
@@ -0,0 +1,61 @@
+﻿#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 HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("ISolutionSimilarityCalculator View")]
+  [Content(typeof(ISolutionSimilarityCalculator), true)]
+  public partial class ISolutionSimilarityCalculatorView : AsynchronousContentView {
+    public ISolutionSimilarityCalculatorView() {
+      InitializeComponent();
+    }
+
+    public new ISolutionSimilarityCalculator Content {
+      get { return (ISolutionSimilarityCalculator)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        solutionVariableNameTextBox.Clear();
+        qualityVariableNameTextBox.Clear();
+      } else {
+        solutionVariableNameTextBox.Text = Content.SolutionVariableName;
+        qualityVariableNameTextBox.Text = Content.QualityVariableName;
+      }
+    }
+
+    private void solutionVariableNameTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (Content != null && Content.SolutionVariableName != solutionVariableNameTextBox.Text) {
+        Content.SolutionVariableName = solutionVariableNameTextBox.Text;
+      }
+    }
+
+    private void qualityVariableNameTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e) {
+      if (Content != null && Content.QualityVariableName != qualityVariableNameTextBox.Text) {
+        Content.QualityVariableName = qualityVariableNameTextBox.Text;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs	(revision 12102)
@@ -20,10 +20,17 @@
 #endregion
 
+using System;
+
 namespace HeuristicLab.Optimization {
+  // use HeuristicLab.Optimization.ISolutionSimilarityCalculator instead
+  // BackwardsCompatibility3.3
+  #region Backwards compatible code, remove with 3.4
   /// <summary>
   /// An interface which represents an operator for similarity calculation between single objective solutions.
   /// </summary>
+  [Obsolete("use HeuristicLab.Optimization.ISolutionSimilarityCalculator instead")]
   public interface ISingleObjectiveSolutionSimilarityCalculator : ISolutionSimilarityCalculator, ISingleObjectiveOperator {
 
   }
+  #endregion
 }
Index: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs	(revision 12102)
@@ -29,4 +29,5 @@
 using HeuristicLab.Encodings.BinaryVectorEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -251,4 +252,6 @@
       Operators.Add(new KnapsackSimultaneousPathRelinker());
       Operators.Add(new KnapsackSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.BinaryVectorParameter.ActualName });
+      Operators.Add(new NoSimilarityCalculator());
 
       Operators.Add(new BestKnapsackSolutionAnalyzer());
Index: trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Problems.TestFunctions/3.3/SingleObjectiveTestFunctionProblem.cs	(revision 12102)
@@ -29,4 +29,5 @@
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -260,4 +261,6 @@
       Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
       Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.RealVectorParameter.ActualName });
+      Operators.Add(new NoSimilarityCalculator());
 
       Operators.Add(new BestSingleObjectiveTestFunctionSolutionAnalyzer());
@@ -315,5 +318,6 @@
       try {
         BestKnownSolutionParameter.Value = Evaluator.GetBestKnownSolution(ProblemSize.Value);
-      } catch (ArgumentException e) {
+      }
+      catch (ArgumentException e) {
         ErrorHandling.ShowErrorDialog(e);
         ProblemSize.Value = Evaluator.MinimumProblemSize;
Index: trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Problems.TravelingSalesman/3.3/TravelingSalesmanProblem.cs	(revision 12102)
@@ -30,4 +30,5 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -233,4 +234,6 @@
       Operators.Add(new TSPSimultaneousPathRelinker());
       Operators.Add(new TSPSimilarityCalculator());
+      Operators.Add(new QualitySimilarityCalculator { QualityVariableName = SolutionCreator.PermutationParameter.ActualName });
+      Operators.Add(new NoSimilarityCalculator());
 
       Operators.Add(new BestTSPSolutionAnalyzer());
Index: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 12101)
+++ trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/VehicleRoutingProblem.cs	(revision 12102)
@@ -29,4 +29,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Operators;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -253,4 +254,6 @@
           ApplicationManager.Manager.GetInstances<IGeneralVRPOperator>().Cast<IOperator>()).OrderBy(op => op.Name));
         Operators.Add(new VRPSimilarityCalculator());
+        Operators.Add(new QualitySimilarityCalculator());
+        Operators.Add(new NoSimilarityCalculator());
         Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
 
@@ -284,8 +287,9 @@
           op.ParentsParameter.Hidden = true;
         }
-        foreach (VRPSimilarityCalculator op in Operators.OfType<VRPSimilarityCalculator>()) {
+        foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>()) {
           op.SolutionVariableName = SolutionCreator.VRPToursParameter.ActualName;
           op.QualityVariableName = ProblemInstance.SolutionEvaluator.QualityParameter.ActualName;
-          op.ProblemInstance = ProblemInstance;
+          var calc = op as VRPSimilarityCalculator;
+          if (calc != null) calc.ProblemInstance = ProblemInstance;
         }
       }
