Index: branches/2989_MovingPeaksBenchmark/HeuristicLab 3.3.sln
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab 3.3.sln	(revision 16605)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab 3.3.sln	(revision 16606)
@@ -462,4 +462,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Algorithms.MOCMAEvolutionStrategy-3.3", "HeuristicLab.Algorithms.MOCMAEvolutionStrategy\3.3\HeuristicLab.Algorithms.MOCMAEvolutionStrategy-3.3.csproj", "{0E2E224F-E9B2-41F3-B510-09183EEBA2AF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.MovingPeaksBenchmark-3.3", "HeuristicLab.Problems.MovingPeaksBenchmark\3.3\HeuristicLab.Problems.MovingPeaksBenchmark-3.3.csproj", "{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}"
 EndProject
 Global
@@ -2249,4 +2251,16 @@
 		{0E2E224F-E9B2-41F3-B510-09183EEBA2AF}.Release|x86.ActiveCfg = Release|x86
 		{0E2E224F-E9B2-41F3-B510-09183EEBA2AF}.Release|x86.Build.0 = Release|x86
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|x64.Build.0 = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Debug|x86.Build.0 = Debug|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|x64.ActiveCfg = Release|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|x64.Build.0 = Release|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|x86.ActiveCfg = Release|Any CPU
+		{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/HeuristicLab.Problems.MovingPeaksBenchmark-3.3.csproj
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/HeuristicLab.Problems.MovingPeaksBenchmark-3.3.csproj	(revision 16606)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/HeuristicLab.Problems.MovingPeaksBenchmark-3.3.csproj	(revision 16606)
@@ -0,0 +1,112 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{CF7DAEF2-84D9-438D-826E-6ADDDCF454C8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.MovingPeaksBenchmark</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.MovingPeaksBenchmark-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Interfaces\IMovingPeaksBenchmarkProblemEvaluator.cs" />
+    <Compile Include="MovingPeaksBenchmarkProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj">
+      <Project>{bb6d334a-4bb6-4674-9883-31a6ebb32cab}</Project>
+      <Name>HeuristicLab.Encodings.RealVectorEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Interfaces/IMovingPeaksBenchmarkProblemEvaluator.cs
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Interfaces/IMovingPeaksBenchmarkProblemEvaluator.cs	(revision 16606)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Interfaces/IMovingPeaksBenchmarkProblemEvaluator.cs	(revision 16606)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MovingPeaksBenchmark {
+  /// <summary>
+  /// An interface which represents an evaluation operator for the Moving Peaks Benchmark.
+  /// </summary>
+  public interface IMovingPeaksBenchmarkProblemEvaluator : ISingleObjectiveEvaluator {
+    bool Maximization { get; }
+    DoubleMatrix Bounds { get; }
+    double BestKnownQuality { get; }
+    int MinimumProblemSize { get; }
+    int MaximumProblemSize { get; }
+    string FunctionName { get; }
+
+    ILookupParameter<RealVector> PointParameter { get; }
+
+    double Evaluate2D(double x, double y);
+    double Evaluate(RealVector point);
+    RealVector GetBestKnownSolution(int dimension);
+  }
+}
Index: branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblem.cs
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblem.cs	(revision 16606)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/MovingPeaksBenchmarkProblem.cs	(revision 16606)
@@ -0,0 +1,391 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.Linq;
+//using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+//using HeuristicLab.Optimization.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+//using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.MovingPeaksBenchmark {
+  [Item("Moving Peaks Benchmark", "Moving peaks benchmark problem for dynamic optimization.")]
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 97)]
+  public sealed class MovingPeaksBenchmarkProblem : SingleObjectiveHeuristicOptimizationProblem<IMovingPeaksBenchmarkProblemEvaluator, IRealVectorCreator>, IStorableContent {
+    public string Filename { get; set; }
+
+    [Storable]
+    private StdDevStrategyVectorCreator strategyVectorCreator;
+    [Storable]
+    private StdDevStrategyVectorCrossover strategyVectorCrossover;
+    [Storable]
+    private StdDevStrategyVectorManipulator strategyVectorManipulator;
+
+    #region Parameter Properties
+    public ValueParameter<DoubleMatrix> BoundsParameter {
+      get { return (ValueParameter<DoubleMatrix>)Parameters["Bounds"]; }
+    }
+    public ValueParameter<IntValue> ProblemSizeParameter {
+      get { return (ValueParameter<IntValue>)Parameters["ProblemSize"]; }
+    }
+    public OptionalValueParameter<RealVector> BestKnownSolutionParameter {
+      get { return (OptionalValueParameter<RealVector>)Parameters["BestKnownSolution"]; }
+    }
+    #endregion
+
+    #region Properties
+    public DoubleMatrix Bounds {
+      get { return BoundsParameter.Value; }
+      set { BoundsParameter.Value = value; }
+    }
+    public IntValue ProblemSize {
+      get { return ProblemSizeParameter.Value; }
+      set { ProblemSizeParameter.Value = value; }
+    }
+//    private BestSingleObjectiveTestFunctionSolutionAnalyzer BestSingleObjectiveTestFunctionSolutionAnalyzer {
+//      get { return Operators.OfType<BestSingleObjectiveTestFunctionSolutionAnalyzer>().FirstOrDefault(); }
+//    }
+    #endregion
+
+    [StorableConstructor]
+    private MovingPeaksBenchmarkProblem(bool deserializing) : base(deserializing) { }
+    private MovingPeaksBenchmarkProblem(MovingPeaksBenchmarkProblem original, Cloner cloner)
+      : base(original, cloner) {
+      strategyVectorCreator = cloner.Clone(original.strategyVectorCreator);
+      strategyVectorCrossover = cloner.Clone(original.strategyVectorCrossover);
+      strategyVectorManipulator = cloner.Clone(original.strategyVectorManipulator);
+      RegisterEventHandlers();
+    }
+    public MovingPeaksBenchmarkProblem()
+//      : base(new AckleyEvaluator(), new UniformRandomRealVectorCreator()) {
+      : base(null, new UniformRandomRealVectorCreator()) {
+      Parameters.Add(new ValueParameter<DoubleMatrix>("Bounds", "The lower and upper bounds in each dimension.", Evaluator.Bounds));
+      Parameters.Add(new ValueParameter<IntValue>("ProblemSize", "The dimension of the problem.", new IntValue(2)));
+      Parameters.Add(new OptionalValueParameter<RealVector>("BestKnownSolution", "The best known solution for this test function instance."));
+
+      Maximization.Value = Evaluator.Maximization;
+      BestKnownQuality = new DoubleValue(Evaluator.BestKnownQuality);
+
+      strategyVectorCreator = new StdDevStrategyVectorCreator();
+      strategyVectorCreator.LengthParameter.ActualName = ProblemSizeParameter.Name;
+      strategyVectorCrossover = new StdDevStrategyVectorCrossover();
+      strategyVectorManipulator = new StdDevStrategyVectorManipulator();
+      strategyVectorManipulator.LearningRateParameter.Value = new DoubleValue(0.5);
+      strategyVectorManipulator.GeneralLearningRateParameter.Value = new DoubleValue(0.5);
+
+      SolutionCreator.RealVectorParameter.ActualName = "Point";
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+
+      InitializeOperators();
+      RegisterEventHandlers();
+      UpdateStrategyVectorBounds();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MovingPeaksBenchmarkProblem(this, cloner);
+    }
+
+    #region Events
+    protected override void OnSolutionCreatorChanged() {
+      base.OnSolutionCreatorChanged();
+      ParameterizeSolutionCreator();
+      ParameterizeAnalyzers();
+      SolutionCreator.RealVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_RealVectorParameter_ActualNameChanged);
+      SolutionCreator_RealVectorParameter_ActualNameChanged(null, EventArgs.Empty);
+    }
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      bool problemSizeChange = ProblemSize.Value < Evaluator.MinimumProblemSize
+        || ProblemSize.Value > Evaluator.MaximumProblemSize;
+      if (problemSizeChange) {
+        ProblemSize.Value = Math.Max(Evaluator.MinimumProblemSize, Math.Min(ProblemSize.Value, Evaluator.MaximumProblemSize));
+      } else {
+        ParameterizeEvaluator();
+      }
+      UpdateMoveEvaluators();
+      ParameterizeAnalyzers();
+      Maximization.Value = Evaluator.Maximization;
+      BoundsParameter.Value = Evaluator.Bounds;
+      BestKnownQuality = new DoubleValue(Evaluator.BestKnownQuality);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      Evaluator_QualityParameter_ActualNameChanged(null, EventArgs.Empty);
+      OnReset();
+    }
+    private void ProblemSizeParameter_ValueChanged(object sender, EventArgs e) {
+      ProblemSize.ValueChanged += new EventHandler(ProblemSize_ValueChanged);
+      ProblemSize_ValueChanged(null, EventArgs.Empty);
+    }
+    private void ProblemSize_ValueChanged(object sender, EventArgs e) {
+      if (ProblemSize.Value < 1) ProblemSize.Value = 1;
+      ParameterizeSolutionCreator();
+      ParameterizeEvaluator();
+      strategyVectorManipulator.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * ProblemSize.Value));
+      strategyVectorManipulator.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(ProblemSize.Value)));
+      OnReset();
+    }
+    private void SolutionCreator_RealVectorParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeEvaluator();
+      ParameterizeOperators();
+      ParameterizeAnalyzers();
+    }
+    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeOperators();
+    }
+    private void BoundsParameter_ValueChanged(object sender, EventArgs e) {
+      Bounds.ToStringChanged += new EventHandler(Bounds_ToStringChanged);
+      Bounds_ToStringChanged(null, EventArgs.Empty);
+    }
+    private void Bounds_ToStringChanged(object sender, EventArgs e) {
+      if (Bounds.Columns != 2 || Bounds.Rows < 1)
+        Bounds = new DoubleMatrix(1, 2);
+      ParameterizeOperators();
+      UpdateStrategyVectorBounds();
+    }
+    private void Bounds_ItemChanged(object sender, EventArgs<int, int> e) {
+      if (e.Value2 == 0 && Bounds[e.Value, 1] <= Bounds[e.Value, 0])
+        Bounds[e.Value, 1] = Bounds[e.Value, 0] + 0.1;
+      if (e.Value2 == 1 && Bounds[e.Value, 0] >= Bounds[e.Value, 1])
+        Bounds[e.Value, 0] = Bounds[e.Value, 1] - 0.1;
+      ParameterizeOperators();
+      UpdateStrategyVectorBounds();
+    }
+    private void MoveGenerator_AdditiveMoveParameter_ActualNameChanged(object sender, EventArgs e) {
+      string name = ((ILookupParameter<AdditiveMove>)sender).ActualName;
+      foreach (IAdditiveRealVectorMoveOperator op in Operators.OfType<IAdditiveRealVectorMoveOperator>()) {
+        op.AdditiveMoveParameter.ActualName = name;
+      }
+    }
+    //private void SphereEvaluator_Parameter_ValueChanged(object sender, EventArgs e) {
+    //  SphereEvaluator eval = (Evaluator as SphereEvaluator);
+    //  if (eval != null) {
+    //    foreach (ISphereMoveEvaluator op in Operators.OfType<ISphereMoveEvaluator>()) {
+    //      op.C = eval.C;
+    //      op.Alpha = eval.Alpha;
+    //    }
+    //  }
+    //}
+    //private void RastriginEvaluator_Parameter_ValueChanged(object sender, EventArgs e) {
+    //  RastriginEvaluator eval = (Evaluator as RastriginEvaluator);
+    //  if (eval != null) {
+    //    foreach (IRastriginMoveEvaluator op in Operators.OfType<IRastriginMoveEvaluator>()) {
+    //      op.A = eval.A;
+    //    }
+    //  }
+    //}
+    private void strategyVectorCreator_BoundsParameter_ValueChanged(object sender, EventArgs e) {
+      strategyVectorManipulator.BoundsParameter.Value = (DoubleMatrix)strategyVectorCreator.BoundsParameter.Value.Clone();
+    }
+    private void strategyVectorCreator_StrategyParameterParameter_ActualNameChanged(object sender, EventArgs e) {
+      string name = strategyVectorCreator.StrategyParameterParameter.ActualName;
+      strategyVectorCrossover.ParentsParameter.ActualName = name;
+      strategyVectorCrossover.StrategyParameterParameter.ActualName = name;
+      strategyVectorManipulator.StrategyParameterParameter.ActualName = name;
+    }
+    #endregion
+
+    #region Helpers
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      // BackwardsCompatibility3.3
+      #region Backwards compatible code (remove with 3.4)
+      if (Operators.Count == 0) InitializeOperators();
+      #endregion
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      ProblemSizeParameter.ValueChanged += new EventHandler(ProblemSizeParameter_ValueChanged);
+      ProblemSize.ValueChanged += new EventHandler(ProblemSize_ValueChanged);
+      BoundsParameter.ValueChanged += new EventHandler(BoundsParameter_ValueChanged);
+      Bounds.ToStringChanged += new EventHandler(Bounds_ToStringChanged);
+      Bounds.ItemChanged += new EventHandler<EventArgs<int, int>>(Bounds_ItemChanged);
+      SolutionCreator.RealVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_RealVectorParameter_ActualNameChanged);
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+      strategyVectorCreator.BoundsParameter.ValueChanged += new EventHandler(strategyVectorCreator_BoundsParameter_ValueChanged);
+      strategyVectorCreator.StrategyParameterParameter.ActualNameChanged += new EventHandler(strategyVectorCreator_StrategyParameterParameter_ActualNameChanged);
+    }
+    private void ParameterizeAnalyzers() {
+      //if (BestSingleObjectiveTestFunctionSolutionAnalyzer != null) {
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.ResultsParameter.ActualName = "Results";
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
+      //  BestSingleObjectiveTestFunctionSolutionAnalyzer.BoundsParameter.ActualName = BoundsParameter.Name;
+      //}
+    }
+    private void InitializeOperators() {
+      //Operators.Add(new SingleObjectiveTestFunctionImprovementOperator());
+      //Operators.Add(new SingleObjectiveTestFunctionPathRelinker());
+      //Operators.Add(new SingleObjectiveTestFunctionSimilarityCalculator());
+      //Operators.Add(new HammingSimilarityCalculator());
+      //Operators.Add(new EuclideanSimilarityCalculator());
+      //Operators.Add(new QualitySimilarityCalculator());
+
+      //Operators.Add(new BestSingleObjectiveTestFunctionSolutionAnalyzer());
+      //Operators.Add(new PopulationSimilarityAnalyzer(Operators.OfType<ISolutionSimilarityCalculator>()));
+      //ParameterizeAnalyzers();
+      //Operators.AddRange(ApplicationManager.Manager.GetInstances<IRealVectorOperator>().Cast<IOperator>());
+      //Operators.Add(strategyVectorCreator);
+      //Operators.Add(strategyVectorCrossover);
+      //Operators.Add(strategyVectorManipulator);
+      //UpdateMoveEvaluators();
+      //ParameterizeOperators();
+      //InitializeMoveGenerators();
+    }
+    private void InitializeMoveGenerators() {
+      foreach (IAdditiveRealVectorMoveOperator op in Operators.OfType<IAdditiveRealVectorMoveOperator>()) {
+        if (op is IMoveGenerator) {
+          op.AdditiveMoveParameter.ActualNameChanged += new EventHandler(MoveGenerator_AdditiveMoveParameter_ActualNameChanged);
+        }
+      }
+    }
+    private void UpdateMoveEvaluators() {
+      //foreach (ISingleObjectiveTestFunctionMoveEvaluator op in Operators.OfType<ISingleObjectiveTestFunctionMoveEvaluator>().ToList())
+      //  Operators.Remove(op);
+      //foreach (ISingleObjectiveTestFunctionMoveEvaluator op in ApplicationManager.Manager.GetInstances<ISingleObjectiveTestFunctionMoveEvaluator>())
+      //  if (op.EvaluatorType == Evaluator.GetType()) {
+      //    Operators.Add(op);
+      //    #region Synchronize evaluator specific parameters with the parameters of the corresponding move evaluators
+      //    if (op is ISphereMoveEvaluator) {
+      //      SphereEvaluator e = (Evaluator as SphereEvaluator);
+      //      e.AlphaParameter.ValueChanged += new EventHandler(SphereEvaluator_Parameter_ValueChanged);
+      //      e.CParameter.ValueChanged += new EventHandler(SphereEvaluator_Parameter_ValueChanged);
+      //      ISphereMoveEvaluator em = (op as ISphereMoveEvaluator);
+      //      em.C = e.C;
+      //      em.Alpha = e.Alpha;
+      //    } else if (op is IRastriginMoveEvaluator) {
+      //      RastriginEvaluator e = (Evaluator as RastriginEvaluator);
+      //      e.AParameter.ValueChanged += new EventHandler(RastriginEvaluator_Parameter_ValueChanged);
+      //      IRastriginMoveEvaluator em = (op as IRastriginMoveEvaluator);
+      //      em.A = e.A;
+      //    }
+      //    #endregion
+      //  }
+      //ParameterizeOperators();
+      //OnOperatorsChanged();
+    }
+    private void ParameterizeSolutionCreator() {
+      SolutionCreator.LengthParameter.Value = new IntValue(ProblemSize.Value);
+      SolutionCreator.LengthParameter.Hidden = true;
+      SolutionCreator.BoundsParameter.ActualName = BoundsParameter.Name;
+      SolutionCreator.BoundsParameter.Hidden = true;
+    }
+    private void ParameterizeEvaluator() {
+      Evaluator.PointParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+      Evaluator.PointParameter.Hidden = true;
+      try {
+        BestKnownSolutionParameter.Value = Evaluator.GetBestKnownSolution(ProblemSize.Value);
+      }
+      catch (ArgumentException e) {
+        ErrorHandling.ShowErrorDialog(e);
+        ProblemSize.Value = Evaluator.MinimumProblemSize;
+      }
+    }
+    private void ParameterizeOperators() {
+      foreach (var op in Operators.OfType<IRealVectorCrossover>()) {
+        op.ParentsParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.ParentsParameter.Hidden = true;
+        op.ChildParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.ChildParameter.Hidden = true;
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.BoundsParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorManipulator>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.BoundsParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorMoveOperator>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorMoveGenerator>()) {
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.BoundsParameter.Hidden = true;
+      }
+      //foreach (var op in Operators.OfType<ISingleObjectiveTestFunctionAdditiveMoveEvaluator>()) {
+      //  op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+      //  op.QualityParameter.Hidden = true;
+      //  op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+      //  op.RealVectorParameter.Hidden = true;
+      //}
+      foreach (var op in Operators.OfType<IRealVectorParticleCreator>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.BoundsParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorParticleUpdater>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.BoundsParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorSwarmUpdater>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+        op.MaximizationParameter.ActualName = MaximizationParameter.Name;
+        op.MaximizationParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>()) {
+        op.RealVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.RealVectorParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<ISingleObjectiveImprovementOperator>()) {
+        op.SolutionParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.SolutionParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<ISingleObjectivePathRelinker>()) {
+        op.ParentsParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
+        op.ParentsParameter.Hidden = true;
+      }
+      foreach (var op in Operators.OfType<ISolutionSimilarityCalculator>()) {
+        op.SolutionVariableName = SolutionCreator.RealVectorParameter.ActualName;
+        op.QualityVariableName = Evaluator.QualityParameter.ActualName;
+        //var calc = op as SingleObjectiveTestFunctionSimilarityCalculator;
+        //if (calc != null) calc.Bounds = Bounds;
+      }
+    }
+    private void UpdateStrategyVectorBounds() {
+      var strategyBounds = (DoubleMatrix)Bounds.Clone();
+      for (int i = 0; i < strategyBounds.Rows; i++) {
+        if (strategyBounds[i, 0] < 0) strategyBounds[i, 0] = 0;
+        strategyBounds[i, 1] = 0.1 * (Bounds[i, 1] - Bounds[i, 0]);
+      }
+      strategyVectorCreator.BoundsParameter.Value = strategyBounds;
+    }
+    #endregion
+  }
+}
Index: branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Plugin.cs.frame
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Plugin.cs.frame	(revision 16606)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Plugin.cs.frame	(revision 16606)
@@ -0,0 +1,45 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.MovingPeaksBenchmark {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.MovingPeaksBenchmark plugin
+  /// </summary>
+  [PluginFile("HeuristicLab.Problems.MovingPeaksBenchmark-3.3.dll", PluginFileType.Assembly)]
+  [Plugin("HeuristicLab.Problems.MovingPeaksBenchmark", "3.3.15.$WCREV$")]
+//  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+//  [PluginDependency("HeuristicLab.Collections", "3.3")]
+//  [PluginDependency("HeuristicLab.Common", "3.3")]
+//  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+//  [PluginDependency("HeuristicLab.Data", "3.3")]
+//  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
+//  [PluginDependency("HeuristicLab.Operators", "3.3")]
+//  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+//  [PluginDependency("HeuristicLab.Optimization.Operators", "3.3")]
+//  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+//  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabProblemsMovingPeaksBenchmarkPlugin : PluginBase {
+  }
+}
Index: branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Properties/AssemblyInfo.cs.frame	(revision 16606)
+++ branches/2989_MovingPeaksBenchmark/HeuristicLab.Problems.MovingPeaksBenchmark/3.3/Properties/AssemblyInfo.cs.frame	(revision 16606)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2019 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.InteropServices;
+
+// 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.Problems.MovingPeaksBenchmark")]
+[assembly: AssemblyDescription("HeuristicLab Moving Peaks Benchmark classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2019 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("4da1bc61-4f7d-4e4e-af09-a6940ea88a5a")]
+
+// 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.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.15.$WCREV$")]
