Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMove.cs	(revision 9495)
@@ -22,10 +22,12 @@
 using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.BinPacking.Interfaces;
 
 namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
   [Item("Single Grouping Move", "A move on a grouping vector that is specified by a single group-assignment-index.")]
   [StorableClass]
-  public class SingleGroupingMove : Item {
+  public class SingleGroupingMove : Item, IPackingMove{
     [Storable]
     public int Index { get; protected set; }
@@ -53,4 +55,11 @@
       return new SingleGroupingMove(this, cloner);
     }
+
+    public IPackingSolutionEncoding GetSolutionAfterMove() {
+      GroupingVectorEncoding newSolution = new GroupingVectorEncoding();
+      newSolution.GroupingVector = new IntegerVector(GroupingVector.GroupingVector);
+      newSolution.GroupingVector[Index] = NewGroup;
+      return newSolution;
+    }
   }
 }
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveGenerator.cs	(revision 9495)
@@ -38,6 +38,6 @@
       get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
     }
-    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
-      get { return (LookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (LookupParameter<IPackingMove>)Parameters["PackingMove"]; }
     }
     protected ScopeParameter CurrentScopeParameter {
@@ -51,5 +51,5 @@
       : base() {
       Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The grouping vector for which moves should be generated."));
-      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The moves that should be generated in subscopes."));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
     }
@@ -61,5 +61,5 @@
       for (int i = 0; i < moveScopes.Length; i++) {
         moveScopes[i] = new Scope(i.ToString());
-        moveScopes[i].Variables.Add(new Variable(SingleGroupingMoveParameter.ActualName, moves[i]));
+        moveScopes[i].Variables.Add(new Variable(PackingMoveParameter.ActualName, moves[i]));
       }
       CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveHardTabuCriterion.cs	(revision 9495)
@@ -38,6 +38,6 @@
       get { return false; }
     }
-    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
-      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
     }
     public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
@@ -65,5 +65,5 @@
     public SingleGroupingMoveHardTabuCriterion()
       : base() {
-      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
       Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
       Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
@@ -80,5 +80,5 @@
     public override IOperation Apply() {
       ItemList<IItem> tabuList = TabuListParameter.ActualValue;
-      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      SingleGroupingMove move = PackingMoveParameter.ActualValue as SingleGroupingMove;
       GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
       int length = groupingVector.GroupingVector.Length;
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveMaker.cs	(revision 9495)
@@ -42,9 +42,15 @@
       get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
     }
-    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
-      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
     }
     public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
       get { return (ILookupParameter<GroupingVectorEncoding>)Parameters["GroupingVector"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlan"]; }
+    }
+    public ILookupParameter<IPackingPlan> PackingPlanAfterMoveParameter {
+      get { return (ILookupParameter<IPackingPlan>)Parameters["PackingPlanAfterMove"]; }
     }
 
@@ -55,7 +61,9 @@
       : base() {
       Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
-      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
       Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
       Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution as grouping vector."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlan", "The currently best performing, decoded bin-packing solution represented as generalized packing-plan."));
+      Parameters.Add(new LookupParameter<IPackingPlan>("PackingPlanAfterMove", "The moved and decoded bin-packing solution represented as generalized packing-plan."));
     }
 
@@ -65,10 +73,11 @@
 
     public override IOperation Apply() {
-      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      IPackingMove move = PackingMoveParameter.ActualValue;
       GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
       DoubleValue moveQuality = MoveQualityParameter.ActualValue;
       DoubleValue quality = QualityParameter.ActualValue;
 
-      groupingVector.GroupingVector[move.Index] = move.NewGroup;
+      groupingVector.GroupingVector = (move.GetSolutionAfterMove() as GroupingVectorEncoding).GroupingVector;
+      PackingPlanParameter.ActualValue = PackingPlanAfterMoveParameter.ActualValue;
 
       quality.Value = moveQuality.Value;
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingMoveSoftTabuCriterion.cs	(revision 9495)
@@ -38,6 +38,6 @@
       get { return false; }
     }
-    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
-      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
     }
     public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
