Index: /trunk/sources/HeuristicLab.Data/BoolArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolArrayData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/BoolArrayData.cs	(revision 763)
@@ -95,12 +95,4 @@
       Data = data;
     }
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the elements of the array.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/BoolData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/BoolData.cs	(revision 763)
@@ -98,13 +98,4 @@
       Data = bool.Parse(node.InnerText);
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the boolean element.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/BoolMatrixData.cs	(revision 763)
@@ -122,12 +122,4 @@
       return builder.ToString();
     }
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the elements of the matrix.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the elements.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedDoubleData.cs	(revision 763)
@@ -110,13 +110,4 @@
       base.Data = (DoubleData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the double value.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedIntData.cs	(revision 763)
@@ -110,13 +110,4 @@
       base.Data = (IntData)PersistenceManager.Restore(node.SelectSingleNode("Value"), restoredObjects);
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the int element.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/ConstrainedObjectData.cs	(revision 763)
@@ -137,13 +137,4 @@
       return Data.ToString();
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the element.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public virtual void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/DoubleArrayData.cs	(revision 763)
@@ -117,13 +117,4 @@
       return builder.ToString();
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the elements of the array.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the elements.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/DoubleData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/DoubleData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/DoubleData.cs	(revision 763)
@@ -109,13 +109,4 @@
       }
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the elements of the matrix.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the elements.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/HeuristicLab.Data.csproj	(revision 763)
@@ -3,5 +3,5 @@
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</ProjectGuid>
@@ -180,5 +180,4 @@
     </Compile>
     <Compile Include="IObjectData.cs" />
-    <Compile Include="IObjectDataVisitor.cs" />
     <Compile Include="ItemList.cs" />
     <Compile Include="ItemListView.cs">
@@ -200,5 +199,4 @@
     </Compile>
     <Compile Include="ObjectData.cs" />
-    <Compile Include="ObjectDataVisitorBase.cs" />
     <Compile Include="StringDataView.cs">
       <SubType>UserControl</SubType>
Index: /trunk/sources/HeuristicLab.Data/IObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IObjectData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/IObjectData.cs	(revision 763)
@@ -34,11 +34,4 @@
     /// </summary>
     object Data { get; set; }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the object.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    void Accept(IObjectDataVisitor visitor);
   }
 }
Index: unk/sources/HeuristicLab.Data/IObjectDataVisitor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IObjectDataVisitor.cs	(revision 762)
+++ 	(revision )
@@ -1,50 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// A basic interface for all data visitors.
-  /// </summary>
-  public interface IObjectDataVisitor {
-    void Visit(BoolData data);
-    void Visit(IntData data);
-    void Visit(DoubleData data);
-    void Visit(StringData data);
-
-    void Visit(BoolArrayData data);
-    void Visit(IntArrayData data);
-    void Visit(DoubleArrayData data);
-
-    void Visit(BoolMatrixData data);
-    void Visit(IntMatrixData data);
-    void Visit(DoubleMatrixData data);
-
-    void Visit(ConstrainedIntData data);
-    void Visit(ConstrainedDoubleData data);
-
-    void Visit(ConstrainedObjectData constrainedObjectData);
-    void Visit(ObjectData objectData);
-  }
-}
Index: /trunk/sources/HeuristicLab.Data/IntData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/IntData.cs	(revision 763)
@@ -103,13 +103,4 @@
       Data = int.Parse(node.InnerText, CultureInfo.InvariantCulture.NumberFormat);
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the int value.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/IntMatrixData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/IntMatrixData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/IntMatrixData.cs	(revision 763)
@@ -139,13 +139,4 @@
       return builder.ToString();
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the elements of the matrix.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the elements.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/NullData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/NullData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/NullData.cs	(revision 763)
@@ -58,13 +58,4 @@
       return clone;
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the value.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.Data/ObjectData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ObjectData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/ObjectData.cs	(revision 763)
@@ -120,13 +120,4 @@
         return Data.ToString();
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the object.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public virtual void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: unk/sources/HeuristicLab.Data/ObjectDataVisitorBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/ObjectDataVisitorBase.cs	(revision 762)
+++ 	(revision )
@@ -1,75 +1,0 @@
-#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2008 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 System.Collections.Generic;
-using System.Text;
-
-namespace HeuristicLab.Data {
-  /// <summary>
-  /// The base class for DataVisitors.
-  /// </summary>
-  public class ObjectDataVisitorBase : IObjectDataVisitor{
-    #region IObjectDataVisitor Members
-    public virtual void Visit(BoolData data) {
-    }
-
-    public virtual void Visit(IntData data) {
-    }
-
-    public virtual void Visit(DoubleData data) {
-    }
-
-    public virtual void Visit(StringData data) {
-    }
-
-    public virtual void Visit(BoolArrayData data) {
-    }
-
-    public virtual void Visit(IntArrayData data) {
-    }
-
-    public virtual void Visit(DoubleArrayData data) {
-    }
-
-    public virtual void Visit(BoolMatrixData data) {
-    }
-
-    public virtual void Visit(IntMatrixData data) {
-    }
-
-    public virtual void Visit(DoubleMatrixData data) {
-    }
-
-    public virtual void Visit(ConstrainedIntData data) {
-    }
-
-    public virtual void Visit(ConstrainedDoubleData data) {
-    }
-
-    public virtual void Visit(ConstrainedObjectData constrainedObjectData) {
-    }
-
-    public virtual void Visit(ObjectData objectData) {
-    }
-    #endregion
-  }
-}
Index: /trunk/sources/HeuristicLab.Data/StringData.cs
===================================================================
--- /trunk/sources/HeuristicLab.Data/StringData.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Data/StringData.cs	(revision 763)
@@ -109,13 +109,4 @@
       return Data;
     }
