Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 6473)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/AlgorithmRunsAnalyzer.cs	(revision 6489)
@@ -69,4 +69,7 @@
     public IScope CurrentScope {
       get { return CurrentScopeParameter.ActualValue; }
+    }
+    public LookupParameter<StringValue> QualityMeasureNameParameter {
+      get { return (LookupParameter<StringValue>)Parameters[MetaOptimizationProblem.QualityMeasureNameName]; }
     }
     #endregion
@@ -93,4 +96,5 @@
       Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.StandardDeviationWeightParameterName));
       Parameters.Add(new LookupParameter<DoubleValue>(MetaOptimizationProblem.EvaluatedSolutionsWeightParameterName));
+      Parameters.Add(new LookupParameter<StringValue>(MetaOptimizationProblem.QualityMeasureNameName));
       Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes represent the parents."));
     }
@@ -104,4 +108,5 @@
     private void AfterDeserialization() {
       if (!Parameters.ContainsKey("CurrentScope")) Parameters.Add(new ScopeParameter("CurrentScope", "The current scope whose sub-scopes represent the parents.")); // backwards compatibility
+      if (!Parameters.ContainsKey(MetaOptimizationProblem.QualityMeasureNameName)) Parameters.Add(new LookupParameter<StringValue>(MetaOptimizationProblem.QualityMeasureNameName)); // backwards compatibility
     }
 
@@ -118,5 +123,6 @@
       double standardDeviationWeight = StandardDeviationWeightParameter.ActualValue.Value;
       double evaluatedSolutionsWeight = EvaluatedSolutionsWeightParameter.ActualValue.Value;
-      var resultNames = new List<string> { "BestQuality", "Execution Time", "EvaluatedSolutions" };
+      string qualityMeasureName = QualityMeasureNameParameter.ActualValue.Value;
+      var resultNames = new List<string> { qualityMeasureName, "Execution Time", "EvaluatedSolutions" };
       int currentGeneration = GenerationsParameter.ActualValue != null ? GenerationsParameter.ActualValue.Value : 0;
       double[] referenceQualityAverages;
@@ -146,9 +152,10 @@
           MetaOptimizationUtil.ClearResults(run, resultNames);
           MetaOptimizationUtil.ClearParameters(run, parameterNames);
-          run.Results.Add("Meta.FromCache", new BoolValue(false));
-          run.Results.Add("Meta.Generation", new IntValue(currentGeneration));
-          run.Results.Add("Meta.ProblemIndex", new IntValue(problemIndex));
+          run.Results.Add("Meta-FromCache", new BoolValue(false));
+          run.Results.Add("Meta-Generation", new IntValue(currentGeneration));
+          run.Results.Add("Meta-ProblemIndex", new IntValue(problemIndex));
           run.Name = string.Format("{0} Problem {1} Run {2}", parameterConfiguration.ParameterInfoString, problemIndex, repetitionIndex);
-          qualities[problemIndex][repetitionIndex] = (((DoubleValue)run.Results["BestQuality"]).Value);
+          
+          qualities[problemIndex][repetitionIndex] = GetResultValue<DoubleValue>(run.Results, qualityMeasureName).Value; 
           executionTimes[problemIndex][repetitionIndex] = (((TimeSpanValue)run.Results["Execution Time"]).Value);
           evaluatedSolutions[problemIndex][repetitionIndex] = (((IntValue)run.Results["EvaluatedSolutions"]).Value);
@@ -203,4 +210,25 @@
       
       return base.Apply();
+    }
+
+    private T1 GetResultValue<T1>(IDictionary<string, IItem> results, string resultName) {
+      return (T1)results[resultName];
+
+      //string separator = ".";
+      //string[] tokens = resultName.Split(separator.ToCharArray());
+
+      //IDictionary<string, IItem> currentResults = results;
+      //IItem currentResult = null;
+      //for (int i = 0; i < tokens.Length; i++) {
+      //  if(currentResults == null)
+      //    throw new KeyNotFoundException("Result value " + resultName + " was not found");
+      //  if (currentResults.ContainsKey(tokens[i])) {
+      //    currentResult = currentResults[tokens[i]];
+      //    currentResults = currentResult as IDictionary<string, IItem>;
+      //  } else {
+      //    throw new KeyNotFoundException("Result value " + resultName + " was not found");
+      //  }
+      //}
+      //return (T1)currentResult;
     }
 
