Index: /trunk/sources/HeuristicLab.Random/3.3/FastRandom.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/FastRandom.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/FastRandom.cs	(revision 4258)
@@ -1,3 +1,4 @@
 ﻿using System;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -43,5 +44,5 @@
   /// </summary>
   [StorableClass]
-  public class FastRandom : Item, IRandom {
+  public sealed class FastRandom : Item, IRandom {
     // The +1 ensures NextDouble doesn't generate 1.0
     private const double REAL_UNIT_INT = 1.0 / ((double)int.MaxValue + 1.0);
@@ -70,4 +71,11 @@
       Reinitialise(seed);
     }
+
+    /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private FastRandom(bool deserializing) : base(deserializing) { }
 
     #endregion
@@ -319,5 +327,5 @@
       }
       return (bitBuffer & (bitMask >>= 1)) == 0;
-    }           
+    }
     // Buffer 32 bits in bitBuffer, return 1 at a time, keep track of how many have been returned
     // with bitBufferIdx.
@@ -328,5 +336,5 @@
 
 
-    #endregion    
+    #endregion
 
     #region IRandom Members
@@ -340,7 +348,7 @@
     }
 
-    #endregion   
-
-    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+    #endregion
+
+    public override IDeepCloneable Clone(Cloner cloner) {
       FastRandom clone = (FastRandom)base.Clone(cloner);
       clone.x = x;
Index: unk/sources/HeuristicLab.Random/3.3/FastRandomCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/FastRandomCreator.cs	(revision 4257)
+++ 	(revision )
@@ -1,72 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 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;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Random {
-  /// <summary>
-  /// An operator which creates a new "FastRandom" pseudo random number generator.
-  /// </summary>
-  [Item("FastRandomCreator", "An operator which creates a new \'FastRandom\' pseudo random number generator.")]
-  [StorableClass]
-  public sealed class FastRandomCreator : SingleSuccessorOperator {
-    public ValueLookupParameter<BoolValue> SetSeedRandomlyParameter {
-      get { return (ValueLookupParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
-    }
-    public ValueLookupParameter<IntValue> SeedParameter {
-      get { return (ValueLookupParameter<IntValue>)Parameters["Seed"]; }
-    }
-    public LookupParameter<IRandom> RandomParameter {
-      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
-    }
-    public BoolValue SetSeedRandomly {
-      get { return SetSeedRandomlyParameter.Value; }
-      set { SetSeedRandomlyParameter.Value = value; }
-    }
-    public IntValue Seed {
-      get { return SeedParameter.Value; }
-      set { SeedParameter.Value = value; }
-    }
-
-    public FastRandomCreator()
-      : base() {
-      Parameters.Add(new ValueLookupParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
-      Parameters.Add(new ValueLookupParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
-      Parameters.Add(new LookupParameter<IRandom>("Random", "The new pseudo random number generator which is initialized with the given seed."));
-    }
-
-    public override IOperation Apply() {
-      if (SetSeedRandomlyParameter.ActualValue == null) SetSeedRandomlyParameter.ActualValue = new BoolValue(true);
-      bool setSeedRandomly = SetSeedRandomlyParameter.ActualValue.Value;
-      if (SeedParameter.ActualValue == null) SeedParameter.ActualValue = new IntValue(0);
-      IntValue seed = SeedParameter.ActualValue;
-
-      if (setSeedRandomly) seed.Value = new System.Random().Next();
-      RandomParameter.ActualValue = new FastRandom(seed.Value);
-
-      return base.Apply();
-    }
-  }
-}
Index: /trunk/sources/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj	(revision 4258)
@@ -108,5 +108,4 @@
   <ItemGroup>
     <None Include="HeuristicLabRandomPlugin.cs.frame" />
-    <Compile Include="FastRandomCreator.cs" />
     <Compile Include="FastRandom.cs" />
     <Compile Include="HeuristicLabRandomPlugin.cs" />
Index: /trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/MersenneTwister.cs	(revision 4258)
@@ -43,5 +43,5 @@
   [Item("MersenneTwister", "A high-quality pseudo random number generator which creates uniformly distributed random numbers.")]
   [StorableClass]
-  public class MersenneTwister : Item, IRandom {
+  public sealed class MersenneTwister : Item, IRandom {
     private const int n = 624, m = 397;
 
@@ -78,4 +78,10 @@
       init = true;
     }
+    /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private MersenneTwister(bool deserializing) : base(deserializing) { }
 
     /// <summary>
Index: /trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/NormalDistributedRandom.cs	(revision 4258)
@@ -34,5 +34,5 @@
   [Item("NormalDistributedRandom", "A pseudo random number generator which uses the Ziggurat method to create normally distributed random numbers.")]
   [StorableClass]
-  public class NormalDistributedRandom : Item, IRandom {
+  public sealed class NormalDistributedRandom : Item, IRandom {
     [Storable]
     private double mu;
@@ -471,4 +471,10 @@
       this.uniform = uniformRandom;
     }
+    /// <summary>
+    /// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
+    /// </summary>
+    /// <param name="deserializing">true, if the constructor is called during deserialization.</param>
+    [StorableConstructor]
+    private NormalDistributedRandom(bool deserializing) : base(deserializing) { }
 
     #region IRandom Members
Index: /trunk/sources/HeuristicLab.Random/3.3/NormalRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/NormalRandomizer.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/NormalRandomizer.cs	(revision 4258)
@@ -67,4 +67,6 @@
       Parameters.Add(new LookupParameter<DoubleValue>("Value", "The value that should be set to a random value."));
     }
+    [StorableConstructor]
+    protected NormalRandomizer(bool deserializing) : base(deserializing) { }
 
     /// <summary>
Index: /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/RandomCreator.cs	(revision 4258)
@@ -39,4 +39,7 @@
       get { return (ValueLookupParameter<IntValue>)Parameters["Seed"]; }
     }
+    public ValueParameter<IRandom> RandomTypeParameter {
+      get { return (ValueParameter<IRandom>)Parameters["RandomType"]; }
+    }
     public LookupParameter<IRandom> RandomParameter {
       get { return (LookupParameter<IRandom>)Parameters["Random"]; }
@@ -50,4 +53,8 @@
       set { SeedParameter.Value = value; }
     }
+    public IRandom RandomType {
+      get { return RandomTypeParameter.Value; }
+      set { RandomTypeParameter.Value = value; }
+    }
 
     public RandomCreator()
@@ -55,6 +62,18 @@
       Parameters.Add(new ValueLookupParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
       Parameters.Add(new ValueLookupParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+      Parameters.Add(new ValueParameter<IRandom>("RandomType", "The type of pseudo random number generator which is created.", new MersenneTwister()));
       Parameters.Add(new LookupParameter<IRandom>("Random", "The new pseudo random number generator which is initialized with the given seed."));
     }
+    [StorableConstructor]
+    private RandomCreator(bool deserializing) : base(deserializing) { }
+
+    // BackwardsCompatibility3.3
+    #region Backwards compatible code (remove with 3.4)
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserializationHook() {
+      if (!Parameters.ContainsKey("RandomType"))
+        Parameters.Add(new ValueParameter<IRandom>("RandomType", "The type of pseudo random number generator which is created.", new MersenneTwister()));
+    }
+    #endregion
 
     public override IOperation Apply() {
@@ -65,5 +84,7 @@
 
       if (setSeedRandomly) seed.Value = new System.Random().Next();
-      RandomParameter.ActualValue = new MersenneTwister((uint)seed.Value);
+      IRandom random = (IRandom)RandomType.Clone();
+      random.Reset(seed.Value);
+      RandomParameter.ActualValue = random;
 
       return base.Apply();
Index: /trunk/sources/HeuristicLab.Random/3.3/UniformRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/3.3/UniformRandomizer.cs	(revision 4257)
+++ /trunk/sources/HeuristicLab.Random/3.3/UniformRandomizer.cs	(revision 4258)
@@ -70,4 +70,6 @@
       Parameters.Add(new LookupParameter<DoubleValue>("Value", "The value that should be set to a random value."));
     }
+    [StorableConstructor]
+    protected UniformRandomizer(bool deserializing) : base(deserializing) { }
 
     /// <summary>