-
-    /// <summary>
-    /// The point of intersection where an <see cref="IObjectDataVisitor"/> 
-    /// can change the string.
-    /// </summary>
-    /// <param name="visitor">The visitor that changes the element.</param>
-    public override void Accept(IObjectDataVisitor visitor) {
-      visitor.Visit(this);
-    }
   }
 }
Index: /trunk/sources/HeuristicLab.GP.Boolean/FunctionLibraryInjector.cs
===================================================================
--- /trunk/sources/HeuristicLab.GP.Boolean/FunctionLibraryInjector.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.GP.Boolean/FunctionLibraryInjector.cs	(revision 763)
@@ -73,8 +73,8 @@
       And and = new And();
       Or or = new Or();
-      Not not = new Not();
+      //Not not = new Not();
       Nand nand = new Nand();
       Nor nor = new Nor();
-      Xor xor = new Xor();
+      //Xor xor = new Xor();
       variable = new HeuristicLab.GP.Boolean.Variable();
 
@@ -82,8 +82,8 @@
         and,
         or,
-        not,
+        //not,
         nand,
         nor,
-        xor,
+        //xor,
         variable
       };
@@ -91,16 +91,16 @@
       SetAllowedSubOperators(and, allFunctions);
       SetAllowedSubOperators(or, allFunctions);
-      SetAllowedSubOperators(not, allFunctions);
+      //SetAllowedSubOperators(not, allFunctions);
       SetAllowedSubOperators(nand, allFunctions);
       SetAllowedSubOperators(nor, allFunctions);
-      SetAllowedSubOperators(xor, allFunctions);
+      //SetAllowedSubOperators(xor, allFunctions);
 
       operatorLibrary = new GPOperatorLibrary();
       operatorLibrary.GPOperatorGroup.AddOperator(and);
       operatorLibrary.GPOperatorGroup.AddOperator(or);
-      operatorLibrary.GPOperatorGroup.AddOperator(not);
+      //operatorLibrary.GPOperatorGroup.AddOperator(not);
       operatorLibrary.GPOperatorGroup.AddOperator(nand);
       operatorLibrary.GPOperatorGroup.AddOperator(nor);
-      operatorLibrary.GPOperatorGroup.AddOperator(xor);
+      //operatorLibrary.GPOperatorGroup.AddOperator(xor);
       operatorLibrary.GPOperatorGroup.AddOperator(variable);
     }
Index: /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Random/NormalRandomAdder.cs	(revision 763)
@@ -71,53 +71,56 @@
       NormalDistributedRandom normal = new NormalDistributedRandom(mt, mu, sigma * factor);
 
-      value.Accept(new RandomAdderVisitor(normal));
-
+      AddNormal(value, normal);
       return null;
     }
 
+    private void AddNormal(IObjectData value, NormalDistributedRandom normal) {
+      // dispatch manually based on dynamic type
+      if (value is IntData)
+        AddNormal((IntData)value, normal);
+      else if (value is ConstrainedIntData)
+        AddNormal((ConstrainedIntData)value, normal);
+      else if (value is ConstrainedDoubleData)
+        AddNormal((ConstrainedDoubleData)value, normal);
+      else if (value is DoubleData)
+        AddNormal((DoubleData)value, normal);
+      else throw new InvalidOperationException("Can't handle type " + value.GetType().Name);
+    }
+    public void AddNormal(DoubleData data, NormalDistributedRandom normal) {
+      data.Data += normal.NextDouble();
+    }
 
