Index: trunk/sources/HeuristicLab.Logging/3.3/BestAverageWorstQualityCalculator.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/BestAverageWorstQualityCalculator.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/BestAverageWorstQualityCalculator.cs	(revision 1862)
@@ -0,0 +1,99 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Captures the best, the average and the worst quality of the current population.
+  /// </summary>
+  public class BestAverageWorstQualityCalculator : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="BestAverageWorstQualityCalculator"/> with five variable
+    /// infos (<c>Quality</c>, <c>Maximization</c>, <c>BestQuality</c>, <c>AverageQuality</c> 
+    /// and <c>WorstQuality</c>).
+    /// </summary>
+    public BestAverageWorstQualityCalculator()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BestQuality", "Quality value of best solution", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("AverageQuality", "Average quality value", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+      AddVariableInfo(new VariableInfo("WorstQuality", "Quality value of worst solution", typeof(DoubleData), VariableKind.New | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Captures the best, the average and the worst quality of the current population.
+    /// </summary>
+    /// <param name="scope">The scope whose population to test and where to inject the captured values.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      double[] qualities = new double[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>("Quality", false).Data;
+
+      double worst = qualities[0];
+      double best = qualities[0];
+      double average = qualities[0];
+      for (int i = 1; i < qualities.Length; i++) {
+        if (qualities[i] < worst) worst = qualities[i];
+        if (qualities[i] > best) best = qualities[i];
+        average += qualities[i];
+      }
+      average = average / qualities.Length;
+
+      if (!GetVariableValue<BoolData>("Maximization", scope, true).Data) {
+        double temp = worst;
+        worst = best;
+        best = temp;
+      }
+
+      SetValue(GetVariableInfo("BestQuality"), best, scope);
+      SetValue(GetVariableInfo("AverageQuality"), average, scope);
+      SetValue(GetVariableInfo("WorstQuality"), worst, scope);
+
+      return null;
+    }
+
+    private void SetValue(IVariableInfo info, double value, IScope scope) {
+      DoubleData data = GetVariableValue<DoubleData>(info.FormalName, scope, false, false);
+      if (data == null) {
+        data = new DoubleData();
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, data));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), data));
+      }
+      data.Data = value;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/BestSolutionStorer.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/BestSolutionStorer.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/BestSolutionStorer.cs	(revision 1862)
@@ -0,0 +1,131 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Keeps a variable in the global scope that contains the scope representing the best solution.
+  /// </summary>
+  public class BestSolutionStorer : DelegatingOperator {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"Keeps a variable in the global scope that contains the scope representing the best of run solution."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="BestSolutionStorer"/> with three variable infos
+    /// (<c>Quality</c>, <c>Maximization</c> and <c>BestSolution</c>).
+    /// </summary>
+    public BestSolutionStorer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximization", "Maximization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BestSolution", "The best solution of the run", typeof(IScope), VariableKind.New | VariableKind.In | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Keeps a variable in the global scope that contains the scope representing the best solution.
+    /// </summary>
+    /// <param name="scope">The scope whose populations to check for the best solution.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      if(scope.GetVariable(Guid.ToString() + "-Active") == null) {
+        double[] qualities = new double[scope.SubScopes.Count];
+        bool maximization = scope.GetVariableValue<BoolData>("Maximization", true).Data;
+        for(int i = 0; i < scope.SubScopes.Count; i++)
+          qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>("Quality", false).Data;
+
+        double smallest = qualities[0]; int smallestIndex = 0;
+        double biggest = qualities[0]; int biggestIndex = 0;
+        for(int i = 1; i < qualities.Length; i++) {
+          if(qualities[i] < smallest) {
+            smallest = qualities[i];
+            smallestIndex = i;
+          }
+          if(qualities[i] > biggest) {
+            biggest = qualities[i];
+            biggestIndex = i;
+          }
+        }
+        IVariableInfo qualityInfo = GetVariableInfo("Quality");
+        IVariable bestSolutionVariable = scope.GetVariable(scope.TranslateName("BestSolution"));
+        if(bestSolutionVariable != null) {
+
+          double bestQuality = ((IScope)bestSolutionVariable.Value).GetVariableValue<DoubleData>(qualityInfo.ActualName, false).Data;
+
+          // do nothing if the best solution of the current scope is not better than the best solution of the whole run so far.
+          if((maximization && biggest <= bestQuality) ||
+            (!maximization && smallest >= bestQuality)) return null;
+        }
+
+        IScope bestSolutionClone;
+        if(maximization) {
+          bestSolutionClone = (IScope)scope.SubScopes[biggestIndex].Clone();
+        } else {
+          bestSolutionClone = (IScope)scope.SubScopes[smallestIndex].Clone();
+        }
+
+        if(SubOperators.Count > 0) {
+          scope.AddSubScope(bestSolutionClone);
+          scope.AddVariable(new Variable(Guid.ToString() + "-Active", new BoolData(true)));
+
+          CompositeOperation compOp = new CompositeOperation();
+          AtomicOperation operation = new AtomicOperation(SubOperators[0], bestSolutionClone);
+          AtomicOperation continuation = new AtomicOperation(this, scope);
+
+          compOp.AddOperation(operation);
+          compOp.AddOperation(continuation);
+          return compOp;
+        } else {
+          StoreBestSolution(bestSolutionClone, scope);
+          return null;
+        }
+      } else {  // operator already executed
+        scope.RemoveVariable(Guid.ToString() + "-Active");
+        IScope bestSolutionClone = scope.SubScopes[scope.SubScopes.Count - 1];
+        scope.RemoveSubScope(bestSolutionClone);
+
+        StoreBestSolution(bestSolutionClone, scope);
+        return null;
+      }
+    }
+
+    private void StoreBestSolution(IScope bestSolution, IScope scope) {
+      SetValue(GetVariableInfo("BestSolution"), bestSolution, scope);
+    }
+
+    private void SetValue(IVariableInfo info, IScope data, IScope scope) {
+      IVariable var = scope.GetVariable(info.ActualName);
+      if(var == null) {
+        var = new Variable(scope.TranslateName(info.FormalName), data);
+        scope.AddVariable(var);
+      } else {
+        var.Value = data;
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/HeuristicLab.Logging-3.2.csproj
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/HeuristicLab.Logging-3.2.csproj	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/HeuristicLab.Logging-3.2.csproj	(revision 1862)
@@ -0,0 +1,172 @@
+﻿<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{4095C92C-5A4C-44BC-9963-5F384CF5CC3F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Logging</RootNamespace>
+    <AssemblyName>HeuristicLab.Logging-3.2</AssemblyName>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <DocumentationFile>bin\Release\HeuristicLab.Logging-3.2.XML</DocumentationFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Logging-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>bin\Release\HeuristicLab.Logging-3.2.XML</DocumentationFile>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BestAverageWorstQualityCalculator.cs" />
+    <Compile Include="BestSolutionStorer.cs" />
+    <Compile Include="PointXYChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PointXYChartView.Designer.cs">
+      <DependentUpon>PointXYChartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Logger.cs" />
+    <Compile Include="Linechart.cs" />
+    <Compile Include="HeuristicLabLoggingPlugin.cs" />
+    <Compile Include="LinechartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LinechartView.Designer.cs">
+      <DependentUpon>LinechartView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LogView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LogView.Designer.cs">
+      <DependentUpon>LogView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PointXYChart.cs" />
+    <Compile Include="PointXYChartInjector.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="QualityLogger.cs" />
+    <Compile Include="Log.cs" />
+    <Compile Include="LinechartInjector.cs" />
+    <Compile Include="SimpleBestSolutionStorer.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Charting.Data\3.2\HeuristicLab.Charting.Data-3.2.csproj">
+      <Project>{E0740131-AA3E-4A3F-BA03-C9FF8327F4EE}</Project>
+      <Name>HeuristicLab.Charting.Data-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Charting\3.2\HeuristicLab.Charting-3.2.csproj">
+      <Project>{B462D3CC-8866-42F0-9832-AD0967613B72}</Project>
+      <Name>HeuristicLab.Charting-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.2\HeuristicLab.Core-3.2.csproj">
+      <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
+      <Name>HeuristicLab.Core-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.2\HeuristicLab.Data-3.2.csproj">
+      <Project>{F473D9AF-3F09-4296-9F28-3C65118DAFFA}</Project>
+      <Name>HeuristicLab.Data-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.2\HeuristicLab.Operators-3.2.csproj">
+      <Project>{A9983BA2-B3B2-475E-8E2C-62050B71D1C5}</Project>
+      <Name>HeuristicLab.Operators-3.2</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\HeuristicLab.PluginInfrastructure.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="PointXYChartView.resx">
+      <DependentUpon>PointXYChartView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LinechartView.resx">
+      <DependentUpon>LinechartView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="LogView.resx">
+      <DependentUpon>LogView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: trunk/sources/HeuristicLab.Logging/3.3/HeuristicLabLoggingPlugin.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/HeuristicLabLoggingPlugin.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/HeuristicLabLoggingPlugin.cs	(revision 1862)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Logging plugin.
+  /// </summary>
+  [ClassInfo(Name = "HeuristicLab.Logging-3.2")]
+  [PluginFile(Filename = "HeuristicLab.Logging-3.2.dll", Filetype = PluginFileType.Assembly)]
+  [Dependency(Dependency = "HeuristicLab.Core-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Data-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Operators-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Charting-3.2")]
+  [Dependency(Dependency = "HeuristicLab.Charting.Data-3.2")]
+  public class HeuristicLabLoggingPlugin : PluginBase {
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/Linechart.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/Linechart.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/Linechart.cs	(revision 1862)
@@ -0,0 +1,157 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Class to represent a Linechart.
+  /// </summary>
+  public class Linechart : ItemBase, IVisualizationItem {
+    private IntData myNumberOfLines;
+    /// <summary>
+    /// Gets or sets the number of lines of the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnNumberOfLinesChanged"/> in the setter.</remarks>
+    public int NumberOfLines {
+      get { return myNumberOfLines.Data; }
+      set {
+        if (value != myNumberOfLines.Data) {
+          myNumberOfLines.Data = value;
+          OnNumberOfLinesChanged();
+        }
+      }
+    }
+    private ItemList myValues;
+    /// <summary>
+    /// Gets or sets the values of the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnValuesChanged"/> in the setter.</remarks>
+    public ItemList Values {
+      get { return myValues; }
+      set {
+        if (value != myValues) {
+          myValues = value;
+          OnValuesChanged();
+        }
+      }
+    }
+
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Linechart"/>.
+    /// </summary>
+    public Linechart() {
+      myNumberOfLines = new IntData(0);
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="Linechart"/> with the given <paramref name="numberOfLines"/>
+    /// and the given <paramref name="values"/>.
+    /// </summary>
+    /// <param name="numberOfLines">The number of lines with which to initialize the current instance.</param>
+    /// <param name="values">The values with which to initialize the current instance.</param>
+    public Linechart(int numberOfLines, ItemList values) {
+      myNumberOfLines = new IntData(numberOfLines);
+      myValues = values;
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="Linechart"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Linechart clone = (Linechart)base.Clone(clonedObjects);
+      clone.myNumberOfLines = (IntData)Auxiliary.Clone(myNumberOfLines, clonedObjects);
+      clone.myValues = (ItemList)Auxiliary.Clone(Values, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates an instance of <see cref="LinechartView"/> to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="LinechartView"/>.</returns>
+    public override IView CreateView() {
+      return new LinechartView(this);
+    }
+
+    /// <summary>
+    /// Occurs when the number of lines has been changed.
+    /// </summary>
+    public event EventHandler NumberOfLinesChanged;
+    /// <summary>
+    /// Fires a new <c>NumberOfLinesChanged</c> event.
+    /// </summary>
+    protected virtual void OnNumberOfLinesChanged() {
+      if (NumberOfLinesChanged != null)
+        NumberOfLinesChanged(this, new EventArgs());
+    }
+    /// <summary>
+    /// Occurs when the values have been changed.
+    /// </summary>
+    public event EventHandler ValuesChanged;
+    /// <summary>
+    /// Fires a new <c>ValuesChanged</c> event.
+    /// </summary>
+    protected virtual void OnValuesChanged() {
+      if (ValuesChanged != null)
+        ValuesChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The number of lines and the values are saved as child nodes with tag 
+    /// name <c>NumberOfLines</c> and <c>Values</c> respectively.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("NumberOfLines", myNumberOfLines, document, persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Values", Values, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted item from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Has to be saved in a special way, see <see cref="GetXmlNode"/> for further information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the Linechart is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myNumberOfLines = (IntData)PersistenceManager.Restore(node.SelectSingleNode("NumberOfLines"), restoredObjects);
+      myValues = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Values"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LinechartInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LinechartInjector.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LinechartInjector.cs	(revision 1862)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Injects a new Linechart into the current scope.
+  /// </summary>
+  public class LinechartInjector : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="LinechartInjector"/> with three variable infos
+    /// (<c>NumberOfLines</c>, <c>Values</c> and <c>Linechart</c>).
+    /// </summary>
+    public LinechartInjector() {
+      VariableInfo numberOfLinesInfo = new VariableInfo("NumberOfLines", "Number of lines the linechart consists of", typeof(IntData), VariableKind.In);
+      numberOfLinesInfo.Local = true;
+      AddVariableInfo(numberOfLinesInfo);
+      AddVariable(new Variable("NumberOfLines", new IntData(1)));
+      AddVariableInfo(new VariableInfo("Values", "Item list holding the values of the linechart", typeof(ItemList), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Linechart", "Object representing a linechart", typeof(Linechart), VariableKind.New | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Injects a new Linechart variable into the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The current scope where to inject the Linechart variable.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      int numberOfLines = GetVariableValue<IntData>("NumberOfLines", scope, true).Data;
+      ItemList values = GetVariableValue<ItemList>("Values", scope, true);
+      Linechart linechart = GetVariableValue<Linechart>("Linechart", scope, false, false);
+      if (linechart == null) {
+        linechart = new Linechart(numberOfLines, values);
+        IVariableInfo info = GetVariableInfo("Linechart");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, linechart));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), linechart));
+      } else
+        linechart.Values = values;
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LinechartView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LinechartView.Designer.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LinechartView.Designer.cs	(revision 1862)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Logging {
+  partial class LinechartView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataChartControl = new HeuristicLab.Charting.Data.DataChartControl();
+      this.SuspendLayout();
+      // 
+      // dataChartControl
+      // 
+      this.dataChartControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataChartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.dataChartControl.Chart = null;
+      this.dataChartControl.Location = new System.Drawing.Point(0, 0);
+      this.dataChartControl.Name = "dataChartControl";
+      this.dataChartControl.ScaleOnResize = true;
+      this.dataChartControl.Size = new System.Drawing.Size(160, 147);
+      this.dataChartControl.TabIndex = 0;
+      // 
+      // LinechartScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataChartControl);
+      this.Name = "LinechartScopeView";
+      this.Size = new System.Drawing.Size(160, 147);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Charting.Data.DataChartControl dataChartControl;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LinechartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LinechartView.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LinechartView.cs	(revision 1862)
@@ -0,0 +1,176 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Charting;
+using HeuristicLab.Charting.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// The visual representation of a <see cref="Linechart"/>.
+  /// </summary>
+  public partial class LinechartView : ViewBase {
+    private double maxY = double.MinValue, minY = double.MaxValue;
+    private static int[] colors = new int[] {
+      182,182,255, 
+      218,255,182,
+      255,182,218, 
+      182,255,255, 
+      218,182,255, 
+      255,182,255,
+      255,182,182, 
+      255,218,182, 
+      255,255,182, 
+      182,255,182, 
+      182,255,218, 
+      182,218,255
+    };
+
+    /// <summary>
+    /// Gets or sets the Linechart object to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public Linechart Linechart {
+      get { return (Linechart)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="LinechartView"/>. 
+    /// </summary>
+    public LinechartView() {
+      InitializeComponent();
+      Caption = "Linechart View";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="LinechartView"/> with the given <paramref name="linechart"/>.
+    /// </summary>
+    /// <param name="linechart">The linechart to represent visually.</param>
+    public LinechartView(Linechart linechart)
+      : this() {
+      Linechart = linechart;
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="Linechart"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      if(Linechart != null) {
+        Linechart.Values.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        Linechart.Values.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="Linechart"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      if(Linechart != null) {
+        Linechart.Values.ItemAdded += new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        Linechart.Values.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="UpdateControls"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Datachart datachart = new Datachart(-50, -5000, 1000, 55000);
+      datachart.Title = "Line Chart";
+      dataChartControl.ScaleOnResize = false;
+      dataChartControl.Chart = datachart;
+      datachart.Group.Clear();
+      datachart.Group.Add(new Axis(datachart, 0, 0, AxisType.Both));
+      if(Linechart != null) {
+        datachart.UpdateEnabled = false;
+        for(int i = 0; i < Linechart.NumberOfLines; i++) {
+          int colorIndex = (i % 12)*3;
+          Color curCol = Color.FromArgb(colors[colorIndex],colors[colorIndex + 1], colors[colorIndex + 2]);
+          Pen p = new Pen(curCol);
+          SolidBrush b = new SolidBrush(curCol);
+          datachart.AddDataRow(DataRowType.Lines, p, b);
+        }
+
+        for(int i = 0; i < Linechart.Values.Count; i++) {
+          ItemList list = (ItemList)Linechart.Values[i];
+          for(int j = 0; j < list.Count; j++) {
+            double value = 0.0;
+            if (list[j] is IntData) value = (double)((IntData)list[j]).Data;
+            else value = ((DoubleData)list[j]).Data;
+            if(!double.IsInfinity(value) && !double.IsNaN(value)) {
+              if(value < minY) minY = value;
+              if(value > maxY) maxY = value;
+              datachart.AddDataPoint(j, i, value);
+            }
+          }
+        }
+        datachart.ZoomIn(-Linechart.Values.Count * 0.05, minY - (minY * 0.1), Linechart.Values.Count * 1.05, maxY * 1.05);
+        datachart.UpdateEnabled = true;
+        datachart.EnforceUpdate();
+      }
+    }
+
+    #region Values Events
+    private delegate void ItemIndexDelegate(object sender, ItemIndexEventArgs e);
+    private void Values_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if(InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemRemoved), sender, e);
+      } else {
+        Datachart datachart = dataChartControl.Chart;
+      }
+    }
+    private void Values_ItemAdded(object sender, ItemIndexEventArgs e) {
+      if(InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemAdded), sender, e);
+      } else {
+        Datachart datachart = dataChartControl.Chart;
+        ItemList list = (ItemList)e.Item;
+        datachart.UpdateEnabled = false;
+        for (int i = 0; i < list.Count; i++) {
+          double value = 0.0;
+          if (list[i] is IntData) value = (double)((IntData)list[i]).Data;
+          else value = ((DoubleData)list[i]).Data;
+          datachart.AddDataPoint(i, e.Index, value);
+          if (value < minY) minY = value;
+          if (value > maxY) maxY = value;
+        }
+        datachart.ZoomIn(-Linechart.Values.Count * 0.05, minY - (minY * 0.1), Linechart.Values.Count * 1.05, maxY * 1.05);
+        datachart.UpdateEnabled = true;
+        datachart.EnforceUpdate();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LinechartView.resx
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LinechartView.resx	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LinechartView.resx	(revision 1862)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Logging/3.3/Log.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/Log.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/Log.cs	(revision 1862)
@@ -0,0 +1,118 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Represents a log object where to store a specific value that should be logged.
+  /// </summary>
+  public class Log : ItemBase, IVisualizationItem {
+    private ItemList myItems;
+    /// <summary>
+    /// Gets or sets the items of the current instance.
+    /// </summary>
+    public ItemList Items {
+      get { return myItems; }
+      set { myItems = value; }
+    }
+
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Log"/>.
+    /// </summary>
+    public Log() { }
+    /// <summary>
+    /// Initializes a new instance of <see cref="Log"/> with the given items.
+    /// </summary>
+    /// <param name="items">The list of items with which to initialize the current instance.</param>
+    public Log(ItemList items) {
+      myItems = items;
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="Log"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      Log clone = (Log)base.Clone(clonedObjects);
+      clone.myItems = (ItemList)Auxiliary.Clone(Items, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates an instance of <see cref="LogView"/> to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="LogView"/>.</returns>
+    public override IView CreateView() {
+      return new LogView(this);
+    }
+
+    /// <summary>
+    /// Occurs when the items have been changed.
+    /// </summary>
+    public event EventHandler ItemsChanged;
+    /// <summary>
+    /// Fires a new <c>ItemsChanged</c> event.
+    /// </summary>
+    protected virtual void OnItemsChanged() {
+      if (ItemsChanged != null)
+        ItemsChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The items of the current instance are saved as a child node with the tag name
+    /// <c>Items</c>.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("Items", Items, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted item from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Has to be saved in a special way, see <see cref="GetXmlNode"/> for further information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the Log is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myItems = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Items"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LogView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LogView.Designer.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LogView.Designer.cs	(revision 1862)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Logging {
+  partial class LogView {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.qualityLogTextBox = new System.Windows.Forms.TextBox();
+      this.SuspendLayout();
+      // 
+      // qualityLogTextBox
+      // 
+      this.qualityLogTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.qualityLogTextBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+      this.qualityLogTextBox.Location = new System.Drawing.Point(0, 0);
+      this.qualityLogTextBox.Multiline = true;
+      this.qualityLogTextBox.Name = "qualityLogTextBox";
+      this.qualityLogTextBox.ReadOnly = true;
+      this.qualityLogTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+      this.qualityLogTextBox.Size = new System.Drawing.Size(150, 150);
+      this.qualityLogTextBox.TabIndex = 0;
+      this.qualityLogTextBox.WordWrap = false;
+      // 
+      // LogView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.qualityLogTextBox);
+      this.Name = "LogView";
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox qualityLogTextBox;
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LogView.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LogView.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LogView.cs	(revision 1862)
@@ -0,0 +1,137 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Visual representation of the <see cref="Log"/> class.
+  /// </summary>
+  public partial class LogView : ViewBase {
+    /// <summary>
+    /// Gets or sets the Log item to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public Log Log {
+      get { return (Log)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="LogView"/>.
+    /// </summary>
+    public LogView() {
+      InitializeComponent();
+      Caption = "Log View";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="LogView"/> with the given <paramref name="log"/>.
+    /// </summary>
+    /// <param name="log">The log object to represent visually.</param>
+    public LogView(Log log)
+      : this() {
+      Log = log;
+    }
+
+    /// <summary>
+    /// Removes the event handlers from the underlying <see cref="Log"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      if (Log != null) {
+        Log.Items.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Items_ItemAdded);
+        Log.Items.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Items_ItemRemoved);
+      }
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds event handlers to the underlying <see cref="Log"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      if (Log != null) {
+        Log.Items.ItemAdded += new EventHandler<ItemIndexEventArgs>(Items_ItemAdded);
+        Log.Items.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Items_ItemRemoved);
+      }
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class 
+    /// <see cref="UpdateControls"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      qualityLogTextBox.Clear();
+      if (Log == null) {
+        qualityLogTextBox.Enabled = false;
+      } else {
+        string[] lines = new string[Log.Items.Count];
+        for (int i = 0; i < Log.Items.Count; i++) {
+          lines[i] = Log.Items[i].ToString().Replace(';','\t');
+        }
+        qualityLogTextBox.Lines = lines;
+        qualityLogTextBox.Enabled = true;
+      }
+    }
+
+    #region ItemList Events
+    private delegate void IndexDelegate(int index);
+    private void Items_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      RemoveItem(e.Index);
+    }
+    private void RemoveItem(int index) {
+      if (InvokeRequired)
+        Invoke(new IndexDelegate(RemoveItem), index);
+      else {
+        string[] lines = new string[qualityLogTextBox.Lines.Length - 1];
+        Array.Copy(qualityLogTextBox.Lines, 0, lines, 0, index);
+        Array.Copy(qualityLogTextBox.Lines, index + 1, lines, index, lines.Length - index);
+        qualityLogTextBox.Lines = lines;
+      }
+    }
+    private void Items_ItemAdded(object sender, ItemIndexEventArgs e) {
+      AddItem(e.Index);
+    }
+    private void AddItem(int index) {
+      if (InvokeRequired)
+        Invoke(new IndexDelegate(AddItem), index);
+      else {
+        string[] lines = new string[qualityLogTextBox.Lines.Length + 1];
+        Array.Copy(qualityLogTextBox.Lines, 0, lines, 0, index);
+        Array.Copy(qualityLogTextBox.Lines, index, lines, index + 1, qualityLogTextBox.Lines.Length - index);
+        lines[index] = Log.Items[index].ToString().Replace(';', '\t');
+        qualityLogTextBox.Lines = lines;
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/LogView.resx
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/LogView.resx	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/LogView.resx	(revision 1862)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Logging/3.3/Logger.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/Logger.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/Logger.cs	(revision 1862)
@@ -0,0 +1,76 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Logs a specified value into a specified log object.
+  /// </summary>
+  public class Logger : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="Logger"/> with two variable infos 
+    /// (<c>Value</c> and <c>Log</c>).
+    /// </summary>
+    public Logger()
+      : base() {
+      AddVariableInfo(new VariableInfo("Value", "The value that should be logged", typeof(ObjectData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Log", "Log into which the values are written", typeof(Log), VariableKind.In | VariableKind.Out | VariableKind.New));
+    }
+
+    /// <summary>
+    /// Logs a specified value into a specified log object.
+    /// </summary>
+    /// <param name="scope">The current scope.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      ObjectData[] values = new ObjectData[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        values[i] = (ObjectData)scope.SubScopes[i].GetVariableValue<ObjectData>("Value", false).Clone();
+
+      Log log = GetVariableValue<Log>("Log", scope, false, false);
+      if (log == null) {
+        log = new Log(new ItemList());
+        IVariableInfo info = GetVariableInfo("Log");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, log));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), log));
+      }
+      ItemList row = new ItemList();
+      row.AddRange(values);
+      log.Items.Add(row);
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/PointXYChart.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/PointXYChart.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/PointXYChart.cs	(revision 1862)
@@ -0,0 +1,158 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using System.Xml;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Class for point xy charts.
+  /// </summary>
+  public class PointXYChart : ItemBase, IVisualizationItem {
+    private ItemList myValues;
+    /// <summary>
+    /// Gets or sets the values of the current instance.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnValuesChanged"/> in the setter.</remarks>
+    public ItemList Values {
+      get { return myValues; }
+      set {
+        if (value != myValues) {
+          myValues = value;
+          OnValuesChanged();
+        }
+      }
+    }
+
+    private BoolData myConnectDots;
+    /// <summary>
+    /// Gets or sets the flag whether the dots should be connected or not.
+    /// </summary>
+    /// <remarks>Calls <see cref="OnConnectDotsChanged"/> in the setter.</remarks>
+    public BoolData ConnectDots {
+      get { return myConnectDots; }
+      set {
+        if (value != myConnectDots) {
+          myConnectDots = value;
+          OnConnectDotsChanged();
+        }
+      }
+    }
+ 
+         
+    /// <summary>
+    /// Initializes a new instance of <see cref="PointXYChart"/> with the <c>ConnectDots</c> flag set to 
+    /// <c>true</c>.
+    /// </summary>
+    public PointXYChart() {
+      myConnectDots = new BoolData(true);
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="PointXYChart"/> with the given <paramref name="connectDots"/>
+    /// flag and the specified <paramref name="values"/>.
+    /// </summary>
+    /// <param name="connectDots">The flag whether the dots should be connected or not.</param>
+    /// <param name="values">The values with which the current instance should be initialized.</param>
+    public PointXYChart(bool connectDots,ItemList values) {
+      myConnectDots = new BoolData(connectDots);
+      myValues = values;
+    }
+
+    /// <summary>
+    /// Clones the current instance (deep clone).
+    /// </summary>
+    /// <remarks>Deep clone through <see cref="Auxiliary.Clone"/> method of helper class 
+    /// <see cref="Auxiliary"/>.</remarks>
+    /// <param name="clonedObjects">Dictionary of all already clone objects. (Needed to avoid cycles.)</param>
+    /// <returns>The cloned object as <see cref="PointXYChart"/>.</returns>
+    public override object Clone(IDictionary<Guid, object> clonedObjects) {
+      PointXYChart clone = (PointXYChart)base.Clone(clonedObjects);
+      clone.myValues = (ItemList)Auxiliary.Clone(Values, clonedObjects);
+      return clone;
+    }
+
+    /// <summary>
+    /// Creates a new instance of <see cref="PointXYChartView"/> to represent the current instance visually.
+    /// </summary>
+    /// <returns>The created view as <see cref="PointXYChartView"/>.</returns>
+    public override IView CreateView() {
+      return new PointXYChartView(this);
+    }
+
+    /// <summary>
+    /// Occurs when the values of the current instance have been changed.
+    /// </summary>
+    public event EventHandler ValuesChanged;
+    /// <summary>
+    /// Fires a <c>ValuesChanged</c> event.
+    /// </summary>
+    protected virtual void OnValuesChanged() {
+      if (ValuesChanged != null)
+        ValuesChanged(this, new EventArgs());
+    }
+    /// <summary>
+    /// Occurs when the boolean flag has been changed.
+    /// </summary>
+    public event EventHandler ConnectDotsChanged;
+    /// <summary>
+    /// Fires a <c>ConnectDotsChanged</c> event.
+    /// </summary>
+    protected virtual void OnConnectDotsChanged() {
+      if (ConnectDotsChanged != null)
+        ConnectDotsChanged(this, new EventArgs());
+    }
+
+    #region Persistence Methods
+    /// <summary>
+    /// Saves the current instance as <see cref="XmlNode"/> in the specified <paramref name="document"/>.
+    /// </summary>
+    /// <remarks>The ConnectDots flag and the values of the current instance are saved as child nodes
+    /// with tag names <c>ConnectDots</c> and <c>Values</c> respectively.</remarks>
+    /// <param name="name">The (tag)name of the <see cref="XmlNode"/>.</param>
+    /// <param name="document">The <see cref="XmlDocument"/> where to save the data.</param>
+    /// <param name="persistedObjects">The dictionary of all already persisted objects. 
+    /// (Needed to avoid cycles.)</param>
+    /// <returns>The saved <see cref="XmlNode"/>.</returns>
+    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      node.AppendChild(PersistenceManager.Persist("ConnectDots",ConnectDots,document,persistedObjects));
+      node.AppendChild(PersistenceManager.Persist("Values", Values, document, persistedObjects));
+      return node;
+    }
+    /// <summary>
+    /// Loads the persisted item from the specified <paramref name="node"/>.
+    /// </summary>
+    /// <remarks>Has to be saved in a special way, see <see cref="GetXmlNode"/> for further information.</remarks>
+    /// <param name="node">The <see cref="XmlNode"/> where the PointXYChart is saved.</param>
+    /// <param name="restoredObjects">The dictionary of all already restored objects. 
+    /// (Needed to avoid cycles.)</param>
+    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      myConnectDots = (BoolData)PersistenceManager.Restore(node.SelectSingleNode("ConnectDots"), restoredObjects);
+      myValues = (ItemList)PersistenceManager.Restore(node.SelectSingleNode("Values"), restoredObjects);
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/PointXYChartInjector.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/PointXYChartInjector.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/PointXYChartInjector.cs	(revision 1862)
@@ -0,0 +1,73 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Injects a new PointXYChart variable into the given scope.
+  /// </summary>
+  class PointXYChartInjector : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PointXYChartInjector"/> with three variable infos
+    /// (<c>ConnectDots</c>, <c>Values</c> and <c>PointXYChart</c>).
+    /// </summary>
+    public PointXYChartInjector() {
+      VariableInfo connectDotsInfo = new VariableInfo("ConnectDots", "Number of lines the linechart consists of", typeof(BoolData), VariableKind.In);
+      connectDotsInfo.Local = true;
+      AddVariableInfo(connectDotsInfo);
+      AddVariable(new Variable("ConnectDots", new BoolData(true)));
+      AddVariableInfo(new VariableInfo("Values", "Item list holding the values of the pointXYchart", typeof(ItemList), VariableKind.In));
+      AddVariableInfo(new VariableInfo("PointXYchart", "Object representing a pointXYchart", typeof(PointXYChart), VariableKind.New | VariableKind.Out));
+    }
+
+    /// <summary>
+    /// Injects a new PointXYChart variable into the given <paramref name="scope"/>.
+    /// </summary>
+    /// <param name="scope">The current scope where to inject the variable.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      bool connectDots = GetVariableValue<BoolData>("ConnectDots", scope, true).Data;
+      ItemList values = GetVariableValue<ItemList>("Values", scope, true);
+      PointXYChart pointXYchart = GetVariableValue<PointXYChart>("PointXYchart", scope, false, false);
+      if (pointXYchart == null) {
+        pointXYchart = new PointXYChart(connectDots, values);
+        IVariableInfo info = GetVariableInfo("PointXYchart");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, pointXYchart));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), pointXYchart));
+      } else
+        pointXYchart.Values = values;
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.Designer.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.Designer.cs	(revision 1862)
@@ -0,0 +1,79 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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
+
+namespace HeuristicLab.Logging {
+  partial class PointXYChartView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.dataChartControl = new HeuristicLab.Charting.Data.DataChartControl();
+      this.SuspendLayout();
+      // 
+      // dataChartControl
+      // 
+      this.dataChartControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dataChartControl.BackColor = System.Drawing.SystemColors.Control;
+      this.dataChartControl.Chart = null;
+      this.dataChartControl.Location = new System.Drawing.Point(0, 0);
+      this.dataChartControl.Name = "dataChartControl";
+      this.dataChartControl.ScaleOnResize = true;
+      this.dataChartControl.Size = new System.Drawing.Size(160, 147);
+      this.dataChartControl.TabIndex = 0;
+      // 
+      // LinechartScopeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dataChartControl);
+      this.Name = "LinechartScopeView";
+      this.Size = new System.Drawing.Size(160, 147);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Charting.Data.DataChartControl dataChartControl;
+
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.cs	(revision 1862)
@@ -0,0 +1,174 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Charting;
+using HeuristicLab.Charting.Data;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Visual representation of a <see cref="PointXYChart"/>.
+  /// </summary>
+  public partial class PointXYChartView : ViewBase {
+    private static int[] colors = new int[] {
+      182,182,255, 
+      218,255,182,
+      255,182,218, 
+      182,255,255, 
+      218,182,255, 
+      255,182,255,
+      255,182,182, 
+      255,218,182, 
+      255,255,182, 
+      182,255,182, 
+      182,255,218, 
+      182,218,255
+    };
+
+    /// <summary>
+    /// Gets or sets the chart to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public PointXYChart PointXYChart {
+      get { return (PointXYChart)base.Item; }
+      set { base.Item = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="PointXYChartView"/>.
+    /// </summary>
+    public PointXYChartView() {
+      InitializeComponent();
+      Caption = "PointXYChart View";
+    }
+    /// <summary>
+    /// Initializes a new instance of <see cref="PointXYChartView"/> with the given 
+    /// <paramref name="pointXYChart"/>.
+    /// </summary>
+    /// <param name="pointXYChart">The chart to represent visually.</param>
+    public PointXYChartView(PointXYChart pointXYChart)
+      : this() {
+      PointXYChart = pointXYChart;
+    }
+
+    /// <summary>
+    /// Removes the eventhandlers from the underlying <see cref="PointXYChart"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.RemoveItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void RemoveItemEvents() {
+      if (PointXYChart != null) {
+        PointXYChart.Values.ItemAdded -= new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        PointXYChart.Values.ItemRemoved -= new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+      base.RemoveItemEvents();
+    }
+    /// <summary>
+    /// Adds eventhandlers to the underlying <see cref="IOperatorGraph"/>.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.AddItemEvents"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      if (PointXYChart != null) {
+        PointXYChart.Values.ItemAdded += new EventHandler<ItemIndexEventArgs>(Values_ItemAdded);
+        PointXYChart.Values.ItemRemoved += new EventHandler<ItemIndexEventArgs>(Values_ItemRemoved);
+      }
+    }
+
+    /// <summary>
+    /// Updates all controls with the latest data of the model.
+    /// </summary>
+    /// <remarks>Calls <see cref="ViewBase.UpdateControls"/> of base class <see cref="ViewBase"/>.</remarks>
+    protected override void UpdateControls() {
+      base.UpdateControls();
+      Datachart datachart = new Datachart(-50, -5000, 1000, 55000);
+      datachart.Title = "Point X/Y Chart";
+      dataChartControl.ScaleOnResize = false;
+      dataChartControl.Chart = datachart;
+      datachart.Group.Clear();
+      datachart.Group.Add(new Axis(datachart, 0, 0, AxisType.Both));
+      double maxY = double.MinValue, minY = double.MaxValue;
+      double maxX = double.MinValue, minX = double.MaxValue;
+      if (PointXYChart != null) {
+        datachart.UpdateEnabled = false;
+        for (int i = 0; i < PointXYChart.Values.Count; i++) {
+          int colorIndex = (i % 12) * 3;
+          Color curCol = Color.FromArgb(colors[colorIndex], colors[colorIndex + 1], colors[colorIndex + 2]);
+          Pen p = new Pen(curCol);
+          SolidBrush b = new SolidBrush(curCol);
+          datachart.AddDataRow(PointXYChart.ConnectDots.Data ? DataRowType.Lines : DataRowType.Points, p, b);
+        }
+
+        for (int i = 0; i < PointXYChart.Values.Count; i++) {
+          ItemList list = (ItemList) PointXYChart.Values[i];
+          for (int j = 0; j < list.Count; j++) {
+           ItemList value = ((ItemList)list[j]);
+           double x = ((DoubleData)value[0]).Data;
+           double y = ((DoubleData)value[1]).Data;
+            if (!double.IsInfinity(x) && !double.IsNaN(x) && !double.IsInfinity(y) && !double.IsNaN(y)) {
+              if (x < minX) minX = x;
+              if (x > maxX) maxX = x;
+              if (y < minY) minY = y;
+              if (y > maxY) maxY = y;
+
+              datachart.AddDataPoint(i, x, y);                                                         
+            }
+          }
+        }
+        datachart.ZoomIn(minX - (Math.Abs(maxX - minX) * 0.1), minY - (Math.Abs(maxY -minY) * 0.1), maxX + (Math.Abs(maxX - minX) * 0.1), maxY + (Math.Abs(maxY - minY) * 0.1));
+        datachart.UpdateEnabled = true;
+        datachart.EnforceUpdate();
+      }
+    }
+
+    #region Values Events
+    private delegate void ItemIndexDelegate(object sender, ItemIndexEventArgs e);
+    private void Values_ItemRemoved(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemRemoved), sender, e);
+      } else {
+        Datachart datachart = dataChartControl.Chart;
+      }
+    }
+    private void Values_ItemAdded(object sender, ItemIndexEventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new ItemIndexDelegate(Values_ItemAdded), sender, e);
+      } else {
+        //Datachart datachart = dataChartControl.Chart;
+        //ItemList list = (ItemList)e.Item;
+        //datachart.UpdateEnabled = false;
+        //for (int i = 0; i < list.Count; i++)
+        //  datachart.AddDataPoint(i, e.Index, ((DoubleArrayData)list[i]).Data[0]);
+        //datachart.UpdateEnabled = true;
+        //datachart.EnforceUpdate();
+      }
+    }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.resx
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.resx	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/PointXYChartView.resx	(revision 1862)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: trunk/sources/HeuristicLab.Logging/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/Properties/AssemblyInfo.frame	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/Properties/AssemblyInfo.frame	(revision 1862)
@@ -0,0 +1,58 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using HeuristicLab.PluginInfrastructure;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Logging")]
+[assembly: AssemblyDescription("HeuristicLab logging classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2008 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f9718239-4d37-4410-84d7-9c3468b01cbf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyFileVersion("3.2.0.$WCREV$")]
+[assembly: AssemblyBuildDate("$WCNOW$")]
Index: trunk/sources/HeuristicLab.Logging/3.3/QualityLogger.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/QualityLogger.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/QualityLogger.cs	(revision 1862)
@@ -0,0 +1,84 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+
+namespace HeuristicLab.Logging {
+  /// <summary>
+  /// Logs the quality (best, average, worst) of a solution.
+  /// </summary>
+  public class QualityLogger : OperatorBase {
+    /// <inheritdoc select="summary"/>
+    public override string Description {
+      get { return @"TODO\r\nOperator description still missing ..."; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="QualityLogger"/> with two variable infos
+    /// (<c>Quality</c> and <c>QualityLog</c>).
+    /// </summary>
+    public QualityLogger()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("QualityLog", "Log of best, average and worst quality values", typeof(Log), VariableKind.In | VariableKind.Out | VariableKind.New));
+    }
+
+    /// <summary>
+    /// Logs the quality (best, average and worst) of a solution.
+    /// </summary>
+    /// <param name="scope">The current scope where to log the quality.</param>
+    /// <returns><c>null</c>.</returns>
+    public override IOperation Apply(IScope scope) {
+      double[] qualities = new double[scope.SubScopes.Count];
+
+      for (int i = 0; i < scope.SubScopes.Count; i++)
+        qualities[i] = scope.SubScopes[i].GetVariableValue<DoubleData>("Quality", false).Data;
+
+      double min = qualities[0];
+      double max = qualities[0];
+      double average = qualities[0];
+      for (int i = 1; i < qualities.Length; i++) {
+        if (qualities[i] < min) min = qualities[i];
+        if (qualities[i] > max) max = qualities[i];
+        average += qualities[i];
+      }
+      average = average / qualities.Length;
+
+      Log log = GetVariableValue<Log>("QualityLog", scope, false, false);
+      if (log == null) {
+        log = new Log(new ItemList());
+        IVariableInfo info = GetVariableInfo("QualityLog");
+        if (info.Local)
+          AddVariable(new Variable(info.ActualName, log));
+        else
+          scope.AddVariable(new Variable(scope.TranslateName(info.FormalName), log));
+      }
+      log.Items.Add(new DoubleArrayData(new double[] { min, average, max } ));
+
+      return null;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Logging/3.3/SimpleBestSolutionStorer.cs
===================================================================
--- trunk/sources/HeuristicLab.Logging/3.3/SimpleBestSolutionStorer.cs	(revision 1862)
+++ trunk/sources/HeuristicLab.Logging/3.3/SimpleBestSolutionStorer.cs	(revision 1862)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2009 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 System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Logging {
+  public class SimpleBestSolutionStorer : OperatorBase {
+
+    public override string Description {
+      get { return @"The simple best solution storer, stores the best solution.
+If the rolling horizon is <= 0 the best solution is never forgotten. If this horizon is 1 only the actual best solution is stored.
+If the horizon is n always the best of the last n solutions is stored.
+
+The operator expects the solutions to be sorted so that the best solution is in the first scope."; }
+    }
+
+    public SimpleBestSolutionStorer()
+      : base() {
+      AddVariableInfo(new VariableInfo("Quality", "Quality value of a solution", typeof(DoubleData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("Maximization", "Whether the problem is a maximization problem or a minimization problem", typeof(BoolData), VariableKind.In));
+      AddVariableInfo(new VariableInfo("BestSolution", "The scope representing the best solution", typeof(IScope), VariableKind.New | VariableKind.Out | VariableKind.In));
+      AddVariableInfo(new VariableInfo("LastBestScopes", "Store a maximum of RollingHorizon solutions", typeof(ItemList<IScope>), VariableKind.New | VariableKind.Out | VariableKind.In));
+      AddVariableInfo(new VariableInfo("RollingHorizon", "The rolling time horizon", typeof(IntData), VariableKind.In));
+      GetVariableInfo("RollingHorizon").Local = true;
+      AddVariable(new Variable("RollingHorizon", new IntData(0)));
+    }
+
+    public override IOperation Apply(IScope scope) {
+      int horizon = GetVariableValue<IntData>("RollingHorizon", scope, true).Data;
+      bool maximization = GetVariableValue<BoolData>("Maximization", scope, true).Data;
+      double currentBestQuality, bestQuality;
+      IVariable bestSolutionVar = null;
+      IScope bestSolutionScope = null;
+      IScope currentSolutionScope = (IScope)scope.SubScopes[0].Clone();
+
+      #region variable setting
+      IVariableInfo bestSolutionInfo = GetVariableInfo("BestSolution");
+      if (bestSolutionInfo.Local == true)
+        bestSolutionVar = GetVariable(bestSolutionInfo.ActualName);
+      else bestSolutionVar = scope.GetVariable(scope.TranslateName("BestSolution"));
+      
+      if (bestSolutionVar != null) {
+        bestSolutionScope = bestSolutionVar.Value as IScope;
+        bestQuality = bestSolutionScope.GetVariableValue<DoubleData>(scope.TranslateName("Quality"), false).Data;
+        currentBestQuality = currentSolutionScope.GetVariableValue<DoubleData>("Quality", false).Data;
+      } else { // if no best solution exists then the first scope is added as the best solution and the operator is finished
+        if (bestSolutionInfo.Local) AddVariable(new Variable(bestSolutionInfo.ActualName, currentSolutionScope));
+        else scope.AddVariable(new Variable(scope.TranslateName("BestSolution"), currentSolutionScope));
+        return null;
+      }
+      #endregion
+
+      if (horizon <= 0) { // never forget the best quality
+        if (currentBestQuality < bestQuality) {
+          bestSolutionVar.Value = currentSolutionScope;
+        }
+      } else { // forget the best found quality after a certain time (given as horizon)
+        ItemList<IScope> lastNBestScopes = scope.GetVariableValue<ItemList<IScope>>("LastBestScopes", false, false);
+        if (lastNBestScopes == null) {
+          lastNBestScopes = new ItemList<IScope>();
+          scope.AddVariable(new Variable(scope.TranslateName("LastBestScopes"), lastNBestScopes));
+        }
+        bool currentIsNewBest = maximization && currentBestQuality > bestQuality || !maximization && currentBestQuality < bestQuality;
+        if (currentIsNewBest) {
+          bestSolutionScope = currentSolutionScope;
+          bestSolutionVar.Value = bestSolutionScope;
+          lastNBestScopes.Clear(); // the solutions that came before cannot be better, we don't need to keep them
+        }
+        lastNBestScopes.Add(currentSolutionScope); // add the current solution to the memory
+        if (lastNBestScopes.Count > horizon) {
+          if (!currentIsNewBest && lastNBestScopes.IndexOf(bestSolutionScope) == 0) { // if the best is to be "forgotton" the new best has to be found
+            bool bestChanged = false;
+            if (maximization) bestQuality = Double.MinValue;
+            else bestQuality = Double.MaxValue;
+            for (int i = 1; i < lastNBestScopes.Count; i++) {
+              double quality = lastNBestScopes[i].GetVariableValue<DoubleData>("Quality", false).Data;
+              if (maximization && quality > bestQuality
+                || !maximization && quality < bestQuality) {
+                bestSolutionScope = lastNBestScopes[i];
+                bestQuality = quality;
+                bestChanged = true;
+              }
+            }
+            if (bestChanged) bestSolutionVar.Value = bestSolutionScope;
+          }
+          lastNBestScopes.RemoveAt(0);
+        }
+      }
+      return null;
+    }
+  }
+}