@@ -65,5 +65,5 @@
     public SingleGroupingMoveSoftTabuCriterion()
       : base() {
-      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
       Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
       Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
@@ -80,5 +80,5 @@
     public override IOperation Apply() {
       ItemList<IItem> tabuList = TabuListParameter.ActualValue;
-      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      SingleGroupingMove move = PackingMoveParameter.ActualValue as SingleGroupingMove;
       GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;
       int length = groupingVector.GroupingVector.Length;
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs	(revision 9440)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/SingleGroupingTabuMaker.cs	(revision 9495)
@@ -32,6 +32,6 @@
   [StorableClass]
   public class SingleGroupingTabuMaker : TabuMaker, IGroupingVectorMoveOperator{
-    public ILookupParameter<SingleGroupingMove> SingleGroupingMoveParameter {
-      get { return (ILookupParameter<SingleGroupingMove>)Parameters["SingleGroupingMove"]; }
+    public ILookupParameter<IPackingMove> PackingMoveParameter {
+      get { return (ILookupParameter<IPackingMove>)Parameters["PackingMove"]; }
     }
     public ILookupParameter<GroupingVectorEncoding> GroupingVectorParameter {
@@ -44,5 +44,5 @@
     public SingleGroupingTabuMaker()
       : base() {
-      Parameters.Add(new LookupParameter<SingleGroupingMove>("SingleGroupingMove", "The move to evaluate."));
+        Parameters.Add(new LookupParameter<IPackingMove>("PackingMove", "The move to evaluate."));
       Parameters.Add(new LookupParameter<GroupingVectorEncoding>("GroupingVector", "The solution to evaluate."));
     }
@@ -53,11 +53,15 @@
 
     protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
-      SingleGroupingMove move = SingleGroupingMoveParameter.ActualValue;
+      IPackingMove move = PackingMoveParameter.ActualValue;
       GroupingVectorEncoding groupingVector = GroupingVectorParameter.ActualValue;    
       double baseQuality = moveQuality;
       if (maximization && quality > moveQuality || !maximization && quality < moveQuality) 
         baseQuality = quality; // we make an uphill move, the lower bound is the solution quality
-            
-      return new SingleGroupingMoveAttribute (move.Index, move.NewGroup, baseQuality);
+
+      var sgMove = move as SingleGroupingMove;
+      if (sgMove != null)
+        return new SingleGroupingMoveAttribute(sgMove.Index, sgMove.NewGroup, baseQuality);
+      else
+        return move.GetSolutionAfterMove();
     }
   }
Index: branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/StochasticSingleGroupingMoveGenerator.cs
===================================================================
--- branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/StochasticSingleGroupingMoveGenerator.cs	(revision 9495)
+++ branches/HeuristicLab.BinPacking/HeuristicLab.Problems.BinPacking/3.3/Encodings/GroupingVector/Moves/SingleGrouping/StochasticSingleGroupingMoveGenerator.cs	(revision 9495)
@@ -0,0 +1,82 @@
+﻿#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 System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PackingEncoding.GroupingVector {
+  [Item("Stochastic SingleGrouping Move Generator", "Generates a number of possible grouping moves from a given grouping vector.")]
+  [StorableClass]
+  public class StochasticSingleGroupingMoveGenerator : SingleGroupingMoveGenerator, IMultiMoveGenerator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public IntValue SampleSize {
+      get { return SampleSizeParameter.Value; }
+      set { SampleSizeParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected StochasticSingleGroupingMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticSingleGroupingMoveGenerator(StochasticSingleGroupingMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticSingleGroupingMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to generate."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticSingleGroupingMoveGenerator(this, cloner);
+    }
+
+    public static SingleGroupingMove[] Apply(GroupingVectorEncoding groupingVector, IRandom random, int sampleSize) {
+
+      int nrOfBins = 0;
+      foreach (int binNr in groupingVector.GroupingVector) {
+        if (binNr > nrOfBins)
+          nrOfBins = binNr;
+      }
+      nrOfBins++;
+      var generatedMoves = new List<SingleGroupingMove>();
+      var moves = new List<SingleGroupingMove>(ExhaustiveSingleGroupingMoveGenerator.Generate(groupingVector, nrOfBins));
+      int moveCount = moves.Count;
+      for (int i = 0; i < sampleSize; i++) {
+        generatedMoves.Add(moves[random.Next(moveCount)]);
+      }
+
+      return generatedMoves.ToArray();
+    }
+
+    protected override SingleGroupingMove[] GenerateMoves(GroupingVectorEncoding SingleGrouping) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(SingleGrouping, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
