Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs	(revision 5665)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/AlgorithmProblemItem.cs	(revision 5665)
@@ -0,0 +1,34 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class AlgorithmProblemItem : ParameterizedNamedItem {
+    #region Parameter Properties
+    public IValueParameter<IAlgorithm> AlgorithmParameter {
+      get { return (ValueParameter<IAlgorithm>)Parameters["Algorithm"]; }
+    }
+    public IValueParameter<IProblem> ProblemParameter {
+      get { return (ValueParameter<IProblem>)Parameters["Problem"]; }
+    }
+    #endregion
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected AlgorithmProblemItem(bool deserializing) : base(deserializing) { }
+    public AlgorithmProblemItem() {
+      this.Parameters.Add(new ValueParameter<IAlgorithm>("Algorithm"));
+      this.Parameters.Add(new ValueParameter<IProblem>("Problem"));
+    }
+    protected AlgorithmProblemItem(AlgorithmProblemItem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AlgorithmProblemItem(this, cloner);
+    }
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5665)
@@ -2,4 +2,6 @@
 using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
+using System.Text;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -103,21 +105,40 @@
     }
 
-    [Storable]
-    protected string name;
-    public string Name {
-      get { return name; }
-      set { name = value; }
-    }
+    public ParameterizedValueConfiguration AlgorithmConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(0).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    public ParameterizedValueConfiguration ProblemConfiguration {
+      get {
+        return this.ParameterConfigurations.ElementAt(1).ValueConfigurations.First() as ParameterizedValueConfiguration;
+      }
+    }
+
+    //[Storable]
+    //protected string name;
+    //public string Name {
+    //  get { return name; }
+    //  set { name = value; }
+    //}
 
     #region constructors and cloning
-    public ParameterConfigurationTree(IAlgorithm algorithm)
-      : base(null, algorithm.GetType()) {
-      this.Optimize = true; // root must always be optimized
+    public ParameterConfigurationTree(IAlgorithm algorithm, IProblem problem)
+      : base(null, algorithm.GetType(), false) {
+      this.Optimize = false;
+      this.IsOptimizable = false;
       this.parameters = new Dictionary<string, IItem>();
       this.Name = algorithm.ItemName;
-      PopulateParameterConfigurations(algorithm);
-    }
-    public ParameterConfigurationTree() {
-    }
+
+      var algproblemitem = new AlgorithmProblemItem();
+      algproblemitem.AlgorithmParameter.Value = algorithm;
+      algproblemitem.ProblemParameter.Value = problem;
+      this.discoverValidValues = false;
+      
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Algorithm", algproblemitem.AlgorithmParameter));
+      this.parameterConfigurations.Add(new SingleValuedParameterConfiguration("Problem", algproblemitem.ProblemParameter));
+    }
+    public ParameterConfigurationTree() { }
     [StorableConstructor]
     protected ParameterConfigurationTree(bool deserializing) : base(deserializing) { }
@@ -138,5 +159,5 @@
         this.parameters.Add(p.Key, cloner.Clone(p.Value));
       }
-      this.name = original.name;
+      //this.name = original.name;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
@@ -181,6 +202,12 @@
     public override void Parameterize(IParameterizedItem item) {
       this.parameters.Clear();
-      base.Parameterize(item);
-      ((IAlgorithm)item).CollectParameterValues(this.Parameters);
+      var algorithm = item as IAlgorithm;
+      var problem = algorithm.Problem;
+
+      AlgorithmConfiguration.Parameterize(algorithm);
+      ProblemConfiguration.Parameterize(problem);
+
+      //((IAlgorithm)AlgorithmConfiguration.ActualValue.Value).CollectParameterValues(this.Parameters);
+      //((IProblem)ProblemConfiguration.ActualValue.Value).CollectParameterValues(this.Parameters);
     }
 
@@ -251,4 +278,23 @@
       return run;
     }
+
+    public override string ParameterInfoString {
+      get {
+        string algorithmInfo = this.AlgorithmConfiguration.ParameterInfoString;
+        string problemInfo = this.ProblemConfiguration.ParameterInfoString;
+        var sb = new StringBuilder();
+        if (!string.IsNullOrEmpty(algorithmInfo)) {
+          sb.Append("Algorithm: ");
+          sb.Append(algorithmInfo);
+        }
+        if (!string.IsNullOrEmpty(problemInfo)) {
+          if (sb.Length > 0)
+            sb.Append(", ");
+          sb.Append("Problem: ");
+          sb.Append(problemInfo);
+        }
+        return sb.ToString();
+      }
+    }
   }
 }
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 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5665)
@@ -128,12 +128,20 @@
 
     [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
+    }
+
+    [Storable]
     protected IItemSet<IItem> validValues;
 
     #region Constructors and Cloning