-    private class RandomAdderVisitor : ObjectDataVisitorBase {
-      private NormalDistributedRandom normal;
-      public RandomAdderVisitor(NormalDistributedRandom normal) {
-        this.normal = normal;
+    public void AddNormal(ConstrainedDoubleData data, NormalDistributedRandom normal) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        double newValue = data.Data + normal.NextDouble();
+        if (IsIntegerConstrained(data)) {
+          newValue = Math.Round(newValue);
+        }
+        if (data.TrySetData(newValue)) {
+          return;
+        }
       }
+      throw new InvalidProgramException("Coudn't find a valid value");
+    }
 
-      public override void Visit(DoubleData data) {
-        data.Data += normal.NextDouble();
+    public void AddNormal(IntData data, NormalDistributedRandom normal) {
+      data.Data = (int)Math.Round(data.Data + normal.NextDouble());
+    }
+
+    public void AddNormal(ConstrainedIntData data, NormalDistributedRandom normal) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        if (data.TrySetData((int)Math.Round(data.Data + normal.NextDouble())))
+          return;
       }
+      throw new InvalidProgramException("Couldn't find a valid value.");
+    }
 
-      public override void Visit(ConstrainedDoubleData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          double newValue = data.Data + normal.NextDouble();
-          if(IsIntegerConstrained(data)) {
-            newValue = Math.Round(newValue);
-          }
-          if(data.TrySetData(newValue)) {
-            return;
-          }
+    private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+      foreach (IConstraint constraint in data.Constraints) {
+        if (constraint is IsIntegerConstraint) {
+          return true;
         }
-        throw new InvalidProgramException("Coudn't find a valid value");
       }
-
-      public override void Visit(IntData data) {
-        data.Data = (int)Math.Round(data.Data + normal.NextDouble());
-      }
-
-      public override void Visit(ConstrainedIntData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          if(data.TrySetData((int)Math.Round(data.Data + normal.NextDouble())))
-            return;
-        }
-        throw new InvalidProgramException("Couldn't find a valid value.");
-      }
-
-      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
-        foreach(IConstraint constraint in data.Constraints) {
-          if(constraint is IsIntegerConstraint) {
-            return true;
-          }
-        }
-        return false;
-      }
+      return false;
     }
   }
Index: /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Random/NormalRandomizer.cs	(revision 763)
@@ -62,57 +62,61 @@
       double mu = GetVariableValue<DoubleData>("Mu", scope, true).Data;
       double sigma = GetVariableValue<DoubleData>("Sigma", scope, true).Data;
-      NormalDistributedRandom normal = new NormalDistributedRandom(mt, mu, sigma);
 
-      value.Accept(new RandomizerVisitor(normal));
-
+      NormalDistributedRandom n = new NormalDistributedRandom(mt, mu, sigma);
+      RandomizeNormal(value, n);
       return null;
     }
 
-    private class RandomizerVisitor : ObjectDataVisitorBase {
-      private NormalDistributedRandom normal;
+    private void RandomizeNormal(IObjectData value, NormalDistributedRandom n) {
+      // dispatch manually based on dynamic type
+      if (value is IntData)
+        RandomizeNormal((IntData)value, n);
+      else if (value is ConstrainedIntData)
+        RandomizeNormal((ConstrainedIntData)value, n);
+      else if (value is DoubleData)
+        RandomizeNormal((DoubleData)value, n);
+      else if (value is ConstrainedDoubleData)
+        RandomizeNormal((ConstrainedDoubleData)value, n);
+      else throw new InvalidOperationException("Can't handle type " + value.GetType().Name);
+    }
 
-      public RandomizerVisitor(NormalDistributedRandom normal) {
-        this.normal = normal;
+    public void RandomizeNormal(ConstrainedDoubleData data, NormalDistributedRandom normal) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        double r = normal.NextDouble();
+        if (IsIntegerConstrained(data)) {
+          r = Math.Round(r);
+        }
+        if (data.TrySetData(r)) {
+          return;
+        }
       }
+      throw new InvalidOperationException("Couldn't find a valid value in 100 tries with mu=" + normal.Mu + " sigma=" + normal.Sigma);
+    }
 
-      public override void Visit(ConstrainedDoubleData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          double r = normal.NextDouble();
-          if(IsIntegerConstrained(data)) {
-            r = Math.Round(r);
-          }
-          if(data.TrySetData(r)) {
-            return;
-          }
-        }
-        throw new InvalidProgramException("Couldn't find a valid value in 100 tries with mu=" + normal.Mu + " sigma=" + normal.Sigma);
+    public void RandomizeNormal(ConstrainedIntData data, NormalDistributedRandom normal) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        double r = normal.NextDouble();
+        if (data.TrySetData((int)Math.Round(r))) // since r is a continuous normally distributed random variable rounding should be OK
+          return;
       }
