Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5927)
@@ -208,7 +208,16 @@
       ProblemConfiguration.Parameterize(problem);
 
-      //((IAlgorithm)AlgorithmConfiguration.ActualValue.Value).CollectParameterValues(this.Parameters);
+      algorithm.CollectParameterValues(this.Parameters);
       //((IProblem)ProblemConfiguration.ActualValue.Value).CollectParameterValues(this.Parameters);
-    }
+      //CollectAlgorithmParameterValues((IAlgorithm)AlgorithmConfiguration.ActualValue.Value, parameters);
+    }
+
+    //protected virtual void CollectAlgorithmParameterValues(IAlgorithm algorithm, IDictionary<string, IItem> values) {
+    //  var algorithmValues = new Dictionary<string, IItem>();
+    //  algorithm.CollectParameterValues(algorithmValues);
+    //  foreach (var value in algorithmValues) {
+    //    values.Add("Algorithm." + value.Key, value.Value);
+    //  }
+    //}
 
     public Experiment GenerateExperiment(IAlgorithm algorithm, bool createBatchRuns, int repetitions) {
@@ -297,4 +306,11 @@
       }
     }
+
+    public override void CollectOptimizedParameterNames(List<string> parameterNames, string prefix) {
+      AlgorithmConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+      ProblemConfiguration.CollectOptimizedParameterNames(parameterNames, string.Empty);
+    }
+
+   
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5927)
@@ -9,4 +9,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -25,5 +26,5 @@
     [Storable]
     protected bool optimize;
-    public bool Optimize {
+    public virtual bool Optimize {
       get { return optimize; }
       set {
@@ -33,5 +34,5 @@
             PopulateValueConfigurations();
           } else {
-            this.ValueConfigurations.Clear();
+            ClearValueConfigurations();
           }
           OnOptimizeChanged();
@@ -42,6 +43,6 @@
 
     [Storable]
-    private Image itemImage;
-    public virtual Image ItemImage {
+    protected Image itemImage;
+    public override Image ItemImage {
       get { return itemImage ?? base.ItemImage; }
     }
@@ -160,5 +161,31 @@
       }
     }
-
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue, IEnumerable<IValueConfiguration> valueConfigurations) {
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null; // maybe use values from valueConfigurations
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = valueConfigurations.Count() > 0 ? valueConfigurations.FirstOrDefault().ItemImage : null;
+      this.ValueConfigurations = new CheckedValueConfigurationList(valueConfigurations);
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+    }
+    public ParameterConfiguration(string parameterName, Type type, IItem actualValue) {
+      this.ParameterName = parameterName;
+      this.parameterDataType = type;
+      this.valueDataType = type;
+      this.discoverValidValues = false;
+      this.validValues = null;
+      this.validTypes = new Type[] { type };
+      this.IsNullable = false;
+      this.itemImage = actualValue.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList();
+      this.ActualValue = new ConstrainedValue(actualValue, type, CreateValidValues(), this.IsNullable);
+      if (Optimize) {
+        PopulateValueConfigurations();
+      }
+    }
     public ParameterConfiguration() { }
     [StorableConstructor]
@@ -180,4 +207,6 @@
       if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
     }
+
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new ParameterConfiguration(this, cloner);
@@ -208,5 +237,5 @@
     }
 
-    private void PopulateValueConfigurations() {
+    protected virtual void PopulateValueConfigurations() {
       foreach (Type t in this.validTypes) {
         if (t == typeof(NullValue)) {
@@ -220,12 +249,22 @@
           }
           if (val != null) { // val can be null when ValidValues does not contain the type (this can happen when discoverValidValues=false)
+            IValueConfiguration valueConfiguration;
             if (val is IParameterizedItem) {
-              this.ValueConfigurations.Add(new ParameterizedValueConfiguration(val, val.GetType(), true), true);
+              valueConfiguration = new ParameterizedValueConfiguration(val, val.GetType(), true);
             } else {
-              this.ValueConfigurations.Add(new RangeValueConfiguration(val, val.GetType()), true);
+              if (val is ISymbolicExpressionGrammar) {
+                valueConfiguration = new SymbolicExpressionGrammarValueConfiguration((ISymbolicExpressionGrammar)val);
+              } else {
+                valueConfiguration = new RangeValueConfiguration(val, val.GetType());
+              }
             }
-          }
-        }
-      }
+            this.ValueConfigurations.Add(valueConfiguration, true);
+          }
+        }
+      }
+    }
+
+    protected virtual void ClearValueConfigurations() {
+      this.ValueConfigurations.Clear();
     }
 
