Index: /branches/3133_ProblemModifiers/Build.cmd
===================================================================
--- /branches/3133_ProblemModifiers/Build.cmd	(revision 18029)
+++ /branches/3133_ProblemModifiers/Build.cmd	(revision 18029)
@@ -0,0 +1,94 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=1
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Debug]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Debug
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :main
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%"=="1" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/HeuristicLab.Problems.Modifiers.Views.csproj
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/HeuristicLab.Problems.Modifiers.Views.csproj	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/HeuristicLab.Problems.Modifiers.Views.csproj	(revision 18029)
@@ -0,0 +1,120 @@
+﻿<?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>{7C396006-7C2C-4E08-86B4-16E4277F9ADC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Modifiers.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Modifiers.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\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>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Clients.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive.Administrator-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Hive.Administrator-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive.JobManager-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Hive.JobManager-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <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="Plugin.cs" />
+    <Compile Include="ProjectResourcesValueView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProjectResourcesValueView.Designer.cs">
+      <DependentUpon>ProjectResourcesValueView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Problems.Modifiers\HeuristicLab.Problems.Modifiers.csproj">
+      <Project>{5fbdcd4a-3c2a-4ec6-83ce-34b29f43621a}</Project>
+      <Name>HeuristicLab.Problems.Modifiers</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)
+
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Properties\AssemblyInfo.cs.frame" "%25ProjectDir%25\Properties\AssemblyInfo.cs"
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Plugin.cs.frame" "%25ProjectDir%25\Plugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Plugin.cs.frame
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Plugin.cs.frame	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Plugin.cs.frame	(revision 18029)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Modifiers.Views {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.Modifiers.Views plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.Modifiers.Views", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Modifiers.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Clients.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive.Administrator", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive.JobManager", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Modifiers", "3.3")]
+  public class HeuristicLabProblemsModifiersViewsPlugin : PluginBase { }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.Designer.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.Designer.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.Designer.cs	(revision 18029)
@@ -0,0 +1,83 @@
+﻿namespace HeuristicLab.Problems.Modifiers.Views {
+  partial class ProjectResourcesValueView {
+    /// <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.hiveProjectSelector = new HeuristicLab.Clients.Hive.JobManager.Views.HiveProjectSelector();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // hiveProjectSelector
+      // 
+      this.hiveProjectSelector.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.hiveProjectSelector.Caption = "Hive Project Selector View";
+      this.hiveProjectSelector.Content = null;
+      this.hiveProjectSelector.JobId = new System.Guid("00000000-0000-0000-0000-000000000000");
+      this.hiveProjectSelector.Location = new System.Drawing.Point(0, 32);
+      this.hiveProjectSelector.Name = "hiveProjectSelector";
+      this.hiveProjectSelector.ProjectId = null;
+      this.hiveProjectSelector.ReadOnly = false;
+      this.hiveProjectSelector.SelectedProject = null;
+      this.hiveProjectSelector.SelectedProjectId = null;
+      this.hiveProjectSelector.SelectedResourceIds = null;
+      this.hiveProjectSelector.Size = new System.Drawing.Size(432, 512);
+      this.hiveProjectSelector.TabIndex = 0;
+      this.hiveProjectSelector.SelectedProjectChanged += new System.EventHandler(this.hiveProjectSelector_SelectedProjectChanged);
+      this.hiveProjectSelector.AssignedResourcesChanged += new System.EventHandler(this.hiveProjectSelector_AssignedResourcesChanged);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.refreshButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Refresh;
+      this.refreshButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.refreshButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(426, 23);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.Text = "Refresh";
+      this.refreshButton.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+      this.refreshButton.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // ProjectResourcesValueView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.hiveProjectSelector);
+      this.Name = "ProjectResourcesValueView";
+      this.Size = new System.Drawing.Size(432, 544);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private Clients.Hive.JobManager.Views.HiveProjectSelector hiveProjectSelector;
+    private System.Windows.Forms.Button refreshButton;
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/ProjectResourcesValueView.cs	(revision 18029)
@@ -0,0 +1,107 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.Modifiers.Views {
+  [View("ProjectResourcesValueView")]
+  [Content(typeof(ProjectResourcesValue), true)]
+  public partial class ProjectResourcesValueView : ItemView {
+    private readonly object locker = new object();
+    private bool updatingProjects;
+    private bool progressRegistered;
+
+    public new ProjectResourcesValue Content {
+      get { return (ProjectResourcesValue)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProjectResourcesValueView() {
+      InitializeComponent();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+
+      hiveProjectSelector.Enabled = Content != null && !ReadOnly && !Locked;
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+
+      HiveClient.Instance.Refreshing -= HiveClient_Instance_Refreshing;
+      HiveClient.Instance.Refreshed -= HiveClient_Instance_Refreshed;
+      HiveClient.Instance.Refreshing += HiveClient_Instance_Refreshing;
+      HiveClient.Instance.Refreshed += HiveClient_Instance_Refreshed;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      HiveClient.Instance.Refreshed -= HiveClient_Instance_Refreshed;
+      HiveClient.Instance.Refreshing -= HiveClient_Instance_Refreshing;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+
+      if (Content == null) {
+        hiveProjectSelector.SelectedProjectId = Guid.Empty;
+        hiveProjectSelector.SelectedResourceIds = new List<Guid>();
+      } else {
+        hiveProjectSelector.SelectedProjectId = Content.ProjectId;
+        hiveProjectSelector.SelectedResourceIds = Content.ResourceIds.ToList();
+      }
+    }
+
+    private void HiveClient_Instance_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveClient_Instance_Refreshing, sender, e);
+      else {
+        if (!progressRegistered) {
+          Progress.Show(this, "Refreshing ...");
+          progressRegistered = true;
+        }
+        refreshButton.Enabled = false;
+      }
+    }
+
+    private void HiveClient_Instance_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke((Action<object, EventArgs>)HiveClient_Instance_Refreshed, sender, e);
+      else {
+        if (progressRegistered) {
+          Progress.Hide(this);
+          progressRegistered = false;
+        }
+        refreshButton.Enabled = true;
+      }
+    }
+
+    private void hiveProjectSelector_SelectedProjectChanged(object sender, EventArgs e) {
+      Content.ProjectId = hiveProjectSelector.SelectedProject.Id;
+    }
+
+    private void hiveProjectSelector_AssignedResourcesChanged(object sender, EventArgs e) {
+      Content.ResourceIds = hiveProjectSelector.AssignedResources.Select(x => x.Id).ToList();
+    }
+
+    private async void refreshButton_Click(object sender, EventArgs e) {
+      lock (locker) {
+        if (updatingProjects) return;
+        updatingProjects = true;
+      }
+
+      await SecurityExceptionUtil.TryAsyncAndReportSecurityExceptions(
+        action: UpdateProjects,
+        finallyCallback: () => updatingProjects = false);
+    }
+
+    private void UpdateProjects() {
+      HiveClient.Instance.RefreshProjectsAndResources();
+      hiveProjectSelector.ProjectId = Content?.ProjectId ?? Guid.Empty;
+      hiveProjectSelector.SelectedProjectId = Content?.ProjectId ?? Guid.Empty;
+      hiveProjectSelector.SelectedResourceIds = Content != null ? Content.ResourceIds.ToList() : new List<Guid>();
+      hiveProjectSelector.Content = HiveClient.Instance.Projects;
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Properties/AssemblyInfo.cs.frame	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.Views/Properties/AssemblyInfo.cs.frame	(revision 18029)
@@ -0,0 +1,37 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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.Analysis.FitnessLandscape")]
+[assembly: AssemblyDescription("HeuristicLab algorithm analysis for fitness landscape properties")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2010 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("34e1ec7e-0124-4f76-b8f8-42b9244d2b09")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.3000")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
+
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.sln
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.sln	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers.sln	(revision 18029)
@@ -0,0 +1,56 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30907.101
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Modifiers", "HeuristicLab.Problems.Modifiers\HeuristicLab.Problems.Modifiers.csproj", "{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{6918D699-500C-43AB-8080-C8982A23AB21}"
+	ProjectSection(SolutionItems) = preProject
+		.editorconfig = .editorconfig
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Modifiers.Views", "HeuristicLab.Problems.Modifiers.Views\HeuristicLab.Problems.Modifiers.Views.csproj", "{7C396006-7C2C-4E08-86B4-16E4277F9ADC}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x64.ActiveCfg = Debug|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x64.Build.0 = Debug|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x86.ActiveCfg = Debug|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Debug|x86.Build.0 = Debug|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x64.ActiveCfg = Release|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x64.Build.0 = Release|x64
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x86.ActiveCfg = Release|x86
+		{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}.Release|x86.Build.0 = Release|x86
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|x64.Build.0 = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Debug|x86.Build.0 = Debug|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|x64.ActiveCfg = Release|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|x64.Build.0 = Release|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|x86.ActiveCfg = Release|Any CPU
+		{7C396006-7C2C-4E08-86B4-16E4277F9ADC}.Release|x86.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {57F4192E-DC9D-4075-867D-E68177A1B8FD}
+	EndGlobalSection
+EndGlobal
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/HeuristicLab.Problems.Modifiers.csproj
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/HeuristicLab.Problems.Modifiers.csproj	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/HeuristicLab.Problems.Modifiers.csproj	(revision 18029)
@@ -0,0 +1,272 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5FBDCD4A-3C2A-4EC6-83CE-34B29F43621A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Modifiers</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Modifiers-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\..\trunk\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HEAL.Attic">
+      <HintPath>..\..\..\trunk\bin\HEAL.Attic.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Algorithms.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Algorithms.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Analysis-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Analysis-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive.JobManager-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Clients.Hive.JobManager-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.BinaryVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.IntegerVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Encodings.RealVectorEncoding-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Encodings.RealVectorEncoding-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Operators-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Operators-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Parameters-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Parameters-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Instances-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Problems.Instances-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Random-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Random-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Selection-3.3">
+      <HintPath>..\..\..\trunk\bin\HeuristicLab.Selection-3.3.dll</HintPath>
+      <Private>false</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Hive\HiveApi.cs" />
+    <Compile Include="Hive\HiveEvaluationProblemModifier.cs" />
+    <Compile Include="Hive\HiveEvaluationResultPoller.cs" />
+    <Compile Include="Hive\ModifiedBasicProblemEvaluationExecutionAlgorithm.cs" />
+    <Compile Include="IListExtensions.cs" />
+    <Compile Include="ListExtensions.cs" />
+    <Compile Include="Modelling\AnalysisRunningPredictionQualityProblemModifier.cs" />
+    <Compile Include="Modifier\ClusteringTranscodingProblemModifier.cs" />
+    <Compile Include="Modifier\EvaluationCacheProblemModifier.cs" />
+    <Compile Include="Modifier\EvaluationLoggingProblemModifier.cs" />
+    <Compile Include="Modifier\EvaluationRepetitionProblemModifier.cs" />
+    <Compile Include="Modifier\InModelSingularEvaluationRemovalStrategy.cs" />
+    <Compile Include="Modifier\ModelBasedEvaluationRemoverProblemModifier.cs" />
+    <Compile Include="Modifier\MultiModelEvaluationRemovalStrategy.cs" />
+    <Compile Include="Modifier\MultiObjectiveEndPointProblemModifier.cs" />
+    <Compile Include="Modifier\ProblemModifier.cs" />
+    <Compile Include="Modifier\SingleObjectiveEndPointProblemModifier.cs" />
+    <Compile Include="Modifier\TranscodingProblemModifier.cs" />
+    <Compile Include="Hive\MultiObjectiveBasicProblemEvaluation.cs" />
+    <Compile Include="MultiObjectiveModifiedProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Hive\ProjectResourcesValue.cs" />
+    <Compile Include="SingleObjectiveModifiedProblem.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\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>
+    <PostBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+set Platform=$(PlatformName)
+set Configuration=$(ConfigurationName)</PostBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Properties\AssemblyInfo.cs.frame" "%25ProjectDir%25\Properties\AssemblyInfo.cs"
+SubWCRev "%25ProjectDir%25\" "%25ProjectDir%25\Plugin.cs.frame" "%25ProjectDir%25\Plugin.cs"</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveApi.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveApi.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveApi.cs	(revision 18029)
@@ -0,0 +1,154 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  public static class HiveApi {
+    private static readonly object locker = new object();
+
+    public class Options {
+      public Guid ProjectId { get; set; }
+      public IEnumerable<Guid> ResourceIds { get; set; }
+      public string JobName { get; set; }
+      public bool Distribute { get; set; }
+    }
+
+    public static IEnumerable<T> ExecuteInHive<T>(IEnumerable<T> executables, Options options, CancellationToken cancellationToken) where T : IExecutable {
+      if (options == null) {
+        options = new Options {
+          ProjectId = Guid.Empty,
+          ResourceIds = new Guid[0],
+          JobName = string.Empty,
+          Distribute = true
+        };
+      }
+
+      var safeExecutables = executables as T[] ?? executables.ToArray();
+      if (!safeExecutables.Any())
+        throw new ArgumentException("At least one executable must be specified.");
+
+      Exception exception = null;
+      bool jobFinished;
+      var tries = 0;
+      const int maxRetries = 5;
+      do {
+        exception = null;
+        Project[] projects;
+        lock (locker) {
+          HiveClient.Instance.Refresh();
+          projects = HiveClient.Instance.Projects.ToArray();
+        }
+
+        var projectId = GuardProjectId(options.ProjectId, projects);
+        var resourceIds = GuardResourceIds(options.ResourceIds, projectId);
+        var jobName = GuardJobName(safeExecutables, options.JobName);
+        var distribute = options.Distribute;
+
+        using (var refreshableJob = PackJob(safeExecutables, projectId, resourceIds, jobName, distribute)) {
+          HiveClient.Store(refreshableJob, cancellationToken);
+
+          var taskIds = refreshableJob.HiveTasks.Select(x => x.Task.Id).ToArray();
+
+          using (var signal = SetupWaitHandle(refreshableJob, e => exception = e)) {
+            refreshableJob.StartResultPolling();
+
+            try {
+              signal.Wait(cancellationToken);
+            } catch (OperationCanceledException) {
+            } finally {
+              HiveClient.LoadJob(refreshableJob);
+              executables = UnpackJob<T>(refreshableJob, taskIds);
+              HiveClient.Delete(refreshableJob); // keep problematic jobs for debugging
+            }
+          }
+          jobFinished = refreshableJob.IsFinished();
+        }
+      } while (tries++ < maxRetries && (exception != null || !jobFinished));
+
+      return executables;
+    }
+
+    public static void RefreshHiveClient(out Project[] projects, out Resource[] resources) {
+      lock (locker) {
+        HiveClient.Instance.Refresh();
+        projects = HiveClient.Instance.Projects.ToArray();
+        resources = HiveClient.Instance.Resources.ToArray();
+      }
+    }
+
+    public static Guid GuardProjectId(Guid projectId, IEnumerable<Project> projects) {
+      Project selectedProject;
+
+      if (projectId == Guid.Empty) {
+        selectedProject = projects.FirstOrDefault();
+        if (selectedProject == null) throw new ArgumentException("A default project is not available.");
+      } else {
+        selectedProject = projects.SingleOrDefault(x => x.Id == projectId);
+        if (selectedProject == null) throw new ArgumentException("The specified project is not available.");
+      }
+
+      return selectedProject.Id;
+    }
+
+    public static IEnumerable<Guid> GuardResourceIds(IEnumerable<Guid> resourceIds, Guid projectId) {
+      Resource[] availableResources;
+      lock (locker) availableResources = HiveClient.Instance.GetAvailableResourcesForProject(projectId).ToArray();
+
+      var availableResourceIds = availableResources.Select(x => x.Id).ToArray();
+      var guardResourceIds = resourceIds as Guid[] ?? resourceIds.ToArray();
+      var unavailableResources = guardResourceIds.Except(availableResourceIds);
+      if (unavailableResources.Any()) throw new ArgumentException("Some of the specified resources are not available for the specified project.");
+
+      return guardResourceIds;
+    }
+
+    public static string GuardJobName<T>(IEnumerable<T> executables, string jobName) where T : IExecutable {
+      if (string.IsNullOrEmpty(jobName)) jobName = string.Join(" + ", executables);
+      return jobName;
+    }
+
+    public static RefreshableJob PackJob<T>(IEnumerable<T> executables, Guid projectId, IEnumerable<Guid> resourceIds, string jobName, bool distribute) where T : IExecutable {
+      var refreshableJob = new RefreshableJob() {
+        Job = {
+          Name = jobName,
+          ProjectId = projectId,
+          ResourceIds = resourceIds.ToList()
+        }
+      };
+
+      foreach (var executable in executables) {
+        var itemTask = ItemTask.GetItemTaskForItem(executable);
+        itemTask.ComputeInParallel = distribute && (executable is Experiment || executable is BatchRun);
+        var hiveTask = itemTask.CreateHiveTask();
+        refreshableJob.HiveTasks.Add(hiveTask);
+      }
+
+      return refreshableJob;
+    }
+
+    public static IEnumerable<T> UnpackJob<T>(RefreshableJob refreshableJob, IList<Guid> taskIds) where T : IExecutable {
+      var hiveTasks = refreshableJob.HiveTasks.OrderBy(x => taskIds.IndexOf(x.Task.Id));
+      foreach (var hiveTask in hiveTasks) {
+        var executable = (T)hiveTask.ItemTask.Item;
+        yield return executable;
+      }
+    }
+
+    public static ManualResetEventSlim SetupWaitHandle(RefreshableJob refreshableJob, Action<Exception> exceptionCallback) {
+      var signal = new ManualResetEventSlim(false);
+      refreshableJob.StateLogListChanged += (sender, args) => {
+        if (refreshableJob.IsFinished())
+          signal.Set();
+      };
+      refreshableJob.ExceptionOccured += (sender, args) => {
+        exceptionCallback(args.Value);
+        signal.Set();
+      };
+      return signal;
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationProblemModifier.cs	(revision 18029)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("1D86AA34-3ACE-432B-9615-8972BE0D9724")]
+  [Item("HiveEvaluationProblemModifier", "A problem modifier that logs evaluations in a file")]
+  public class HiveEvaluationProblemModifier : ProblemModifier {
+    private readonly HiveEvaluationResultPoller<ModifiedBasicProblemEvaluationExecutionAlgorithm> poller = new HiveEvaluationResultPoller<ModifiedBasicProblemEvaluationExecutionAlgorithm>(TimeSpan.FromSeconds(40));
+
+    #region ParameterNames
+    private const string ProjectResourcesParameterName = "ProjectResources";
+    private const string DistributeTasksParameterName = "DistributeTasks";
+    private const string PollerLogParameterName = "LogFile";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<ProjectResourcesValue> ProjectResourcesParameter => (IValueParameter<ProjectResourcesValue>)Parameters[ProjectResourcesParameterName];
+    public IFixedValueParameter<BoolValue> DistributeTasksParameter => (IFixedValueParameter<BoolValue>)Parameters[DistributeTasksParameterName];
+    public IFixedValueParameter<FileValue> PollerLogParameter => (IFixedValueParameter<FileValue>)Parameters[PollerLogParameterName];
+    #endregion
+
+    #region ParameterProperties
+    public ProjectResourcesValue ProjectResources => ProjectResourcesParameter.Value;
+    public bool DistributeTasks => DistributeTasksParameter.Value.Value;
+    public FileValue PollerLog => PollerLogParameter.Value;
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected HiveEvaluationProblemModifier(StorableConstructorFlag _) : base(_) { }
+
+    protected HiveEvaluationProblemModifier(HiveEvaluationProblemModifier original, Cloner cloner) : base(original,
+      cloner) {
+      Initialize();
+    }
+    public HiveEvaluationProblemModifier() {
+      Parameters.Add(new ValueParameter<ProjectResourcesValue>(ProjectResourcesParameterName, "The project/resources where Hive jobs/tasks should be assigned to."));
+      Parameters.Add(new FixedValueParameter<BoolValue>(DistributeTasksParameterName, "Has currently no effect"));
+      Parameters.Add(new FixedValueParameter<FileValue>(PollerLogParameterName, "Where to log Hive related exceptions", new FileValue()));
+      Initialize();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveEvaluationProblemModifier(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (!Parameters.ContainsKey(PollerLogParameterName))
+        Parameters.Add(new FixedValueParameter<FileValue>(PollerLogParameterName, "Where to log Hive related exceptions", new FileValue()));
+      PollerLogParameter.Value.Value = poller.LogFile;
+      Initialize();
+    }
+    #endregion
+
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var individualScope = new Scope();
+      foreach (var value in individual.Values)
+        individualScope.Variables.Add(new Variable(value.Key, value.Value));
+      var evaluation = new ModifiedBasicProblemEvaluationExecutionAlgorithm(NextModifier, individualScope, random) { Problem = new MultiObjectiveModifiedProblem() };//this is just so that algorithm.problem is not null
+      evaluation.Prepare();
+      var options = new HiveApi.Options {
+        ProjectId = ProjectResources.ProjectId,
+        ResourceIds = ProjectResources.ResourceIds,
+        Distribute = DistributeTasks,
+        JobName = $"{evaluation}+{Guid.NewGuid().ToString().ToUpperInvariant()}"
+      };
+
+      try {
+        var taskCompletionSource = poller.StartEvaluation(evaluation, options);
+        taskCompletionSource.Task.Wait();
+        if (taskCompletionSource.Task.Status == System.Threading.Tasks.TaskStatus.Faulted)
+          if (taskCompletionSource.Task.Exception != null)
+            throw taskCompletionSource.Task.Exception;
+        evaluation = taskCompletionSource.Task.Result;
+      } catch (Exception e) {
+        individual["Exception"] = new StringValue("ERROR: " + e.ToString().Replace(Environment.NewLine, " // "));
+        return Maximization.Select(x => x ? double.MinValue : double.MaxValue).ToArray();
+      }
+
+      foreach (var variable in evaluation.IndividualScope.Variables)
+        individual[variable.Name] = variable.Value;
+      return evaluation.Qualities;
+    }
+
+
+    public override void Initialize() {
+      base.Initialize();
+      PollerLogParameter.Value.ToStringChanged += (o, e) => { poller.LogFile = PollerLog.Value; };
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationResultPoller.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationResultPoller.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/HiveEvaluationResultPoller.cs	(revision 18029)
@@ -0,0 +1,147 @@
+﻿using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.Modifiers {
+  /// <summary>
+  /// non-storable poller that downloads hive jobs 
+  /// </summary>
+  public class HiveEvaluationResultPoller {
+    protected static readonly object LogLocker = new object();
+    protected static readonly Semaphore Throttle = new Semaphore(90, 90); //The Hive server throttles connections down to 100 
+  }
+  public class HiveEvaluationResultPoller<T> : HiveEvaluationResultPoller where T : IExecutable {
+    private Thread thread;
+    private readonly object locker = new object();
+    private readonly Dictionary<Guid, TaskCompletionSource<T>> jobs = new Dictionary<Guid, TaskCompletionSource<T>>();
+
+    public TimeSpan Interval { get; set; }
+    public string LogFile;
+    public HiveEvaluationResultPoller(TimeSpan interval) {
+      Interval = interval;
+    }
+
+    public TaskCompletionSource<T> StartEvaluation(T evaluation, HiveApi.Options options) {
+      HiveApi.RefreshHiveClient(out var projects, out _);
+      var projectId = HiveApi.GuardProjectId(options.ProjectId, projects);
+      var resourceIds = options.ResourceIds;
+      var jobName = HiveApi.GuardJobName(new[] { evaluation }, options.JobName);
+      var distribute = options.Distribute;
+      using (var refreshableJob = HiveApi.PackJob(new[] { evaluation }, projectId, resourceIds, jobName, distribute)) {
+        Throttle.WaitOne();
+        try {
+          HiveClient.Store(refreshableJob, CancellationToken.None);
+        } catch (Exception e) {
+          WriteToLog(new[] { "Exception occured when uploading Job : " + DateTime.Now, e.ToString(), "========" });
+          throw;
+        } finally {
+          Throttle.Release();
+        }
+        var comp = new TaskCompletionSource<T>();
+        lock (locker) {
+          var startNew = jobs.Count == 0;
+          jobs.Add(refreshableJob.Id, comp);
+          if (startNew) Start();
+        }
+        return comp;
+      }
+    }
+
+    #region Helpers
+    private void Start() {
+      thread = new Thread(RunPolling);
+      thread.Start();
+    }
+
+    private void RunPolling() {
+      var stopRequested = false;
+      do {
+        try {
+          Thread.Sleep(Interval);
+          stopRequested = FetchJobResults();
+          HiveApi.RefreshHiveClient(out _, out _);
+        } catch (Exception e) {
+          WriteToLog(new[] { "Poller Exception occurred at : " + DateTime.Now, e.ToString(), "========" });
+        }
+      } while (!stopRequested);
+    }
+
+    private bool FetchJobResults() {
+      var stopping = false;
+      HiveServiceLocator.Instance.CallHiveService(service => {
+        Guid[] tasks1;
+        lock (locker) {
+          tasks1 = jobs.Keys.ToArray();
+        }
+
+        var toRemoves = new HashSet<Guid>();
+        foreach (var x in tasks1) {
+          LightweightTask task;
+          try {
+            task = service.GetLightweightJobTasksWithoutStateLog(x).Single();
+          } catch (Exception e) {
+            toRemoves.Add(x);
+            lock (locker) {
+              if (jobs.ContainsKey(x)) jobs[x].SetException(e);
+            }
+            continue;
+          }
+          switch (task.State) {
+            case TaskState.Offline:
+            case TaskState.Waiting:
+            case TaskState.Transferring:
+            case TaskState.Calculating:
+            case TaskState.Paused:
+              break;
+            case TaskState.Finished:
+              var evaluation = (T)PersistenceUtil.Deserialize<ItemTask>(service.GetTaskData(task.Id).Data).Item;
+              HiveClient.Delete(service.GetJob(x));
+              toRemoves.Add(x);
+              lock (locker) {
+                if (jobs.ContainsKey(x))
+                  jobs[x].SetResult(evaluation);
+              }
+              break;
+            case TaskState.Aborted:
+            case TaskState.Failed:
+              toRemoves.Add(x);
+              lock (locker) {
+                if (jobs.ContainsKey(x))
+                  jobs[x].SetException(new HiveException($"The evaluation with job id {x} and task id {task.Id} failed. Please consult the Hive Job-Manager for further information"));
+              }
+              break;
+            default:
+              throw new ArgumentOutOfRangeException();
+          }
+        }
+
+        lock (locker) {
+          foreach (var x in toRemoves.Where(x => jobs.ContainsKey(x))) {
+            jobs.Remove(x);
+            if (jobs.Count != 0) continue;
+            stopping = true;
+            thread = null;
+          }
+        }
+
+      });
+      return stopping;
+    }
+    private void WriteToLog(IEnumerable<string> lines) {
+      if (LogFile == null) return;
+      lock (LogLocker) {
+        try {
+          File.AppendAllLines(LogFile, lines);
+        } catch { // ignored
+        }
+      }
+    }
+    #endregion
+  }
+}
+
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ModifiedBasicProblemEvaluationExecutionAlgorithm.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ModifiedBasicProblemEvaluationExecutionAlgorithm.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ModifiedBasicProblemEvaluationExecutionAlgorithm.cs	(revision 18029)
@@ -0,0 +1,56 @@
+﻿using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("19E56ADE-9700-42A1-A5BD-5553CB841E93")]
+  public sealed class ModifiedBasicProblemEvaluationExecutionAlgorithm : BasicAlgorithm {
+    public override bool SupportsPause => false;
+
+    [Storable]
+    public ProblemModifier NextModifier { get; private set; } //private setters are needed for HEAL.Attic
+    [Storable]
+    public IScope IndividualScope { get; private set; } //private setters are needed for HEAL.Attic
+    [Storable]
+    public IRandom Random { get; private set; } //private setters are needed for HEAL.Attic
+    [Storable]
+    public double[] Qualities { get; private set; } //private setters are needed for HEAL.Attic
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    private ModifiedBasicProblemEvaluationExecutionAlgorithm(StorableConstructorFlag _) : base(_) { }
+    private ModifiedBasicProblemEvaluationExecutionAlgorithm(ModifiedBasicProblemEvaluationExecutionAlgorithm original, Cloner cloner) : base(original, cloner) {
+      IndividualScope = cloner.Clone(original.IndividualScope);
+      Random = cloner.Clone(original.Random);
+      Qualities = original.Qualities.ToArray();
+      NextModifier = cloner.Clone(original.NextModifier);
+
+    }
+    public ModifiedBasicProblemEvaluationExecutionAlgorithm(ProblemModifier nextModifier, IScope individualScope, IRandom random) {
+      NextModifier = nextModifier;
+      IndividualScope = individualScope;
+      Random = random;
+      Qualities = new[] { double.NaN };
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ModifiedBasicProblemEvaluationExecutionAlgorithm(this, cloner);
+    }
+    #endregion
+
+    protected override void Run(CancellationToken cancellationToken) {
+      var encoding = NextModifier.Encoding;
+      var individual = encoding is MultiEncoding multiEncoding
+        ? (Individual)new MultiEncodingIndividual(multiEncoding, IndividualScope)
+        : (Individual)new SingleEncodingIndividual(encoding, IndividualScope);
+
+      var evaluationTask = Task.Run(() => NextModifier.ModifiedEvaluate(individual, Random), cancellationToken);
+      evaluationTask.Wait(cancellationToken);
+      Qualities = evaluationTask.Result;
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/MultiObjectiveBasicProblemEvaluation.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/MultiObjectiveBasicProblemEvaluation.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/MultiObjectiveBasicProblemEvaluation.cs	(revision 18029)
@@ -0,0 +1,56 @@
+﻿using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("3985D750-03D4-4842-A34D-A352BED95190")]
+  public sealed class MultiObjectiveBasicProblemEvaluation : BasicAlgorithm {
+    public override bool SupportsPause => false;
+
+    public new MultiObjectiveBasicProblem<IEncoding> Problem {
+      get => (MultiObjectiveBasicProblem<IEncoding>)base.Problem;
+      private set => base.Problem = value;
+    }
+
+    [Storable]
+    public IScope IndividualScope { get; private set; }
+    [Storable]
+    public IRandom Random { get; private set; }
+    [Storable]
+    public double[] Qualities { get; private set; }
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    private MultiObjectiveBasicProblemEvaluation(StorableConstructorFlag _) : base(_) { }
+    private MultiObjectiveBasicProblemEvaluation(MultiObjectiveBasicProblemEvaluation original, Cloner cloner) : base(original, cloner) {
+      IndividualScope = cloner.Clone(original.IndividualScope);
+      Random = cloner.Clone(original.Random);
+      Qualities = (double[])original.Qualities.Clone();
+    }
+    public MultiObjectiveBasicProblemEvaluation(MultiObjectiveBasicProblem<IEncoding> problem, IScope individualScope, IRandom random) {
+      Problem = problem;
+      IndividualScope = individualScope;
+      Random = random;
+      Qualities = Enumerable.Repeat(double.NaN, problem.Maximization.Length).ToArray();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveBasicProblemEvaluation(this, cloner);
+    }
+    #endregion
+
+    protected override void Run(CancellationToken cancellationToken) {
+      var singleEncoding = Problem.Encoding;
+      var individual = Problem.Encoding is MultiEncoding multiEncoding
+        ? (Individual)new MultiEncodingIndividual(multiEncoding, IndividualScope)
+        : (Individual)new SingleEncodingIndividual(singleEncoding, IndividualScope);
+      var evaluationTask = Task.Run(() => Problem.Evaluate(individual, Random), cancellationToken);
+      evaluationTask.Wait(cancellationToken);
+      Qualities = evaluationTask.Result;
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ProjectResourcesValue.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ProjectResourcesValue.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Hive/ProjectResourcesValue.cs	(revision 18029)
@@ -0,0 +1,53 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [Item("ProjectResourcesValue", "Represents a project and selected project resources.")]
+  [StorableType("897D2065-5C7D-448B-B9DB-4D612BF1844E")]
+  public class ProjectResourcesValue : Item {
+    [Storable]
+    private Guid projectId;
+    public Guid ProjectId {
+      get => projectId;
+      set {
+        if (projectId == value) return;
+        projectId = value;
+        OnToStringChanged();
+      }
+    }
+
+    [Storable]
+    private List<Guid> resourceIds;
+    public List<Guid> ResourceIds {
+      get => resourceIds;
+      set {
+        if (resourceIds == value) return;
+        resourceIds = value;
+        OnToStringChanged();
+      }
+    }
+
+    [StorableConstructor]
+    protected ProjectResourcesValue(StorableConstructorFlag _) : base(_) { }
+    protected ProjectResourcesValue(ProjectResourcesValue original, Cloner cloner) : base(original, cloner) {
+      ProjectId = original.ProjectId;
+      ResourceIds = original.ResourceIds.Select(x => x).ToList();
+    }
+    public ProjectResourcesValue() {
+      ProjectId = Guid.Empty;
+      ResourceIds = new List<Guid>();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ProjectResourcesValue(this, cloner);
+    }
+
+    public override string ToString() {
+      return $"ProjectId: {ProjectId}, NrOfResources: {ResourceIds.Count}";
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/IListExtensions.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/IListExtensions.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/IListExtensions.cs	(revision 18029)
@@ -0,0 +1,17 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  public static class IListExtensions {
+    public static void Shuffle<T>(this IList<T> list, IRandom random) {
+      int n = list.Count;
+      while (n > 1) {
+        n--;
+        int k = random.Next(n + 1);
+        T value = list[k];
+        list[k] = list[n];
+        list[n] = value;
+      }
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/ListExtensions.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/ListExtensions.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/ListExtensions.cs	(revision 18029)
@@ -0,0 +1,12 @@
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+  public static class ListExtensions {
+    public static void DuplicateLast<T>(this IList<T> l) {
+      l.Add(l[l.Count-1]);
+    }
+    public static T Last<T>(this IList<T> l) {
+      return l[l.Count - 1];
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modelling/AnalysisRunningPredictionQualityProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modelling/AnalysisRunningPredictionQualityProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modelling/AnalysisRunningPredictionQualityProblemModifier.cs	(revision 18029)
@@ -0,0 +1,201 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 License Information
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.Modifiers {
+
+  [StorableType("A0E33EDB-04F6-48B6-BB10-7E3753841AEA")]
+  [Item("AnalysisRunningPredictionQualityProblemModifier", " A problem modifier that provides extended Analysis by creating running models (models trained on the evaluations of previous iterations) and analyzing their performance over time")]
+  public class AnalysisRunningPredictionQualityProblemModifier : ProblemModifier {
+
+    #region Properties
+    [Storable]
+    private ModifiableDataset data;
+
+    [Storable]
+    private Dictionary<string, List<double[]>> evaluationsLookUp;
+
+    [Storable]
+    private List<Tuple<double[], double[]>> evaluatedThisIteration;
+
+    [Storable]
+    private List<Tuple<double[], double[]>> lastPopulation;
+
+    [Storable]
+    private int iteration;
+
+    [Storable]
+    private int trainingLength;
+
+    public const string ModelBuilderParameterName = "ModelBuilder";
+
+    public IValueParameter<IAlgorithm> ModelBuilderParameter => (IValueParameter<IAlgorithm>)Parameters[ModelBuilderParameterName];
+
+    public IAlgorithm ModelBuilder => ModelBuilderParameter.Value;
+
+    #endregion
+    [StorableConstructor]
+    protected AnalysisRunningPredictionQualityProblemModifier(StorableConstructorFlag _) : base(_) { }
+
+    protected AnalysisRunningPredictionQualityProblemModifier(AnalysisRunningPredictionQualityProblemModifier original, Cloner cloner) : base(original, cloner) {
+      data = cloner.Clone(original?.data);
+      evaluationsLookUp = original?.evaluationsLookUp.ToDictionary(e => e.Key, e => e.Value.Select(o => o.ToArray()).ToList());
+      iteration = original?.iteration ?? 0;
+      trainingLength = original?.trainingLength ?? 0;
+      evaluatedThisIteration = original?.evaluatedThisIteration.Select(x => Tuple.Create(x.Item1.ToArray(), x.Item2.ToArray())).ToList();
+      lastPopulation = original?.lastPopulation.Select(x => Tuple.Create(x.Item1.ToArray(), x.Item2.ToArray())).ToList();
+      Parameters.Add(new ValueParameter<IAlgorithm>(ModelBuilderParameterName, "The model builder", new GaussianProcessRegression()));
+    }
+
+    protected AnalysisRunningPredictionQualityProblemModifier() {
+      evaluationsLookUp = new Dictionary<string, List<double[]>>();
+    }
+
+    public override void Initialize() {
+      data = new ModifiableDataset();
+      if (evaluationsLookUp == null) evaluationsLookUp = new Dictionary<string, List<double[]>>();
+      evaluationsLookUp.Clear();
+      iteration = 0;
+      trainingLength = 0;
+      evaluatedThisIteration = new List<Tuple<double[], double[]>>();
+      lastPopulation = new List<Tuple<double[], double[]>>();
+    }
+
+    public override void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      var models = new ResultCollection(qualities.First().Length);
+      for (var i = 0; i < qualities.First().Length; i++) {
+        var pd = new RegressionProblemData(data, data.VariableNames.Where(v => v.Contains("X")), TargetVariableName(i));
+        pd.TrainingPartition.Start = 0;
+        pd.TrainingPartition.End = pd.TestPartition.Start = trainingLength;
+        pd.TestPartition.End = data.Rows;
+        models.AddOrUpdateResult(TargetVariableName(i), BuildRunningModel(pd, random));
+      }
+      results.AddOrUpdateResult("Running Models", models);
+      trainingLength = data.Rows;
+      lastPopulation = individuals.Zip(qualities, (i, q) => Tuple.Create(ExtractInputs(i), q)).ToList();
+      evaluatedThisIteration.Clear();
+      iteration++;
+      base.ModifiedAnalyze(individuals, qualities, results, random);
+    }
+
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var q = base.ModifiedEvaluate(individual, random);
+      lock (data) {
+        ExtendDatasetWithoutDuplicates(new[] { individual }, new[] { q });
+        evaluatedThisIteration.Add(Tuple.Create(ExtractInputs(individual), q.ToArray()));
+      }
+      return q;
+    }
+
+    private IRegressionSolution BuildRunningModel(RegressionProblemData pd, IRandom random) {
+      if (pd.TrainingPartition.Size <= 0) return null;
+      try {
+        ModelBuilder.Problem = new RegressionProblem() { ProblemData = pd };
+        if (ModelBuilder.Parameters.ContainsKey("Seed") && (ModelBuilder.Parameters["Seed"] is IValueParameter<IntValue> seedParam)) seedParam.Value.Value = random.Next();
+        if (ModelBuilder.Parameters.ContainsKey("SetSeedRandomly") && (ModelBuilder.Parameters["SetSeedRandomly"] is IValueParameter<BoolValue> setSeedParam)) setSeedParam.Value.Value = false;
+        ModelBuilder.Start();
+        var res = ModelBuilder.Results.Select(x => x.Value).OfType<IRegressionSolution>().Single();
+        ModelBuilder.Prepare();
+        ModelBuilder.Runs.Clear();
+        return res;
+      } catch (Exception) {
+        return null;
+      }
+    }
+
+
+    #region DataHandling
+    private void ExtendDatasetWithoutDuplicates(IReadOnlyList<Individual> individuals, IReadOnlyList<double[]> qualities) {
+      if (data.Rows == 0) {
+        for (var i = 0; i < ExtractInputs(individuals[0]).Length; i++) {
+          var v = InputVariableName(i);
+          if (!data.DoubleVariables.Contains(v))
+            data.AddVariable(v, new List<double>());
+        }
+        for (var i = 0; i < qualities[0].Length; i++) {
+          var v = TargetVariableName(i);
+          if (!data.DoubleVariables.Contains(v))
+            data.AddVariable(v, new List<double>());
+        }
+      }
+      for (var i = 0; i < individuals.Count; i++) {
+        var ins = ExtractInputs(individuals[i]);
+        var id = ToIdentifier(ins);
+        var outs = qualities[i];
+        if (outs.Any(x => double.IsNaN(x) || double.IsInfinity(x) || double.MaxValue / 100 < x || double.MinValue / 100 > x)) continue;
+        if (evaluationsLookUp.ContainsKey(id) && evaluationsLookUp[id].Any(o => Equals(o, outs))) continue;
+        if (ins.Length + outs.Length != data.DoubleVariables.Count()) throw new ArgumentException("length of individuals and outputs does not match existing data");
+        data.AddRow(ins.Concat(qualities[i]).Select(x => (object)x));
+        if (!evaluationsLookUp.ContainsKey(id)) evaluationsLookUp.Add(id, new List<double[]>() { outs });
+        else { evaluationsLookUp[id].Add(outs); }
+      }
+    }
+
+    private static double[] ExtractInputs(Individual individual) {
+      if (!(individual is SingleEncodingIndividual si)) throw new ArgumentException("Multi encodings are not supported with this problem modifier");
+      switch (si[si.Name]) {
+        case RealVector rv:
+          return rv.CloneAsArray();
+        case IntegerVector iv:
+          return iv.Select(i => (double)i).ToArray();
+        default:
+          throw new ArgumentException("Only Integer and Real Vector Individuals can be transformed to input values");
+      }
+    }
+    #endregion DataHandling
+
+    #region Naming
+    public static string ToIdentifier(IEnumerable<double> inputs) {
+      return string.Join(";", inputs);
+    }
+
+    public static string ToIdentifier(Individual i) {
+      return string.Join(";", ExtractInputs(i));
+    }
+
+    public static string TargetVariableName(int targetNumber) {
+      return "Y" + targetNumber;
+    }
+
+    public static string InputVariableName(int inputNumber) {
+      return "X" + inputNumber;
+    }
+    #endregion Naming
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new AnalysisRunningPredictionQualityProblemModifier(this, cloner);
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ClusteringTranscodingProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ClusteringTranscodingProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ClusteringTranscodingProblemModifier.cs	(revision 18029)
@@ -0,0 +1,155 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("28866F64-5BB4-41A0-95E9-7DF9A7C0B376")]
+  [Item("ClusteringTranscodingProblemModifier", "A problem modifier that groups input parameters into clusters and sets them to equal values. Values assigned to cluster -1 will be fixed to their default values")]
+  public class ClusteringTranscodingProblemModifier : TranscodingProblemModifier {
+    #region ParameterNames
+    private const string DefaultVectorParameterName = "DefaultVector";
+    private const string ClusterAssignmentParameterName = "ClusterAssignment";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<IntegerVector> DefaultVectorParameter => (IValueParameter<IntegerVector>)Parameters[DefaultVectorParameterName];
+    public IValueParameter<IntegerVector> ClusterAssignmentParameter => (IValueParameter<IntegerVector>)Parameters[ClusterAssignmentParameterName];
+    #endregion
+
+    #region ParameterNames
+    public IntegerVector DefaultVector {
+      get => DefaultVectorParameter.Value;
+      set => DefaultVectorParameter.Value = value;
+    }
+    public IntegerVector ClusterAssignment {
+      get => ClusterAssignmentParameter.Value;
+      set => ClusterAssignmentParameter.Value = value;
+    }
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected ClusteringTranscodingProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected ClusteringTranscodingProblemModifier(ClusteringTranscodingProblemModifier original, Cloner cloner) : base(original, cloner) {
+      RegisterEvents();
+    }
+    public ClusteringTranscodingProblemModifier() {
+      Parameters.Add(new ValueParameter<IntegerVector>(DefaultVectorParameterName, "The default values for every dimension of the original encoding", new IntegerVector(2)));
+      Parameters.Add(new ValueParameter<IntegerVector>(ClusterAssignmentParameterName, "The cluster assignments for every dimension of the original encoding", new IntegerVector(2)));
+      RegisterEvents();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { RegisterEvents(); }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ClusteringTranscodingProblemModifier(this, cloner);
+    }
+    #endregion
+
+    #region ParameterEvents
+    private void RegisterEvents() {
+      ClusterAssignmentParameter.ValueChanged -= ClusterAssignmentValueChanged;
+      ClusterAssignmentParameter.ValueChanged += ClusterAssignmentValueChanged;
+      ClusterAssignmentParameter.Value.ToStringChanged -= RedoEncoding;
+      ClusterAssignmentParameter.Value.ToStringChanged += RedoEncoding;
+      DefaultVectorParameter.ValueChanged -= DefaultVectorValueChanged;
+      DefaultVectorParameter.ValueChanged += DefaultVectorValueChanged;
+      DefaultVectorParameter.Value.ToStringChanged -= RedoEncoding;
+      DefaultVectorParameter.Value.ToStringChanged += RedoEncoding;
+    }
+    private void ClusterAssignmentValueChanged(object sender, EventArgs e) {
+      ClusterAssignmentParameter.Value.ToStringChanged -= RedoEncoding;
+      ClusterAssignmentParameter.Value.ToStringChanged += RedoEncoding;
+      RedoEncoding(sender, e);
+    }
+    private void DefaultVectorValueChanged(object sender, EventArgs e) {
+      DefaultVectorParameter.Value.ToStringChanged -= RedoEncoding;
+      DefaultVectorParameter.Value.ToStringChanged += RedoEncoding;
+      RedoEncoding(sender, e);
+    }
+    private void RedoEncoding(object sender, EventArgs e) {
+      InvokeEncodingChanged();
+    }
+    #endregion
+
+    #region TranscodingProblemModifier
+
+    protected override ISolutionCreator ChangeSolutionCreator(ISolutionCreator oldCreator) {
+      if (oldCreator == null || encoding == null) return null;
+
+      var nc = Encoding.Operators.SingleOrDefault(o => o.GetType() == oldCreator.GetType());
+      return (ISolutionCreator)nc ?? throw new ArgumentException($"Could not transcode {oldCreator.GetType()}. Please extend {GetType()} to handle your specific solution creator.");
+
+    }
+
+    protected override IEncoding ChangeEncoding(IEncoding oldEncoding) {
+      if (oldEncoding == null) {
+        return null;
+      }
+      if (!(oldEncoding is IntegerVectorEncoding iEncoding)) throw new ArgumentException("This form of transcoding is only valid for IntegerVectorEncoding");
+      if (iEncoding.Length != ClusterAssignment.Length) throw new ArgumentException("ClusterAssignment and original Encoding need to have equal length");
+      if (iEncoding.Length != DefaultVector.Length) throw new ArgumentException("ClusterAssignment and default Vector need to have equal length");
+      var clusters = ClusterAssignment.Max() + 1;
+      var min = new int[clusters];
+      var max = new int[clusters];
+      var steps = new int[clusters];
+      var b = new bool[clusters];
+      for (var i = 0; i < iEncoding.Length; i++) {
+        var t = ClusterAssignment[i];
+        if (t < 0) continue;
+        var i2 = i % iEncoding.Length;
+        var iMin = iEncoding.Bounds[i2, 0];
+        var iMax = iEncoding.Bounds[i2, 1];
+        var iSteps = iEncoding.Bounds.Columns > 2 ? iEncoding.Bounds[i2, 2] : 1; //check
+        if (!b[t] || min[t] < iMin) min[t] = iMin; //biggest possible minimum
+        if (!b[t] || max[t] > iMax) max[t] = iMax; //smallest possible maximum 
+        if (!b[t]) steps[t] = iSteps;
+        if (steps[t] != iSteps && b[t]) throw new ArgumentException("step sizes for variables within clusters must not differ");
+        b[t] = true;
+      }
+      if (!b.All(x => x)) throw new ArgumentException("At least one cluster is not mapped to any input variable");
+      return new IntegerVectorEncoding(iEncoding.Name, clusters, min, max, steps);
+    }
+    protected override Individual ChangeIndividual(Individual newIndividual) {
+      var intVec = newIndividual.IntegerVector();
+      var enc = newIndividual.GetEncoding<IntegerVectorEncoding>();
+      var individualScope = new Scope();
+      foreach (var v in newIndividual.Values) //intentional shallow copy 
+        individualScope.Variables.Add(new Variable(v.Key, v.Value));
+      var oldIndividual = new SingleEncodingIndividual(enc, individualScope) { [enc.Name] = TransCode(intVec) };
+      return oldIndividual;
+    }
+    #endregion
+
+    #region Helpers
+    private IntegerVector TransCode(IntegerVector newVector) {
+      return new IntegerVector(ClusterAssignment.Select((v, i) => v >= 0 ? newVector[v] : DefaultVector[i]).ToArray());
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationCacheProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationCacheProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationCacheProblemModifier.cs	(revision 18029)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("39EFBF50-DCC3-4E04-B0C1-C0EF1BC70736")]
+  [Item("MultiObjectiveEvaluationCacheProblemModifier", "A problem modifier that caches old evaluations")]
+  public class EvaluationCacheProblemModifier : ProblemModifier {
+    private readonly object locker = new object();
+    [Storable]
+    private Dictionary<string, Tuple<double[], IScope>> cache;
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected EvaluationCacheProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected EvaluationCacheProblemModifier(EvaluationCacheProblemModifier original, Cloner cloner) : base(original, cloner) {
+      cache = original?.cache.ToDictionary(x => x.Key, x => Tuple.Create((double[])x.Value.Item1.Clone(), cloner.Clone(x.Value.Item2)));
+    }
+    public EvaluationCacheProblemModifier() {
+      cache = new Dictionary<string, Tuple<double[], IScope>>();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (cache == null) cache = new Dictionary<string, Tuple<double[], IScope>>();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationCacheProblemModifier(this, cloner);
+    }
+    #endregion
+
+    #region ProblemModifier
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var key = ToKey(individual, Encoding);
+      lock (locker) {
+        if (cache.TryGetValue(key, out var tuple))
+          return tuple.Item1;
+      }
+      var qualities = base.ModifiedEvaluate(individual, random);
+      StoreInCache(key, qualities, individual);
+      return qualities;
+    }
+
+    public override void Initialize() {
+      cache = new Dictionary<string, Tuple<double[], IScope>>();
+    }
+    #endregion
+
+    #region Helpers
+    private void StoreInCache(string key, double[] qualities, Individual individual) {
+      IScope individualScope = new Scope();
+      individualScope.Variables.AddRange(individual.Values.Select(v => new Variable(v.Key, v.Value)));
+      individualScope = (IScope)individualScope.Clone();
+      lock (locker) {
+        if (!cache.ContainsKey(key))
+          cache.Add(key, Tuple.Create(qualities, individualScope));
+      }
+    }
+
+    private static string ToKey(Individual i, IEncoding enc) {
+      switch (enc) {
+        case IntegerVectorEncoding _:
+          return string.Join(";", i.IntegerVector());
+        case RealVectorEncoding _:
+          return string.Join(";", i.RealVector());
+        default:
+          throw new ArgumentException("Encoding not supported");
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationLoggingProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationLoggingProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationLoggingProblemModifier.cs	(revision 18029)
@@ -0,0 +1,117 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.IO;
+using System.Linq;
+using System.Text;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("FADAA1BF-7B7A-4E28-AA15-22AF56D63CFE")]
+  [Item("MultiObjectiveEvaluationLogProblemModifier", "A problem modifier that logs evaluations in a file")]
+  public class EvaluationLoggingProblemModifier : ProblemModifier {
+    private readonly object fileLock = new object();
+    #region ParameterNames
+    private const string LogFileParameterName = "LogFile";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<FileValue> LogFileParameter => (IValueParameter<FileValue>)Parameters[LogFileParameterName];
+    #endregion
+
+    #region ParameterNames
+    public FileValue LogFile => LogFileParameter.Value;
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected EvaluationLoggingProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected EvaluationLoggingProblemModifier(EvaluationLoggingProblemModifier original, Cloner cloner) : base(original, cloner) {
+    }
+    public EvaluationLoggingProblemModifier() {
+      var defaultFileName = $"{Environment.CurrentDirectory}\\Log_{Guid.NewGuid()}.txt";
+      var value = new FileValue();
+      value.StringValue.Value = defaultFileName;
+      Parameters.Add(new ValueParameter<FileValue>(LogFileParameterName, "The log file into which evaluations should be logged.", value));
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationLoggingProblemModifier(this, cloner);
+    }
+    #endregion
+
+    #region ProblemModifier
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var qualities = base.ModifiedEvaluate(individual, random);
+      lock (fileLock) { LogResultsToFile(individual, LogFile.Value, Encoding); }
+      return qualities;
+    }
+    #endregion
+
+    #region Helpers
+    private static void LogResultsToFile(Individual individual, string logFilePath, IEncoding enc) {
+      if (string.IsNullOrEmpty(logFilePath)) throw new ArgumentException("Log path is null or empty");
+      var logFile = new FileInfo(logFilePath);
+      if (!logFile.Exists) {
+        logFile.Directory?.Create();
+        logFile.Create();
+      }
+      var logLines = new List<string>();
+      var sb = new StringBuilder();
+      var inputs = ExtractInputs(individual, enc).ToArray();
+      var additionalInfo = ExtractAdditionalInfo(individual, enc);
+      if (logFile.Length == 0) {
+        var digits = Math.Ceiling(Math.Log10(inputs.Length));
+        var header = Enumerable
+          .Range(0, inputs.Length)
+          .Select(x => string.Format($"X{{0:D{digits}}}", x))
+          .Concat(additionalInfo.Select(x => x.Item1));
+        logLines.Add(string.Join(";", header));
+        sb.Clear();
+      }
+      logLines.Add(string.Join(";", inputs.Concat(additionalInfo.Select(x => x.Item2))));
+      sb.Clear();
+      File.AppendAllLines(logFilePath, logLines);
+    }
+    private static Tuple<string, string>[] ExtractAdditionalInfo(Individual individual, IEncoding enc) {
+      return individual.Values.Where(x => x.Key != enc.Name).OrderBy(x => x.Key).Select(x => Tuple.Create(x.Key, x.Value.ToString())).ToArray();
+    }
+    private static IEnumerable<object> ExtractInputs(Individual individual, IEncoding encoding) {
+      var encodingType = encoding.GetType();
+      if (encodingType == typeof(IntegerVectorEncoding))
+        return individual.IntegerVector().Select(x => (object)x);
+      if (encodingType == typeof(RealVectorEncoding))
+        return individual.RealVector().Select(x => (object)x);
+      throw new ArgumentException("This input encoding is not supported yet");
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationRepetitionProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationRepetitionProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/EvaluationRepetitionProblemModifier.cs	(revision 18029)
@@ -0,0 +1,126 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("7DE16061-1E13-4039-A78F-E33821F41648")]
+  [Item("EvaluationRepetitionProblemModifier", "A problem modifier that repeats the evaluation multiple times and averages the results. If you use the parallelization feature, make sure the underlying problem is thread-safe")]
+  public class EvaluationRepetitionProblemModifier : ProblemModifier {
+    public const string RepetitionIdVariableName = "RepetitionID";
+
+    #region Parameter Names
+    public const string RepetitionsParameterName = "Repetitions";
+    private const string ParallelismParameterName = "Degree of Parallelism";
+    private const string EnforceParameterName = "Enforce Parallelism";
+    #endregion
+
+    #region Parameters
+    public IFixedValueParameter<IntValue> RepetitionsParameter => (IFixedValueParameter<IntValue>)Parameters[RepetitionsParameterName];
+    public IFixedValueParameter<IntValue> ParallelismParameter => (IFixedValueParameter<IntValue>)Parameters[ParallelismParameterName];
+    public IFixedValueParameter<BoolValue> EnforceParameter => (IFixedValueParameter<BoolValue>)Parameters[EnforceParameterName];
+    #endregion
+
+    #region Parameter Properties
+    public int Repetitions {
+      get => RepetitionsParameter.Value.Value;
+      set => RepetitionsParameter.Value.Value = value;
+    }
+    public int Parallelism {
+      get => ParallelismParameter.Value.Value;
+      set => ParallelismParameter.Value.Value = value;
+    }
+    public bool Enforce {
+      get => EnforceParameter.Value.Value;
+      set => EnforceParameter.Value.Value = value;
+    }
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected EvaluationRepetitionProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected EvaluationRepetitionProblemModifier(EvaluationRepetitionProblemModifier original, Cloner cloner) : base(original, cloner) { }
+    public EvaluationRepetitionProblemModifier() {
+      Parameters.Add(new FixedValueParameter<IntValue>(RepetitionsParameterName, "The number of repetitions per evaluation.", new IntValue(10)));
+      Parameters.Add(new FixedValueParameter<IntValue>(ParallelismParameterName, "The degree of parallelism", new IntValue(1)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(EnforceParameterName, "Whether the degree of parallelism is enforced (thread parallel) or just a maximum (C# parallel foreach)", new BoolValue(false)));
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationRepetitionProblemModifier(this, cloner);
+    }
+    #endregion
+
+    #region ProblemModifier
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var iBag = new ConcurrentBag<IResult>();
+      var rBag = new ConcurrentBag<Tuple<string, double[]>>();
+      var options = new ParallelOptions() { MaxDegreeOfParallelism = Parallelism };
+
+      if (!Enforce)
+        Parallel.ForEach(Enumerable.Range(0, Repetitions), options, repetition => {
+          EvaluateRep(repetition, iBag, rBag, individual, random);
+        });
+      else {
+        var threads = new List<Thread>();
+        foreach (var repetition in Enumerable.Range(0, Repetitions)) {
+          var t = new Thread(() => { EvaluateRep(repetition, iBag, rBag, individual, random); });
+          threads.Add(t);
+          t.Start();
+        }
+        foreach (var t in threads) t.Join();
+      }
+
+      individual["SimulationQualities"] = new ResultCollection(iBag.OrderBy(x => x.Name));
+      individual["SimulationResult"] = new ResultCollection(rBag.Select(t => new Result(t.Item1, new DoubleArray(t.Item2))).OrderBy(x => x.Name));
+      return Enumerable.Range(0, Maximization.Length).Select(i => rBag.Select(x => x.Item2[i]).Average()).ToArray();
+    }
+    #endregion
+
+    #region Helpers
+    private void EvaluateRep(int repetition, ConcurrentBag<IResult> iBag, ConcurrentBag<Tuple<string, double[]>> rBag, Individual individual, IRandom random) {
+      var extendedIndividual = individual.Copy();
+      extendedIndividual[RepetitionIdVariableName] = new IntValue(repetition);
+      var qualities = base.ModifiedEvaluate(extendedIndividual, random);
+      iBag.Add(new Result("Repetition " + repetition, ExtractNewVariables(individual, extendedIndividual)));
+      rBag.Add(Tuple.Create("Repetition " + repetition, qualities));
+    }
+
+    private static ResultCollection ExtractNewVariables(Individual oldInd, Individual newInd) {
+      var dict = oldInd.Values.ToDictionary(x => x.Key, x => x.Value);
+      return new ResultCollection(newInd.Values.Where(v1 => !dict.ContainsKey(v1.Key)).Select(v1 => new Result(v1.Key, v1.Value)));
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/InModelSingularEvaluationRemovalStrategy.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/InModelSingularEvaluationRemovalStrategy.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/InModelSingularEvaluationRemovalStrategy.cs	(revision 18029)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("888EE1F9-F142-40F4-B5DC-D541184F8A9D")]
+  [Item("InModelSingularEvaluationRemovalStrategy", "A modifier attached to a problem")]
+  public class InModelSingularEvaluationRemovalStrategy : ModelBasedEvaluationRemoverProblemModifier {
+
+    public const string SurvivalProbabilityParameterName = "SurvivalProbability";
+    public const string ModelBuilderParameterName = "ModelBuilder";
+    public const string InModelComparisonParameterName = "InModelComparison";
+    public IFixedValueParameter<PercentValue> SurvivalProbabilityParameter => (IFixedValueParameter<PercentValue>)Parameters[SurvivalProbabilityParameterName];
+    public IValueParameter<IAlgorithm> ModelBuilderParameter => (IValueParameter<IAlgorithm>)Parameters[ModelBuilderParameterName];
+    public IFixedValueParameter<BoolValue> InModelComparisonParameter => (IFixedValueParameter<BoolValue>)Parameters[InModelComparisonParameterName];
+    public double SurvivalProbability => SurvivalProbabilityParameter.Value.Value;
+    public IAlgorithm ModelBuilder => ModelBuilderParameter.Value;
+    public bool InModelComparison => InModelComparisonParameter.Value.Value;
+
+    [StorableConstructor]
+    protected InModelSingularEvaluationRemovalStrategy(StorableConstructorFlag _) : base(_) { }
+    protected InModelSingularEvaluationRemovalStrategy(InModelSingularEvaluationRemovalStrategy original, Cloner cloner) : base(original, cloner) { }
+
+    public InModelSingularEvaluationRemovalStrategy() : base() {
+      Parameters.Add(new FixedValueParameter<PercentValue>(
+        SurvivalProbabilityParameterName,
+        "Probability of survival despite bad prediction values",
+        new PercentValue(0.05)));
+      Parameters.Add(new ValueParameter<IAlgorithm>(ModelBuilderParameterName, "The model builder", new LinearRegression()));
+      Parameters.Add(new FixedValueParameter<BoolValue>(InModelComparisonParameterName, "Whether the actual qualities (false) or the predicted qualities (values) will be used to determine removal. This is relevant if the model has a strong offset to the actual values", new BoolValue(false)));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InModelSingularEvaluationRemovalStrategy(this, cloner);
+    }
+
+    protected override IRegressionSolution BuildRunningModel(RegressionProblemData pd, IRandom random, int objectiveNumber) {
+      if (pd.TrainingPartition.Size <= 0) return null;
+      try {
+        ModelBuilder.Problem = new RegressionProblem() { ProblemData = pd };
+        if (ModelBuilder.Parameters.ContainsKey("Seed") && (ModelBuilder.Parameters["Seed"] is IValueParameter<IntValue> seedparam)) {
+          seedparam.Value.Value = random.Next();
+          if (ModelBuilder.Parameters.ContainsKey("SetSeedRandomly") && (ModelBuilder.Parameters["SetSeedRandomly"] is IValueParameter<BoolValue> setseedparam)) {
+            setseedparam.Value.Value = false;
+          }
+        }
+        ModelBuilder.Start();
+        var res = ModelBuilder.Results.Select(x => x.Value).OfType<IRegressionSolution>().Single();
+        ModelBuilder.Prepare();
+        ModelBuilder.Runs.Clear();
+        return res;
+      } catch (Exception) {
+        return null;
+      }
+    }
+
+
+    protected override bool RemoveEvaluation(Individual individual, bool[] maximization, IRandom random) {
+      if (random.NextDouble() < SurvivalProbability) return false;
+      if (solutions == null || solutions.Count != maximization.Length || solutions.Any(s => s == null)) return false;
+      var q = solutions.Select(x => x.Model.GetEstimatedValues(ToDataset(ExtractInputs(individual)), new[] { 0 }).Single()).ToArray();
+      return lastPopulation.Any(x => DominationCalculator<double[]>.Dominates(InModelComparison ? x.Item3 : x.Item2, q, maximization, false) == DominationResult.Dominates);
+    }
+
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ModelBasedEvaluationRemoverProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ModelBasedEvaluationRemoverProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ModelBasedEvaluationRemoverProblemModifier.cs	(revision 18029)
@@ -0,0 +1,266 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 License Information
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("867E0908-9DD4-4924-BB31-10B81B006BE4")]
+  [Item("ModelBasedEvaluationRemoverProblemModifier", " A problem modifier that provides extended Analysis by creating running models (models trained on the evaluations of previous iterations) and analyzing their performance over time")]
+  public abstract class ModelBasedEvaluationRemoverProblemModifier : ProblemModifier {
+    private readonly object locker = new object();
+    #region Properties
+    [Storable]
+    protected ModifiableDataset data;
+    [Storable]
+    protected Dictionary<string, List<double[]>> evaluationsLookUp;
+    [Storable]
+    protected List<Tuple<double[], double[]>> evaluatedThisIteration;
+    [Storable]
+    protected List<Tuple<double[], double[], double[]>> lastPopulation;
+    [Storable]
+    protected List<IRegressionSolution> solutions;
+    [Storable]
+    protected ResultCollection modelingResults;
+    [Storable]
+    protected int iteration;
+    #endregion
+
+    #region constructors
+    [StorableConstructor]
+    protected ModelBasedEvaluationRemoverProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected ModelBasedEvaluationRemoverProblemModifier(ModelBasedEvaluationRemoverProblemModifier original, Cloner cloner) : base(original, cloner) {
+      data = cloner.Clone(original?.data);
+      evaluationsLookUp = original?.evaluationsLookUp.ToDictionary(e => e.Key, e => e.Value.Select(o => o.ToArray()).ToList());
+      evaluatedThisIteration = original?.evaluatedThisIteration.Select(x => Tuple.Create(x.Item1.ToArray(), x.Item2.ToArray())).ToList();
+      lastPopulation = original?.lastPopulation.Select(x => Tuple.Create(x.Item1.ToArray(), x.Item2.ToArray(), x.Item3.ToArray())).ToList();
+      solutions = original?.solutions?.Select(cloner.Clone).ToList();
+      iteration = original?.iteration ?? 0;
+      modelingResults = cloner.Clone(original?.modelingResults);
+    }
+    protected ModelBasedEvaluationRemoverProblemModifier() {
+      InitializeDataCollection();
+    }
+    #endregion
+
+    #region ProblemModifier
+    public override void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      lock (locker) {
+        solutions = new List<IRegressionSolution>();
+        for (var i = 0; i < qualities.First().Length; i++) {
+          // model building and prediction
+          var pd = new RegressionProblemData(data, data.VariableNames.Where(v => v.Contains("X")), TargetVariableName(i));
+          pd.TrainingPartition.Start = 0;
+          pd.TrainingPartition.End = pd.TestPartition.Start = data.Rows;
+          pd.TestPartition.End = data.Rows;
+          var sol = BuildRunningModel(pd, random, i);
+          solutions.Add(sol);
+        }
+
+        var survivors = new HashSet<string>(individuals.Select(ToIdentifier));
+        var newSurvivors = evaluatedThisIteration.Where(x => survivors.Contains(ToIdentifier(x.Item1))).ToArray();
+
+        AddOrExtendScatterPlot(modelingResults,
+          "Real Evaluations",
+          "objective 1",
+          "objective 2",
+          "iteration" + iteration,
+          evaluatedThisIteration.Select(x => new Point2D<double>(x.Item2[0], x.Item2[1])).ToArray()
+        );
+        AddOrExtendDataTable(modelingResults, "Removal Plot", new[] {
+          Tuple.Create("Total Removed Evaluations", (double) ((IntValue) modelingResults["Removed Evaluations"].Value).Value, false),
+          Tuple.Create("Total Performed Evaluations", (double) ((IntValue) modelingResults["Performed Evaluations"].Value).Value, false),
+          Tuple.Create("Removed Evaluations", (double) ((IntValue) modelingResults["Removed Evaluations (current generation)"].Value).Value, false),
+          Tuple.Create("Performed Evaluations", (double) ((IntValue) modelingResults["Performed Evaluations (current generation)"].Value).Value, false),
+          Tuple.Create("Survived Performed Evaluations", (double) newSurvivors.Length, false)
+        });
+        modelingResults.AddOrUpdateResult("Removed Evaluations (current generation)", new IntValue(0));
+        modelingResults.AddOrUpdateResult("Performed Evaluations (current generation)", new IntValue(0));
+
+        foreach (var regressionSolution in solutions) {
+          modelingResults.AddOrUpdateResult("model_" + regressionSolution.ProblemData.TargetVariable, regressionSolution);
+        }
+      }
+
+      iteration++;
+      lastPopulation = individuals.Zip(qualities, (i, q) => Tuple.Create(
+        ExtractInputs(i),
+        q,
+        solutions.Select(sol => sol.Model.GetEstimatedValues(ToDataset(ExtractInputs(i)), new[] { 0 }).Single()).ToArray()
+      )).ToList();
+      results.AddOrUpdateResult("ModelingResults", modelingResults);
+      lock (evaluatedThisIteration) evaluatedThisIteration.Clear();
+
+      base.ModifiedAnalyze(individuals, qualities, results, random);
+    }
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      if (RemoveEvaluation(individual, Maximization.CloneAsArray(), random)) {
+        lock (locker) {
+          ((IntValue)modelingResults["Removed Evaluations"].Value).Value++;
+          ((IntValue)modelingResults["Removed Evaluations (current generation)"].Value).Value++;
+        }
+        return Maximization.Select(x => x ? double.MinValue : double.MaxValue).ToArray();
+      }
+
+      var q = base.ModifiedEvaluate(individual, random);
+      lock (locker) {
+        ((IntValue)modelingResults["Performed Evaluations"].Value).Value++;
+        ((IntValue)modelingResults["Performed Evaluations (current generation)"].Value).Value++;
+        ExtendDatasetWithoutDuplicates(new[] { individual }, new[] { q });
+        evaluatedThisIteration.Add(Tuple.Create(ExtractInputs(individual), q.ToArray()));
+      }
+      return q;
+    }
+    #endregion
+
+    protected abstract IRegressionSolution BuildRunningModel(RegressionProblemData pd, IRandom random, int objectiveNumber);
+    protected abstract bool RemoveEvaluation(Individual individual, bool[] maximization, IRandom random);
+
+    #region AnalysisHelpers
+    private static void AddOrExtendScatterPlot(ResultCollection results, string resultName, string xLabel, string yLabel, string rowName, IList<Point2D<double>> points) {
+      ScatterPlot plot;
+      if (results.ContainsKey(resultName)) {
+        plot = (ScatterPlot)results[resultName].Value;
+      } else {
+        plot = new ScatterPlot(resultName, "");
+        results.Add(new Result(resultName, plot));
+        plot.VisualProperties.XAxisTitle = xLabel;
+        plot.VisualProperties.YAxisTitle = yLabel;
+      }
+
+      var row = new ScatterPlotDataRow(rowName, "", points);
+      if (!plot.Rows.ContainsKey(rowName)) plot.Rows.Add(row);
+      else plot.Rows[rowName].Points.AddRange(points);
+    }
+    private static void AddOrExtendDataTable(ResultCollection results, string resultName, IReadOnlyList<Tuple<string, double, bool>> values) {
+      DataTable plot;
+      if (results.ContainsKey(resultName)) {
+        plot = (DataTable)results[resultName].Value;
+      } else {
+        plot = new DataTable(resultName);
+        results.Add(new Result(resultName, plot));
+        plot.VisualProperties.XAxisTitle = "Iteration";
+        plot.VisualProperties.YAxisTitle = "Evaluations";
+      }
+      foreach (var tuple in values) AddOrExtendRow(plot, tuple.Item1, tuple.Item2, tuple.Item3);
+    }
+    private static void AddOrExtendRow(DataTable plot, string rowName, double d, bool secondary = false) {
+      DataRow row;
+      if (plot.Rows.ContainsKey(rowName)) {
+        row = plot.Rows[rowName];
+      } else {
+        row = new DataRow(rowName);
+        plot.Rows.Add(row);
+      }
+      row.Values.Add(d);
+      row.VisualProperties.SecondYAxis = secondary;
+    }
+    #endregion
+
+    #region DataHandling
+    private void InitializeDataCollection() {
+      lock (locker) {
+        evaluatedThisIteration = new List<Tuple<double[], double[]>>();
+        lastPopulation = new List<Tuple<double[], double[], double[]>>();
+        modelingResults = new ResultCollection();
+        iteration = 0;
+        modelingResults.AddOrUpdateResult("Removed Evaluations", new IntValue(0));
+        modelingResults.AddOrUpdateResult("Performed Evaluations", new IntValue(0));
+        modelingResults.AddOrUpdateResult("Removed Evaluations (current generation)", new IntValue(0));
+        modelingResults.AddOrUpdateResult("Performed Evaluations (current generation)", new IntValue(0));
+        data = new ModifiableDataset();
+        if (evaluationsLookUp == null) evaluationsLookUp = new Dictionary<string, List<double[]>>();
+        evaluationsLookUp.Clear();
+      }
+    }
+    private void ExtendDatasetWithoutDuplicates(IReadOnlyList<Individual> individuals, IReadOnlyList<double[]> qualities) {
+      if (data.Rows == 0) {
+        for (var i = 0; i < ExtractInputs(individuals[0]).Length; i++) {
+          var v = InputVariableName(i);
+          if (!data.DoubleVariables.Contains(v))
+            data.AddVariable(v, new List<double>());
+        }
+        for (var i = 0; i < qualities[0].Length; i++) {
+          var v = TargetVariableName(i);
+          if (!data.DoubleVariables.Contains(v))
+            data.AddVariable(v, new List<double>());
+        }
+      }
+      for (var i = 0; i < individuals.Count; i++) {
+        var ins = ExtractInputs(individuals[i]);
+        var id = ToIdentifier(ins);
+        var outs = qualities[i];
+        if (outs.Any(x => double.IsNaN(x) || double.IsInfinity(x) || double.MaxValue / 100 < x || double.MinValue / 100 > x || x > 100000)) continue;
+        if (evaluationsLookUp.ContainsKey(id) && evaluationsLookUp[id].Any(o => Equals(o, outs))) continue;
+
+        if (ins.Length + outs.Length != data.DoubleVariables.Count()) throw new ArgumentException("length of individuals and outputs does not match existing data");
+        data.AddRow(ins.Concat(qualities[i]).Select(x => (object)x));
+        if (!evaluationsLookUp.ContainsKey(id)) evaluationsLookUp.Add(id, new List<double[]>() { outs });
+        else { evaluationsLookUp[id].Add(outs); }
+      }
+    }
+    protected static Dataset ToDataset(double[] ins) {
+      return new Dataset(ins.Select((d, i1) => InputVariableName(i1)), ins.Select(d => new List<double>() { d }));
+    }
+    protected static double[] ExtractInputs(Individual individual) {
+      if (!(individual is SingleEncodingIndividual si)) throw new ArgumentException("Multi encodings are not supported with this problem modifier");
+      var e = si[si.Name];
+      switch (e) {
+        case RealVector rv:
+          return rv.CloneAsArray();
+
+        case IntegerVector iv:
+          return iv.Select(i => (double)i).ToArray();
+
+        default:
+          throw new ArgumentException("Only Integer and Real Vector Individuals can be transformed to input values");
+      }
+    }
+    #endregion DataHandling
+
+    #region Naming
+    public static string ToIdentifier(double[] inputs) {
+      return string.Join(";", inputs);
+    }
+    public static string ToIdentifier(Individual i) {
+      return string.Join(";", ExtractInputs(i));
+    }
+    public static string TargetVariableName(int targetNumber) {
+      return "Y" + targetNumber;
+    }
+    public static string InputVariableName(int inputNumber) {
+      return "X" + inputNumber;
+    }
+    #endregion Naming
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiModelEvaluationRemovalStrategy.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiModelEvaluationRemovalStrategy.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiModelEvaluationRemovalStrategy.cs	(revision 18029)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Algorithms.DataAnalysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("DD354BFC-0384-4A26-AE3B-C1195111385A")]
+  [Item("MultiModelEvaluationRemovalStrategy", "A modifier attached to a problem")]
+  public class MultiModelEvaluationRemovalStrategy : ModelBasedEvaluationRemoverProblemModifier {
+    #region ParameterNames
+    public const string SurvivalProbabilityParameterName = "SurvivalProbability";
+    public const string ModelBuilderParameterName = "ModelBuilder";
+    public const string InModelComparisonParameterName = "InModelComparison";
+    #endregion
+
+    #region Parameters
+    public IFixedValueParameter<PercentValue> SurvivalProbabilityParameter => (IFixedValueParameter<PercentValue>)Parameters[SurvivalProbabilityParameterName];
+    public IValueParameter<ItemList<IAlgorithm>> ModelBuilderParameter => (IValueParameter<ItemList<IAlgorithm>>)Parameters[ModelBuilderParameterName];
+    public IFixedValueParameter<BoolValue> InModelComparisonParameter => (IFixedValueParameter<BoolValue>)Parameters[InModelComparisonParameterName];
+    #endregion
+
+    #region ParameterProperties
+    public double SurvivalProbability => SurvivalProbabilityParameter.Value.Value;
+    public IAlgorithm[] ModelBuilder => ModelBuilderParameter.Value.ToArray();
+    public bool InModelComparison => InModelComparisonParameter.Value.Value;
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected MultiModelEvaluationRemovalStrategy(StorableConstructorFlag _) : base(_) { }
+    protected MultiModelEvaluationRemovalStrategy(MultiModelEvaluationRemovalStrategy original, Cloner cloner) : base(original, cloner) { }
+    public MultiModelEvaluationRemovalStrategy() {
+      Parameters.Add(new FixedValueParameter<PercentValue>(
+        SurvivalProbabilityParameterName,
+        "Probability of survival despite bad prediction values",
+        new PercentValue(0.05)));
+      Parameters.Add(new ValueParameter<ItemList<IAlgorithm>>(ModelBuilderParameterName, "The model builder", new ItemList<IAlgorithm>(new IAlgorithm[] { new LinearRegression(), new RandomForestRegression() })));
+      Parameters.Add(new FixedValueParameter<BoolValue>(InModelComparisonParameterName, "Whether the actual qualities (false) or the predicted qualities (values) will be used to determine removal. This is relevant if the model has a strong offset to the actual values", new BoolValue(false)));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiModelEvaluationRemovalStrategy(this, cloner);
+    }
+    #endregion
+
+    #region ModelBasedEvaluationRemoverProblemModifier
+    protected override IRegressionSolution BuildRunningModel(RegressionProblemData pd, IRandom random, int objectiveNumber) {
+      if (pd.TrainingPartition.Size <= 0) return null;
+      try {
+        var m = ModelBuilder[objectiveNumber % ModelBuilder.Length];
+        m.Problem = new RegressionProblem() { ProblemData = pd };
+        if (m.Parameters.ContainsKey("Seed") && m.Parameters["Seed"] is IValueParameter<IntValue> seedParameter) {
+          seedParameter.Value.Value = random.Next();
+          if (m.Parameters.ContainsKey("SetSeedRandomly") &&
+              (m.Parameters["SetSeedRandomly"] is IValueParameter<BoolValue> setSeedRandomly)) {
+            setSeedRandomly.Value.Value = false;
+          }
+        }
+        m.Start();
+        var res = m.Results.Select(x => x.Value).OfType<IRegressionSolution>().Single();
+        m.Prepare();
+        m.Runs.Clear();
+        return res;
+      } catch (Exception) {
+        return null;
+      }
+    }
+    protected override bool RemoveEvaluation(Individual individual, bool[] maximization, IRandom random) {
+      if (random.NextDouble() < SurvivalProbability) return false;
+      if (solutions == null || solutions.Count != maximization.Length || solutions.Any(s => s == null)) return false;
+      var q = solutions.Select(x => x.Model.GetEstimatedValues(ToDataset(ExtractInputs(individual)), new[] { 0 }).Single()).ToArray();
+      return lastPopulation.Any(x => DominationCalculator<double[]>.Dominates(InModelComparison ? x.Item3 : x.Item2, q, maximization, false) == DominationResult.Dominates);
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiObjectiveEndPointProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiObjectiveEndPointProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/MultiObjectiveEndPointProblemModifier.cs	(revision 18029)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("D5B5D05B-FBF5-434F-AB25-E382D83FAA0B")]
+  [Item("MultiObjectiveEndPointProblemModifier", "A dummy problem modifier leading to a multi-objective basic problem")]
+  public class MultiObjectiveEndPointProblemModifier<T> : ProblemModifier where T : class, IEncoding {
+
+    private MultiObjectiveBasicProblem<T> problem;
+    [Storable]
+    public MultiObjectiveBasicProblem<T> Problem {
+      get => problem;
+      set {
+        if (problem == value) return;
+        if (problem != null) {
+          problem.SolutionCreatorChanged -= OnUpdateRequired;
+          if (problem.Encoding?.Parameters != null) {
+            foreach (var encodingParameter in problem.Encoding.Parameters.OfType<IValueParameter>())
+              encodingParameter.ValueChanged -= OnParameterValueChanged;
+          }
+        }
+        problem = value;
+        UpdateState();
+        try { //this is to catch inconsistent states during deserialization
+          var enc = problem.Encoding.Parameters;
+        } catch (NullReferenceException) {
+          return;
+        }
+        problem.SolutionCreatorChanged += OnUpdateRequired;
+        if (problem.Encoding?.Parameters == null) return;
+        foreach (var encodingParameter in problem.Encoding.Parameters.OfType<IValueParameter>())
+          encodingParameter.ValueChanged += OnParameterValueChanged;
+      }
+    }
+
+    private void OnUpdateRequired(object o, EventArgs e) {
+      UpdateState();
+    }
+    private void OnParameterValueChanged(object o, EventArgs e) {
+      UpdateState();
+      ((IValueParameter)o).Value.ToStringChanged += OnUpdateRequired;
+    }
+
+    public override IEncoding Encoding => Problem?.Encoding;
+    public override BoolArray Maximization {
+      get {
+        if (Problem == null) return new BoolArray(new[] { false, false });
+        var dict = new Dictionary<string, IItem>();
+        Problem.CollectParameterValues(dict);
+        return dict.ContainsKey("Maximization") ? (BoolArray)dict["Maximization"] : new BoolArray(problem.Maximization);
+      }
+    }
+
+    #region constructors and cloning
+    public override ISolutionCreator SolutionCreator => Problem?.SolutionCreator;
+
+    [StorableConstructor]
+    protected MultiObjectiveEndPointProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected MultiObjectiveEndPointProblemModifier(MultiObjectiveEndPointProblemModifier<T> original, Cloner cloner) : base(original, cloner) {
+      Problem = cloner.Clone(original?.Problem);
+    }
+    public MultiObjectiveEndPointProblemModifier() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveEndPointProblemModifier<T>(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (problem == null) return;
+      problem.SolutionCreatorChanged += OnUpdateRequired;
+      if (problem.Encoding?.Parameters == null) return;
+      foreach (var encodingParameter in problem.Encoding.Parameters.OfType<IValueParameter>())
+        encodingParameter.ValueChanged += OnParameterValueChanged;
+    }
+    #endregion
+
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      return Problem.Evaluate(individual, random);
+    }
+
+    public override void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      Problem.Analyze(individuals, qualities, results, random);
+    }
+
+    public void UpdateState() {
+      InvokeEncodingChanged();
+      InvokeMaximizationChanged();
+      InvokeSolutionCreatorChanged();
+    }
+
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/ProblemModifier.cs	(revision 18029)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("03EC0CED-F927-4CCF-8262-716AECE267BE")]
+  [Item("MultiObjectiveProblemModifier", "A modifier attached to a problem")]
+  public abstract class ProblemModifier : ParameterizedNamedItem {
+
+    [Storable] private ProblemModifier nextModifier;
+    public virtual IEncoding Encoding => NextModifier?.Encoding;
+    public virtual BoolArray Maximization => NextModifier?.Maximization;
+    public virtual ISolutionCreator SolutionCreator => NextModifier?.SolutionCreator;
+    public ProblemModifier NextModifier {
+      get => nextModifier;
+      set
+      {
+        if (nextModifier == value) return;
+        ResetListeners(nextModifier, value);
+        nextModifier = value;
+        InvokeEncodingChanged();
+        InvokeMaximizationChanged();
+      }
+    }
+
+    #region Constructors
+    [StorableConstructor]
+    protected ProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected ProblemModifier(ProblemModifier original, Cloner cloner) : base(original, cloner) {
+      nextModifier = cloner.Clone(original.NextModifier);
+    }
+    protected ProblemModifier() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ResetListeners(nextModifier, nextModifier);
+    }
+    #endregion
+
+    public virtual void Initialize() { }
+
+    public virtual double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      return nextModifier.ModifiedEvaluate(individual, random);
+    }
+
+    public virtual void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      nextModifier.ModifiedAnalyze(individuals, qualities, results, random);
+    }
+
+    #region updateEvents
+    public event EventHandler EncodingChanged;
+    public event EventHandler MaximizationChanged;
+    public event EventHandler SolutionCreatorChanged;
+    protected void InvokeEncodingChanged() {
+      EncodingChanged?.Invoke(this, EventArgs.Empty);
+    }
+    protected void InvokeMaximizationChanged() {
+      MaximizationChanged?.Invoke(this, EventArgs.Empty);
+    }
+    protected void InvokeSolutionCreatorChanged() {
+      SolutionCreatorChanged?.Invoke(this, EventArgs.Empty);
+    }
+    protected virtual void OnNextMaximizationChanged(object sender, EventArgs e) {
+      InvokeMaximizationChanged();
+    }
+    protected virtual void OnNextEncodingChanged(object sender, EventArgs e) {
+      InvokeEncodingChanged();
+    }
+    protected virtual void OnNextSolutionCreatorChanged(object sender, EventArgs e) {
+      InvokeSolutionCreatorChanged();
+    }
+    #endregion
+
+    #region helpers
+    protected virtual void ResetListeners(ProblemModifier oldNext, ProblemModifier newNext) {
+      if (oldNext != null) {
+        oldNext.EncodingChanged -= OnNextEncodingChanged;
+        oldNext.MaximizationChanged -= OnNextMaximizationChanged;
+        oldNext.SolutionCreatorChanged -= OnNextSolutionCreatorChanged;
+      }
+      if (newNext == null) return;
+      newNext.EncodingChanged += OnNextEncodingChanged;
+      newNext.MaximizationChanged += OnNextMaximizationChanged;
+      newNext.SolutionCreatorChanged += OnNextSolutionCreatorChanged;
+    }
+    #endregion
+
+
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/SingleObjectiveEndPointProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/SingleObjectiveEndPointProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/SingleObjectiveEndPointProblemModifier.cs	(revision 18029)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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.Collections.Generic;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("7C9DECC0-1CA1-4198-835F-CB1CF35D88E8")]
+  [Item("SingleObjectiveEndPointProblemModifier", "A dummy problem modifier leading to a single objective basic problem")]
+  public class SingleObjectiveEndPointProblemModifier<T> : ProblemModifier where T : class, IEncoding {
+    private SingleObjectiveBasicProblem<T> problem;
+    [Storable]
+    public SingleObjectiveBasicProblem<T> Problem {
+      get => problem;
+      set {
+        problem = value;
+        UpdateState();
+        //TODO attach to EncodingChanged and MaximizationChanged Events ... (not implemented in BasicProblem yet)
+      }
+    }
+
+    public override IEncoding Encoding => Problem?.Encoding;
+    public override BoolArray Maximization {
+      get {
+        if (Problem == null) return new BoolArray(new[] { false });
+        var dict = new Dictionary<string, IItem>();
+        Problem.CollectParameterValues(dict);
+        var b = dict.ContainsKey("Maximization") ? ((BoolValue)dict["Maximization"]).Value : problem.Maximization;
+        return new BoolArray(new[] { b });
+      }
+    }
+
+    [StorableConstructor]
+    protected SingleObjectiveEndPointProblemModifier(StorableConstructorFlag _) : base(_) { }
+    protected SingleObjectiveEndPointProblemModifier(SingleObjectiveEndPointProblemModifier<T> original, Cloner cloner) : base(original, cloner) {
+      Problem = cloner.Clone(original?.Problem);
+    }
+    public SingleObjectiveEndPointProblemModifier() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveEndPointProblemModifier<T>(this, cloner);
+    }
+
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      return new[] { Problem.Evaluate(individual, random) };
+    }
+
+    public override void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      Problem.Analyze(individuals, qualities.Select(x => x.Single()).ToArray(), results, random);
+    }
+
+    public void UpdateState() {
+      InvokeEncodingChanged();
+      InvokeMaximizationChanged();
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/TranscodingProblemModifier.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/TranscodingProblemModifier.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Modifier/TranscodingProblemModifier.cs	(revision 18029)
@@ -0,0 +1,90 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("AD8A9A90-109A-4496-A057-A94728F2C7E2")]
+  [Item("TranscodingProblemModifier", "A problem modifier that converts the solution candidate for evaluation and Analysis between a new (alg sided) and an original (problem sided) encoding")]
+  public abstract class TranscodingProblemModifier : ProblemModifier {
+    [Storable] protected IEncoding encoding;
+    [Storable] protected ISolutionCreator solutionCreator;
+
+    public override IEncoding Encoding => encoding ?? NextModifier?.Encoding;
+    public override ISolutionCreator SolutionCreator => solutionCreator ?? NextModifier?.SolutionCreator;
+
+    #region constructors
+    [StorableConstructor]
+    protected TranscodingProblemModifier(StorableConstructorFlag _) : base(_) { }
+
+    protected TranscodingProblemModifier(TranscodingProblemModifier original, Cloner cloner) : base(original, cloner) {
+      encoding = cloner.Clone(original.encoding);
+    }
+    public TranscodingProblemModifier() { }
+    #endregion
+
+    #region ProblemModifier
+    public override double[] ModifiedEvaluate(Individual individual, IRandom random) {
+      var oldIndividual = ChangeIndividual(individual);
+      var res = base.ModifiedEvaluate(oldIndividual, random);
+      CopyIntoIndividual(oldIndividual, individual);
+      return res;
+    }
+    public override void ModifiedAnalyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      var oldIndividuals = individuals.Select(ChangeIndividual).ToArray();
+      base.ModifiedAnalyze(oldIndividuals, qualities, results, random);
+      for (var i = 0; i < oldIndividuals.Length; i++)
+        CopyIntoIndividual(oldIndividuals[i], individuals[i]);
+    }
+
+    protected override void OnNextEncodingChanged(object sender, EventArgs e) {
+      encoding = ChangeEncoding(NextModifier.Encoding);
+      solutionCreator = ChangeSolutionCreator(NextModifier.SolutionCreator);
+      InvokeEncodingChanged();
+      InvokeSolutionCreatorChanged();
+    }
+
+    protected override void OnNextSolutionCreatorChanged(object sender, EventArgs e) {
+      solutionCreator = ChangeSolutionCreator(NextModifier.SolutionCreator);
+      InvokeSolutionCreatorChanged();
+    }
+
+    #endregion
+
+    #region helpers
+    //ChangeSolutionCreator
+    protected abstract ISolutionCreator ChangeSolutionCreator(ISolutionCreator oldCreator);
+    protected abstract IEncoding ChangeEncoding(IEncoding oldEncoding); //changes upwards (original enc to new enc)
+    protected abstract Individual ChangeIndividual(Individual newIndividual); //changes downwards (individual with new enc to individual with original enc) 
+    private static void CopyIntoIndividual(Individual oldIndividual, Individual newIndividual) { //moves additional information after evaluation or analysis to the new (alg-sided) individual
+      var set = new HashSet<string>();
+      foreach (var v in newIndividual.Values.Select(x => x.Key)) set.Add(v);
+      foreach (var v in oldIndividual.Values.Where(v1 => !set.Contains(v1.Key))) newIndividual[v.Key] = v.Value;
+    }
+    #endregion
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/MultiObjectiveModifiedProblem.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/MultiObjectiveModifiedProblem.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/MultiObjectiveModifiedProblem.cs	(revision 18029)
@@ -0,0 +1,174 @@
+﻿using System;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("903EE850-62D5-4F3E-8F0D-8D9D5415A5F1")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 90)]
+  [Item("MultiObjectiveModifiedProblem", "A wrapper problem for multi-objective problems that should be evaluated using Hive.")]
+  public class MultiObjectiveModifiedProblem : MultiObjectiveBasicProblem<IEncoding>, IStatefulItem {
+    private readonly MultiObjectiveEndPointProblemModifier<IEncoding> endPoint = new MultiObjectiveEndPointProblemModifier<IEncoding>();
+    private ProblemModifier activeStart; //this is to avoid attaching to multiple modifiers
+    public override bool[] Maximization => Parameters.ContainsKey("Maximization") ? MaximizationParameter.Value.CloneAsArray() : new[] { false, false };
+
+    #region Parameter Names
+    private const string ProblemParameterName = "Problem";
+    private const string ModifierParameterName = "Modifiers";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<MultiObjectiveBasicProblem<IEncoding>> ProblemParameter => (IValueParameter<MultiObjectiveBasicProblem<IEncoding>>)Parameters[ProblemParameterName];
+
+    public IFixedValueParameter<CheckedItemList<ProblemModifier>> ModifierParameter => (IFixedValueParameter<CheckedItemList<ProblemModifier>>)Parameters[ModifierParameterName];
+
+    public IValueParameter<BoolArray> MaximizationParameter => ((IValueParameter<BoolArray>)Parameters["Maximization"]);
+    #endregion
+
+    #region Parameter Properties
+    public MultiObjectiveBasicProblem<IEncoding> Problem {
+      get => ProblemParameter.Value;
+      set => ProblemParameter.Value = value;
+    }
+
+    public CheckedItemList<ProblemModifier> Modifiers => ModifierParameter.Value;
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected MultiObjectiveModifiedProblem(StorableConstructorFlag _) : base(_) { }
+    protected MultiObjectiveModifiedProblem(MultiObjectiveModifiedProblem original, Cloner cloner) : base(original, cloner) {
+      Initialize();
+    }
+    public MultiObjectiveModifiedProblem() {
+      var defaultModifiers = new CheckedItemList<ProblemModifier> {
+        { new EvaluationCacheProblemModifier(), false },
+        { new EvaluationRepetitionProblemModifier(), false },
+        { new EvaluationLoggingProblemModifier(), false }
+      };
+      Parameters.Add(new ValueParameter<MultiObjectiveBasicProblem<IEncoding>>(ProblemParameterName, "The actual problem that should be used to evaluate individuals."));
+      Parameters.Add(new FixedValueParameter<CheckedItemList<ProblemModifier>>(ModifierParameterName, "The modifiers applied to the problem (order can be important)", defaultModifiers));
+      EncodingParameter.Hidden = true;
+      MaximizationParameter.Hidden = true;
+      SolutionCreatorParameter.Hidden = true;
+      EvaluatorParameter.Hidden = true;
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveModifiedProblem(this, cloner);
+    }
+    #endregion
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      if (Encoding == null) Encoding = new IntegerVectorEncoding("null-encoding");
+      Initialize();
+    }
+
+    private void Initialize() {
+      if (Problem != null) {
+        Problem.OperatorsChanged -= Problem_OperatorsChanged;
+        Problem.OperatorsChanged += Problem_OperatorsChanged;
+      }
+      ProblemParameter.ValueChanged -= ProblemParameter_ValueChanged;
+      ProblemParameter.ValueChanged += ProblemParameter_ValueChanged;
+      Modifiers.CheckedItemsChanged -= ActiveModifiersChanged;
+      Modifiers.CheckedItemsChanged += ActiveModifiersChanged;
+      Modifiers.ItemsMoved -= ActiveModifiersChanged; //This my fire unnecessarily but CheckedItemsChanged does not account for order ...
+      Modifiers.ItemsMoved += ActiveModifiersChanged;
+      Modifiers.ItemsAdded -= ActiveModifiersChanged;
+      Modifiers.ItemsAdded += ActiveModifiersChanged;
+      Modifiers.ItemsRemoved -= ActiveModifiersChanged;
+      Modifiers.ItemsRemoved += ActiveModifiersChanged;
+      Modifiers.ItemsReplaced -= ActiveModifiersChanged;
+      Modifiers.ItemsReplaced += ActiveModifiersChanged;
+      UpdateModifiers();
+    }
+
+    public override double[] Evaluate(Individual individual, IRandom random) {
+      return activeStart.ModifiedEvaluate(individual, random);
+    }
+
+    public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      activeStart.ModifiedAnalyze(individuals, qualities, results, random);
+    }
+
+    private bool updating;
+    private void UpdateModifiers() {
+      if (Problem == null || updating) return;
+      updating = true;
+      var am = Modifiers.CheckedItems.Select(x => x.Value).ToArray();
+
+      //unwire modifiers to prevent cycles while setting and superfluous listeners
+      foreach (var problemModifier in Modifiers) problemModifier.NextModifier = null;
+      //wire modifiers
+      for (var i = 0; i < am.Length - 1; i++) am[i].NextModifier = am[i + 1];
+      if (am.Length != 0) am[am.Length - 1].NextModifier = endPoint;
+      endPoint.Problem = Problem;
+
+      //listen to activeStart changes
+      if (activeStart != null) {
+        activeStart.EncodingChanged -= StartEncodingChanged;
+        activeStart.MaximizationChanged -= StartMaximizationChanged;
+        activeStart.SolutionCreatorChanged -= StartSolutionCreatorChanged;
+      }
+      activeStart = am.Length == 0 ? endPoint : am[0];
+      activeStart.EncodingChanged += StartEncodingChanged;
+      activeStart.MaximizationChanged += StartMaximizationChanged;
+      activeStart.SolutionCreatorChanged += StartSolutionCreatorChanged;
+
+      foreach (var m in Modifiers) m.Initialize();
+
+      updating = false;
+      if (Encoding == activeStart.Encoding || activeStart.Encoding == null) return;
+      Encoding = activeStart.Encoding;
+    }
+
+    private void StartMaximizationChanged(object sender, EventArgs e) {
+      if (activeStart.Maximization == null) return;
+      MaximizationParameter.Value = (BoolArray)activeStart.Maximization.AsReadOnly();
+    }
+
+    private void StartEncodingChanged(object sender, EventArgs e) {
+      if (Encoding == activeStart.Encoding || activeStart.Encoding == null) return;
+      Encoding = activeStart.Encoding;
+    }
+
+    private void StartSolutionCreatorChanged(object sender, EventArgs e) {
+      if (SolutionCreator == activeStart.SolutionCreator || activeStart.SolutionCreator == null) return;
+      SolutionCreator = activeStart.SolutionCreator;
+    }
+
+    private void ActiveModifiersChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<ProblemModifier>> e) {
+      UpdateModifiers();
+    }
+
+    private void ProblemParameter_ValueChanged(object sender, EventArgs e) {
+      if (Problem != null) {
+        Problem.OperatorsChanged -= Problem_OperatorsChanged;
+        Problem.OperatorsChanged += Problem_OperatorsChanged;
+      }
+      endPoint.Problem = Problem;
+      UpdateModifiers();
+    }
+
+    private void Problem_OperatorsChanged(object sender, EventArgs e) {
+      UpdateModifiers();
+    }
+
+    void IStatefulItem.InitializeState() {
+      UpdateModifiers();
+    }
+
+    void IStatefulItem.ClearState() {
+      UpdateModifiers();
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Plugin.cs.frame
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Plugin.cs.frame	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Plugin.cs.frame	(revision 18029)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Modifiers {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Problems.Modifiers plugin
+  /// </summary>
+  [Plugin("HeuristicLab.Problems.Modifiers", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Modifiers-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.ALGLIB", "3.7")]
+  [PluginDependency("HeuristicLab.Attic", "1.0")]
+  [PluginDependency("HeuristicLab.Algorithms.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive", "3.3")]
+  [PluginDependency("HeuristicLab.Clients.Hive.JobManager", "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.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "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.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")] 
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")] 
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  [PluginDependency("HeuristicLab.Selection", "3.3")]
+  public class HeuristicLabProblemsModifiersPlugin : PluginBase { }
+}
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Properties/AssemblyInfo.cs.frame	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/Properties/AssemblyInfo.cs.frame	(revision 18029)
@@ -0,0 +1,37 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+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.Analysis.FitnessLandscape")]
+[assembly: AssemblyDescription("HeuristicLab algorithm analysis for fitness landscape properties")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2010 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("34e1ec7e-0124-4f76-b8f8-42b9244d2b09")]
+
+// 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 Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.3000")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
+
Index: /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/SingleObjectiveModifiedProblem.cs
===================================================================
--- /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/SingleObjectiveModifiedProblem.cs	(revision 18029)
+++ /branches/3133_ProblemModifiers/HeuristicLab.Problems.Modifiers/SingleObjectiveModifiedProblem.cs	(revision 18029)
@@ -0,0 +1,150 @@
+﻿using System;
+using System.Linq;
+using HEAL.Attic;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+
+namespace HeuristicLab.Problems.Modifiers {
+  [StorableType("4C46E221-E7E6-41B4-8CFB-35920CDCE6E8")]
+  [Creatable(CreatableAttribute.Categories.Problems, Priority = 90)]
+  [Item("SingleObjectiveModifiedProblem", "A wrapper problem for single-objective problems that should be evaluated using Hive.")]
+  public class SingleObjectiveModifiedProblem : SingleObjectiveBasicProblem<IEncoding>, IStatefulItem {
+
+    private readonly SingleObjectiveEndPointProblemModifier<IEncoding> endPoint = new SingleObjectiveEndPointProblemModifier<IEncoding>();
+    private ProblemModifier activeStart; //this is to avoid attaching to multiple modifiers
+    public override bool Maximization => false; // this is a fixed and readonly parameter in BasicProblem, we cannot change it dynamically (after the constructor).
+
+    #region Parameter Names
+    private const string ProblemParameterName = "Problem";
+    private const string ModifierParameterName = "Modifiers";
+    #endregion
+
+    #region Parameters
+    public IValueParameter<SingleObjectiveBasicProblem<IEncoding>> ProblemParameter => (IValueParameter<SingleObjectiveBasicProblem<IEncoding>>)Parameters[ProblemParameterName];
+
+    public IFixedValueParameter<CheckedItemList<ProblemModifier>> ModifierParameter => (IFixedValueParameter<CheckedItemList<ProblemModifier>>)Parameters[ModifierParameterName];
+    #endregion
+
+    #region Parameter Properties
+    public SingleObjectiveBasicProblem<IEncoding> Problem {
+      get => ProblemParameter.Value;
+      set => ProblemParameter.Value = value;
+    }
+
+    public CheckedItemList<ProblemModifier> Modifiers => ModifierParameter.Value;
+
+    #endregion
+
+    #region Constructors & Cloning
+    [StorableConstructor]
+    protected SingleObjectiveModifiedProblem(StorableConstructorFlag _) : base(_) { }
+    protected SingleObjectiveModifiedProblem(SingleObjectiveModifiedProblem original, Cloner cloner) : base(original, cloner) {
+      Initialize();
+    }
+    public SingleObjectiveModifiedProblem() {
+      var defaultModifiers = new CheckedItemList<ProblemModifier> {
+        {new EvaluationCacheProblemModifier(), false},
+        {new EvaluationRepetitionProblemModifier(), false},
+        {new EvaluationLoggingProblemModifier(), false}
+      };
+      Parameters.Add(new ValueParameter<SingleObjectiveBasicProblem<IEncoding>>(ProblemParameterName, "The actual problem that should used to evaluate individuals."));
+      Parameters.Add(new FixedValueParameter<CheckedItemList<ProblemModifier>>(ModifierParameterName, "The modifiers applied to the problem (order can be important)", defaultModifiers));
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveModifiedProblem(this, cloner);
+    }
+    #endregion
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
+    private void Initialize() {
+      if (Problem != null) {
+        Problem.OperatorsChanged -= Problem_OperatorsChanged;
+        Problem.OperatorsChanged += Problem_OperatorsChanged;
+      }
+      ProblemParameter.ValueChanged -= ProblemParameter_ValueChanged;
+      ProblemParameter.ValueChanged += ProblemParameter_ValueChanged;
+      Modifiers.CheckedItemsChanged -= ActiveModifiersChanged;
+      Modifiers.CheckedItemsChanged += ActiveModifiersChanged;
+      Modifiers.ItemsMoved -= ActiveModifiersChanged; //This my fire unnecessarily but CheckedItemsChanged does not account for order ...
+      Modifiers.ItemsMoved += ActiveModifiersChanged;
+      UpdateModifiers();
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      // this must be a minimization problem. If the wrapped problem is a maximization problem then just return the negative quality.
+      var wrappedQuality = activeStart.ModifiedEvaluate(individual, random)[0];
+      return Problem.Maximization ? -wrappedQuality : wrappedQuality;
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      activeStart.ModifiedAnalyze(individuals, qualities.Select(x => new[] { x }).ToArray(), results, random);
+    }
+
+    private bool updating;
+    private void UpdateModifiers() {
+      if (Problem == null || updating) return;
+      updating = true;
+      var am = Modifiers.CheckedItems.Select(x => x.Value).ToArray();
+
+      //unwire modifiers to prevent cycles while setting and superfluous listeners
+      foreach (var problemModifier in Modifiers) problemModifier.NextModifier = null;
+      //wire modifiers
+      for (var i = 0; i < am.Length - 1; i++) am[i].NextModifier = am[i + 1];
+      if (am.Length != 0) am[am.Length - 1].NextModifier = endPoint;
+      endPoint.Problem = Problem;
+
+      //listen to activeStart changes
+      if (activeStart != null) {
+        activeStart.EncodingChanged -= StartEncodingChanged;
+      }
+      activeStart = am.Length == 0 ? endPoint : am[0];
+      activeStart.EncodingChanged += StartEncodingChanged;
+
+      foreach (var m in Modifiers) m.Initialize();
+
+      updating = false;
+      if (Encoding == activeStart.Encoding || activeStart.Encoding == null) return;
+      Encoding = activeStart.Encoding;
+    }
+
+
+    private void StartEncodingChanged(object sender, EventArgs e) {
+      if (Encoding == activeStart.Encoding || activeStart.Encoding == null) return;
+      Encoding = activeStart.Encoding;
+    }
+    private void ActiveModifiersChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<ProblemModifier>> e) {
+      UpdateModifiers();
+    }
+
+    private void ProblemParameter_ValueChanged(object sender, EventArgs e) {
+      if (Problem != null) {
+        Problem.OperatorsChanged -= Problem_OperatorsChanged;
+        Problem.OperatorsChanged += Problem_OperatorsChanged;
+      }
+      endPoint.Problem = Problem;
+      UpdateModifiers();
+    }
+
+    private void Problem_OperatorsChanged(object sender, EventArgs e) {
+      UpdateModifiers();
+    }
+
+
+    void IStatefulItem.InitializeState() {
+      UpdateModifiers();
+    }
+
+    void IStatefulItem.ClearState() {
+      UpdateModifiers();
+    }
+  }
+}
Index: /branches/3133_ProblemModifiers/PreBuildEvent.cmd
===================================================================
--- /branches/3133_ProblemModifiers/PreBuildEvent.cmd	(revision 18029)
+++ /branches/3133_ProblemModifiers/PreBuildEvent.cmd	(revision 18029)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
