Index: branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/BinaryIteratedLocalSearch.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/BinaryIteratedLocalSearch.cs	(revision 14429)
+++ branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/BinaryIteratedLocalSearch.cs	(revision 14429)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.BinaryVectorEncoding.LocalSearch;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.LocalSearch {
+  [Item("Iterated Local Search (ILS)", "Performs a repeated local search by applying a kick to each previous local optimum.")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 999)]
+  [StorableClass]
+  public sealed class BinaryIteratedLocalSearch : IteratedLocalSearch<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector> {
+
+    [StorableConstructor]
+    private BinaryIteratedLocalSearch(bool deserializing) : base(deserializing) { }
+    private BinaryIteratedLocalSearch(BinaryIteratedLocalSearch original, Cloner cloner)
+      : base(original, cloner) { }
+    public BinaryIteratedLocalSearch() {
+      var ls = new ExhaustiveBitflip<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, LocalSearchContext<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector>>();
+      LocalSearchParameter.ValidValues.Add(ls);
+      //foreach (var ls in ApplicationManager.Manager.GetInstances<IBinaryLocalSearch<LocalSearchContext<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector>>>())
+        //LocalSearchParameter.ValidValues.Add(ls);
+      KickerParameter.ValidValues.Add(new SingleBitflipManipulator<LocalSearchContext<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector>>());
+      KickerParameter.ValidValues.Add(new MultiBitflipManipulator<LocalSearchContext<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector>>());
+      //foreach (var ls in ApplicationManager.Manager.GetInstances<IManipulator<LocalSearchContext<SingleObjectiveProblem<BinaryVectorEncoding, BinaryVector>, BinaryVectorEncoding, BinaryVector>>>())
+      //KickerParameter.ValidValues.Add(ls);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BinaryIteratedLocalSearch(this, cloner);
+    }
+  }
+}
Index: branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/HeuristicLab.Algorithms.LocalSearch-3.3.csproj
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/HeuristicLab.Algorithms.LocalSearch-3.3.csproj	(revision 13401)
+++ branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/HeuristicLab.Algorithms.LocalSearch-3.3.csproj	(revision 14429)
@@ -114,4 +114,7 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="BinaryIteratedLocalSearch.cs" />
+    <Compile Include="IteratedLocalSearch.cs" />
+    <Compile Include="LocalSearchContext.cs" />
     <Compile Include="LocalSearchImprovementOperator.cs" />
     <Compile Include="LocalSearchMainLoop.cs" />
@@ -150,4 +153,8 @@
       <Name>HeuristicLab.Data-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.BinaryVectorEncoding\3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj">