-    public ParameterConfiguration(string parameterName, IValueParameter valueParameter) {
+    public ParameterConfiguration(string parameterName, IValueParameter valueParameter, bool discoverValidValues) {
       this.ParameterName = parameterName;
       this.parameterDataType = valueParameter.GetType();
       this.valueDataType = valueParameter.DataType;
-      this.validValues = GetValidValues(valueParameter);
+      this.discoverValidValues = discoverValidValues;
+      this.validValues = discoverValidValues ? GetValidValues(valueParameter) : new ItemSet<IItem> { valueParameter.Value };
       this.validTypes = GetValidTypes(valueParameter).ToArray();
       this.IsNullable = valueParameter.ItemName.StartsWith("Optional");
@@ -169,4 +177,5 @@
       this.isNullable = original.isNullable;
       this.itemImage = original.itemImage;
+      this.discoverValidValues = original.discoverValidValues;
       if (this.valueConfigurations != null) RegisterValueConfigurationEvents();
     }
@@ -210,8 +219,10 @@
             val = CreateItem(t);
           }
-          if (val is IParameterizedItem) {
-            this.ValueConfigurations.Add(new ParameterizedValueConfiguration(val, val.GetType()), true);
-          } else {
-            this.ValueConfigurations.Add(new RangeValueConfiguration(val, val.GetType()), true);
+          if (val != null) { // val can be null when ValidValues does not contain the type (this can happen when discoverValidValues=false)
+            if (val is IParameterizedItem) {
+              this.ValueConfigurations.Add(new ParameterizedValueConfiguration(val, val.GetType(), true), true);
+            } else {
+              this.ValueConfigurations.Add(new RangeValueConfiguration(val, val.GetType()), true);
+            }
           }
         }
@@ -395,8 +406,8 @@
     }
 
-    public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter) {
+    public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter, bool discoverValidValues) {
       if (parameter is IValueParameter) {
         IValueParameter valueParameter = parameter as IValueParameter;
-        return new ParameterConfiguration(parameter.Name, valueParameter);
+        return new ParameterConfiguration(parameter.Name, valueParameter, discoverValidValues);
       }
       return null;
@@ -410,5 +421,5 @@
       }
       var clonedValue = this.ActualValue.Value != null ? (IItem)this.ActualValue.Value.Clone() : null;
-      if(clonedValue != null) AdaptValidValues(parameter, clonedValue);
+      if (clonedValue != null) AdaptValidValues(parameter, clonedValue);
       parameter.Value = clonedValue;
     }
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 5665)
@@ -0,0 +1,27 @@
+﻿using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class SingleValuedParameterConfiguration : ParameterConfiguration {
+
+    #region Constructors and Cloning
+    [StorableConstructor]
+    protected SingleValuedParameterConfiguration(bool deserializing) : base(deserializing) { }
+    public SingleValuedParameterConfiguration(string parameterName, IValueParameter valueParameter)
+      : base(parameterName, valueParameter, false) {
+      this.Optimize = true;
+      this.ValueConfigurations.Single().Optimize = true;
+    }
+    public SingleValuedParameterConfiguration() { }
+    protected SingleValuedParameterConfiguration(SingleValuedParameterConfiguration original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleValuedParameterConfiguration(this, cloner);
+    }
+    #endregion
+  }
+}
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 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ParameterizedValueConfiguration.cs	(revision 5665)
@@ -12,5 +12,5 @@
     [Storable]
     protected IItemCollection<IParameterConfiguration> parameterConfigurations = new ItemCollection<IParameterConfiguration>();
-    public IItemCollection<IParameterConfiguration> ParameterConfigurations {
+    public virtual IItemCollection<IParameterConfiguration> ParameterConfigurations {
       get { return new ReadOnlyItemCollection<IParameterConfiguration>(this.parameterConfigurations); }
       protected set { this.parameterConfigurations = value; }
@@ -23,5 +23,5 @@
         if (optimize) {
           ClearParameterConfigurations();
-          if (this.actualValue.Value is IParameterizedNamedItem) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem);
+          if (this.actualValue.Value is IParameterizedNamedItem) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem, this.discoverValidValues);
         } else {
           ClearParameterConfigurations();
@@ -35,6 +35,13 @@
         ClearParameterConfigurations();
         base.ActualValue = value;
-        if(this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem);
+        if(this.actualValue.Value != null) PopulateParameterConfigurations(this.actualValue.Value as IParameterizedNamedItem, this.discoverValidValues);
       }