@@ -260,6 +299,11 @@
     public IItem CreateItem(Type type) {
       // no valid values; just instantiate
-      if (validValues == null)
-        return (IItem)Activator.CreateInstance(type);
+      try {
+        if (validValues == null)
+          return (IItem)Activator.CreateInstance(type);
+      }
+      catch (MissingMemberException) {
+        return null; // can happen, when ApplicationManager.Manager.GetTypes(type, OnlyInstantiable=true) returns objects which have no default constructor
+      }
 
       if (type == typeof(NullValue))
@@ -279,5 +323,5 @@
         try {
           var val = CreateItem(t);
-          validValues.Add(val);
+          if (val != null) validValues.Add(val);
         }
         catch (MissingMethodException) { /* Constructor is missing, don't use those types */ }
@@ -415,7 +459,13 @@
 
     public void Parameterize(IValueParameter parameter) {
+      if (parameter is IFixedValueParameter)
+        return;
+
       if (Optimize) {
         if (this.ActualValue.Value is IParameterizedItem) {
           ((ParameterizedValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((IParameterizedItem)this.ActualValue.Value);
+        }
+        if (this.ActualValue.Value is ISymbolicExpressionGrammar) {
+          ((SymbolicExpressionGrammarValueConfiguration)this.ValueConfigurations[actualValueConfigurationIndex]).Parameterize((ISymbolicExpressionGrammar)this.ActualValue.Value);
         }
       }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/SingleValuedParameterConfiguration.cs	(revision 5927)
@@ -1,3 +1,4 @@
-﻿using System.Linq;
+﻿using System;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -14,5 +15,24 @@
       : base(parameterName, valueParameter, false) {
       this.Optimize = true;
+      base.PopulateValueConfigurations();
       this.ValueConfigurations.Single().Optimize = true;
+    }
+    public SingleValuedParameterConfiguration(string parameterName, IValueConfiguration valueConfiguration) {
+      this.ParameterName = parameterName;
+      this.parameterDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.valueDataType = valueConfiguration.ActualValue.ValueDataType;
+      this.discoverValidValues = false;
+      this.validValues = new ItemSet<IItem> { valueConfiguration.ActualValue.Value };
+      this.validTypes = new Type[] {valueConfiguration.ActualValue.ValueDataType};
+      this.IsNullable = false;
+      this.itemImage = valueConfiguration.ItemImage;
+      this.ValueConfigurations = new CheckedValueConfigurationList { valueConfiguration };
+      this.ValueConfigurations.Single().Optimize = true;
+      valueConfiguration.ToStringChanged += new EventHandler(valueConfiguration_ToStringChanged);
+      this.ActualValue = new ConstrainedValue(
+        valueConfiguration.ActualValue.Value,
+        valueConfiguration.ActualValue.ValueDataType,
+        this.validValues,
+        this.IsNullable);
     }
     public SingleValuedParameterConfiguration() { }
@@ -24,4 +44,29 @@
     }
     #endregion
+
+    protected override void PopulateValueConfigurations() {
+      // don't change valueconfigurations, since it only contains the one element specified in constructor
+    }
+
+    protected override void ClearValueConfigurations() {
+      // do nothing
+    }
+
+    public override string ToString() {
+      if (this.valueConfigurations.First() is SymbolValueConfiguration) {
+        var syVc = (SymbolValueConfiguration)this.valueConfigurations.First();
+        if (this.Optimize) {
+          return syVc.ToString() + " (Optimize)";
+        } else {
+          return syVc.ToString();
+        }
+      } else {
+        return base.ToString();
+      }
+    }
+
+    private void valueConfiguration_ToStringChanged(object sender, EventArgs e) {
+      OnToStringChanged();
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolValueConfiguration.cs	(revision 5927)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolValueConfiguration.cs	(revision 5927)
@@ -0,0 +1,105 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SymbolValueConfiguration : ParameterizedValueConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolValueConfiguration() : base() { }
+    public SymbolValueConfiguration(Symbol symbol)
+      : base() {
+      this.IsOptimizable = true;
+      this.Optimize = false;
+      this.Name = symbol.Name;
+      this.actualValue = new ConstrainedValue(symbol, symbol.GetType(), new ItemSet<IItem> { symbol }, false);
+    }
+    protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      this.ClearParameterConfigurations();
+
+      var symbol = (Symbol)item;
+
+      var initialFrequencyValueConfigurations = new List<IValueConfiguration>();
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(0), typeof(DoubleValue)));
+      initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(1), typeof(DoubleValue)));
+      var initialFrequencyParameterConfiguration = new ParameterConfiguration("InitialFrequency", typeof(Symbol), new DoubleValue(symbol.InitialFrequency), initialFrequencyValueConfigurations);
+      this.parameterConfigurations.Add(initialFrequencyParameterConfiguration);
+
+      var constant = symbol as Constant;
+      if (constant != null) {
+        var minValueParameterConfiguration = new ParameterConfiguration("MinValue", typeof(DoubleValue), new DoubleValue(constant.MinValue));
+        var maxValueParameterConfiguration = new ParameterConfiguration("MaxValue", typeof(DoubleValue), new DoubleValue(constant.MaxValue));
+        var manipulatorMuParameterConfiguration = new ParameterConfiguration("ManipulatorMu", typeof(DoubleValue), new DoubleValue(constant.ManipulatorMu));
+        var manipulatorSigmaParameterConfiguration = new ParameterConfiguration("ManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.ManipulatorSigma));
+        var multiplicativeManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.MultiplicativeManipulatorSigma));
+
+        this.parameterConfigurations.Add(minValueParameterConfiguration);
+        this.parameterConfigurations.Add(maxValueParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(manipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeManipulatorSigmaParameterConfiguration);
+      }
+
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        var weightMuParameterConfiguration = new ParameterConfiguration("WeightMu", typeof(DoubleValue), new DoubleValue(variable.WeightMu));
+        var weightSigmaParameterConfiguration = new ParameterConfiguration("WeightSigma", typeof(DoubleValue), new DoubleValue(variable.WeightSigma));
+        var weightManipulatorMuParameterConfiguration = new ParameterConfiguration("WeightManipulatorMu", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorMu));
+        var weightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("WeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorSigma));
+        var multiplicativeWeightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeWeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.MultiplicativeWeightManipulatorSigma));
+
+        this.parameterConfigurations.Add(weightMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorMuParameterConfiguration);
+        this.parameterConfigurations.Add(weightManipulatorSigmaParameterConfiguration);
+        this.parameterConfigurations.Add(multiplicativeWeightManipulatorSigmaParameterConfiguration);
+      }
+    }
+
+    public virtual void Parameterize(Symbol symbol) {
+      symbol.InitialFrequency = GetDoubleValue("InitialFrequency");
+      
+      var constant = symbol as Constant;
+      if (constant != null) {
+        constant.MinValue = GetDoubleValue("MinValue");
+        constant.MaxValue = GetDoubleValue("MaxValue");
+        constant.ManipulatorMu = GetDoubleValue("ManipulatorMu");
+        constant.ManipulatorSigma = GetDoubleValue("ManipulatorSigma");
+        constant.MultiplicativeManipulatorSigma = GetDoubleValue("MultiplicativeManipulatorSigma");
+      }
+      
+      var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable;
+      if (variable != null) {
+        variable.WeightMu = GetDoubleValue("WeightMu");
+        variable.WeightSigma = GetDoubleValue("WeightSigma");
+        variable.WeightManipulatorMu = GetDoubleValue("WeightManipulatorMu");
+        variable.WeightManipulatorSigma = GetDoubleValue("WeightManipulatorSigma");
+        variable.MultiplicativeWeightManipulatorSigma = GetDoubleValue("MultiplicativeWeightManipulatorSigma");
+      }
+    }
+
+    private double GetDoubleValue(string name) {
+      return ((DoubleValue)ParameterConfigurations.Single(x => x.Name == name).ActualValue.Value).Value;
+    }
+
+    public override string ToString() {
+      return string.Format("{0}: {1}", this.Name, parameterConfigurations.Single(pc => pc.Name == "InitialFrequency").ActualValue.Value);
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolicExpressionGrammarValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolicExpressionGrammarValueConfiguration.cs	(revision 5927)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/SymbolicRegression/SymbolicExpressionGrammarValueConfiguration.cs	(revision 5927)
@@ -0,0 +1,40 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SymbolicExpressionGrammarValueConfiguration : ParameterizedValueConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SymbolicExpressionGrammarValueConfiguration(bool deserializing) : base(deserializing) { }
+    public SymbolicExpressionGrammarValueConfiguration() : base() { }
+    public SymbolicExpressionGrammarValueConfiguration(ISymbolicExpressionGrammar grammar) {
+      this.IsOptimizable = true;
+      this.ActualValue = new ConstrainedValue(grammar, grammar.GetType(), new ItemSet<IItem> { grammar }, false);
+    }
+    protected SymbolicExpressionGrammarValueConfiguration(SymbolicExpressionGrammarValueConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionGrammarValueConfiguration(this, cloner);
+    }
+    #endregion
+
+    protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var grammar = (ISymbolicExpressionGrammar)item;
+      foreach (Symbol symbol in grammar.Symbols) {
+        this.parameterConfigurations.Add(new SingleValuedParameterConfiguration(symbol.Name, new SymbolValueConfiguration(symbol)));
+      }
+    }
+
+    public virtual void Parameterize(ISymbolicExpressionGrammar grammar) {
+      foreach (Symbol symbol in grammar.Symbols) {
+        ((SymbolValueConfiguration)this.parameterConfigurations.Single(pc => pc.Name == symbol.Name).ValueConfigurations.First()).Parameterize(symbol);
+      }
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/CheckedValueConfigurationCollection.cs	(revision 5927)
@@ -1,10 +1,8 @@
-﻿using System;
-using System.Collections.Generic;
+﻿using System.Collections.Generic;
 using System.Linq;
-using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Common;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Collections;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -29,4 +27,9 @@
       RegisterEvents();
     }
