Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 5446)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 5785)
@@ -19,5 +19,6 @@
     </UpgradeBackupLocation>
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile></TargetFrameworkProfile>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
     <PublishUrl>publish\</PublishUrl>
     <Install>true</Install>
@@ -96,4 +97,34 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -118,4 +149,5 @@
     <Compile Include="Crossovers\PositionBasedCrossover.cs" />
     <Compile Include="HeuristicLabEncodingsPermutationEncodingPlugin.cs" />
+    <Compile Include="Interfaces\IPermutationSwapMoveOperator.cs" />
     <Compile Include="Interfaces\IPermutationCreator.cs" />
     <Compile Include="Interfaces\IPermutationCrossover.cs" />
@@ -133,5 +165,18 @@
     <Compile Include="Manipulators\TranslocationInversionManipulator.cs" />
     <Compile Include="Manipulators\TranslocationManipulator.cs" />
+    <Compile Include="Moves\Edge.cs" />
     <Compile Include="Moves\PermutationMoveAttribute.cs" />
+    <Compile Include="Moves\StandardEdgeEqualityComparer.cs" />
+    <Compile Include="Moves\Swap\SwapMoveSoftTabuCriterion.cs" />
+    <Compile Include="Moves\Swap\ExhaustiveSwapMoveGenerator.cs" />
+    <Compile Include="Moves\Swap\StochasticSwapSingleMoveGenerator.cs" />
+    <Compile Include="Moves\Swap\SwapMoveAbsoluteAttribute.cs" />
+    <Compile Include="Moves\Swap\SwapMoveHardTabuCriterion.cs" />
+    <Compile Include="Moves\Swap\SwapMoveMaker.cs" />
+    <Compile Include="Moves\Swap\SwapMoveRelativeAttribute.cs" />
+    <Compile Include="Moves\Swap\SwapMoveTabuMaker.cs" />
+    <Compile Include="Moves\Swap\StochasticSwapMultiMoveGenerator.cs" />
+    <Compile Include="Moves\Swap\SwapMoveGenerator.cs" />
+    <Compile Include="Moves\Swap\SwapMove.cs" />
     <Compile Include="Moves\ThreeIndexMove.cs" />
     <Compile Include="Moves\ThreeOpt\StochasticSingleInsertionMoveGenerator.cs" />
@@ -176,47 +221,7 @@
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
-      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
-      <Name>HeuristicLab.Collections-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
-      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
-      <Name>HeuristicLab.Common.Resources-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
-      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
-      <Name>HeuristicLab.Common-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
-      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
-      <Name>HeuristicLab.Core-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
-      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
-      <Name>HeuristicLab.Data-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
-      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
-      <Name>HeuristicLab.Operators-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Optimization.Operators\3.3\HeuristicLab.Optimization.Operators-3.3.csproj">
-      <Project>{25087811-F74C-4128-BC86-8324271DA13E}</Project>
-      <Name>HeuristicLab.Optimization.Operators-3.3</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
       <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
-      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
-      <Name>HeuristicLab.Parameters-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
-      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
-      <Name>HeuristicLab.Persistence-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
-      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
-      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
     </ProjectReference>
   </ItemGroup>
@@ -238,4 +243,5 @@
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
@@ -255,3 +261,6 @@
 SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\HeuristicLabEncodingsPermutationEncodingPlugin.cs.frame" "%25ProjectDir%25\HeuristicLabEncodingsPermutationEncodingPlugin.cs"</PreBuildEvent>
   </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>copy "$(TargetPath)" "C:\Program Files\HeuristicLab 3.3\"</PostBuildEvent>