+    }
+
+    [Storable]
+    protected bool discoverValidValues;
+    public bool DiscoverValidValues {
+      get { return discoverValidValues; }
+      set { discoverValidValues = value; }
     }
 
@@ -45,9 +52,11 @@
       this.ParameterConfigurations = new ItemList<IParameterConfiguration>();
     }
-    public ParameterizedValueConfiguration(IItem value, Type valueDataType)
+    public ParameterizedValueConfiguration(IItem value, Type valueDataType, bool discoverValidValues)
       : base(value, valueDataType) {
+      this.discoverValidValues = discoverValidValues;
     }
     protected ParameterizedValueConfiguration(ParameterizedValueConfiguration original, Cloner cloner)
       : base(original, cloner) {
+      this.discoverValidValues = original.discoverValidValues;
       this.ParameterConfigurations = cloner.Clone(original.parameterConfigurations);
     }
@@ -57,8 +66,11 @@
     #endregion
 
-    protected virtual void PopulateParameterConfigurations(IParameterizedNamedItem parameterizedItem) {
+    protected virtual void PopulateParameterConfigurations(IParameterizedNamedItem parameterizedItem, bool discoverValidValues) {
       foreach (var childParameter in parameterizedItem.Parameters) {
-        var pc = ParameterConfiguration.Create(parameterizedItem, childParameter);
-        if (pc != null) this.parameterConfigurations.Add(pc);
+        IValueParameter valueParameter = childParameter as IValueParameter;
+        if (valueParameter != null) {
+          var pc = new ParameterConfiguration(valueParameter.Name, valueParameter, discoverValidValues);
+          this.parameterConfigurations.Add(pc);
+        }
       }
     }
@@ -71,5 +83,5 @@
       get {
         StringBuilder sb = new StringBuilder();
-        if (this.Optimize && this.ParameterConfigurations.Count > 0) {
+        if ((this.Optimize) && this.ParameterConfigurations.Count > 0) {
           var parameterInfos = new List<string>();
           foreach (var pc in this.ParameterConfigurations) {
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 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5665)
@@ -2,9 +2,7 @@
 using System.Collections.Generic;
 using System.Drawing;
-using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -74,5 +72,4 @@
     #region Constructors and Cloning
     public ValueConfiguration(IItem value, Type valueDataType) {
-      var validTypes = ApplicationManager.Manager.GetTypes(valueDataType).OrderBy(x => x.Name).ToArray();
       this.ActualValue = new ConstrainedValue(value, valueDataType, new ItemSet<IItem> { value }, false);
       this.IsOptimizable = true;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmSubScopesCreator.cs	(revision 5665)
@@ -1,14 +1,10 @@
 ﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+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 HeuristicLab.Core;
-using HeuristicLab.Common;
-using HeuristicLab.Parameters;
-using HeuristicLab.Optimization;
-using HeuristicLab.Data;
-using HeuristicLab.Algorithms.GeneticAlgorithm;
 
 namespace HeuristicLab.Problems.MetaOptimization {
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 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5665)
@@ -146,4 +146,6 @@
     <Compile Include="Analyzers\PMOPopulationDiversityAnalyzer.cs" />
     <Compile Include="ConstrainedTypeValue.cs" />
+    <Compile Include="Encoding\AlgorithmProblemItem.cs" />
+    <Compile Include="Encoding\ParameterConfigurations\SingleValuedParameterConfiguration.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 5655)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5665)
@@ -269,5 +269,5 @@
       // the first problem in the list is always the instance for the algorithm - this way some basic wiring between problem and algorithm can be sustained
       if (e.Items.Single().Index == 0) {
-        ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, e.Items.Single().Value));
+        ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, e.Items.Single().Value), e.Items.Single().Value);
 
         // special for DataAnalysisProblem: Because of wiring between algorithm and problem, ParameterConfigurationTree needs to be recreated on Reset event
@@ -291,5 +291,5 @@
 
     private void DataAnalysisProblem_Reset(object sender, EventArgs e) {
-      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, Problems.First()));
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(CreateAlgorithm(AlgorithmType.Value, Problems.First()), Problems.First());
     }
     #endregion
@@ -304,6 +304,10 @@
       AlgorithmType.Value = algorithm.GetType();
       if (algorithm.Problem != null) ProblemType.Value = algorithm.Problem.GetType();
-      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(algorithm);
-      if (algorithm.Problem != null) Problems.Add((IProblem)algorithm.Problem);
+      if (algorithm.Problem != null) {
+        Problems.Clear();
+        Problems.Add((IProblem)algorithm.Problem);
+      }
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(algorithm, Problems.First());
+      
     }
   }