+    public CheckedValueConfigurationList(IEnumerable<IValueConfiguration> collection)
+      : base(collection) {
+      validValues = null;
+      // event wiring not needed
+    }
     public CheckedValueConfigurationList() {
       RegisterEvents();
@@ -43,4 +46,5 @@
       RegisterEvents();
     }
+
     public override IDeepCloneable Clone(Cloner cloner) {
       return new CheckedValueConfigurationList(this, cloner);
@@ -61,5 +65,5 @@
     }
 
-    void CheckedValueConfigurationList_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
+    private void CheckedValueConfigurationList_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IValueConfiguration>> e) {
       foreach (var item in e.Items) {
         var matchingItems = this.Where(x => x != item.Value && x.ActualValue.ValueDataType == item.Value.ActualValue.ValueDataType);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 5927)
@@ -20,10 +20,12 @@
       get { return base.Optimize; }
       set {
-        base.Optimize = value;
-        if (optimize) {
-          ClearParameterConfigurations();
-          if (this.actualValue.Value is IParameterizedNamedItem) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem, this.discoverValidValues);
-        } else {
-          ClearParameterConfigurations();
+        if (this.optimize != value) {
+          base.Optimize = value;
+          if (optimize) {
+            ClearParameterConfigurations();
+            PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
+          } else {
+            ClearParameterConfigurations();
+          }
         }
       }
@@ -35,5 +37,5 @@
         ClearParameterConfigurations();
         base.ActualValue = value;
-        if(this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem, this.discoverValidValues);
+        if (this.Optimize && this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value, this.discoverValidValues);
       }
     }
