Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Experiment.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Experiment.cs	(revision 8086)
@@ -179,5 +179,5 @@
       experimentStopped = false;
       foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started))
-        if (clearRuns || optimizer.ExecutionState != ExecutionState.Prepared)
+        //if (clearRuns || optimizer.ExecutionState != ExecutionState.Prepared)
           optimizer.Prepare(clearRuns);
     }
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 8086)
@@ -114,4 +114,8 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Interfaces\IImprovementOperator.cs" />
+    <Compile Include="Interfaces\IPathRelinker.cs" />
+    <Compile Include="Interfaces\ISimilarityBasedOperator.cs" />
+    <Compile Include="Interfaces\ISimilarityCalculator.cs" />
     <Compile Include="RunCollectionModification\RunCollectionRunRemover.cs" />
     <Compile Include="Plugin.cs" />
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IImprovementOperator.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IImprovementOperator.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IImprovementOperator.cs	(revision 8086)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents an operator for improvement.
+  /// </summary>
+  public interface IImprovementOperator : IOperator {
+    IValueLookupParameter<IItem> TargetParameter { get; }
+  }
+}
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IPathRelinker.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IPathRelinker.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IPathRelinker.cs	(revision 8086)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents an operator for path relinking.
+  /// </summary>
+  public interface IPathRelinker : IOperator {
+    ILookupParameter<ItemArray<IItem>> ParentsParameter { get; }
+  }
+}
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs	(revision 8086)
@@ -29,5 +29,5 @@
   /// </summary>
   public interface IProblem : IParameterizedNamedItem {
-    IEnumerable<IOperator> Operators { get; }
+    IEnumerable<IItem> Operators { get; }
 
     event EventHandler OperatorsChanged;
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/ISimilarityCalculator.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/ISimilarityCalculator.cs	(revision 8086)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Interfaces/ISimilarityCalculator.cs	(revision 8086)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 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.Core;
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// An interface which represents an operator for similarity calculation.
+  /// </summary>
+  public interface ISimilarityCalculator : IItem {
+    string Target { get; set; }
+
+    double ExecuteCalculation(IScope left, IScope right);
+  }
+}
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/Problem.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 8086)
@@ -34,8 +34,7 @@
   [StorableClass]
   public abstract class Problem : ParameterizedNamedItem, IProblem {
-    private static readonly string OperatorsParameterName = "Operators";
-
-    public IFixedValueParameter<OperatorCollection> OperatorsParameter {
-      get { return (IFixedValueParameter<OperatorCollection>)Parameters[OperatorsParameterName]; }
+    private const string OperatorsParameterName = "Operators";
+    public IFixedValueParameter<ItemCollection<IItem>> OperatorsParameter {
+      get { return (IFixedValueParameter<ItemCollection<IItem>>)Parameters[OperatorsParameterName]; }
     }
 
@@ -53,5 +52,5 @@
     protected Problem()
       : base() {
-      Parameters.Add(new FixedValueParameter<OperatorCollection>(OperatorsParameterName, "The operators that the problem provides to the algorithms.", new OperatorCollection(), false));
+      Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
       OperatorsParameter.Hidden = true;
       RegisterEventHandlers();
@@ -60,11 +59,24 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      IParameter operatorsParam;
+      if (Parameters.TryGetValue(OperatorsParameterName, out operatorsParam)) {
+        var operators = operatorsParam.ActualValue as OperatorCollection;
+        if (operators != null) {
+          Parameters.Remove(OperatorsParameterName);
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(operators), false));
+          OperatorsParameter.Hidden = true;
+        }
+      }
+      #endregion
+
       RegisterEventHandlers();
     }
 
     private void RegisterEventHandlers() {
-      Operators.ItemsAdded += new CollectionItemsChangedEventHandler<IOperator>(Operators_Changed);
-      Operators.ItemsRemoved += new CollectionItemsChangedEventHandler<IOperator>(Operators_Changed);
-      Operators.CollectionReset += new CollectionItemsChangedEventHandler<IOperator>(Operators_Changed);
+      Operators.ItemsAdded += new CollectionItemsChangedEventHandler<IItem>(Operators_Changed);
+      Operators.ItemsRemoved += new CollectionItemsChangedEventHandler<IItem>(Operators_Changed);
+      Operators.CollectionReset += new CollectionItemsChangedEventHandler<IItem>(Operators_Changed);
     }
 
@@ -72,21 +84,28 @@
     // BackwardsCompatibility3.3
     #region Backwards compatible code, remove with 3.4
