Index: trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/CyclicCrossover.cs	(revision 2830)
@@ -54,5 +54,5 @@
       if (parent1.Length != parent2.Length) throw new ArgumentException("CyclicCrossover: The parent permutations are of unequal length");
       int length = parent1.Length;
-      Permutation result = new Permutation(length);
+      int[] result = new int[length];
       bool[] indexCopied = new bool[length];
       int[] invParent1 = new int[length];
@@ -89,5 +89,5 @@
       } while (j < length);
 
-      return result;
+      return new Permutation(result);
     }
 
Index: trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/InversionManipulator.cs	(revision 2830)
@@ -31,5 +31,4 @@
   [Creatable("Test")]
   public class InversionManipulator : PermutationManipulator {
-
     /// <summary>
     /// Inverts a randomly chosen part of a permutation.
@@ -38,18 +37,18 @@
     /// <param name="permutation">The permutation to manipulate.</param>
     /// <returns>The new manipulated permutation.</returns>
-    public static Permutation Apply(IRandom random, Permutation permutation) {
-      Permutation result = (Permutation)permutation.Clone();
+    public static void Apply(IRandom random, Permutation permutation) {
       int breakPoint1, breakPoint2;
 
-      breakPoint1 = random.Next(result.Length - 1);
+      breakPoint1 = random.Next(permutation.Length - 1);
       do {
-        breakPoint2 = random.Next(result.Length - 1);
+        breakPoint2 = random.Next(permutation.Length - 1);
       } while (breakPoint2 == breakPoint1);
       if (breakPoint2 < breakPoint1) { int h = breakPoint1; breakPoint1 = breakPoint2; breakPoint2 = h; }
 
-      for (int i = 0; i <= (breakPoint2 - breakPoint1); i++) {  // invert permutation between breakpoints
-        result[breakPoint1 + i] = permutation[breakPoint2 - i];
+      for (int i = 0; i <= (breakPoint2 - breakPoint1) / 2; i++) {  // invert permutation between breakpoints
+        int temp = permutation[breakPoint1 + i];
+        permutation[breakPoint1 + i] = permutation[breakPoint2 - i];
+        permutation[breakPoint2 - i] = temp;
       }
-      return result;
     }
 
@@ -60,6 +59,6 @@
     /// <param name="permutation">The permutation to manipulate.</param>
     /// <returns>The new manipulated permuation.</returns>
-    protected override Permutation Manipulate(IRandom random, Permutation permutation) {
-      return Apply(random, permutation);
+    protected override void Manipulate(IRandom random, Permutation permutation) {
+      Apply(random, permutation);
     }
   }
Index: trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/MaximalPreservativeCrossover.cs	(revision 2830)
@@ -59,5 +59,5 @@
       if (parent1.Length < 4) throw new ArgumentException("MaximalPreservativeCrossover: The parent permutation must be at least of size 4");
       int length = parent1.Length;
-      Permutation result = new Permutation(length);
+      int[] result = new int[length];
       bool[] numberCopied = new bool[length];
       int breakPoint1, breakPoint2, subsegmentLength, index;
@@ -119,5 +119,5 @@
       } while (index != breakPoint1);
 
-      return result;
+      return new Permutation(result);
     }
 
Index: trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/OrderCrossover.cs	(revision 2830)
@@ -45,5 +45,5 @@
     /// <returns>The new permutation resulting from the crossover.</returns>
     public static Permutation Apply(IRandom random, Permutation parent1, Permutation parent2) {
-      Permutation result = new Permutation(parent1.Length);
+      int[] result = new int[parent1.Length];
       bool[] copied = new bool[result.Length];
 
@@ -66,5 +66,5 @@
         }
       }
-      return result;
+      return new Permutation(result);
     }
 
Index: trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/PartiallyMatchedCrossover.cs	(revision 2830)
@@ -57,5 +57,5 @@
       if (parent1.Length < 4) throw new ArgumentException("PartiallyMatchedCrossover: The parent permutation must be at least of size 4");
       int length = parent1.Length;
-      Permutation result = new Permutation(length); ;
+      int[] result = new int[length];
       int[] invResult = new int[length];
 
@@ -85,5 +85,5 @@
       }
 
-      return result;
+      return new Permutation(result);
     }
 
Index: trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/Permutation.cs	(revision 2830)
@@ -44,5 +44,4 @@
     public Permutation(int[] elements)
       : base(elements) {
-      if (!Validate()) throw new ArgumentException("Elements do not represent a valid permutation.");
     }
     private Permutation(Permutation elements) : base(elements) { }
Index: trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs
===================================================================
--- trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs	(revision 2829)
+++ trunk/sources/HeuristicLab.Permutation/3.3/PermutationManipulator.cs	(revision 2830)
@@ -46,9 +46,9 @@
 
     public sealed override IExecutionSequence Apply() {
-      PermutationParameter.ActualValue = Manipulate(RandomParameter.ActualValue, PermutationParameter.ActualValue);
+      Manipulate(RandomParameter.ActualValue, PermutationParameter.ActualValue);
       return base.Apply();
     }
 
-    protected abstract Permutation Manipulate(IRandom random, Permutation permutation);
+    protected abstract void Manipulate(IRandom random, Permutation permutation);
   }
 }