@@ -66,10 +68,13 @@
     #endregion
 
-    protected virtual void PopulateParameterConfigurations(IParameterizedNamedItem parameterizedItem, bool discoverValidValues) {
-      foreach (var childParameter in parameterizedItem.Parameters) {
-        IValueParameter valueParameter = childParameter as IValueParameter;
-        if (valueParameter != null) {
-          var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
-          this.parameterConfigurations.Add(pc);
+    protected virtual void PopulateParameterConfigurations(IItem item, bool discoverValidValues) {
+      var parameterizedItem = item as IParameterizedItem;
+      if (parameterizedItem != null) {
+        foreach (var childParameter in parameterizedItem.Parameters) {
+          IValueParameter valueParameter = childParameter as IValueParameter;
+          if (valueParameter != null) {
+            var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
+            this.parameterConfigurations.Add(pc);
+          }
         }
       }
@@ -126,7 +131,7 @@
     }
 
-    public IEnumerable<string> GetOptimizedParameterNames() {
+    public virtual IEnumerable<string> GetOptimizedParameterNames() {
       var list = new List<string>();
-      this.CollectOptimizedParameterNames(list, "");
+      this.CollectOptimizedParameterNames(list, string.Empty);
       return list;
     }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5927)
@@ -20,5 +20,5 @@
     [Storable]
     protected bool isOptimizable;
-    public bool IsOptimizable {
+    public virtual bool IsOptimizable {
       get { return isOptimizable; }
       set {
@@ -36,4 +36,7 @@
       set {
         if (optimize != value) {
+          if (value == true && !this.IsOptimizable)
+            throw new NotSupportedException("This value is not optimizable.");
+
           optimize = value;
           OnOptimizeChanged();
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 5927)
@@ -59,12 +59,5 @@
         for (int j = 0; j < problems.Count; j++) {
           IScope child = new Scope(string.Format("Problem {0}, Repetition {1}", j, i));
-          var algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
-          algorithm.Problem = (IProblem)problems[j].Clone();
-          ((EngineAlgorithm)algorithm).Engine = new SequentialEngine.SequentialEngine();
-
-          //((GeneticAlgorithm)algorithm).PopulationSize.Value = 10;
-          //((GeneticAlgorithm)algorithm).MaximumGenerations.Value = 10;
-
-          parameterConfiguration.Parameterize(algorithm);
+          var algorithm = MetaOptimizationUtil.CreateParameterizedAlgorithmInstance(parameterConfiguration, algorithmType, (IProblem)problems[j].Clone());
           child.Variables.Add(new Variable("Algorithm", algorithm));
           child.Variables.Add(new Variable("ProblemIndex", new IntValue(j)));
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5927)
@@ -102,4 +102,7 @@
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Operators-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
@@ -117,6 +120,9 @@
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.DataAnalysis-3.3.dll</HintPath>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis.Symbolic-3.4">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
@@ -148,4 +154,6 @@
     <Compile Include="Encoding\AlgorithmProblemItem.cs" />
     <Compile Include="Encoding\ParameterConfigurations\SingleValuedParameterConfiguration.cs" />
+    <Compile Include="Encoding\SymbolicRegression\SymbolValueConfiguration.cs" />
+    <Compile Include="Encoding\SymbolicRegression\SymbolicExpressionGrammarValueConfiguration.cs" />
     <Compile Include="Encoding\ValueConfigurations\RangeValueConfiguration.cs" />
     <Compile Include="Encoding\ValueConfigurations\ParameterizedValueConfiguration.cs" />
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5927)
@@ -38,7 +38,7 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IParameterConfigurationEvaluator, IParameterConfigurationCreator>, IStorableContent {
+  public sealed class MetaOptimizationProblem : SingleObjectiveHeuristicOptimizationProblem<IParameterConfigurationEvaluator, IParameterConfigurationCreator>, IStorableContent {
     public string Filename { get; set; }
-
+    
     public const string AlgorithmTypeParameterName = "AlgorithmType";
     public const string ProblemTypeParameterName = "ProblemType";
@@ -272,5 +272,5 @@
 
         // special for DataAnalysisProblem: Because of wiring between algorithm and problem, ParameterConfigurationTree needs to be recreated on Reset event
-        var dap = e.Items.Single().Value as DataAnalysisProblem;
+        var dap = e.Items.Single().Value as IDataAnalysisProblem;
         if (dap != null) {
           dap.Reset += new EventHandler(DataAnalysisProblem_Reset);
@@ -283,5 +283,5 @@
         ParameterConfigurationTreeParameter.ActualValue = null;
 
-        var dap = e.Items.Single().Value as DataAnalysisProblem;
+        var dap = e.Items.Single().Value as IDataAnalysisProblem;
         if (dap != null) {
           dap.Reset -= new EventHandler(DataAnalysisProblem_Reset);
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationUtil.cs	(revision 5927)
@@ -1,17 +1,8 @@
 ﻿using System;
+using System.Collections.Generic;
 using System.Linq;
-using System.Threading;
-using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-using HeuristicLab.Algorithms.GeneticAlgorithm;
-using System.Threading.Tasks;
-using System.Diagnostics;
-using System.Reflection;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -52,4 +43,16 @@
       return parameterConfigurationTree.AverageQualityNormalized.Value;
     }
+
+    /// <summary>
+    /// Creates a new instance of algorithmType, sets the given problem and parameterizes it with the given configuration
+    /// </summary>
+    public static IAlgorithm CreateParameterizedAlgorithmInstance(ParameterConfigurationTree parameterConfigurationTree, Type algorithmType, IProblem problem, bool randomize = false, IRandom random = null) {
+      var algorithm = (IAlgorithm)Activator.CreateInstance(algorithmType);
+      algorithm.Problem = problem;
+      ((EngineAlgorithm)algorithm).Engine = new SequentialEngine.SequentialEngine();
+      if(randomize) parameterConfigurationTree.Randomize(random);
+      parameterConfigurationTree.Parameterize(algorithm);
+      return algorithm;
+    }
   }
 }
