Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringConstantErc.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringConstantErc.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringConstantErc.cs	(revision 14952)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.String {
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+  [StorableClass]
+  public class StringConstantErc : WeightedErcItem<string> {
+
+    private const string ConstantsParameterName = "Constants";
+
+    public StringConstantErc() : this(false, 1d) { }
+
+    public StringConstantErc(params string[] constants) : this(true, 1d, constants) { }
+
+    public StringConstantErc(bool isEnabled, double weight = 1d, params string[] constants) : base(isEnabled, weight) {
+      Parameters.Add(new FixedValueParameter<StringArray>(ConstantsParameterName, new StringArray(constants)));
+      Constants.ToStringChanged += (sender, args) => UpdateName();
+      UpdateName();
+    }
+    private void UpdateName() {
+      Name = Constants.ToString();
+    }
+
+    [StorableConstructor]
+    public StringConstantErc(bool deserializing) : base(deserializing) {
+    }
+
+    public StringConstantErc(StringConstantErc origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public IValueParameter<StringArray> ConstantsParameter
+    {
+      get { return (IValueParameter<StringArray>)Parameters[ConstantsParameterName]; }
+    }
+
+    public StringArray Constants
+    {
+      get { return ConstantsParameter.Value; }
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConstantErc(this, cloner);
+    }
+
+    public override string GetErcValue(IRandom random) {
+      if (Constants.Length == 0) return string.Empty;
+
+      var x = random.Next(Constants.Length);
+      return Constants[x];
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringConstantErcValue.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringConstantErcValue.cs	(revision 14909)
+++ 	(revision )
@@ -1,51 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.String {
-
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Data;
-  using HeuristicLab.Parameters;
-  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-  [StorableClass]
-  public class StringConstantErcValue : WeightedErcValueItem<string> {
-
-    private const string ConstantsParameterName = "Constants";
-
-    public StringConstantErcValue() : this(false, 1d) { }
-
-    public StringConstantErcValue(params string[] constants) : this(true, 1d, constants) { }
-
-    public StringConstantErcValue(bool isEnabled, double weight = 1d, params string[] constants) : base(isEnabled, weight) {
-      Name = "String constants";
-      Parameters.Add(new FixedValueParameter<StringArray>(ConstantsParameterName, new StringArray(constants)));
-    }
-
-    [StorableConstructor]
-    public StringConstantErcValue(bool deserializing) : base(deserializing) {
-    }
-
-    public StringConstantErcValue(StringConstantErcValue origin, Cloner cloner) : base(origin, cloner) {
-    }
-
-    public IValueParameter<StringArray> ConstantsParameter
-    {
-      get { return (IValueParameter<StringArray>)Parameters[ConstantsParameterName]; }
-    }
-
-    public StringArray Constants
-    {
-      get { return ConstantsParameter.Value; }
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new StringConstantErcValue(this, cloner);
-    }
-
-    public override string GetErcValue(IRandom random) {
-      if (Constants.Length == 0) return string.Empty;
-
-      var x = random.Next(Constants.Length);
-      return Constants[x];
-    }
-  }
-}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringErcOptions.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringErcOptions.cs	(revision 14909)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringErcOptions.cs	(revision 14952)
@@ -7,6 +7,6 @@
   public class StringErcOptions : ErcOption<string> {
     public StringErcOptions() { }
-    public StringErcOptions(params IWeightedErcValueItem<string>[] values) : base(true, values) { }
-    public StringErcOptions(bool isEnabled, params IWeightedErcValueItem<string>[] values) : base(isEnabled, values) { }
+    public StringErcOptions(params WeightedErcItem<string>[] values) : base(true, values) { }
+    public StringErcOptions(bool isEnabled, params WeightedErcItem<string>[] values) : base(isEnabled, values) { }
 
     [StorableConstructor]
@@ -18,4 +18,8 @@
       return new StringErcOptions(this, cloner);
     }
+
+    public override string ToString() {
+      return "String";
+    }
   }
 }
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringRandomErc.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringRandomErc.cs	(revision 14952)
+++ branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringRandomErc.cs	(revision 14952)
@@ -0,0 +1,171 @@
+﻿namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.String {
+  using System.Collections.Generic;
+
+  using HeuristicLab.Common;
+  using HeuristicLab.Core;
+  using HeuristicLab.Data;
+  using HeuristicLab.Parameters;
+  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators;
+
+  [StorableClass]
+  public class StringRandomErc : WeightedErcItem<string> {
+    private readonly List<string> generatedValues = new List<string>();
+
+    public const int DefaultStringLength = 10;
+
+    private const string AllowLowercaseLettersParameterName = "Allow lowercase letters";
+    private const string AllowUppercaseLettersParameterName = "Allow uppercase letters";
+    private const string AllowSpaceParameterName = "Allow space";
+    private const string SpaceProbabilityParameterName = "Space probability";
+    private const string StringLengthParameterName = "String length";
+    private const string AllowDigitsParameterName = "Allow digits";
+    private const string AllowSymbolsParameterName = "Allow symbols";
+    private const string VowelProbabilityParameterName = "Vowel probability";
+
+    private const string NewStringProbabilityParameterName = "New string probability";
+    private const string NewStringProbabilityParameterDescription = "The probability that the selection of the ephemeral random string constant for inclusion in randomly generated code will produce a new string (rather than a string that was previously generated).";
+
+    public StringRandomErc() : this(false, 1d) { }
+
+    public StringRandomErc(bool isEnabled, double weight = 1d) : base(isEnabled, weight) {
+      Name = "String random";
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowLowercaseLettersParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowUppercaseLettersParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowDigitsParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSymbolsParameterName, new BoolValue(true)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSpaceParameterName, new BoolValue(false)));
+      Parameters.Add(new FixedValueParameter<IntValue>(StringLengthParameterName, new IntValue(DefaultStringLength)));
+      Parameters.Add(new FixedValueParameter<PercentValue>(SpaceProbabilityParameterName));
+      Parameters.Add(new FixedValueParameter<PercentValue>(VowelProbabilityParameterName));
+      Parameters.Add(new FixedValueParameter<PercentValue>(NewStringProbabilityParameterName, NewStringProbabilityParameterDescription));
+    }
+
+    [StorableConstructor]
+    public StringRandomErc(bool deserializing) : base(deserializing) { }
+
+    public StringRandomErc(StringRandomErc origin, Cloner cloner) : base(origin, cloner) {
+    }
+
+    public override string GetErcValue(IRandom random) {
+      if (random.NextDouble().IsAlmost(NewStringProbability) || generatedValues.Count == 0) {
+        var value = StringGenerator.RandomString(
+          AllowLowercaseLetters,
+          AllowUppercaseLetters,
+          AllowSpace,
+          SpaceProbability,
+          StringLength,
+          random);
+
+        generatedValues.Add(value);
+        return value;
+      }
+
+      var idx = random.Next(generatedValues.Count);
+      return generatedValues[idx];
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringRandomErc(this, cloner);
+    }
+
+    public IValueParameter<BoolValue> AllowLowercaseLettersParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowLowercaseLettersParameterName]; }
+    }
+
+    public bool AllowLowercaseLetters
+    {
+      get { return AllowLowercaseLettersParameter.Value.Value; }
+      set { AllowLowercaseLettersParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowUppercaseLettersParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowUppercaseLettersParameterName]; }
+    }
+
+    public bool AllowUppercaseLetters
+    {
+      get { return AllowUppercaseLettersParameter.Value.Value; }
+      set { AllowUppercaseLettersParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowDigitsParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowDigitsParameterName]; }
+    }
+
+    public bool AllowDigits
+    {
+      get { return AllowDigitsParameter.Value.Value; }
+      set { AllowDigitsParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowSymbolsParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowSymbolsParameterName]; }
+    }
+
+    public bool AllowSymbols
+    {
+      get { return AllowSymbolsParameter.Value.Value; }
+      set { AllowSymbolsParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<BoolValue> AllowSpaceParameter
+    {
+      get { return (IValueParameter<BoolValue>)Parameters[AllowSpaceParameterName]; }
+    }
+
+    public bool AllowSpace
+    {
+      get { return AllowSpaceParameter.Value.Value; }
+      set { AllowSpaceParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> SpaceProbabilityParameter
+    {
+      get { return (IValueParameter<PercentValue>)Parameters[SpaceProbabilityParameterName]; }
+    }
+
+    public double SpaceProbability
+    {
+      get { return SpaceProbabilityParameter.Value.Value; }
+      set { SpaceProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<PercentValue> VowelProbabilityParameter
+    {
+      get { return (IValueParameter<PercentValue>)Parameters[VowelProbabilityParameterName]; }
+    }
+
+    public double VowelProbability
+    {
+      get { return VowelProbabilityParameter.Value.Value; }
+      set { VowelProbabilityParameter.Value.Value = value; }
+    }
+
+    public IValueParameter<IntValue> StringLengthParameter
+    {
+      get { return (IValueParameter<IntValue>)Parameters[StringLengthParameterName]; }
+    }
+
+    public IValueParameter<PercentValue> NewStringProbabilityParameter
+    {
+      get { return (IValueParameter<PercentValue>)Parameters[NewStringProbabilityParameterName]; }
+    }
+
+    public double NewStringProbability
+    {
+      get { return NewStringProbabilityParameter.Value.Value; }
+      set { NewStringProbabilityParameter.Value.Value = value; }
+    }
+
+    public int StringLength
+    {
+      get { return StringLengthParameter.Value.Value; }
+      set { StringLengthParameter.Value.Value = value; }
+    }
+  }
+}
Index: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringRandomErcValue.cs
===================================================================
--- branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis.Base/Erc/String/StringRandomErcValue.cs	(revision 14909)
+++ 	(revision )
@@ -1,171 +1,0 @@
-﻿namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.String {
-  using System.Collections.Generic;
-
-  using HeuristicLab.Common;
-  using HeuristicLab.Core;
-  using HeuristicLab.Data;
-  using HeuristicLab.Parameters;
-  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators;
-
-  [StorableClass]
-  public class StringRandomErcValue : WeightedErcValueItem<string> {
-    private readonly List<string> generatedValues = new List<string>();
-
-    public const int DefaultStringLength = 10;
-
-    private const string AllowLowercaseLettersParameterName = "Allow lowercase letters";
-    private const string AllowUppercaseLettersParameterName = "Allow uppercase letters";
-    private const string AllowSpaceParameterName = "Allow space";
-    private const string SpaceProbabilityParameterName = "Space probability";
-    private const string StringLengthParameterName = "String length";
-    private const string AllowDigitsParameterName = "Allow digits";
-    private const string AllowSymbolsParameterName = "Allow symbols";
-    private const string VowelProbabilityParameterName = "Vowel probability";
-
-    private const string NewStringProbabilityParameterName = "New string probability";
-    private const string NewStringProbabilityParameterDescription = "The probability that the selection of the ephemeral random string constant for inclusion in randomly generated code will produce a new string (rather than a string that was previously generated).";
-
-    public StringRandomErcValue() : this(false, 1d) { }
-
-    public StringRandomErcValue(bool isEnabled, double weight = 1d) : base(isEnabled, weight) {
-      Name = "String random";
-      Parameters.Add(new FixedValueParameter<BoolValue>(AllowLowercaseLettersParameterName, new BoolValue(true)));
-      Parameters.Add(new FixedValueParameter<BoolValue>(AllowUppercaseLettersParameterName, new BoolValue(true)));
-      Parameters.Add(new FixedValueParameter<BoolValue>(AllowDigitsParameterName, new BoolValue(true)));
-      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSymbolsParameterName, new BoolValue(true)));
-      Parameters.Add(new FixedValueParameter<BoolValue>(AllowSpaceParameterName, new BoolValue(false)));
-      Parameters.Add(new FixedValueParameter<IntValue>(StringLengthParameterName, new IntValue(DefaultStringLength)));
-      Parameters.Add(new FixedValueParameter<PercentValue>(SpaceProbabilityParameterName));
-      Parameters.Add(new FixedValueParameter<PercentValue>(VowelProbabilityParameterName));
-      Parameters.Add(new FixedValueParameter<PercentValue>(NewStringProbabilityParameterName, NewStringProbabilityParameterDescription));
-    }
-
-    [StorableConstructor]
-    public StringRandomErcValue(bool deserializing) : base(deserializing) { }
-
-    public StringRandomErcValue(StringRandomErcValue origin, Cloner cloner) : base(origin, cloner) {
-    }
-
-    public override string GetErcValue(IRandom random) {
-      if (random.NextDouble().IsAlmost(NewStringProbability) || generatedValues.Count == 0) {
-        var value = StringGenerator.RandomString(
-          AllowLowercaseLetters,
-          AllowUppercaseLetters,
-          AllowSpace,
-          SpaceProbability,
-          StringLength,
-          random);
-
-        generatedValues.Add(value);
-        return value;
-      }
-
-      var idx = random.Next(generatedValues.Count);
-      return generatedValues[idx];
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new StringRandomErcValue(this, cloner);
-    }
-
-    public IValueParameter<BoolValue> AllowLowercaseLettersParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[AllowLowercaseLettersParameterName]; }
-    }
-
-    public bool AllowLowercaseLetters
-    {
-      get { return AllowLowercaseLettersParameter.Value.Value; }
-      set { AllowLowercaseLettersParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<BoolValue> AllowUppercaseLettersParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[AllowUppercaseLettersParameterName]; }
-    }
-
-    public bool AllowUppercaseLetters
-    {
-      get { return AllowUppercaseLettersParameter.Value.Value; }
-      set { AllowUppercaseLettersParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<BoolValue> AllowDigitsParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[AllowDigitsParameterName]; }
-    }
-
-    public bool AllowDigits
-    {
-      get { return AllowDigitsParameter.Value.Value; }
-      set { AllowDigitsParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<BoolValue> AllowSymbolsParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[AllowSymbolsParameterName]; }
-    }
-
-    public bool AllowSymbols
-    {
-      get { return AllowSymbolsParameter.Value.Value; }
-      set { AllowSymbolsParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<BoolValue> AllowSpaceParameter
-    {
-      get { return (IValueParameter<BoolValue>)Parameters[AllowSpaceParameterName]; }
-    }
-
-    public bool AllowSpace
-    {
-      get { return AllowSpaceParameter.Value.Value; }
-      set { AllowSpaceParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<PercentValue> SpaceProbabilityParameter
-    {
-      get { return (IValueParameter<PercentValue>)Parameters[SpaceProbabilityParameterName]; }
-    }
-
-    public double SpaceProbability
-    {
-      get { return SpaceProbabilityParameter.Value.Value; }
-      set { SpaceProbabilityParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<PercentValue> VowelProbabilityParameter
-    {
-      get { return (IValueParameter<PercentValue>)Parameters[VowelProbabilityParameterName]; }
-    }
-
-    public double VowelProbability
-    {
-      get { return VowelProbabilityParameter.Value.Value; }
-      set { VowelProbabilityParameter.Value.Value = value; }
-    }
-
-    public IValueParameter<IntValue> StringLengthParameter
-    {
-      get { return (IValueParameter<IntValue>)Parameters[StringLengthParameterName]; }
-    }
-
-    public IValueParameter<PercentValue> NewStringProbabilityParameter
-    {
-      get { return (IValueParameter<PercentValue>)Parameters[NewStringProbabilityParameterName]; }
-    }
-
-    public double NewStringProbability
-    {
-      get { return NewStringProbabilityParameter.Value.Value; }
-      set { NewStringProbabilityParameter.Value.Value = value; }
-    }
-
-    public int StringLength
-    {
-      get { return StringLengthParameter.Value.Value; }
-      set { StringLengthParameter.Value.Value = value; }
-    }
-  }
-}