+  </PropertyGroup>
 </Project>
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Interfaces/IPermutationSwapMoveOperator.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Interfaces/IPermutationSwapMoveOperator.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Interfaces/IPermutationSwapMoveOperator.cs	(revision 5785)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Encodings.PermutationEncoding {
+  public interface IPermutationSwapMoveOperator : IPermutationMoveOperator {
+    ILookupParameter<SwapMove> SwapMoveParameter { get; }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs	(revision 5446)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Manipulators/Swap2Manipulator.cs	(revision 5785)
@@ -49,10 +49,14 @@
     /// <param name="permutation">The permutation to manipulate.</param>
     public static void Apply(IRandom random, Permutation permutation) {
-      int index1, index2, temp;
+      int index1, index2;
 
       index1 = random.Next(permutation.Length);
       index2 = random.Next(permutation.Length);
 
-      temp = permutation[index1];
+      Apply(permutation, index1, index2);
+    }
+
+    public static void Apply(Permutation permutation, int index1, int index2) {
+      int temp = permutation[index1];
       permutation[index1] = permutation[index2];
       permutation[index2] = temp;
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Edge.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Edge.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Edge.cs	(revision 5785)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("Edge", "An edge between two integer nodes and a flag for the direction.")]
+  [StorableClass]
+  public class Edge : Item {
+    [Storable]
+    public int Source { get; private set; }
+    [Storable]
+    public int Target { get; private set; }
+    [Storable]
+    public bool Bidirectional { get; private set; }
+
+    [StorableConstructor]
+    protected Edge(bool deserializing) : base(deserializing) { }
+    protected Edge(Edge original, Cloner cloner)
+      : base(original, cloner) {
+      Source = original.Source;
+      Target = original.Target;
+      Bidirectional = original.Bidirectional;
+    }
+    public Edge(int source, int target, bool bidirectional)
+      : base() {
+      Source = source;
+      Target = target;
+      Bidirectional = bidirectional;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Edge(this, cloner);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/StandardEdgeEqualityComparer.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/StandardEdgeEqualityComparer.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/StandardEdgeEqualityComparer.cs	(revision 5785)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  public class StandardEdgeEqualityComparer : EqualityComparer<Edge> {
+    public override bool Equals(Edge x, Edge y) {
+      bool inDirection = x.Source == y.Source && x.Target == y.Target;
+      if (!x.Bidirectional && !y.Bidirectional) return inDirection;
+      else return inDirection || x.Source == y.Target && x.Target == y.Source;
+    }
+
+    public override int GetHashCode(Edge edge) {
+      return (int)((long)edge.Source.GetHashCode() + (long)edge.Target.GetHashCode());
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/ExhaustiveSwapMoveGenerator.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/ExhaustiveSwapMoveGenerator.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/ExhaustiveSwapMoveGenerator.cs	(revision 5785)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("ExhaustiveSwapMoveGenerator", "Generates all possible swap moves from a given permutation.")]
+  [StorableClass]
+  public class ExhaustiveSwapMoveGenerator : SwapMoveGenerator, IExhaustiveMoveGenerator {
+    [StorableConstructor]
+    protected ExhaustiveSwapMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected ExhaustiveSwapMoveGenerator(ExhaustiveSwapMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public ExhaustiveSwapMoveGenerator() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExhaustiveSwapMoveGenerator(this, cloner);
+    }
+
+    public static SwapMove[] Apply(Permutation permutation) {
+      int length = permutation.Length;
+      if (length == 1) throw new ArgumentException("ExhaustiveSwapMoveGenerator: There cannot be an Swap move given a permutation of length 1.", "permutation");
+      int totalMoves = (length) * (length - 1) / 2;
+      SwapMove[] moves = null;
+      int count = 0;
+
+      if (permutation.PermutationType == PermutationTypes.RelativeUndirected) {
+        if (totalMoves - 3 > 0) {
+          moves = new SwapMove[totalMoves - 3];
+          for (int i = 0; i < length - 1; i++) {
+            for (int j = i + 1; j < length; j++) {
+              if (j - i >= length - 2) continue;
+              moves[count++] = new SwapMove(i, j);
+            }
+          }
+        } else { // when length is 3 or less, there's actually no difference, but for the sake of not crashing the algorithm create a dummy move
+          moves = new SwapMove[1];
+          moves[0] = new SwapMove(0, 1);
+        }
+      } else {
+        moves = new SwapMove[totalMoves];
+        for (int i = 0; i < length - 1; i++)
+          for (int j = i + 1; j < length; j++) {
+            moves[count++] = new SwapMove(i, j);
+          }
+      }
+      return moves;
+    }
+
+    protected override SwapMove[] GenerateMoves(Permutation permutation) {
+      return Apply(permutation);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapMultiMoveGenerator.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapMultiMoveGenerator.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapMultiMoveGenerator.cs	(revision 5785)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("StochasticSwapMultiMoveGenerator", "Randomly samples n from all possible swap moves from a given permutation.")]
+  [StorableClass]
+  public class StochasticSwapMultiMoveGenerator : SwapMoveGenerator, 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 StochasticSwapMultiMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticSwapMultiMoveGenerator(StochasticSwapMultiMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticSwapMultiMoveGenerator()
+      : 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 StochasticSwapMultiMoveGenerator(this, cloner);
+    }
+
+    public static SwapMove[] Apply(Permutation permutation, IRandom random, int sampleSize) {
+      int length = permutation.Length;
+      SwapMove[] moves = new SwapMove[sampleSize];
+      for (int i = 0; i < sampleSize; i++) {
+        moves[i] = StochasticSwapSingleMoveGenerator.Apply(permutation, random);
+      }
+      return moves;
+    }
+
+    protected override SwapMove[] GenerateMoves(Permutation permutation) {
+      IRandom random = RandomParameter.ActualValue;
+      return Apply(permutation, random, SampleSizeParameter.ActualValue.Value);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapSingleMoveGenerator.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapSingleMoveGenerator.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/StochasticSwapSingleMoveGenerator.cs	(revision 5785)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("StochasticSwapSingleMoveGenerator", "Randomly samples a single from all possible swap moves from a given permutation.")]
+  [StorableClass]
+  public class StochasticSwapSingleMoveGenerator : SwapMoveGenerator, IStochasticOperator, ISingleMoveGenerator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    [StorableConstructor]
+    protected StochasticSwapSingleMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected StochasticSwapSingleMoveGenerator(StochasticSwapSingleMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public StochasticSwapSingleMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StochasticSwapSingleMoveGenerator(this, cloner);
+    }
+
+    public static SwapMove Apply(Permutation permutation, IRandom random) {
+      int length = permutation.Length;
+      if (length == 1) throw new ArgumentException("StochasticSwapSingleMoveGenerator: There cannot be an Swap move given a permutation of length 1.", "permutation");
+      int index1 = random.Next(length - 1);
+      int index2 = random.Next(index1 + 1, length);
+      return new SwapMove(index1, index2);
+    }
+
+    protected override SwapMove[] GenerateMoves(Permutation permutation) {
+      IRandom random = RandomParameter.ActualValue;
+      return new SwapMove[] { Apply(permutation, random) };
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMove.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMove.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMove.cs	(revision 5785)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMove", "Item that describes a swap move.")]
+  [StorableClass]
+  public class SwapMove : TwoIndexMove {
+    [StorableConstructor]
+    protected SwapMove(bool deserializing) : base(deserializing) { }
+    protected SwapMove(SwapMove original, Cloner cloner) : base(original, cloner) { }
+    public SwapMove() : base() { }
+    public SwapMove(int index1, int index2) : base(index1, index2, null) { }
+    public SwapMove(int index1, int index2, Permutation permutation) : base(index1, index2, permutation) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMove(this, cloner);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveAbsoluteAttribute.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveAbsoluteAttribute.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveAbsoluteAttribute.cs	(revision 5785)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveAbsoluteAttribute", "Specifies the tabu attributes for a swap move on an absolute position permutation.")]
+  [StorableClass]
+  public class SwapMoveAbsoluteAttribute : PermutationMoveAttribute {
+    [Storable]
+    public int Index1 { get; private set; }
+    [Storable]
+    public int Number1 { get; private set; }
+    [Storable]
+    public int Index2 { get; private set; }
+    [Storable]
+    public int Number2 { get; private set; }
+
+    [StorableConstructor]
+    protected SwapMoveAbsoluteAttribute(bool deserializing) : base(deserializing) { }
+    protected SwapMoveAbsoluteAttribute(SwapMoveAbsoluteAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.Index1 = original.Index1;
+      this.Number1 = original.Number1;
+      this.Index2 = original.Index2;
+      this.Number2 = original.Number2;
+    }
+    public SwapMoveAbsoluteAttribute() : this(-1, -1, -1, -1, -1) { }
+    public SwapMoveAbsoluteAttribute(int index1, int number1, int index2, int number2, double moveQuality)
+      : base(moveQuality) {
+      Index1 = index1;
+      Number1 = number1;
+      Index2 = index2;
+      Number2 = number2;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveAbsoluteAttribute(this, cloner);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveGenerator.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveGenerator.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveGenerator.cs	(revision 5785)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveGenerator", "Base class for all swap move generators.")]
+  [StorableClass]
+  public abstract class SwapMoveGenerator : SingleSuccessorOperator, IPermutationSwapMoveOperator, IMoveGenerator {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<SwapMove> SwapMoveParameter {
+      get { return (LookupParameter<SwapMove>)Parameters["SwapMove"]; }
+    }
+    protected ScopeParameter CurrentScopeParameter {
+      get { return (ScopeParameter)Parameters["CurrentScope"]; }
+    }
+
+    [StorableConstructor]
+    protected SwapMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected SwapMoveGenerator(SwapMoveGenerator original, Cloner cloner) : base(original, cloner) { }
+    public SwapMoveGenerator()
+      : base() {
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The permutation for which moves should be generated."));
+      Parameters.Add(new LookupParameter<SwapMove>("SwapMove", "The moves that should be generated in subscopes."));
+      Parameters.Add(new ScopeParameter("CurrentScope", "The current scope where the moves should be added as subscopes."));
+    }
+
+    public override IOperation Apply() {
+      Permutation p = PermutationParameter.ActualValue;
+      SwapMove[] moves = GenerateMoves(p);
+      Scope[] moveScopes = new Scope[moves.Length];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString());
+        moveScopes[i].Variables.Add(new Variable(SwapMoveParameter.ActualName, moves[i]));
+      }
+      CurrentScopeParameter.ActualValue.SubScopes.AddRange(moveScopes);
+      return base.Apply();
+    }
+
+    protected abstract SwapMove[] GenerateMoves(Permutation permutation);
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveHardTabuCriterion.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveHardTabuCriterion.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveHardTabuCriterion.cs	(revision 5785)
@@ -0,0 +1,169 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveHardTabuCriterion", @"For relative postion encoded permutations it prevents readding of previously deleted edges as well as deleting previously added edges.
+  For absolute position encoded permutations it prevents moving a number if it was previously moved.
+
+If the aspiration condition is activated, a move will not be considered tabu against a move in the tabu list if it leads to a better solution than the quality recorded with the move in the tabu list.")]
+  [StorableClass]
+  public class SwapMoveHardTabuCriterion : SingleSuccessorOperator, IPermutationSwapMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<SwapMove> SwapMoveParameter {
+      get { return (LookupParameter<SwapMove>)Parameters["SwapMove"]; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (LookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected SwapMoveHardTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SwapMoveHardTabuCriterion(SwapMoveHardTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SwapMoveHardTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<SwapMove>("SwapMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveHardTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SwapMove move = SwapMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      int length = permutation.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+
+      if (permutation.PermutationType != PermutationTypes.Absolute)
+        isTabu = EvaluateRelativeTabuState(tabuList, move, permutation, moveQuality, maximization, useAspiration);
+      else isTabu = EvaluateAbsoluteTabuState(tabuList, move, permutation, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private static bool EvaluateRelativeTabuState(ItemList<IItem> tabuList, SwapMove move, Permutation permutation, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      StandardEdgeEqualityComparer eq = new StandardEdgeEqualityComparer();
+      bool bidirectional = permutation.PermutationType == PermutationTypes.RelativeUndirected;
+      List<Edge> deleted = new List<Edge>();
+      deleted.Add(new Edge(permutation.GetCircular(move.Index1 - 1), permutation[move.Index1], bidirectional));
+      deleted.Add(new Edge(permutation[move.Index1], permutation.GetCircular(move.Index1 + 1), bidirectional));
+      deleted.Add(new Edge(permutation.GetCircular(move.Index2 - 1), permutation[move.Index2], bidirectional));
+      deleted.Add(new Edge(permutation[move.Index2], permutation.GetCircular(move.Index2 + 1), bidirectional));
+      List<Edge> added = new List<Edge>();
+      added.Add(new Edge(permutation.GetCircular(move.Index1 - 1), permutation[move.Index2], bidirectional));
+      added.Add(new Edge(permutation[move.Index2], permutation.GetCircular(move.Index1 + 1), bidirectional));
+      added.Add(new Edge(permutation.GetCircular(move.Index2 - 1), permutation[move.Index1], bidirectional));
+      added.Add(new Edge(permutation[move.Index1], permutation.GetCircular(move.Index2 + 1), bidirectional));
+
+      foreach (IItem tabuMove in tabuList) {
+        SwapMoveRelativeAttribute relAttrib = (tabuMove as SwapMoveRelativeAttribute);
+        if (relAttrib != null
+          && (!useAspiration
+              || maximization && moveQuality <= relAttrib.MoveQuality
+              || !maximization && moveQuality >= relAttrib.MoveQuality)) {
+          for (int i = 0; i < relAttrib.AddedEdges.Count; i++) {
+            isTabu = eq.Equals(relAttrib.AddedEdges[i], deleted[0])
+                  || eq.Equals(relAttrib.AddedEdges[i], deleted[1])
+                  || eq.Equals(relAttrib.AddedEdges[i], deleted[2])
+                  || eq.Equals(relAttrib.AddedEdges[i], deleted[3]);
+            if (isTabu) break;
+          }
+          if (isTabu) break;
+          for (int i = 0; i < relAttrib.DeletedEdges.Count; i++) {
+            isTabu = eq.Equals(relAttrib.DeletedEdges[i], added[0])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[1])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[2])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[3]);
+            if (isTabu) break;
+          }
+        }
+        if (isTabu) break;
+      }
+      return isTabu;
+    }
+
+    private bool EvaluateAbsoluteTabuState(ItemList<IItem> tabuList, SwapMove move, Permutation permutation, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      foreach (IItem tabuMove in tabuList) {
+        SwapMoveAbsoluteAttribute attrib = (tabuMove as SwapMoveAbsoluteAttribute);
+        if (attrib != null
+          && (!useAspiration
+              || maximization && moveQuality <= attrib.MoveQuality
+              || !maximization && moveQuality >= attrib.MoveQuality)) {
+          int i1 = move.Index1;
+          int n1 = permutation[move.Index1];
+          int i2 = move.Index2;
+          int n2 = permutation[move.Index2];
+          if (attrib != null) {
+            if (attrib.Number1 == n1 || attrib.Number1 == n2
+              || attrib.Number2 == n2 || attrib.Number2 == n1)
+              isTabu = true;
+          }
+        }
+        if (isTabu) break;
+      }
+      return isTabu;
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveMaker.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveMaker.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveMaker.cs	(revision 5785)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveMaker", "Peforms a swap move on a given permutation and updates the quality.")]
+  [StorableClass]
+  public class SwapMoveMaker : SingleSuccessorOperator, IPermutationSwapMoveOperator, IMoveMaker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ILookupParameter<SwapMove> SwapMoveParameter {
+      get { return (ILookupParameter<SwapMove>)Parameters["SwapMove"]; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+
+    [StorableConstructor]
+    protected SwapMoveMaker(bool deserializing) : base(deserializing) { }
+    protected SwapMoveMaker(SwapMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public SwapMoveMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the solution."));
+      Parameters.Add(new LookupParameter<SwapMove>("SwapMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The relative quality of the move."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveMaker(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      SwapMove move = SwapMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      DoubleValue moveQuality = MoveQualityParameter.ActualValue;
+      DoubleValue quality = QualityParameter.ActualValue;
+
+      Swap2Manipulator.Apply(permutation, move.Index1, move.Index2);
+      quality.Value = moveQuality.Value;
+
+      return base.Apply();
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveRelativeAttribute.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveRelativeAttribute.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveRelativeAttribute.cs	(revision 5785)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveRelativeAttribute", "Specifies the tabu attributes for a swap move on a relative position permutation.")]
+  [StorableClass]
+  public class SwapMoveRelativeAttribute : PermutationMoveAttribute {
+    [Storable]
+    public ItemList<Edge> DeletedEdges { get; private set; }
+    [Storable]
+    public ItemList<Edge> AddedEdges { get; private set; }
+
+    [StorableConstructor]
+    protected SwapMoveRelativeAttribute(bool deserializing) : base(deserializing) { }
+    protected SwapMoveRelativeAttribute(SwapMoveRelativeAttribute original, Cloner cloner)
+      : base(original, cloner) {
+      this.DeletedEdges = cloner.Clone(original.DeletedEdges);
+      this.AddedEdges = cloner.Clone(original.AddedEdges);
+    }
+    public SwapMoveRelativeAttribute(double moveQuality)
+      : base(moveQuality) {
+      DeletedEdges = new ItemList<Edge>();
+      AddedEdges = new ItemList<Edge>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveRelativeAttribute(this, cloner);
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveSoftTabuCriterion.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveSoftTabuCriterion.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveSoftTabuCriterion.cs	(revision 5785)
@@ -0,0 +1,154 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveSoftTabuCriterion", @"For relative postion encoded permutations it just prevents readding of previously deleted edges, but allows deleting previously added edges.
+  For absolute position encoded permutations it prevents moving a number to a position it has previously occupied.
+
+If the aspiration condition is activated, a move will not be considered tabu against a move in the tabu list if it leads to a better solution than the quality recorded with the move in the tabu list.")]
+  [StorableClass]
+  public class SwapMoveSoftTabuCriterion : SingleSuccessorOperator, IPermutationSwapMoveOperator, ITabuChecker {
+    public override bool CanChangeName {
+      get { return false; }
+    }
+    public ILookupParameter<SwapMove> SwapMoveParameter {
+      get { return (LookupParameter<SwapMove>)Parameters["SwapMove"]; }
+    }
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (LookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<ItemList<IItem>> TabuListParameter {
+      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
+    }
+    public ILookupParameter<BoolValue> MoveTabuParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
+    }
+    public IValueLookupParameter<BoolValue> MaximizationParameter {
+      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
+      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
+    }
+
+    public BoolValue UseAspirationCriterion {
+      get { return UseAspirationCriterionParameter.Value; }
+      set { UseAspirationCriterionParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected SwapMoveSoftTabuCriterion(bool deserializing) : base(deserializing) { }
+    protected SwapMoveSoftTabuCriterion(SwapMoveSoftTabuCriterion original, Cloner cloner) : base(original, cloner) { }
+    public SwapMoveSoftTabuCriterion()
+      : base() {
+      Parameters.Add(new LookupParameter<SwapMove>("SwapMove", "The move to evaluate."));
+      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
+      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
+      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveSoftTabuCriterion(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
+      SwapMove move = SwapMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.ActualValue;
+      int length = permutation.Length;
+      double moveQuality = MoveQualityParameter.ActualValue.Value;
+      bool maximization = MaximizationParameter.ActualValue.Value;
+      bool useAspiration = UseAspirationCriterion.Value;
+      bool isTabu = false;
+
+      if (permutation.PermutationType != PermutationTypes.Absolute)
+        isTabu = EvaluateRelativeTabuState(tabuList, move, permutation, moveQuality, maximization, useAspiration);
+      else isTabu = EvaluateAbsoluteTabuState(tabuList, move, permutation, moveQuality, maximization, useAspiration);
+
+      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
+      return base.Apply();
+    }
+
+    private static bool EvaluateRelativeTabuState(ItemList<IItem> tabuList, SwapMove move, Permutation permutation, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      StandardEdgeEqualityComparer eq = new StandardEdgeEqualityComparer();
+      bool bidirectional = permutation.PermutationType == PermutationTypes.RelativeUndirected;
+      List<Edge> added = new List<Edge>();
+      added.Add(new Edge(permutation.GetCircular(move.Index1 - 1), permutation[move.Index2], bidirectional));
+      added.Add(new Edge(permutation[move.Index2], permutation.GetCircular(move.Index1 + 1), bidirectional));
+      added.Add(new Edge(permutation.GetCircular(move.Index2 - 1), permutation[move.Index1], bidirectional));
+      added.Add(new Edge(permutation[move.Index1], permutation.GetCircular(move.Index2 + 1), bidirectional));
+
+      foreach (IItem tabuMove in tabuList) {
+        SwapMoveRelativeAttribute relAttrib = (tabuMove as SwapMoveRelativeAttribute);
+        if (relAttrib != null
+          && (!useAspiration
+              || maximization && moveQuality <= relAttrib.MoveQuality
+              || !maximization && moveQuality >= relAttrib.MoveQuality)) {
+          for (int i = 0; i < relAttrib.DeletedEdges.Count; i++) {
+            isTabu = eq.Equals(relAttrib.DeletedEdges[i], added[0])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[1])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[2])
+                  || eq.Equals(relAttrib.DeletedEdges[i], added[3]);
+            if (isTabu) break;
+          }
+        }
+        if (isTabu) break;
+      }
+      return isTabu;
+    }
+
+    private bool EvaluateAbsoluteTabuState(ItemList<IItem> tabuList, SwapMove move, Permutation permutation, double moveQuality, bool maximization, bool useAspiration) {
+      bool isTabu = false;
+      foreach (IItem tabuMove in tabuList) {
+        SwapMoveAbsoluteAttribute attrib = (tabuMove as SwapMoveAbsoluteAttribute);
+        if (attrib != null
+          && (!useAspiration
+              || maximization && moveQuality <= attrib.MoveQuality
+              || !maximization && moveQuality >= attrib.MoveQuality)) {
+          int i1 = move.Index1;
+          int n1 = permutation[move.Index1];
+          int i2 = move.Index2;
+          int n2 = permutation[move.Index2];
+          if ((attrib.Index1 == i1 || attrib.Index1 == i2) && (attrib.Number1 == n1 || attrib.Number1 == n2)
+            || (attrib.Index2 == i2 || attrib.Index2 == i1) && (attrib.Number2 == n2 || attrib.Number2 == n1))
+            isTabu = true;
+        }
+        if (isTabu) break;
+      }
+      return isTabu;
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveTabuMaker.cs
===================================================================
--- branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveTabuMaker.cs	(revision 5785)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap/SwapMoveTabuMaker.cs	(revision 5785)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("SwapMoveTabuMaker", "Declares a given swap move as tabu, by adding its attributes to the tabu list and also store the solution quality or the move quality (whichever is better).")]
+  [StorableClass]
+  public class SwapMoveTabuMaker : TabuMaker, IPermutationSwapMoveOperator {
+    public ILookupParameter<Permutation> PermutationParameter {
+      get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; }
+    }
+    public ILookupParameter<SwapMove> SwapMoveParameter {
+      get { return (LookupParameter<SwapMove>)Parameters["SwapMove"]; }
+    }
+
+    [StorableConstructor]
+    protected SwapMoveTabuMaker(bool deserializing) : base(deserializing) { }
+    protected SwapMoveTabuMaker(SwapMoveTabuMaker original, Cloner cloner) : base(original, cloner) { }
+    public SwapMoveTabuMaker()
+      : base() {
+      Parameters.Add(new LookupParameter<SwapMove>("SwapMove", "The move that was made."));
+      Parameters.Add(new LookupParameter<Permutation>("Permutation", "The solution as permutation."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SwapMoveTabuMaker(this, cloner);
+    }
+
+    protected override IItem GetTabuAttribute(bool maximization, double quality, double moveQuality) {
+      SwapMove move = SwapMoveParameter.ActualValue;
+      Permutation permutation = PermutationParameter.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
+      if (permutation.PermutationType == PermutationTypes.Absolute)
+        return new SwapMoveAbsoluteAttribute(move.Index1, permutation[move.Index1], move.Index2, permutation[move.Index2], baseQuality);
+      else {
+        SwapMoveRelativeAttribute attrib = new SwapMoveRelativeAttribute(baseQuality);
+        bool bidirectional = permutation.PermutationType == PermutationTypes.RelativeUndirected;
+        attrib.DeletedEdges.Add(new Edge(permutation.GetCircular(move.Index1 - 1), permutation[move.Index1], bidirectional));
+        attrib.DeletedEdges.Add(new Edge(permutation[move.Index1], permutation.GetCircular(move.Index1 + 1), bidirectional));
+        attrib.DeletedEdges.Add(new Edge(permutation.GetCircular(move.Index2 - 1), permutation[move.Index2], bidirectional));
+        attrib.DeletedEdges.Add(new Edge(permutation[move.Index2], permutation.GetCircular(move.Index2 + 1), bidirectional));
+        attrib.AddedEdges.Add(new Edge(permutation.GetCircular(move.Index1 - 1), permutation[move.Index2], bidirectional));
+        attrib.AddedEdges.Add(new Edge(permutation[move.Index2], permutation.GetCircular(move.Index1 + 1), bidirectional));
+        attrib.AddedEdges.Add(new Edge(permutation.GetCircular(move.Index2 - 1), permutation[move.Index1], bidirectional));
+        attrib.AddedEdges.Add(new Edge(permutation[move.Index1], permutation.GetCircular(move.Index2 + 1), bidirectional));
+        return attrib;
+      }
+    }
+  }
+}
Index: branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/HeuristicLab.Encodings.PermutationEncoding-3.3.Tests.csproj
===================================================================
--- trunk/sources/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/HeuristicLab.Encodings.PermutationEncoding-3.3.Tests.csproj	(revision 5446)
+++ branches/QAP/HeuristicLab.Encodings.PermutationEncoding/3.3/Tests/HeuristicLab.Encodings.PermutationEncoding-3.3.Tests.csproj	(revision 5785)
@@ -90,4 +90,19 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86">
+      <HintPath>..\..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
     <Reference Include="System" />
@@ -125,39 +140,7 @@
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
-      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
-      <Name>HeuristicLab.Collections-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
-      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
-      <Name>HeuristicLab.Common-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
-      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
-      <Name>HeuristicLab.Core-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
-      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
-      <Name>HeuristicLab.Data-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
-      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
-      <Name>HeuristicLab.Operators-3.3</Name>
-    </ProjectReference>
     <ProjectReference Include="..\..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
       <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
       <Name>HeuristicLab.Optimization-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
-      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
-      <Name>HeuristicLab.Parameters-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
-      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
-      <Name>HeuristicLab.Persistence-3.3</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
-      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
-      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