-    [Storable(Name = "Operators")]
+    [Storable(Name = "Operators", AllowOneWay = true)]
     private IEnumerable<IOperator> StorableOperators {
-      get { return null; }
       set {
+        IParameter operatorsParam;
+        if (Parameters.TryGetValue(OperatorsParameterName, out operatorsParam)) {
+          var items = operatorsParam.ActualValue as ItemCollection<IItem>;
+          if (items == null) Parameters.Remove(operatorsParam);
+        }
+
+        //necessary to convert old experiments files where no parameter was used for saving the operators
         if (!Parameters.ContainsKey(OperatorsParameterName)) {
-          Parameters.Add(new FixedValueParameter<OperatorCollection>(OperatorsParameterName, "The operators that the problem provides to the algorithms.", new OperatorCollection(value), false));
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
           OperatorsParameter.Hidden = true;
         }
+        if (value != null) Operators.AddRange(value);
       }
     }
     #endregion
-    protected OperatorCollection Operators {
+    protected ItemCollection<IItem> Operators {
       get {
         // BackwardsCompatibility3.3
         #region Backwards compatible code, remove with 3.4
         if (!Parameters.ContainsKey(OperatorsParameterName)) {
-          Parameters.Add(new FixedValueParameter<OperatorCollection>(OperatorsParameterName, "The operators that the problem provides to the algorithms.", new OperatorCollection(), false));
+          Parameters.Add(new FixedValueParameter<ItemCollection<IItem>>(OperatorsParameterName, "The operators and items that the problem provides to the algorithms.", new ItemCollection<IItem>(), false));
           OperatorsParameter.Hidden = true;
         }
@@ -95,5 +114,5 @@
       }
     }
-    IEnumerable<IOperator> IProblem.Operators { get { return Operators; } }
+    IEnumerable<IItem> IProblem.Operators { get { return Operators; } }
     #endregion
 
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 8086)
@@ -81,6 +81,6 @@
       get { return (OptionalValueParameter<IScope>)Parameters["BestKnownSolution"]; }
     }
-    public ValueParameter<ItemList<IOperator>> OperatorsParameter {
-      get { return (ValueParameter<ItemList<IOperator>>)Parameters["Operators"]; }
+    public ValueParameter<ItemList<IItem>> OperatorsParameter {
+      get { return (ValueParameter<ItemList<IItem>>)Parameters["Operators"]; }
     }
     #endregion
@@ -112,5 +112,5 @@
       set { BestKnownQualityParameter.Value = value; }
     }
-    public IEnumerable<IOperator> Operators {
+    public IEnumerable<IItem> Operators {
       get { return OperatorsParameter.Value; }
     }
@@ -121,4 +121,13 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code, remove with 3.4
+      if (Parameters.ContainsKey("Operators") && Parameters["Operators"] is ValueParameter<ItemList<IOperator>>) {
+        ItemList<IOperator> tmp = ((ValueParameter<ItemList<IOperator>>)Parameters["Operators"]).Value;
+        Parameters.Remove("Operators");
+        Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>(tmp), false));
+      }
+      #endregion
+
       RegisterEventHandlers();
     }
@@ -130,5 +139,5 @@
       Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this problem."));
       Parameters.Add(new OptionalValueParameter<IScope>("BestKnownSolution", "The best known solution for this external evaluation problem."));
-      Parameters.Add(new ValueParameter<ItemList<IOperator>>("Operators", "The operators that are passed to the algorithm.", new ItemList<IOperator>()));
+      Parameters.Add(new ValueParameter<ItemList<IItem>>("Operators", "The operators and items that the problem provides to the algorithms.", new ItemList<IItem>()));
 
       RegisterEventHandlers();
@@ -200,7 +209,7 @@
         Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
       OperatorsParameter.ValueChanged += new EventHandler(OperatorsParameter_ValueChanged);
-      OperatorsParameter.Value.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOperator>>(OperatorsParameter_Value_ItemsAdded);
-      OperatorsParameter.Value.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOperator>>(OperatorsParameter_Value_ItemsRemoved);
-      OperatorsParameter.Value.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOperator>>(OperatorsParameter_Value_CollectionReset);
+      OperatorsParameter.Value.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_ItemsAdded);
+      OperatorsParameter.Value.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_ItemsRemoved);
+      OperatorsParameter.Value.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IItem>>(OperatorsParameter_Value_CollectionReset);
     }
 
@@ -209,5 +218,5 @@
       if (Evaluator != null) {
         string qualityName = Evaluator.QualityParameter.ActualName;
-        foreach (IOperator op in OperatorsParameter.Value) {
+        foreach (IOperator op in OperatorsParameter.Value.OfType<IOperator>()) {
           foreach (ILookupParameter<DoubleValue> param in op.Parameters.OfType<ILookupParameter<DoubleValue>>()) {
             if (param.Name.Equals("Quality")) param.ActualName = qualityName;
Index: branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/RunCollection.cs
===================================================================
--- branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 7787)
+++ branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/RunCollection.cs	(revision 8086)
@@ -126,4 +126,5 @@
       parameterNames.Clear();
       resultNames.Clear();
+      dataTypes.Clear();
       foreach (IRun run in items) {
         foreach (KeyValuePair<string, IItem> parameter in run.Parameters)
