Index: branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/LocalSearchImprovement.cs
===================================================================
--- branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/LocalSearchImprovement.cs	(revision 5603)
+++ branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/LocalSearchImprovement.cs	(revision 5609)
@@ -87,5 +87,4 @@
       : base() {
         loop = new LocalSearchMainLoop();
-        loop.ResultsParameter.Value = new VariableCollection();
 
         Parameters.Add(new /*Constrained*/ValueParameter<IMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution."));
@@ -143,12 +142,38 @@
     public override IOperation Apply() {
       Scope subScope = new Scope();
-      subScope.Parent = ExecutionContext.Scope;
+      Scope individual = new Scope();
 
-      IAtomicOperation op = ExecutionContext.CreateChildOperation(loop, subScope);
-      op.Operator.Execute((IExecutionContext)op, CancellationToken);
+      foreach (Variable var in ExecutionContext.Scope.Variables) {
+        individual.Variables.Add(var);
+      }
+      subScope.SubScopes.Add(individual);
 
-      ExecutionContext.Scope.SubScopes.Remove(subScope);
+      ExecutionContext.Scope.SubScopes.Add(subScope);
+      int index = subScope.Parent.SubScopes.IndexOf(subScope);
 
-      return base.Apply();
+      SubScopesProcessor processor = new SubScopesProcessor();
+      SubScopesRemover remover = new SubScopesRemover();
+
+      remover.RemoveAllSubScopes = false;
+      remover.SubScopeIndexParameter.Value = new IntValue(index);
+
+      for (int i = 0; i < index; i++) {
+        processor.Operators.Add(new EmptyOperator());
+      }
+
+      loop.MoveGeneratorParameter.Value = MoveGeneratorParameter.Value;
+      loop.MoveEvaluatorParameter.Value = MoveEvaluatorParameter.Value;
+      loop.MoveMakerParameter.Value = MoveMakerParameter.Value;
+      loop.MaximumIterationsParameter.Value = MaximumIterationsParameter.Value;
+
+      processor.Operators.Add(loop);
+      processor.Successor = remover;
+
+      IOperation next = base.Apply();
+      if (next as ExecutionContext != null) {
+        remover.Successor = (next as ExecutionContext).Operator;
+      }
+
+      return ExecutionContext.CreateOperation(processor);
     }
   }
Index: branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/ShakingOperator.cs
===================================================================
--- branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/ShakingOperator.cs	(revision 5603)
+++ branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/ShakingOperator.cs	(revision 5609)
@@ -65,8 +65,11 @@
       IOperator successor = null;
 
-      if (index >= operators.Count || index < 0) {
+      if (index >= operators.Count - 1) {
         ContinueParameter.ActualValue = new BoolValue(false);
       } else {
         ContinueParameter.ActualValue = new BoolValue(true);
+      }
+
+      if (index >= 0 && index < operators.Count) {
         successor = operators[index].Value;
       }
Index: branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearchMainLoop.cs
===================================================================
--- branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearchMainLoop.cs	(revision 5603)
+++ branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearchMainLoop.cs	(revision 5609)
@@ -126,4 +126,5 @@
       QualityComparator qualityComparator = new QualityComparator();
       ConditionalBranch improvesQualityBranch = new ConditionalBranch();
+      ConditionalBranch improvesQualityBranch2 = new ConditionalBranch();
 
       Assigner bestQualityUpdater = new Assigner();
@@ -134,5 +135,6 @@
       Assigner indexResetter = new Assigner();
 
-      SubScopesRemover remover = new SubScopesRemover();
+      SubScopesRemover remover1 = new SubScopesRemover();
+      SubScopesRemover remover2 = new SubScopesRemover();
       Placeholder analyzer2 = new Placeholder();
 
@@ -145,4 +147,5 @@
       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Iterations", new IntValue(0)));
       variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("Index", new DoubleValue(0)));
+      variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("Continue", new BoolValue(false)));
       variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("BestQuality", new DoubleValue(0)));
 
@@ -183,9 +186,10 @@
       evaluator.OperatorParameter.ActualName = EvaluatorParameter.Name;
 
-      qualityComparator.LeftSideParameter.ActualName = "OriginalQuality";
-      qualityComparator.RightSideParameter.ActualName = QualityParameter.Name;
+      qualityComparator.LeftSideParameter.ActualName = QualityParameter.Name;
+      qualityComparator.RightSideParameter.ActualName = "OriginalQuality";
       qualityComparator.ResultParameter.ActualName = "IsBetter";
 
       improvesQualityBranch.ConditionParameter.ActualName = "IsBetter";
+      improvesQualityBranch2.ConditionParameter.ActualName = "IsBetter";
 
       bestQualityUpdater.Name = "Update BestQuality";
@@ -194,4 +198,5 @@
 
       cleaner.Name = "Clean scope";
+      cleaner.ClearSubScopesParameter.Value = new BoolValue(false);
       originalRestorer.Name = "Restore original solution";
 
@@ -204,5 +209,5 @@
       indexResetter.RightSideParameter.Value = new IntValue(0);
 
-      remover.Name = "Remove subscope";
+      remover1.Name = remover2.Name = "Remove subscope";
 
       analyzer2.Name = "Analyzer (placeholder)";
@@ -253,13 +258,17 @@
       improvesQualityBranch.TrueBranch = bestQualityUpdater;
       improvesQualityBranch.FalseBranch = cleaner;
-      improvesQualityBranch.Successor = remover;
 
       bestQualityUpdater.Successor = indexResetter;
+      indexResetter.Successor = remover1;
 
       cleaner.Successor = originalRestorer;
-      originalRestorer.Successor = indexCounter;
+      originalRestorer.Successor = remover2;
+      remover2.Successor = indexCounter;
       /////////
-      indexTermination.TrueBranch = null;
-      indexTermination.FalseBranch = iterationInit;
+      indexTermination.TrueBranch = improvesQualityBranch2;
+      indexTermination.FalseBranch = null;
+
+      improvesQualityBranch2.TrueBranch = null;
+      improvesQualityBranch2.FalseBranch = createChild;
 
       iterationsCounter.Successor = iterationsComparator;
Index: branches/VNS/HeuristicLab.Operators/3.3/ScopeCleaner.cs
===================================================================
--- branches/VNS/HeuristicLab.Operators/3.3/ScopeCleaner.cs	(revision 5603)
+++ branches/VNS/HeuristicLab.Operators/3.3/ScopeCleaner.cs	(revision 5609)
@@ -24,4 +24,5 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Operators {
@@ -38,4 +39,16 @@
       get { return CurrentScopeParameter.ActualValue; }
     }
+    public ValueParameter<BoolValue> ClearSubScopesParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["ClearSubScopes"]; }
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      #region Backwards Compatibility
+      if (!Parameters.ContainsKey("ClearSubScopes")) {
+        Parameters.Add(new ValueParameter<BoolValue>("ClearSubScopes", "Indicates, if the subscopes should be cleared.", new BoolValue(false)));
+      }
+      #endregion
+    }
 
     [StorableConstructor]
@@ -47,4 +60,5 @@
       : base() {
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose variables and sub-scopes should be removed."));
+      Parameters.Add(new ValueParameter<BoolValue>("ClearSubScopes", "Indicates, if the subscopes should be cleared.", new BoolValue(false)));
     }
 
@@ -55,5 +69,6 @@
     public override IOperation Apply() {
       CurrentScope.Variables.Clear();
-      CurrentScope.SubScopes.Clear();
+      if(ClearSubScopesParameter.Value.Value)
+        CurrentScope.SubScopes.Clear();
       return base.Apply();
     }
