Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Helper.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Helper.cs	(revision 11396)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Helper.cs	(revision 11396)
@@ -0,0 +1,67 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+
+namespace HeuristicLab.Problems.Programmable {
+  internal static class Helper {
+    internal static ParameterVector Extract(IScope scope, Configuration config) {
+      var binDict = new Dictionary<string, BinaryVector>();
+      var intDict = new Dictionary<string, IntegerVector>();
+      var realDict = new Dictionary<string, RealVector>();
+      var permDict = new Dictionary<string, Permutation>();
+      foreach (var param in config.Parameters) {
+        var binConfig = param.Value as BinaryParameterConfiguration;
+        if (binConfig != null) {
+          binDict.Add(param.Key, (BinaryVector)scope.Variables[param.Key].Value);
+          continue;
+        }
+        var intConfig = param.Value as IntegerParameterConfiguration;
+        if (intConfig != null) {
+          intDict.Add(param.Key, (IntegerVector)scope.Variables[param.Key].Value);
+          continue;
+        }
+        var realConfig = param.Value as RealParameterConfiguration;
+        if (realConfig != null) {
+          realDict.Add(param.Key, (RealVector)scope.Variables[param.Key].Value);
+          continue;
+        }
+        var permConfig = param.Value as PermutationParameterConfiguration;
+        if (permConfig != null) {
+          permDict.Add(param.Key, (Permutation)scope.Variables[param.Key].Value);
+          continue;
+        }
+        throw new InvalidOperationException("Parameter " + param.Key + " not found.");
+      }
+      return new ParameterVector(
+        binaryVectors: binDict.Count > 0 ? binDict : null,
+        integerVectors: intDict.Count > 0 ? intDict : null,
+        realVectors: realDict.Count > 0 ? realDict : null,
+        permutations: permDict.Count > 0 ? permDict : null);
+    }
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 11396)
@@ -138,6 +138,8 @@
     <Compile Include="Datastructures\ParameterConfiguration.cs" />
     <Compile Include="Datastructures\ParameterVector.cs" />
+    <Compile Include="Helper.cs" />
     <Compile Include="Interfaces\IParameterVectorMoveOperator.cs" />
     <Compile Include="Interfaces\ISingleObjectiveProblemDefinitionHost.cs" />
+    <Compile Include="Interfaces\ISingleObjectiveProgrammableProblemAnalyzer.cs" />
     <Compile Include="Interfaces\ISingleObjectiveProgrammableProblemEvaluator.cs" />
     <Compile Include="Operators\ParameterVectorManipulator.cs" />
@@ -146,4 +148,5 @@
     <Compile Include="Operators\ParameterVectorMoveGenerator.cs" />
     <Compile Include="Operators\ParameterVectorMoveMaker.cs" />
+    <Compile Include="Operators\SingleObjectiveAnalyzer.cs" />
     <Compile Include="Operators\SingleObjectiveEvaluator.cs" />
     <Compile Include="Operators\ParameterVectorCreater.cs" />
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemAnalyzer.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemAnalyzer.cs	(revision 11396)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemAnalyzer.cs	(revision 11396)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Programmable {
+  public interface ISingleObjectiveProgrammableProblemAnalyzer : IAnalyzer {
+    ILookupParameter<ISingleObjectiveProblemDefinitionHost> ProblemDefinitionParameter { get; }
+    ILookupParameter<Configuration> ConfigurationParameter { get; }
+    IScopeTreeLookupParameter<DoubleValue> QualityParameter { get; }
+    ILookupParameter<ResultCollection> ResultsParameter { get; }
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemEvaluator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemEvaluator.cs	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Interfaces/ISingleObjectiveProgrammableProblemEvaluator.cs	(revision 11396)
@@ -20,8 +20,11 @@
 #endregion
 
+using HeuristicLab.Core;
 using HeuristicLab.Optimization;
 
 namespace HeuristicLab.Problems.Programmable {
   public interface ISingleObjectiveProgrammableProblemEvaluator : ISingleObjectiveEvaluator {
+    ILookupParameter<ISingleObjectiveProblemDefinitionHost> ProblemDefinitionParameter { get; }
+    ILookupParameter<Configuration> ConfigurationParameter { get; }
   }
 }
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveEvaluator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveEvaluator.cs	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveEvaluator.cs	(revision 11396)
@@ -21,12 +21,7 @@
 
 using System;
-using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -79,36 +74,5 @@
       if (host.Instance == null) throw new InvalidOperationException("Problem definition instance is null.");
       var config = ConfigurationParameter.ActualValue;
-      var binDict = new Dictionary<string, BinaryVector>();
-      var intDict = new Dictionary<string, IntegerVector>();
-      var realDict = new Dictionary<string, RealVector>();
-      var permDict = new Dictionary<string, Permutation>();
-      foreach (var param in config.Parameters) {
-        var binConfig = param.Value as BinaryParameterConfiguration;
-        if (binConfig != null) {
-          binDict.Add(param.Key, (BinaryVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var intConfig = param.Value as IntegerParameterConfiguration;
-        if (intConfig != null) {
-          intDict.Add(param.Key, (IntegerVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var realConfig = param.Value as RealParameterConfiguration;
-        if (realConfig != null) {
-          realDict.Add(param.Key, (RealVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var permConfig = param.Value as PermutationParameterConfiguration;
-        if (permConfig != null) {
-          permDict.Add(param.Key, (Permutation)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        throw new InvalidOperationException("Parameter " + param.Key + " not found.");
-      }
-      var vector = new ParameterVector(
-        binaryVectors: binDict.Count > 0 ? binDict : null,
-        integerVectors: intDict.Count > 0 ? intDict : null,
-        realVectors: realDict.Count > 0 ? realDict : null,
-        permutations: permDict.Count > 0 ? permDict : null);
+      var vector = Helper.Extract(ExecutionContext.Scope, config);
       MoveQualityParameter.ActualValue = new DoubleValue(host.Instance.Evaluate(random, vector));
       return base.InstrumentedApply();
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveGenerator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveGenerator.cs	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/ParameterVectorMoveGenerator.cs	(revision 11396)
@@ -21,13 +21,8 @@
 
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -77,36 +72,5 @@
       var sampleSize = SampleSizeParameter.ActualValue.Value;
       var config = ConfigurationParameter.ActualValue;
-      var binDict = new Dictionary<string, BinaryVector>();
-      var intDict = new Dictionary<string, IntegerVector>();
-      var realDict = new Dictionary<string, RealVector>();
-      var permDict = new Dictionary<string, Permutation>();
-      foreach (var param in config.Parameters) {
-        var binConfig = param.Value as BinaryParameterConfiguration;
-        if (binConfig != null) {
-          binDict.Add(param.Key, (BinaryVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var intConfig = param.Value as IntegerParameterConfiguration;
-        if (intConfig != null) {
-          intDict.Add(param.Key, (IntegerVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var realConfig = param.Value as RealParameterConfiguration;
-        if (realConfig != null) {
-          realDict.Add(param.Key, (RealVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var permConfig = param.Value as PermutationParameterConfiguration;
-        if (permConfig != null) {
-          permDict.Add(param.Key, (Permutation)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        throw new InvalidOperationException("Parameter " + param.Key + " not found.");
-      }
-      var vector = new ParameterVector(
-        binaryVectors: binDict.Count > 0 ? binDict : null,
-        integerVectors: intDict.Count > 0 ? intDict : null,
-        realVectors: realDict.Count > 0 ? realDict : null,
-        permutations: permDict.Count > 0 ? permDict : null);
+      var vector = Helper.Extract(ExecutionContext.Scope, config);
       var nbhood = host.Instance.GetNeighbors(random, vector).Take(sampleSize).ToList();
 
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveAnalyzer.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveAnalyzer.cs	(revision 11396)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveAnalyzer.cs	(revision 11396)
@@ -0,0 +1,64 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("Single-objective Analyzer", "Calls the script's Analyze method to be able to write into the results collection.")]
+  [StorableClass]
+  public class SingleObjectiveAnalyzer : SingleSuccessorOperator, ISingleObjectiveProgrammableProblemAnalyzer {
+    public bool EnabledByDefault { get { return true; } }
+
+    public ILookupParameter<ISingleObjectiveProblemDefinitionHost> ProblemDefinitionParameter {
+      get { return (ILookupParameter<ISingleObjectiveProblemDefinitionHost>)Parameters["ProblemDefinition"]; }
+    }
+
+    public ILookupParameter<Configuration> ConfigurationParameter {
+      get { return (ILookupParameter<Configuration>)Parameters["Configuration"]; }
+    }
+
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleObjectiveAnalyzer(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveAnalyzer(SingleObjectiveAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveAnalyzer() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<ISingleObjectiveProblemDefinitionHost>("ProblemDefinition", "The host that holds the problem definition."));
+      Parameters.Add(new LookupParameter<Configuration>("Configuration", "An item that holds the problem's configuration."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The results collection to write to."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var host = ProblemDefinitionParameter.ActualValue;
+      if (host.Instance == null) throw new InvalidOperationException("Script instance is null, maybe the code doesn't compile.");
+      var config = ConfigurationParameter.ActualValue;
+      var results = ResultsParameter.ActualValue;
+
+      IEnumerable<IScope> scopes = new[] { ExecutionContext.Scope };
+      for (var i = 0; i < QualityParameter.Depth; i++)
+        scopes = scopes.Select(x => (IEnumerable<IScope>)x.SubScopes).Aggregate((a, b) => a.Concat(b));
+
+      var vectors = scopes.Select(scope => Helper.Extract(scope, config)).ToArray();
+      host.Instance.Analyze(vectors, QualityParameter.ActualValue.Select(x => x.Value).ToArray(), results);
+      return base.Apply();
+    }
+  }
+}
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveEvaluator.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveEvaluator.cs	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Operators/SingleObjectiveEvaluator.cs	(revision 11396)
@@ -21,12 +21,7 @@
 
 using System;
-using System.Collections.Generic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
-using HeuristicLab.Encodings.BinaryVectorEncoding;
-using HeuristicLab.Encodings.IntegerVectorEncoding;
-using HeuristicLab.Encodings.PermutationEncoding;
-using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -74,36 +69,5 @@
       if (host.Instance == null) throw new InvalidOperationException("Script instance is null, maybe the code doesn't compile.");
       var config = ConfigurationParameter.ActualValue;
-      var binDict = new Dictionary<string, BinaryVector>();
-      var intDict = new Dictionary<string, IntegerVector>();
-      var realDict = new Dictionary<string, RealVector>();
-      var permDict = new Dictionary<string, Permutation>();
-      foreach (var param in config.Parameters) {
-        var binConfig = param.Value as BinaryParameterConfiguration;
-        if (binConfig != null) {
-          binDict.Add(param.Key, (BinaryVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var intConfig = param.Value as IntegerParameterConfiguration;
-        if (intConfig != null) {
-          intDict.Add(param.Key, (IntegerVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var realConfig = param.Value as RealParameterConfiguration;
-        if (realConfig != null) {
-          realDict.Add(param.Key, (RealVector)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        var permConfig = param.Value as PermutationParameterConfiguration;
-        if (permConfig != null) {
-          permDict.Add(param.Key, (Permutation)ExecutionContext.Scope.Variables[param.Key].Value);
-          continue;
-        }
-        throw new InvalidOperationException("Parameter " + param.Key + " not found.");
-      }
-      var vector = new ParameterVector(
-        binaryVectors: binDict.Count > 0 ? binDict : null,
-        integerVectors: intDict.Count > 0 ? intDict : null,
-        realVectors: realDict.Count > 0 ? realDict : null,
-        permutations: permDict.Count > 0 ? permDict : null);
+      var vector = Helper.Extract(ExecutionContext.Scope, config);
       QualityParameter.ActualValue = new DoubleValue(host.Instance.Evaluate(random, vector));
       return base.Apply();
Index: branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11395)
+++ branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 11396)
@@ -87,4 +87,5 @@
 
       Operators.Add(new BestScopeSolutionAnalyzer());
+      Operators.Add(new SingleObjectiveAnalyzer());
       Operators.Add(Evaluator);
       Operators.Add(SolutionCreator);
@@ -127,4 +128,9 @@
       base.OnNameChanged();
       ProblemDefinitionParameter.Value.Name = Name;
+    }
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      Parameterize();
     }
 
@@ -143,4 +149,16 @@
       ConfigurationParameter.Value = configuration;
       Maximization.Value = instance.IsMaximizationProblem;
+
+      Evaluator.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
+      Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
+      foreach (var evalOp in Operators.OfType<ISingleObjectiveProgrammableProblemEvaluator>()) {
+        evalOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
+        evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
+      }
+      foreach (var analyzeOp in Operators.OfType<ISingleObjectiveProgrammableProblemAnalyzer>()) {
+        analyzeOp.ConfigurationParameter.ActualName = ConfigurationParameter.Name;
+        analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;
+        analyzeOp.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+      }
 
       var solutionCreators = UpdateDynamicConfigurationParameters(configuration);
