Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/BinaryFactorVariable.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/BinaryFactorVariable.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/BinaryFactorVariable.cs	(revision 15132)
@@ -30,5 +30,5 @@
   [StorableClass]
   [Item("BinaryFactorVariable", "Represents a categorical variable (comparable to factors as in R) and it's value.")]
-  public class BinaryFactorVariable : VariableBase {
+  public sealed class BinaryFactorVariable : VariableBase {
 
     private readonly Dictionary<string, List<string>> variableValues;
@@ -47,9 +47,9 @@
 
     [StorableConstructor]
-    protected BinaryFactorVariable(bool deserializing)
+    private BinaryFactorVariable(bool deserializing)
       : base(deserializing) {
       variableValues = new Dictionary<string, List<string>>();
     }
-    protected BinaryFactorVariable(BinaryFactorVariable original, Cloner cloner)
+    private BinaryFactorVariable(BinaryFactorVariable original, Cloner cloner)
       : base(original, cloner) {
       variableValues =
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/FactorVariable.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/FactorVariable.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/FactorVariable.cs	(revision 15132)
@@ -30,5 +30,5 @@
   [StorableClass]
   [Item("FactorVariable", "Represents a categorical variable (comparable to factors as in R).")]
-  public class FactorVariable : VariableBase {
+  public sealed class FactorVariable : VariableBase {
     private readonly Dictionary<string, Dictionary<string, int>> variableValues; // for each variable value also store a zero-based index
     [Storable]
@@ -45,9 +45,9 @@
 
     [StorableConstructor]
-    protected FactorVariable(bool deserializing)
+    private FactorVariable(bool deserializing)
       : base(deserializing) {
       variableValues = new Dictionary<string, Dictionary<string, int>>();
     }
-    protected FactorVariable(FactorVariable original, Cloner cloner)
+    private FactorVariable(FactorVariable original, Cloner cloner)
       : base(original, cloner) {
       variableValues =
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/Variable.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/Variable.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/Variable.cs	(revision 15132)
@@ -20,6 +20,4 @@
 #endregion
 
-using System;
-using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -29,11 +27,11 @@
   [StorableClass]
   [Item("Variable", "Represents a variable value.")]
-  public class Variable : VariableBase {
+  public sealed class Variable : VariableBase {
 
     [StorableConstructor]
-    protected Variable(bool deserializing)
+    private Variable(bool deserializing)
       : base(deserializing) {
     }
-    protected Variable(Variable original, Cloner cloner)
+    private Variable(Variable original, Cloner cloner)
       : base(original, cloner) {
     }
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableBase.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableBase.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableBase.cs	(revision 15132)
@@ -34,5 +34,5 @@
       get { return weightMu; }
       set {
-        if(value != weightMu) {
+        if (value != weightMu) {
           weightMu = value;
           OnChanged(EventArgs.Empty);
@@ -45,6 +45,6 @@
       get { return weightSigma; }
       set {
-        if(weightSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
-        if(value != weightSigma) {
+        if (weightSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
+        if (value != weightSigma) {
           weightSigma = value;
           OnChanged(EventArgs.Empty);
@@ -57,5 +57,5 @@
       get { return weightManipulatorMu; }
       set {
-        if(value != weightManipulatorMu) {
+        if (value != weightManipulatorMu) {
           weightManipulatorMu = value;
           OnChanged(EventArgs.Empty);
@@ -68,6 +68,6 @@
       get { return weightManipulatorSigma; }
       set {
-        if(weightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
-        if(value != weightManipulatorSigma) {
+        if (weightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
+        if (value != weightManipulatorSigma) {
           weightManipulatorSigma = value;
           OnChanged(EventArgs.Empty);
@@ -80,6 +80,6 @@
       get { return multiplicativeWeightManipulatorSigma; }
       set {
-        if(multiplicativeWeightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
-        if(value != multiplicativeWeightManipulatorSigma) {
+        if (multiplicativeWeightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
+        if (value != multiplicativeWeightManipulatorSigma) {
           multiplicativeWeightManipulatorSigma = value;
           OnChanged(EventArgs.Empty);
@@ -94,5 +94,5 @@
       get { return variableChangeProbability; }
       set {
-        if(value < 0 || value > 1.0) throw new ArgumentException("Variable change probability must lie in the interval [0..1]");
+        if (value < 0 || value > 1.0) throw new ArgumentException("Variable change probability must lie in the interval [0..1]");
         variableChangeProbability = value;
       }
@@ -104,5 +104,5 @@
       get { return variableNames; }
       set {
-        if(value == null) throw new ArgumentNullException();
+        if (value == null) throw new ArgumentNullException();
         variableNames.Clear();
         variableNames.AddRange(value);
@@ -116,5 +116,5 @@
       get { return allVariableNames; }
       set {
-        if(value == null) throw new ArgumentNullException();
+        if (value == null) throw new ArgumentNullException();
         allVariableNames.Clear();
         allVariableNames.AddRange(value);
@@ -124,9 +124,9 @@
     public override bool Enabled {
       get {
-        if(variableNames.Count == 0) return false;
+        if (variableNames.Count == 0) return false;
         return base.Enabled;
       }
       set {
-        if(variableNames.Count == 0) base.Enabled = false;
+        if (variableNames.Count == 0) base.Enabled = false;
         else base.Enabled = value;
       }
@@ -146,5 +146,5 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      if(allVariableNames == null || (allVariableNames.Count == 0 && variableNames.Count > 0)) {
+      if (allVariableNames == null || (allVariableNames.Count == 0 && variableNames.Count > 0)) {
         allVariableNames = variableNames;
       }
@@ -167,5 +167,5 @@
       multiplicativeWeightManipulatorSigma = original.multiplicativeWeightManipulatorSigma;
       variableChangeProbability = original.variableChangeProbability;
-      }
+    }
     protected VariableBase(string name, string description)
       : base(name, description) {
Index: stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableTreeNodeBase.cs
===================================================================
--- stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableTreeNodeBase.cs	(revision 15131)
+++ stable/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/VariableTreeNodeBase.cs	(revision 15132)
@@ -79,10 +79,16 @@
       }
 
-      if (Symbol.VariableChangeProbability >= 1.0 || random.NextDouble() < Symbol.VariableChangeProbability) {
-        var oldName = variableName;
+      if (Symbol.VariableChangeProbability >= 1.0) {
+        // old behaviour for backwards compatibility
+        #region Backwards compatible code, remove with 3.4
 #pragma warning disable 612, 618
         variableName = Symbol.VariableNames.SelectRandom(random);
 #pragma warning restore 612, 618
+        #endregion
+      } else if (random.NextDouble() < Symbol.VariableChangeProbability) {
+        var oldName = variableName;
+        variableName = Symbol.VariableNames.SampleRandom(random);
         if (oldName != variableName) {
+          // re-initialize weight if the variable is changed
           weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightMu, Symbol.WeightSigma);
         }