+      throw new InvalidOperationException("Couldn't find a valid value");
+    }
 
-      public override void Visit(ConstrainedIntData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          double r = normal.NextDouble();
-          if(data.TrySetData((int)Math.Round(r))) // since r is a continuous normally distributed random variable rounding should be OK
-            return;
-        }
-        throw new InvalidProgramException("Couldn't find a valid value");
-      }
+    public void RandomizeNormal(DoubleData data, NormalDistributedRandom normal) {
+      data.Data = normal.NextDouble();
+    }
 
-      public override void Visit(DoubleData data) {
-        data.Data = normal.NextDouble();
-      }
-
-      public override void Visit(IntData data) {
-        data.Data = (int)Math.Round(normal.NextDouble());
-      }
+    public void RandomizeNormal(IntData data, NormalDistributedRandom normal) {
+      data.Data = (int)Math.Round(normal.NextDouble());
+    }
 
 
-      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
-        foreach(IConstraint constraint in data.Constraints) {
-          if(constraint is IsIntegerConstraint) {
-            return true;
-          }
+    private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+      foreach (IConstraint constraint in data.Constraints) {
+        if (constraint is IsIntegerConstraint) {
+          return true;
         }
-        return false;
       }
+      return false;
     }
   }
Index: /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Random/UniformRandomAdder.cs	(revision 763)
@@ -33,10 +33,12 @@
 
     public override string Description {
-      get { return @"Samples a uniformly distributed random variable 'U' with range = [min,max] and E(u) = (max-min)/2
+      get {
+        return @"Samples a uniformly distributed random variable 'U' with range = [min,max] and E(u) = (max-min)/2
 and adds the result to the variable 'Value'. ShakingFactor influences the effective range of U. 
 If r=(max-min) then the effective range of U is [E(u) - shakingFactor * r/2, E(u) + shakingFactor * r/2].
 
 If a constraint for the allowed range of 'Value' is defined and the result of the operation would be smaller then 
-the smallest allowed value then 'Value' is set to the lower bound and vice versa for the upper bound."; }
+the smallest allowed value then 'Value' is set to the lower bound and vice versa for the upper bound.";
+      }
     }
 
@@ -66,59 +68,59 @@
       max = ex + newRange / 2;
 
-      value.Accept(new RandomAdderVisitor(mt, min, max));
-
+      AddUniform(value, mt, min, max);
       return null;
     }
 
+    private void AddUniform(IObjectData value, MersenneTwister mt, double min, double max) {
+      // dispatch manually on dynamic type
+      if (value is IntData)
+        AddUniform((IntData)value, mt, min, max);
+      else if (value is ConstrainedIntData)
+        AddUniform((ConstrainedIntData)value, mt, min, max);
+      else if (value is DoubleData)
+        AddUniform((DoubleData)value, mt, min, max);
+      else if (value is ConstrainedDoubleData)
+        AddUniform((ConstrainedDoubleData)value, mt, min, max);
+      else throw new InvalidOperationException("Can't handle type " + value.GetType().Name);
+    }
 
-    private class RandomAdderVisitor : ObjectDataVisitorBase {
-      private double min;
-      private double max;
-      private MersenneTwister mt;
 
-      public RandomAdderVisitor(MersenneTwister mt, double min, double max) {
-        this.mt = mt;
-        this.min = min;
-        this.max = max;
+    public void AddUniform(ConstrainedDoubleData data, MersenneTwister mt, double min, double max) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        double newValue = data.Data + mt.NextDouble() * (max - min) + min;
+        if (IsIntegerConstrained(data)) {
+          newValue = Math.Floor(newValue);
+        }
+        if (data.TrySetData(newValue)) {
+          return;
+        }
       }
+      throw new InvalidProgramException("Couldn't find a valid value");
+    }
 