+      <Project>{66D249C3-A01D-42A8-82A2-919BC8EC3D83}</Project>
+      <Name>HeuristicLab.Encodings.BinaryVectorEncoding-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
Index: branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/IteratedLocalSearch.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/IteratedLocalSearch.cs	(revision 14429)
+++ branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/IteratedLocalSearch.cs	(revision 14429)
@@ -0,0 +1,107 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Threading;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Algorithms.SingleObjective;
+using HeuristicLab.Optimization.LocalSearch;
+using HeuristicLab.Optimization.Manipulation;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.LocalSearch {
+  [Item("Iterated Local Search (ILS)", "Performs a repeated local search by applying a kick to each previous local optimum.")]
+  [Creatable(CreatableAttribute.Categories.SingleSolutionAlgorithms, Priority = 999)]
+  [StorableClass]
+  public class IteratedLocalSearch<TProblem, TEncoding, TSolution> : HeuristicAlgorithm<LocalSearchContext<TProblem, TEncoding, TSolution>, TProblem, TEncoding, TSolution>
+      where TProblem : class, ISingleObjectiveProblem<TEncoding, TSolution>, ISingleObjectiveProblemDefinition<TEncoding, TSolution>
+      where TEncoding : class, IEncoding<TSolution>
+      where TSolution : class, ISolution {
+
+    public IConstrainedValueParameter<ILocalSearch<LocalSearchContext<TProblem, TEncoding, TSolution>>> LocalSearchParameter {
+      get { return (IConstrainedValueParameter<ILocalSearch<LocalSearchContext<TProblem, TEncoding, TSolution>>>)Parameters["LocalSearch"]; }
+    }
+    public IConstrainedValueParameter<IManipulator<LocalSearchContext<TProblem, TEncoding, TSolution>>> KickerParameter {
+      get { return (IConstrainedValueParameter<IManipulator<LocalSearchContext<TProblem, TEncoding, TSolution>>>)Parameters["Kicker"]; }
+    }
+
+    [Storable]
+    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+
+    [StorableConstructor]
+    protected IteratedLocalSearch(bool deserializing) : base(deserializing) { }
+    protected IteratedLocalSearch(IteratedLocalSearch<TProblem, TEncoding, TSolution> original, Cloner cloner)
+      : base(original, cloner) {
+      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+    }
+    public IteratedLocalSearch() {
+      ProblemAnalyzer = new MultiAnalyzer();
+      AlgorithmAnalyzer = new MultiAnalyzer();
+      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
+      AlgorithmAnalyzer.Operators.Add(qualityAnalyzer, true);
+
+      Parameters.Add(new ConstrainedValueParameter<ILocalSearch<LocalSearchContext<TProblem, TEncoding, TSolution>>>("LocalSearch", "The local search operator to use."));
+      Parameters.Add(new ConstrainedValueParameter<IManipulator<LocalSearchContext<TProblem, TEncoding, TSolution>>>("Kicker", "The manipulator operator that performs the kick."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IteratedLocalSearch<TProblem, TEncoding, TSolution>(this, cloner);
+    }
+
+    protected override void OnProblemChanged() {
+      base.OnProblemChanged();
+      qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
+      qualityAnalyzer.QualityParameter.Depth = 1;
+      qualityAnalyzer.QualityParameter.Hidden = true;
+    }
+
+    protected override void PerformInitialize(CancellationToken token) {
+      Context.Solution = CreateEmptySolutionScope();
+      RunOperator(Problem.Encoding.SolutionCreator, Context.Solution, token);
+      Evaluate(Context.Solution, token);
+      DoLocalSearch();
+    }
+
+    protected override void PerformIterate(CancellationToken token) {
+      Context.Iterations++;
+      KickerParameter.Value.Manipulate(Context);
+      DoLocalSearch();
+    }
+
+    private void DoLocalSearch() {
+      LocalSearchParameter.Value.Optimize(Context);
+    }
+
+    protected override void PerformAnalyze(CancellationToken token) {
+      base.PerformAnalyze(token);
+      IResult res;
+      if (!Results.TryGetValue("Iterations", out res)) {
+        res = new Result("Iterations", new IntValue(Context.Iterations));
+        Results.Add(res);
+      }
+      ((IntValue)res.Value).Value = Context.Iterations;
+    }
+  }
+}
Index: branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchContext.cs
===================================================================
--- branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchContext.cs	(revision 14429)
+++ branches/ProblemRefactoring/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchContext.cs	(revision 14429)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Algorithms.SingleObjective;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Algorithms.LocalSearch {
+  [Item("LocalSearchContext", "")]
+  [StorableClass]
+  public class LocalSearchContext<TProblem, TEncoding, TSolution> : HeuristicAlgorithmContext<TProblem, TEncoding, TSolution>,
+      ISingleObjectiveSolutionContext<TSolution>, IImprovementStepsContext, IIterationsContext
+      where TProblem : class, ISingleObjectiveProblem<TEncoding, TSolution>, ISingleObjectiveProblemDefinition<TEncoding, TSolution> // need both !?
+      where TEncoding : class, IEncoding<TSolution>
+      where TSolution: class, ISolution {
+
+    [Storable]
+    private ISingleObjectiveSolutionScope<TSolution> solution;
+    public ISingleObjectiveSolutionScope<TSolution> Solution {
+      get { return solution; }
+      set {
+        solution = value;
+        if (Scope.SubScopes.Count == 0)
+          Scope.SubScopes.Add(solution);
+        else Scope.SubScopes[0] = solution;
+      }
+    }
+
+    [Storable]
+    private int iterations;
+    public int Iterations {
+      get { return iterations; }
+      set { iterations = value; }
+    }
+
+    [Storable]
+    private int improvementSteps;
+    public int ImprovementSteps {
+      get { return improvementSteps; }
+      set { improvementSteps = value; }
+    }
+
+    [StorableConstructor]
+    private LocalSearchContext(bool deserializing) : base(deserializing) { }
+    private LocalSearchContext(LocalSearchContext<TProblem, TEncoding, TSolution> original, Cloner cloner)
+      : base(original, cloner) { }
+    public LocalSearchContext() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LocalSearchContext<TProblem, TEncoding, TSolution>(this, cloner);
+    }
+
+    IScope ISolutionContext.Solution { get { return solution; } }
+    ISolutionScope<TSolution> ISolutionContext<TSolution>.Solution { get { return solution; } }
+  }
+}
