Index: /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs	(revision 11300)
@@ -38,5 +38,5 @@
   [Item("LocalSearchImprovementOperator", "A local search improvement operator.")]
   [StorableClass]
-  public sealed class LocalSearchImprovementOperator : SingleSuccessorOperator, ILocalImprovementOperator, IStochasticOperator {
+  public sealed class LocalSearchImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator {
     #region IGenericLocalImprovementOperator Properties
     public Type ProblemType { get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } }
Index: /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs	(revision 11300)
@@ -38,5 +38,5 @@
   [Item("SimulatedAnnealingImprovementOperator", "A simulated annealing improvement operator.")]
   [StorableClass]
-  public sealed class SimulatedAnnealingImprovementOperator : SingleSuccessorOperator, ILocalImprovementOperator, IStochasticOperator {
+  public sealed class SimulatedAnnealingImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator {
     #region IGenericLocalImprovementOperator Properties
     public Type ProblemType { get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } }
Index: /trunk/sources/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs
===================================================================
--- /trunk/sources/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs	(revision 11300)
@@ -283,10 +283,12 @@
     private void ParameterizeLocalImprovementOperators() {
       foreach (ILocalImprovementOperator op in LocalImprovementParameter.ValidValues) {
-        if (op != LocalImprovementParameter.Value) op.Problem = null;
         op.MaximumIterationsParameter.Value = null;
         op.MaximumIterationsParameter.ActualName = LocalImprovementMaximumIterationsParameter.Name;
-      }
-      if (LocalImprovementParameter.Value != null)
-        LocalImprovementParameter.Value.Problem = Problem;
+
+        var algOp = op as ILocalImprovementAlgorithmOperator;
+        if (algOp != null && algOp != LocalImprovementParameter.Value) algOp.Problem = null;
+      }
+      if (LocalImprovementParameter.Value is ILocalImprovementAlgorithmOperator)
+        ((ILocalImprovementAlgorithmOperator)LocalImprovementParameter.Value).Problem = Problem;
     }
     private void InitializeLocalImprovementOperators() {
@@ -294,11 +296,18 @@
         LocalImprovementParameter.ValidValues.Clear();
       } else {
-        foreach (var entry in LocalImprovementParameter.ValidValues.ToList()) {
-          if (!entry.ProblemType.IsAssignableFrom(Problem.GetType())) {
-            LocalImprovementParameter.ValidValues.Remove(entry);
+        foreach (var algOp in LocalImprovementParameter.ValidValues.OfType<ILocalImprovementAlgorithmOperator>()) {
+          if (!algOp.ProblemType.IsInstanceOfType(Problem)) {
+            LocalImprovementParameter.ValidValues.Remove(algOp);
           }
         }
-        foreach (ILocalImprovementOperator op in ApplicationManager.Manager.GetInstances<ILocalImprovementOperator>().Where(x => x.ProblemType.IsAssignableFrom(Problem.GetType()))) {
-          if (!LocalImprovementParameter.ValidValues.Any(x => x.GetType() == op.GetType()))
+        // Regular ILocalImprovementOperators queried from Problem
+        foreach (var op in Problem.Operators.OfType<ILocalImprovementOperator>().Where(x => !(x is ILocalImprovementAlgorithmOperator))) {
+          LocalImprovementParameter.ValidValues.Add(op);
+        }
+        // ILocalImprovementAlgorithmOperators queried from ApplicationManager
+        var algOps = ApplicationManager.Manager.GetInstances<ILocalImprovementAlgorithmOperator>()
+                                               .Where(x => x.ProblemType.IsInstanceOfType(Problem));
+        foreach (var op in algOps) {
+          if (LocalImprovementParameter.ValidValues.All(x => x.GetType() != op.GetType()))
             LocalImprovementParameter.ValidValues.Add(op);
         }
Index: /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 11299)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 11300)
@@ -114,4 +114,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Interfaces\ILocalImprovementAlgorithmOperator.cs" />
     <Compile Include="Interfaces\ISingleObjectivePathRelinker.cs" />
     <Compile Include="Interfaces\ISingleObjectiveImprovementOperator.cs" />
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementAlgorithmOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementAlgorithmOperator.cs	(revision 11300)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementAlgorithmOperator.cs	(revision 11300)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public interface ILocalImprovementAlgorithmOperator : ILocalImprovementOperator {
+    Type ProblemType { get; }
+    IProblem Problem { get; set; }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementOperator.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Optimization/3.3/Interfaces/ILocalImprovementOperator.cs	(revision 11300)
@@ -20,5 +20,4 @@
 #endregion
 
-using System;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -26,6 +25,4 @@
 namespace HeuristicLab.Optimization {
   public interface ILocalImprovementOperator : IOperator {
-    Type ProblemType { get; }
-    IProblem Problem { get; set; }
     IValueLookupParameter<IntValue> MaximumIterationsParameter { get; }
     ILookupParameter<IntValue> EvaluatedSolutionsParameter { get; }
Index: /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs	(revision 11300)
@@ -35,15 +35,4 @@
   [StorableClass]
   public class QAPExhaustiveInsertionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
-
-    public Type ProblemType {
-      get { return typeof(QuadraticAssignmentProblem); }
-    }
-
-    [Storable]
-    private QuadraticAssignmentProblem problem;
-    public IProblem Problem {
-      get { return problem; }
-      set { problem = (QuadraticAssignmentProblem)value; }
-    }
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
@@ -87,5 +76,4 @@
     protected QAPExhaustiveInsertionLocalImprovement(QAPExhaustiveInsertionLocalImprovement original, Cloner cloner)
       : base(original, cloner) {
-      this.problem = cloner.Clone(original.problem);
     }
     public QAPExhaustiveInsertionLocalImprovement()
Index: /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs	(revision 11300)
@@ -35,15 +35,4 @@
   [StorableClass]
   public class QAPExhaustiveInversionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
-
-    public Type ProblemType {
-      get { return typeof(QuadraticAssignmentProblem); }
-    }
-
-    [Storable]
-    private QuadraticAssignmentProblem problem;
-    public IProblem Problem {
-      get { return problem; }
-      set { problem = (QuadraticAssignmentProblem)value; }
-    }
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
@@ -87,5 +76,4 @@
     protected QAPExhaustiveInversionLocalImprovement(QAPExhaustiveInversionLocalImprovement original, Cloner cloner)
       : base(original, cloner) {
-      this.problem = cloner.Clone(original.problem);
     }
     public QAPExhaustiveInversionLocalImprovement()
Index: /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs	(revision 11300)
@@ -35,15 +35,4 @@
   [StorableClass]
   public class QAPExhaustiveSwap2LocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
-
-    public Type ProblemType {
-      get { return typeof(QuadraticAssignmentProblem); }
-    }
-
-    [Storable]
-    private QuadraticAssignmentProblem problem;
-    public IProblem Problem {
-      get { return problem; }
-      set { problem = (QuadraticAssignmentProblem)value; }
-    }
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
@@ -91,5 +80,4 @@
     protected QAPExhaustiveSwap2LocalImprovement(QAPExhaustiveSwap2LocalImprovement original, Cloner cloner)
       : base(original, cloner) {
-      this.problem = cloner.Clone(original.problem);
     }
     public QAPExhaustiveSwap2LocalImprovement()
Index: /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs	(revision 11300)
@@ -35,15 +35,4 @@
   [StorableClass]
   public class QAPStochasticScrambleLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, IStochasticOperator {
-
-    public Type ProblemType {
-      get { return typeof(QuadraticAssignmentProblem); }
-    }
-
-    [Storable]
-    private QuadraticAssignmentProblem problem;
-    public IProblem Problem {
-      get { return problem; }
-      set { problem = (QuadraticAssignmentProblem)value; }
-    }
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
@@ -95,5 +84,4 @@
     protected QAPStochasticScrambleLocalImprovement(QAPStochasticScrambleLocalImprovement original, Cloner cloner)
       : base(original, cloner) {
-      this.problem = cloner.Clone(original.problem);
     }
     public QAPStochasticScrambleLocalImprovement()
Index: /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.QuadraticAssignment/3.3/QuadraticAssignmentProblem.cs	(revision 11300)
@@ -302,5 +302,10 @@
       Operators.Add(new QAPAlleleFrequencyAnalyzer());
       Operators.Add(new QAPPopulationDiversityAnalyzer());
+
+      Operators.Add(new QAPExhaustiveInsertionLocalImprovement());
+      Operators.Add(new QAPExhaustiveInversionLocalImprovement());
+      Operators.Add(new QAPStochasticScrambleLocalImprovement());
       Operators.Add(new QAPExhaustiveSwap2LocalImprovement());
+
       Operators.Add(new QAPSimilarityCalculator());
       ParameterizeAnalyzers();
Index: /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 11299)
+++ /trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 11300)
@@ -37,14 +37,4 @@
   [StorableClass]
   public class AlbaLambdaInterchangeLocalImprovementOperator : VRPOperator, IStochasticOperator, ILocalImprovementOperator {
-    public Type ProblemType {
-      get { return typeof(VehicleRoutingProblem); }
-    }
-
-    [Storable]
-    private VehicleRoutingProblem problem;
-    public IProblem Problem {
-      get { return problem; }
-      set { problem = (VehicleRoutingProblem)value; }
-    }
 
     public IValueLookupParameter<IntValue> MaximumIterationsParameter {
@@ -84,5 +74,4 @@
     protected AlbaLambdaInterchangeLocalImprovementOperator(AlbaLambdaInterchangeLocalImprovementOperator original, Cloner cloner)
       : base(original, cloner) {
-        this.problem = cloner.Clone(original.problem);
     }
     public AlbaLambdaInterchangeLocalImprovementOperator()
@@ -102,5 +91,5 @@
     }
 
-    public static void Apply(AlbaEncoding solution, int maxIterations, 
+    public static void Apply(AlbaEncoding solution, int maxIterations,
       int lambda, int samples, IRandom random, IVRPProblemInstance problemInstance, ref double quality, out int evaluatedSolutions) {
       evaluatedSolutions = 0;
@@ -120,5 +109,5 @@
           }
         }
-        if (bestMove != null) 
+        if (bestMove != null)
           AlbaLambdaInterchangeMoveMaker.Apply(solution, bestMove);
       }