-      public override void Visit(ConstrainedDoubleData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          double newValue = data.Data + mt.NextDouble() * (max - min) + min;
-          if(IsIntegerConstrained(data)) {
-            newValue = Math.Floor(newValue);
-          }
-          if(data.TrySetData(newValue)) {
-            return;
-          }
+    public void AddUniform(ConstrainedIntData data, MersenneTwister mt, double min, double max) {
+      for (int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
+        int newValue = (int)Math.Floor(data.Data + mt.NextDouble() * (max - min) + min);
+        if (data.TrySetData(newValue)) {
+          return;
         }
-        throw new InvalidProgramException("Couldn't find a valid value");
       }
+      throw new InvalidProgramException("Couldn't find a valid value");
+    }
 
-      public override void Visit(ConstrainedIntData data) {
-        for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
-          int newValue = (int)Math.Floor(data.Data + mt.NextDouble() * (max - min) + min);
-          if(data.TrySetData(newValue)) {
-            return;
-          }
+    public void AddUniform(DoubleData data, MersenneTwister mt, double min, double max) {
+      data.Data = data.Data + mt.NextDouble() * (max - min) + min;
+    }
+
+    public void AddUniform(IntData data, MersenneTwister mt, double min, double max) {
+      data.Data = (int)Math.Floor(data.Data + mt.NextDouble() * (max - min) + min);
+    }
+    private bool IsIntegerConstrained(ConstrainedDoubleData data) {
+      foreach (IConstraint constraint in data.Constraints) {
+        if (constraint is IsIntegerConstraint) {
+          return true;
         }
-        throw new InvalidProgramException("Couldn't find a valid value");
       }
-
-      public override void Visit(DoubleData data) {
-        data.Data = data.Data + mt.NextDouble() * (max - min) + min;
-      }
-
-      public override void Visit(IntData data) {
-        data.Data = (int)Math.Floor(data.Data + mt.NextDouble() * (max - min) + min);
-      }
-      private bool IsIntegerConstrained(ConstrainedDoubleData data) {
-        foreach(IConstraint constraint in data.Constraints) {
-          if(constraint is IsIntegerConstraint) {
-            return true;
-          }
-        }
-        return false;
-      }
+      return false;
     }
   }
Index: /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs	(revision 762)
+++ /trunk/sources/HeuristicLab.Random/UniformRandomizer.cs	(revision 763)
@@ -61,29 +61,32 @@
       double max = GetVariableValue<DoubleData>("Max", scope, true).Data;
 
-      value.Accept(new RandomVisitor(mt, min, max));
-
+      RandomizeUniform(value, mt, min, max);
       return null;
     }
 
-    private class RandomVisitor : ObjectDataVisitorBase {
-      private MersenneTwister mt;
-      private double min;
-      private double max;
+    private void RandomizeUniform(IObjectData value, MersenneTwister mt, double min, double max) {
+      // Dispatch manually based on dynamic type,
+      // a bit awkward but necessary until we create a better type hierarchy for numeric types (gkronber 15.11.2008).
+      if (value is DoubleData)
+        RandomizeUniform((DoubleData)value, mt, min, max);
+      else if (value is ConstrainedDoubleData)
+        RandomizeUniform((ConstrainedDoubleData)value, mt, min, max);
+      else if (value is IntData)
+        RandomizeUniform((IntData)value, mt, min, max);
+      else if (value is ConstrainedIntData)
+        RandomizeUniform((ConstrainedIntData)value, mt, min, max);
+      else throw new ArgumentException("Can't handle type " + value.GetType().Name);
+    }
 
-      public RandomVisitor(MersenneTwister mt, double min, double max) {
-        this.mt = mt;
-        this.min = min;
-        this.max = max;
-      }
 
-      public override void Visit(DoubleData data) {
+      public void RandomizeUniform(DoubleData data, MersenneTwister mt, double min, double max) {
         data.Data = mt.NextDouble() * (max - min) + min;
       }
 
-      public override void Visit(IntData data) {
+      public void RandomizeUniform(IntData data, MersenneTwister mt, double min, double max) {
         data.Data = (int)Math.Floor(mt.NextDouble() * (max - min) + min);
       }
 
-      public override void Visit(ConstrainedDoubleData data) {
+      public void RandomizeUniform(ConstrainedDoubleData data, MersenneTwister mt, double min, double max) {
         for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
           double r = mt.NextDouble() * (max - min) + min;
@@ -95,8 +98,8 @@
           }
         }
-        throw new InvalidProgramException("Couldn't find a valid value");
+        throw new InvalidOperationException("Couldn't find a valid value");
       }
 
-      public override void Visit(ConstrainedIntData data) {
+      public void RandomizeUniform(ConstrainedIntData data, MersenneTwister mt, double min, double max) {
         for(int tries = MAX_NUMBER_OF_TRIES; tries >= 0; tries--) {
           int r = (int)Math.Floor(mt.NextDouble() * (max - min) + min);
@@ -105,5 +108,5 @@
           }
         }
-        throw new InvalidProgramException("Couldn't find a valid value");
+        throw new InvalidOperationException("Couldn't find a valid value");
       }
 
@@ -117,4 +120,3 @@
       }
     }
-  }
 }
