Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.Designer.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.Designer.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.Designer.cs	(revision 14333)
@@ -0,0 +1,175 @@
+﻿namespace HeuristicLab.GoalSeeking.Views {
+  partial class GoalSeekingTargetView {
+    /// <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.components = new System.ComponentModel.Container();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.activeCheckBox = new System.Windows.Forms.CheckBox();
+      this.stepTextBox = new System.Windows.Forms.TextBox();
+      this.varianceTextBox = new System.Windows.Forms.TextBox();
+      this.weightTextBox = new System.Windows.Forms.TextBox();
+      this.goalTextBox = new System.Windows.Forms.TextBox();
+      this.stepLabel = new System.Windows.Forms.Label();
+      this.varianceLabel = new System.Windows.Forms.Label();
+      this.weightLabel = new System.Windows.Forms.Label();
+      this.goalLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.groupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.activeCheckBox);
+      this.groupBox.Controls.Add(this.stepTextBox);
+      this.groupBox.Controls.Add(this.varianceTextBox);
+      this.groupBox.Controls.Add(this.weightTextBox);
+      this.groupBox.Controls.Add(this.goalTextBox);
+      this.groupBox.Controls.Add(this.stepLabel);
+      this.groupBox.Controls.Add(this.varianceLabel);
+      this.groupBox.Controls.Add(this.weightLabel);
+      this.groupBox.Controls.Add(this.goalLabel);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(205, 148);
+      this.groupBox.TabIndex = 0;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Target";
+      // 
+      // activeCheckBox
+      // 
+      this.activeCheckBox.AutoSize = true;
+      this.activeCheckBox.Location = new System.Drawing.Point(6, 19);
+      this.activeCheckBox.Name = "activeCheckBox";
+      this.activeCheckBox.Size = new System.Drawing.Size(56, 17);
+      this.activeCheckBox.TabIndex = 2;
+      this.activeCheckBox.Text = "Active";
+      this.activeCheckBox.UseVisualStyleBackColor = true;
+      this.activeCheckBox.CheckedChanged += new System.EventHandler(this.activeCheckBox_CheckedChanged);
+      // 
+      // stepTextBox
+      // 
+      this.stepTextBox.Location = new System.Drawing.Point(100, 122);
+      this.stepTextBox.Name = "stepTextBox";
+      this.stepTextBox.Size = new System.Drawing.Size(100, 20);
+      this.stepTextBox.TabIndex = 1;
+      this.stepTextBox.TextChanged += new System.EventHandler(this.stepTextBox_TextChanged);
+      // 
+      // varianceTextBox
+      // 
+      this.varianceTextBox.Location = new System.Drawing.Point(100, 96);
+      this.varianceTextBox.Name = "varianceTextBox";
+      this.varianceTextBox.Size = new System.Drawing.Size(100, 20);
+      this.varianceTextBox.TabIndex = 1;
+      this.varianceTextBox.TextChanged += new System.EventHandler(this.varianceTextBox_TextChanged);
+      // 
+      // weightTextBox
+      // 
+      this.weightTextBox.Location = new System.Drawing.Point(100, 70);
+      this.weightTextBox.Name = "weightTextBox";
+      this.weightTextBox.Size = new System.Drawing.Size(100, 20);
+      this.weightTextBox.TabIndex = 1;
+      this.weightTextBox.TextChanged += new System.EventHandler(this.weightTextBox_TextChanged);
+      this.weightTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.weightTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // goalTextBox
+      // 
+      this.goalTextBox.Location = new System.Drawing.Point(100, 44);
+      this.goalTextBox.Name = "goalTextBox";
+      this.goalTextBox.Size = new System.Drawing.Size(100, 20);
+      this.goalTextBox.TabIndex = 1;
+      this.goalTextBox.TextChanged += new System.EventHandler(this.goalTextBox_TextChanged);
+      this.goalTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.goalTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // stepLabel
+      // 
+      this.stepLabel.AutoSize = true;
+      this.stepLabel.Location = new System.Drawing.Point(6, 125);
+      this.stepLabel.Name = "stepLabel";
+      this.stepLabel.Size = new System.Drawing.Size(29, 13);
+      this.stepLabel.TabIndex = 0;
+      this.stepLabel.Text = "Step";
+      // 
+      // varianceLabel
+      // 
+      this.varianceLabel.AutoSize = true;
+      this.varianceLabel.Location = new System.Drawing.Point(6, 99);
+      this.varianceLabel.Name = "varianceLabel";
+      this.varianceLabel.Size = new System.Drawing.Size(49, 13);
+      this.varianceLabel.TabIndex = 0;
+      this.varianceLabel.Text = "Variance";
+      // 
+      // weightLabel
+      // 
+      this.weightLabel.AutoSize = true;
+      this.weightLabel.Location = new System.Drawing.Point(6, 73);
+      this.weightLabel.Name = "weightLabel";
+      this.weightLabel.Size = new System.Drawing.Size(41, 13);
+      this.weightLabel.TabIndex = 0;
+      this.weightLabel.Text = "Weight";
+      // 
+      // goalLabel
+      // 
+      this.goalLabel.AutoSize = true;
+      this.goalLabel.Location = new System.Drawing.Point(6, 47);
+      this.goalLabel.Name = "goalLabel";
+      this.goalLabel.Size = new System.Drawing.Size(29, 13);
+      this.goalLabel.TabIndex = 0;
+      this.goalLabel.Text = "Goal";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // GoalSeekingTargetView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.groupBox);
+      this.Name = "GoalSeekingTargetView";
+      this.Size = new System.Drawing.Size(205, 148);
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.Label goalLabel;
+    private System.Windows.Forms.Label stepLabel;
+    private System.Windows.Forms.Label varianceLabel;
+    private System.Windows.Forms.Label weightLabel;
+    private System.Windows.Forms.TextBox stepTextBox;
+    private System.Windows.Forms.TextBox varianceTextBox;
+    private System.Windows.Forms.TextBox weightTextBox;
+    private System.Windows.Forms.TextBox goalTextBox;
+    private System.Windows.Forms.CheckBox activeCheckBox;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalParameterView.cs	(revision 14333)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.ComponentModel;
+using System.Globalization;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.GoalSeeking.Views {
+  [View("GoalSeekingTarget View", "")]
+  [Content(typeof(GoalParameter), true)]
+  public partial class GoalSeekingTargetView : AsynchronousContentView {
+    public new GoalParameter Content {
+      get { return (GoalParameter)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public GoalSeekingTargetView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        groupBox.Text = Content.Name;
+        goalTextBox.Text = Content.Goal.ToString(CultureInfo.CurrentCulture);
+        weightTextBox.Text = Content.Weight.ToString(CultureInfo.CurrentCulture);
+        varianceTextBox.Text = Content.Variance.ToString(CultureInfo.CurrentCulture);
+        stepTextBox.Text = Content.Step.ToString(CultureInfo.CurrentCulture);
+        activeCheckBox.Checked = Content.Active;
+        Content.Changed += Content_Changed;
+      }
+    }
+
+    private void Content_Changed(object sender, EventArgs args) {
+      groupBox.Text = Content.Name;
+      goalTextBox.Text = Content.Goal.ToString(CultureInfo.CurrentCulture);
+      weightTextBox.Text = Content.Weight.ToString(CultureInfo.CurrentCulture);
+      varianceTextBox.Text = Content.Variance.ToString(CultureInfo.CurrentCulture);
+      stepTextBox.Text = Content.Step.ToString(CultureInfo.CurrentCulture);
+      activeCheckBox.Checked = Content.Active;
+    }
+
+    #region event handlers
+    private void TextBoxValidating(object sender, CancelEventArgs e) {
+      double v;
+      string errorMsg = "Could not parse the entered value. Please input a real number.";
+      var tb = (TextBox)sender;
+      if (!double.TryParse(tb.Text, out v)) {
+        e.Cancel = true;
+        tb.Select(0, tb.Text.Length);
+
+        // Set the ErrorProvider error with the text to display. 
+        this.errorProvider.SetError(tb, errorMsg);
+        errorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;
+        errorProvider.SetIconPadding(tb, -20);
+      }
+    }
+
+    private void TextBoxValidated(object sender, EventArgs e) {
+      var tb = (TextBox)sender;
+      errorProvider.SetError(tb, string.Empty);
+    }
+
+    private void activeCheckBox_CheckedChanged(object sender, System.EventArgs e) {
+      Content.Active = activeCheckBox.Checked;
+      goalTextBox.Enabled = weightTextBox.Enabled = stepTextBox.Enabled = varianceTextBox.Enabled = Content.Active;
+    }
+
+    private void goalTextBox_TextChanged(object sender, EventArgs e) {
+      double goal;
+      if (double.TryParse(goalTextBox.Text, out goal))
+        Content.Goal = goal;
+    }
+
+    private void weightTextBox_TextChanged(object sender, EventArgs e) {
+      double weight;
+      if (double.TryParse(weightTextBox.Text, out weight))
+        Content.Weight = weight;
+    }
+
+    private void varianceTextBox_TextChanged(object sender, EventArgs e) {
+      double variance;
+      if (double.TryParse(varianceTextBox.Text, out variance))
+        Content.Variance = variance;
+    }
+
+    private void stepTextBox_TextChanged(object sender, System.EventArgs e) {
+      double step;
+      if (double.TryParse(stepTextBox.Text, out step))
+        Content.Step = step;
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalSeekingProblem.Views.csproj
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalSeekingProblem.Views.csproj	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/GoalSeekingProblem.Views.csproj	(revision 14333)
@@ -0,0 +1,107 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" 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>{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.GoalSeekingProblem.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.GoalSeekingProblem.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\..\..\trunk\sources\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>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <Private>False</Private>
+    </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="InputParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="InputParameterView.Designer.cs">
+      <DependentUpon>InputParameterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="GoalParameterView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GoalParameterView.Designer.cs">
+      <DependentUpon>GoalParameterView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.GoalSeekingProblem\3.4\GoalSeekingProblem.csproj">
+      <Project>{79271bc8-4446-40e2-bb89-9be4e17174fe}</Project>
+      <Name>GoalSeekingProblem</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- 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>
+  -->
+</Project>
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.Designer.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.Designer.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.Designer.cs	(revision 14333)
@@ -0,0 +1,180 @@
+﻿namespace HeuristicLab.GoalSeeking.Views {
+  partial class GoalSeekingParameterView {
+    /// <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.components = new System.ComponentModel.Container();
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.activeCheckBox = new System.Windows.Forms.CheckBox();
+      this.valueTextBox = new System.Windows.Forms.TextBox();
+      this.stepTextBox = new System.Windows.Forms.TextBox();
+      this.maxTextBox = new System.Windows.Forms.TextBox();
+      this.valueLabel = new System.Windows.Forms.Label();
+      this.minTextBox = new System.Windows.Forms.TextBox();
+      this.stepLabel = new System.Windows.Forms.Label();
+      this.maximumLabel = new System.Windows.Forms.Label();
+      this.minimumLabel = new System.Windows.Forms.Label();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.groupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // groupBox
+      // 
+      this.groupBox.Controls.Add(this.activeCheckBox);
+      this.groupBox.Controls.Add(this.valueTextBox);
+      this.groupBox.Controls.Add(this.stepTextBox);
+      this.groupBox.Controls.Add(this.maxTextBox);
+      this.groupBox.Controls.Add(this.valueLabel);
+      this.groupBox.Controls.Add(this.minTextBox);
+      this.groupBox.Controls.Add(this.stepLabel);
+      this.groupBox.Controls.Add(this.maximumLabel);
+      this.groupBox.Controls.Add(this.minimumLabel);
+      this.groupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.groupBox.Location = new System.Drawing.Point(0, 0);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(204, 149);
+      this.groupBox.TabIndex = 1;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Parameter";
+      // 
+      // activeCheckBox
+      // 
+      this.activeCheckBox.AutoSize = true;
+      this.activeCheckBox.Location = new System.Drawing.Point(6, 19);
+      this.activeCheckBox.Name = "activeCheckBox";
+      this.activeCheckBox.Size = new System.Drawing.Size(56, 17);
+      this.activeCheckBox.TabIndex = 2;
+      this.activeCheckBox.Text = "Active";
+      this.activeCheckBox.UseVisualStyleBackColor = true;
+      this.activeCheckBox.CheckedChanged += new System.EventHandler(this.activeCheckBox_CheckedChanged);
+      // 
+      // valueTextBox
+      // 
+      this.valueTextBox.Location = new System.Drawing.Point(98, 122);
+      this.valueTextBox.Name = "valueTextBox";
+      this.valueTextBox.Size = new System.Drawing.Size(100, 20);
+      this.valueTextBox.TabIndex = 1;
+      this.valueTextBox.TextChanged += new System.EventHandler(this.valueTextBox_TextChanged);
+      this.valueTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.valueTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // stepTextBox
+      // 
+      this.stepTextBox.Location = new System.Drawing.Point(98, 96);
+      this.stepTextBox.Name = "stepTextBox";
+      this.stepTextBox.Size = new System.Drawing.Size(100, 20);
+      this.stepTextBox.TabIndex = 1;
+      this.stepTextBox.TextChanged += new System.EventHandler(this.stepTextBox_TextChanged);
+      this.stepTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.stepTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // maxTextBox
+      // 
+      this.maxTextBox.Location = new System.Drawing.Point(98, 70);
+      this.maxTextBox.Name = "maxTextBox";
+      this.maxTextBox.Size = new System.Drawing.Size(100, 20);
+      this.maxTextBox.TabIndex = 1;
+      this.maxTextBox.TextChanged += new System.EventHandler(this.maxTextBox_TextChanged);
+      this.maxTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.maxTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // valueLabel
+      // 
+      this.valueLabel.AutoSize = true;
+      this.valueLabel.Location = new System.Drawing.Point(4, 125);
+      this.valueLabel.Name = "valueLabel";
+      this.valueLabel.Size = new System.Drawing.Size(34, 13);
+      this.valueLabel.TabIndex = 0;
+      this.valueLabel.Text = "Value";
+      // 
+      // minTextBox
+      // 
+      this.minTextBox.Location = new System.Drawing.Point(98, 44);
+      this.minTextBox.Name = "minTextBox";
+      this.minTextBox.Size = new System.Drawing.Size(100, 20);
+      this.minTextBox.TabIndex = 1;
+      this.minTextBox.TextChanged += new System.EventHandler(this.minTextBox_TextChanged);
+      this.minTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.TextBoxValidating);
+      this.minTextBox.Validated += new System.EventHandler(this.TextBoxValidated);
+      // 
+      // stepLabel
+      // 
+      this.stepLabel.AutoSize = true;
+      this.stepLabel.Location = new System.Drawing.Point(4, 99);
+      this.stepLabel.Name = "stepLabel";
+      this.stepLabel.Size = new System.Drawing.Size(29, 13);
+      this.stepLabel.TabIndex = 0;
+      this.stepLabel.Text = "Step";
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.AutoSize = true;
+      this.maximumLabel.Location = new System.Drawing.Point(4, 73);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(51, 13);
+      this.maximumLabel.TabIndex = 0;
+      this.maximumLabel.Text = "Maximum";
+      // 
+      // minimumLabel
+      // 
+      this.minimumLabel.AutoSize = true;
+      this.minimumLabel.Location = new System.Drawing.Point(4, 47);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(48, 13);
+      this.minimumLabel.TabIndex = 0;
+      this.minimumLabel.Text = "Minimum";
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // GoalSeekingParameterView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.groupBox);
+      this.Name = "GoalSeekingParameterView";
+      this.Size = new System.Drawing.Size(204, 149);
+      this.groupBox.ResumeLayout(false);
+      this.groupBox.PerformLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox groupBox;
+    private System.Windows.Forms.CheckBox activeCheckBox;
+    private System.Windows.Forms.TextBox stepTextBox;
+    private System.Windows.Forms.TextBox maxTextBox;
+    private System.Windows.Forms.TextBox minTextBox;
+    private System.Windows.Forms.Label stepLabel;
+    private System.Windows.Forms.Label maximumLabel;
+    private System.Windows.Forms.Label minimumLabel;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+    private System.Windows.Forms.TextBox valueTextBox;
+    private System.Windows.Forms.Label valueLabel;
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/InputParameterView.cs	(revision 14333)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.ComponentModel;
+using System.Globalization;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.GoalSeeking.Views {
+  [View("GoalSeekingParameter View", "")]
+  [Content(typeof(InputParameter), true)]
+  public partial class GoalSeekingParameterView : AsynchronousContentView {
+    public new InputParameter Content {
+      get { return (InputParameter)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public GoalSeekingParameterView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        groupBox.Text = Content.Name;
+        minTextBox.Text = Content.Min.ToString(CultureInfo.CurrentCulture);
+        maxTextBox.Text = Content.Max.ToString(CultureInfo.CurrentCulture);
+        stepTextBox.Text = Content.Step.ToString(CultureInfo.CurrentCulture);
+        valueTextBox.Text = Content.Value.ToString(CultureInfo.CurrentCulture);
+        activeCheckBox.Checked = Content.Active;
+        Content.Changed += Content_Changed;
+      }
+    }
+
+    private void Content_Changed(object sender, EventArgs args) {
+      groupBox.Text = Content.Name;
+      minTextBox.Text = Content.Min.ToString(CultureInfo.CurrentCulture);
+      maxTextBox.Text = Content.Max.ToString(CultureInfo.CurrentCulture);
+      stepTextBox.Text = Content.Step.ToString(CultureInfo.CurrentCulture);
+      valueTextBox.Text = Content.Value.ToString(CultureInfo.CurrentCulture);
+      activeCheckBox.Checked = Content.Active;
+    }
+
+    #region event handlers
+    private void TextBoxValidating(object sender, CancelEventArgs e) {
+      double v;
+      string errorMsg = "Could not parse the entered value. Please input a real number.";
+      var tb = (TextBox)sender;
+      if (!double.TryParse(tb.Text, out v)) {
+        e.Cancel = true;
+        tb.Select(0, tb.Text.Length);
+
+        // Set the ErrorProvider error with the text to display. 
+        this.errorProvider.SetError(tb, errorMsg);
+        errorProvider.BlinkStyle = ErrorBlinkStyle.NeverBlink;
+        errorProvider.SetIconPadding(tb, -20);
+      }
+    }
+
+    private void TextBoxValidated(object sender, EventArgs e) {
+      var tb = (TextBox)sender;
+      errorProvider.SetError(tb, string.Empty);
+    }
+    #endregion
+
+    private void minTextBox_TextChanged(object sender, EventArgs e) {
+      double min;
+      if (double.TryParse(minTextBox.Text, out min))
+        Content.Min = min;
+    }
+
+    private void maxTextBox_TextChanged(object sender, EventArgs e) {
+      double max;
+      if (double.TryParse(minTextBox.Text, out max))
+        Content.Max = max;
+    }
+
+    private void stepTextBox_TextChanged(object sender, EventArgs e) {
+      double step;
+      if (double.TryParse(minTextBox.Text, out step))
+        Content.Step = step;
+    }
+
+    private void valueTextBox_TextChanged(object sender, EventArgs e) {
+      double value;
+      if (double.TryParse(minTextBox.Text, out value))
+        Content.Value = value;
+    }
+
+    private void activeCheckBox_CheckedChanged(object sender, EventArgs e) {
+      Content.Active = activeCheckBox.Checked;
+      minTextBox.Enabled = maxTextBox.Enabled = stepTextBox.Enabled = Content.Active;
+      valueTextBox.Enabled = !Content.Active;
+    }
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs	(revision 14333)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.GoalSeekingProblem.Views {
+  [Plugin("HeuristicLab.GoalSeekingProblem.Views", "3.4.0.0")]
+  [PluginFile("HeuristicLab.GoalSeekingProblem.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+
+  public class HeuristicLabProcessParameterOptimizationPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs.frame
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs.frame	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Plugin.cs.frame	(revision 14333)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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.GoalSeekingProblem.Views {
+  [Plugin("HeuristicLab.GoalSeekingProblem.Views", "3.4.0.0")]
+  [PluginFile("HeuristicLab.GoalSeekingProblem.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+
+  public class HeuristicLabProcessParameterOptimizationPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/PreBuildEvent.cmd
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/PreBuildEvent.cmd	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/PreBuildEvent.cmd	(revision 14333)
@@ -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
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Properties/AssemblyInfo.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Properties/AssemblyInfo.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.Views/3.4/Properties/AssemblyInfo.cs	(revision 14333)
@@ -0,0 +1,36 @@
+﻿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("GoalSeekingProblem.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("GoalSeekingProblem.Views")]
+[assembly: AssemblyCopyright("Copyright ©  2016")]
+[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("b0cbff1b-6a06-4dda-b622-e847b8adc908")]
+
+// 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("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.sln
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.sln	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem.sln	(revision 14333)
@@ -0,0 +1,48 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoalSeekingProblem", "HeuristicLab.GoalSeekingProblem\3.4\GoalSeekingProblem.csproj", "{79271BC8-4446-40E2-BB89-9BE4E17174FE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GoalSeekingProblem.Views", "HeuristicLab.GoalSeekingProblem.Views\3.4\GoalSeekingProblem.Views.csproj", "{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}"
+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
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|x64.ActiveCfg = Debug|x64
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|x64.Build.0 = Debug|x64
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|x86.ActiveCfg = Debug|x86
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Debug|x86.Build.0 = Debug|x86
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|x64.ActiveCfg = Release|x64
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|x64.Build.0 = Release|x64
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|x86.ActiveCfg = Release|x86
+		{79271BC8-4446-40E2-BB89-9BE4E17174FE}.Release|x86.Build.0 = Release|x86
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|x64.Build.0 = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Debug|x86.Build.0 = Debug|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|x64.ActiveCfg = Release|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|x64.Build.0 = Release|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|x86.ActiveCfg = Release|Any CPU
+		{B0CBFF1B-6A06-4DDA-B622-E847B8ADC908}.Release|x86.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalParameter.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalParameter.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalParameter.cs	(revision 14333)
@@ -0,0 +1,123 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.GoalSeeking {
+  [Item("GoalParameter", "An object describing a tunable parameter used in goal seeking.")]
+  [StorableClass]
+  public class GoalParameter : NamedItem {
+    [Storable]
+    private double goal;
+    public double Goal {
+      get { return goal; }
+      set {
+        if (goal.IsAlmost(value)) return;
+        goal = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double weight;
+    public double Weight {
+      get { return weight; }
+      set {
+        if (weight.IsAlmost(value)) return;
+        weight = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double variance;
+
+    public double Variance {
+      get { return variance; }
+      set {
+        if (variance.IsAlmost(value)) return;
+        variance = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double step;
+    public double Step {
+      get { return step; }
+      set {
+        if (step.IsAlmost(value)) return;
+        step = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private bool active;
+    public bool Active {
+      get { return active; }
+      set {
+        if (active == value) return;
+        active = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    public override string ToString() {
+      return string.Format("{0} [active: {1}; goal: {2}; weight: {3}; variance: {4}; step: {5}", Name, Active, Goal, Weight, Variance, Step);
+    }
+
+    protected GoalParameter(GoalParameter original, Cloner cloner) : base(original, cloner) {
+      name = original.name;
+      goal = original.goal;
+      weight = original.weight;
+      variance = original.variance;
+      step = original.step;
+      active = original.active;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GoalParameter(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected GoalParameter(bool deserializing) : base(deserializing) { }
+
+    public GoalParameter(string name, double goal, double weight, double variance, double step, bool active = true) {
+      this.name = name;
+      this.goal = goal;
+      this.weight = weight;
+      this.variance = variance;
+      this.step = step;
+      this.active = active;
+    }
+
+    public event EventHandler Changed;
+    private void OnChanged(object sender, EventArgs args) {
+      var changed = Changed;
+      if (changed == null) return;
+      changed(sender, args);
+    }
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingProblem.csproj
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingProblem.csproj	(revision 14332)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingProblem.csproj	(revision 14333)
@@ -189,4 +189,7 @@
     <None Include="Plugin.cs.frame" />
     <Compile Include="Analyzers\BestSolutionAnalyzer.cs" />
+    <Compile Include="GoalParameter.cs" />
+    <Compile Include="GoalSeekingUtil.cs" />
+    <Compile Include="InputParameter.cs" />
     <Compile Include="IGoalSeekingProblem.cs" />
     <Compile Include="Plugin.cs" />
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingUtil.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingUtil.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/GoalSeekingUtil.cs	(revision 14333)
@@ -0,0 +1,132 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.GoalSeeking {
+  internal static class GoalSeekingUtil {
+    internal static void UpdateTargets(ICheckedItemList<GoalParameter> goals, IEnumerable<IRegressionModel> models, EventHandler changedEventHandler) {
+      var targets = models.Select(x => x.TargetVariable).Distinct().OrderBy(x => x);
+      var dict = goals.ToDictionary(x => x.Name, x => x);
+      goals.Clear();
+      foreach (var t in targets) {
+        GoalParameter gp;
+        if (dict.ContainsKey(t)) {
+          gp = dict[t];
+        } else {
+          var goal = double.NaN;
+          var weight = 1.0;
+          var variance = double.NaN;
+          var step = 1e-6;
+          gp = new GoalParameter(t, goal, weight, variance, step, active: false); // new goals are not active by default as they need to be configured by the user
+          gp.Changed += changedEventHandler;
+        }
+        goals.Add(gp, gp.Active);
+      }
+    }
+
+    internal static void UpdateInputs(ICheckedItemList<InputParameter> inputs, IEnumerable<IRegressionModel> models, EventHandler changedEventHandler) {
+      var variables = models.SelectMany(x => x.VariablesUsedForPrediction).Distinct();
+      var dict = inputs.ToDictionary(x => x.Name, x => x); // save old parameter settings
+      inputs.Clear();
+      foreach (var v in variables) {
+        InputParameter ip;
+        if (dict.ContainsKey(v)) {
+          ip = dict[v];
+        } else {
+          ip = new InputParameter(v, double.NaN, -1, 1, 1e-6, active: false); // new inputs are not active by default. the user needs to configure them first
+          ip.Changed += changedEventHandler;
+        }
+        inputs.Add(ip, ip.Active);
+      }
+    }
+
+    internal static RealVectorEncoding CreateEncoding(IEnumerable<InputParameter> inputParameters) {
+      var encoding = new RealVectorEncoding(inputParameters.Count());
+      encoding.Bounds = new DoubleMatrix(encoding.Length, 2); // only two columns: min and max
+      encoding.Bounds.RowNames = inputParameters.Select(x => x.Name);
+      encoding.Bounds.ColumnNames = new[] { "Min.", "Max." };
+
+      int i = 0;
+      foreach (var parameter in inputParameters) {
+        encoding.Bounds[i, 0] = parameter.Min;
+        encoding.Bounds[i, 1] = parameter.Max;
+        ++i;
+      }
+      return encoding;
+    }
+
+    internal static void ValidateGoalsAndInputs(IEnumerable<GoalParameter> goals, IEnumerable<InputParameter> inputs) {
+      var notConfiguredGoals = goals.Where(x => x.Active && (double.IsNaN(x.Variance) || double.IsNaN(x.Goal))).ToList();
+      var notConfiguredInputs = inputs.Where(x => x.Active && (double.IsNaN(x.Min) || double.IsNaN(x.Max) || double.IsNaN(x.Value))).ToList();
+      StringBuilder sb = null;
+      if (notConfiguredGoals.Any()) {
+        sb = new StringBuilder();
+        sb.AppendLine("The following GoalParameters are not configured.");
+        foreach (var goal in notConfiguredGoals) {
+          sb.AppendLine(goal.Name);
+        }
+      }
+      if (notConfiguredInputs.Any()) {
+        if (sb == null)
+          sb = new StringBuilder();
+        sb.AppendLine("The following InpuTParameters are not configured.");
+        foreach (var input in notConfiguredInputs) {
+          sb.AppendLine(input.Name);
+        }
+      }
+      if (sb != null)
+        throw new InvalidOperationException(sb.ToString());
+    }
+
+    internal static void Configure(IEnumerable<GoalParameter> goals, IEnumerable<InputParameter> inputs, IRegressionProblemData problemData, int row) {
+      var inputMap = inputs.ToDictionary(x => x.Name, x => x);
+      var goalMap = goals.ToDictionary(x => x.Name, x => x);
+
+      foreach (var variable in problemData.AllowedInputVariables) {
+        if (inputMap.ContainsKey(variable)) {
+          var values = problemData.Dataset.GetReadOnlyDoubleValues(variable);
+          var input = inputMap[variable];
+          input.Value = values[row];
+          double min = values[0], max = values[0];
+          foreach (var v in values) {
+            if (min > v) min = v;
+            if (max < v) max = v;
+          }
+          input.Min = min;
+          input.Min = max;
+        } else if (goalMap.ContainsKey(variable)) {
+          var values = problemData.Dataset.GetReadOnlyDoubleValues(variable);
+          var goal = goalMap[variable];
+          goal.Variance = values.Variance();
+          goal.Goal = values[row];
+        }
+      }
+    }
+
+    internal static void Goals_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<GoalParameter>> args) {
+      var goals = (CheckedItemList<GoalParameter>)sender;
+      foreach (var item in args.Items.Select(x => x.Value)) {
+        item.Active = goals.ItemChecked(item);
+      }
+    }
+
+    internal static void Inputs_CheckedItemsChanged(object sender, CollectionItemsChangedEventArgs<IndexedItem<InputParameter>> args) {
+      var inputs = (CheckedItemList<InputParameter>)sender;
+      foreach (var item in args.Items.Select(x => x.Value)) {
+        item.Active = inputs.ItemChecked(item);
+      }
+    }
+
+    internal static void RaiseEvent(object sender, EventHandler handler) {
+      if (handler == null) return;
+      handler(sender, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/IGoalSeekingProblem.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/IGoalSeekingProblem.cs	(revision 14332)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/IGoalSeekingProblem.cs	(revision 14333)
@@ -22,6 +22,4 @@
 using System;
 using System.Collections.Generic;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Optimization;
 using HeuristicLab.Problems.DataAnalysis;
@@ -29,9 +27,7 @@
 namespace HeuristicLab.GoalSeeking {
   public interface IGoalSeekingProblem : IProblem {
-    IRegressionProblemData ProblemData { get; set; }
-
+    void Configure(IRegressionProblemData problemData, int row);
     //rounding ? 
     IEnumerable<double> GetEstimatedGoalValues(IEnumerable<double> parameterValues, bool round = false);
-    int Row { get; set; }
 
     //Models?
@@ -39,42 +35,13 @@
     void AddModel(IRegressionModel model);
     void RemoveModel(IRegressionModel model);
+
+    //targets and parameters
+    IEnumerable<GoalParameter> Goals { get; }
+    IEnumerable<InputParameter> Inputs { get; }
+
+    //events
     event EventHandler ModelsChanged;
-
-    #region targets
-    double GetTargetGoal(string target);
-    void SetTargetGoal(string target, double goal);
-
-    //variance ?
-    double GetTargetWeight(string target);
-    void SetTargetWeight(string target, double weight);
-
-    double GetTargetVariance(string target);
-    void SetTargetVariance(string target, double variance);
-
-    double GetTargetStepSize(string target);
-    void SetTargetStepSize(string target, double stepSize);
-
     event EventHandler TargetsChanged;
-    #endregion
-
-    #region parameters
-    ICheckedItemList<StringValue> ControllableParameters { get; }
-    DoubleMatrix ControllableParameterBounds { get; }
-
-    IEnumerable<string> GetControllableParameters();
-    void SetControllableParameters(IEnumerable<string> parameterNames);
-
-    bool GetParameterActive(string parameter);
-    void SetParameterActive(string parameter, bool active);
-
-    double[] GetParameterBounds(string parameterName);
-    void SetParameterBounds(string parameterName, double min, double max, double step);
-    // set get ParameterStepSize, set get parameters active
-    // parameters changed event
-    double GetParameterStepSize(string parameter);
-    void SetParameterStepSize(string parameter, double stepSize);
-
     event EventHandler ParametersChanged;
-    #endregion
   }
 }
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/InputParameter.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/InputParameter.cs	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/InputParameter.cs	(revision 14333)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.GoalSeeking {
+  [Item("InputParameter", "An object describing a target for the goal seeking.")]
+  [StorableClass]
+  public class InputParameter : NamedItem {
+    [Storable]
+    private double min;
+    public double Min {
+      get { return min; }
+      set {
+        if (min.IsAlmost(value)) return;
+        min = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double max;
+    public double Max {
+      get { return max; }
+      set {
+        if (max.IsAlmost(value)) return;
+        max = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double step;
+    public double Step {
+      get { return step; }
+      set {
+        if (step.IsAlmost(value)) return;
+        step = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private double value;
+    public double Value {
+      get { return value; }
+      set {
+        if (this.value.IsAlmost(value)) return;
+        this.value = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    [Storable]
+    private bool active;
+    public bool Active {
+      get { return active; }
+      set {
+        if (active == value) return;
+        active = value;
+        OnChanged(this, EventArgs.Empty);
+      }
+    }
+
+    public override string ToString() {
+      return string.Format("{0} [active: {1}; value: {2}; min: {3}; max: {4}; step: {5}]", Name, Active, Value, Min, Max, Step);
+    }
+
+    protected InputParameter(InputParameter original, Cloner cloner) : base(original, cloner) {
+      name = original.name;
+      min = original.min;
+      max = original.max;
+      step = original.step;
+      value = original.value;
+      active = original.active;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new InputParameter(this, cloner);
+    }
+
+    [StorableConstructor]
+    protected InputParameter(bool deserializing) : base(deserializing) { }
+
+    public InputParameter(string name, double value, double min, double max, double step, bool active = true) {
+      this.name = name;
+      this.value = value;
+      this.min = min;
+      this.max = max;
+      this.step = step;
+      this.active = active;
+    }
+
+    public event EventHandler Changed;
+    private void OnChanged(object sender, EventArgs args) {
+      var changed = Changed;
+      if (changed == null) return;
+      changed(sender, args);
+    }
+  }
+}
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/MultiObjectiveGoalSeekingProblem.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/MultiObjectiveGoalSeekingProblem.cs	(revision 14332)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/MultiObjectiveGoalSeekingProblem.cs	(revision 14333)
@@ -23,5 +23,4 @@
 using System.Collections.Generic;
 using System.Linq;
-using System.Windows.Forms;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
@@ -39,342 +38,83 @@
   [StorableClass]
   public sealed class MultiObjectiveGoalSeekingProblem : MultiObjectiveBasicProblem<RealVectorEncoding>, IGoalSeekingProblem {
+    #region parameter names
     private const string ModifiableDatasetParameterName = "Dataset";
-    private const string ProblemDataParameterName = "ProblemData";
-    private const string ControllableParametersParameterName = "ControllableParameters";
-    private const string ControllableParameterBoundsParameterName = "ControllableParameterBounds";
-    private const string TargetGoalsParameterName = "TargetGoals";
-    private const string TargetsParameterName = "Targets";
-    private const string ModelCollectionParameterName = "ModelCollection";
-    private const string RowParameterName = "Row";
-    // these parameters are used by the pareto folding analyzer
+    private const string InputsParameterName = "Inputs";
+    private const string GoalsParameterName = "Goals";
+    private const string ModelsParameterName = "Models";
     private const string QualitySumCutoffParameterName = "QualitySumCutoff";
+    #endregion
 
     #region parameters
+    public IValueParameter<CheckedItemList<InputParameter>> InputsParameter {
+      get { return (IValueParameter<CheckedItemList<InputParameter>>)Parameters[InputsParameterName]; }
+    }
+    public IValueParameter<CheckedItemList<GoalParameter>> GoalsParameter {
+      get { return (IValueParameter<CheckedItemList<GoalParameter>>)Parameters[GoalsParameterName]; }
+    }
+    public IFixedValueParameter<ItemCollection<IRegressionModel>> ModelsParameter {
+      get { return (IFixedValueParameter<ItemCollection<IRegressionModel>>)Parameters[ModelsParameterName]; }
+    }
     public IFixedValueParameter<DoubleValue> QualitySumCutoffParameter {
       get { return (IFixedValueParameter<DoubleValue>)Parameters[QualitySumCutoffParameterName]; }
     }
-    public IValueParameter<IRegressionProblemData> ProblemDataParameter {
-      get { return (IValueParameter<IRegressionProblemData>)Parameters[ProblemDataParameterName]; }
-    }
-    public IValueParameter<CheckedItemList<StringValue>> ControllableParametersParameter {
-      get { return (IValueParameter<CheckedItemList<StringValue>>)Parameters[ControllableParametersParameterName]; }
-    }
-    public IValueParameter<DoubleMatrix> ControllableParameterBoundsParameter {
-      get { return (IValueParameter<DoubleMatrix>)Parameters[ControllableParameterBoundsParameterName]; }
-    }
-    public IFixedValueParameter<ItemCollection<IRegressionModel>> ModelCollectionParameter {
-      get { return (IFixedValueParameter<ItemCollection<IRegressionModel>>)Parameters[ModelCollectionParameterName]; }
-    }
-    public IValueParameter<CheckedItemList<StringValue>> TargetsParameter {
-      get { return (IValueParameter<CheckedItemList<StringValue>>)Parameters[TargetsParameterName]; }
-    }
-    public IValueParameter<DoubleMatrix> TargetGoalsParameter {
-      get { return (IValueParameter<DoubleMatrix>)Parameters[TargetGoalsParameterName]; }
-    }
-    public IFixedValueParameter<IntValue> RowParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters[RowParameterName]; }
-    }
-    #endregion
-
-    #region parameter properties
-    private IItemCollection<IRegressionModel> ModelCollection {
-      get { return ModelCollectionParameter.Value; }
-    }
-    public DoubleMatrix TargetGoals {
-      get { return TargetGoalsParameter.Value; }
-      set { TargetGoalsParameter.Value = value; }
-    }
-    public double QualitySumCutoff {
-      get { return QualitySumCutoffParameter.Value.Value; }
-      set { QualitySumCutoffParameter.Value.Value = value; }
-    }
-    #endregion
-
-    #region IProcessParameterOptimizationProblem properties
-    [Storable]
-    private IRegressionProblemData problemData;
-    public IRegressionProblemData ProblemData {
-      get { return problemData; }
-      set {
-        if (value == null || value == problemData) return;
-        var variables = value.Dataset.DoubleVariables.ToList();
-        if (Models.Any()) {
-          var targets = Models.Select(x => x.TargetVariable);
-          var hashset = new HashSet<string>(variables);
-          foreach (var target in targets) {
-            if (!hashset.Contains(target)) {
-              throw new ArgumentException(string.Format("Incompatible problem data. Target \"{0}\" is missing.", target));
-            }
-          }
-        }
-        problemData = value;
-        dataset = new ModifiableDataset(variables, variables.Select(x => new List<double> { ProblemData.Dataset.GetDoubleValue(x, Row) }));
-        ProblemDataParameter.Value = ProblemData;
-        UpdateControllableParameters();
-        UpdateTargetList();
-      }
-    }
-
-    public int Row {
-      get { return RowParameter.Value.Value; }
-      set { RowParameter.Value.Value = value; }
-    }
-
+    #endregion
+
+    #region IGoalSeekingProblem implementation
     public IEnumerable<IRegressionModel> Models {
-      get { return ModelCollectionParameter.Value; }
-    }
-
-    #region targets
-    public ICheckedItemList<StringValue> TargetList {
-      get { return TargetsParameter.Value; }
-      set { TargetsParameter.Value = (CheckedItemList<StringValue>)value; }
-    }
-    // convenience method
-    private IEnumerable<string> ActiveTargets {
-      get { return TargetList.CheckedItems.Select(x => x.Value.Value); }
-    }
-    #endregion
-
-    #region parameters
-    public ICheckedItemList<StringValue> ControllableParameters {
-      get { return ControllableParametersParameter.Value; }
-      set { ControllableParametersParameter.Value = (CheckedItemList<StringValue>)value; }
-    }
-    // convenience method 
-    private IEnumerable<string> ActiveParameters {
-      get { return ControllableParameters.CheckedItems.Select(x => x.Value.Value); }
-    }
-    public DoubleMatrix ControllableParameterBounds {
-      get { return ControllableParameterBoundsParameter.Value; }
-      set { ControllableParameterBoundsParameter.Value = value; }
-    }
-    #endregion
-    #endregion
-
-    #region IProcessParameterOptimizationProblem methods
-    #region models
+      get { return ModelsParameter.Value; }
+    }
+
+    public IEnumerable<GoalParameter> Goals {
+      get { return GoalsParameter.Value; }
+    }
+
+    public IEnumerable<InputParameter> Inputs {
+      get { return InputsParameter.Value; }
+    }
+
+    public void AddModel(IRegressionModel model) {
+      var models = ModelsParameter.Value;
+      models.Add(model);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    public void RemoveModel(IRegressionModel model) {
+      var models = ModelsParameter.Value;
+      models.Remove(model);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    public void Configure(IRegressionProblemData problemData, int row) {
+      GoalSeekingUtil.Configure(Goals, Inputs, problemData, row);
+    }
+
     public IEnumerable<double> GetEstimatedGoalValues(IEnumerable<double> parameterValues, bool round = false) {
       var ds = (ModifiableDataset)dataset.Clone();
-      foreach (var parameter in ActiveParameters.Zip(parameterValues, (p, v) => new { Name = p, Value = v })) {
+      foreach (var parameter in ActiveInputs.Zip(parameterValues, (p, v) => new { Name = p.Name, Value = v })) {
         ds.SetVariableValue(parameter.Value, parameter.Name, 0);
       }
       var rows = new[] { 0 }; // actually just one row
-
       var estimatedValues =
-        round ? ActiveTargets.Select(t => RoundToNearestStepMultiple(GetModels(t).Average(m => m.GetEstimatedValues(ds, rows).Single()), GetTargetStepSize(t)))
-              : ActiveTargets.Select(t => GetModels(t).Average(m => m.GetEstimatedValues(ds, rows).Single()));
+        round ? ActiveGoals.Select(t => RoundToNearestStepMultiple(GetModels(t.Name).Average(m => m.GetEstimatedValues(ds, rows).Single()), t.Step))
+              : ActiveGoals.Select(t => GetModels(t.Name).Average(m => m.GetEstimatedValues(ds, rows).Single()));
       return estimatedValues;
     }
 
-    public void AddModel(IRegressionModel model) {
-      var target = model.TargetVariable;
-      CheckIfDatasetContainsTarget(target);
-      ModelCollection.Add(model);
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    // method which throws an exception that can be caught in the event handler if the check fails
-    private void CheckIfDatasetContainsTarget(string target) {
-      if (dataset.DoubleVariables.All(x => x != target))
-        throw new ArgumentException(string.Format("Model target \"{0}\" does not exist in the dataset.", target));
-    }
-
-    public void RemoveModel(IRegressionModel model) {
-      ModelCollection.Remove(model);
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
     public event EventHandler ModelsChanged;
-    private void OnModelsChanged(object sender, EventArgs args) {
-      var changed = ModelsChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion
-
-    #region targets
-    public bool GetTargetActive(string target) {
-      var item = TargetList.SingleOrDefault(x => x.Value == target);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetTargetActive: Invalid target name {0}", target));
-      return TargetList.ItemChecked(item);
-    }
-
-    public void SetTargetActive(string target, bool active) {
-      var item = TargetList.SingleOrDefault(x => x.Value == target);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetTargetActive: Invalid target name {0}", target));
-      TargetList.SetItemCheckedState(item, active);
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetGoal(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 0];
-    }
-
-    public void SetTargetGoal(string target, double goal) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 0] = goal;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetWeight(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 1];
-    }
-
-    public void SetTargetWeight(string target, double weight) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 1] = weight;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetVariance(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 2];
-    }
-
-    public void SetTargetVariance(string target, double variance) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 2] = variance;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetStepSize(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 3];
-    }
-
-    public void SetTargetStepSize(string target, double stepSize) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 3] = stepSize;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
     public event EventHandler TargetsChanged;
-    private void OnTargetsChanged(object sender, EventArgs args) {
-      var changed = TargetsChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion // targets
-
-    #region process parameters
-    /// <summary>
-    /// Returns the parameter bounds (min and max) and the step size for the specified parameter
-    /// </summary>
-    /// <param name="parameterName"></param>
-    /// <returns>A double array containing the values (min, max, step) in this order</returns>
-    public double[] GetParameterBounds(string parameterName) {
-      var index = ControllableParameters.TakeWhile(x => x.Value != parameterName).Count();
-      if (index < ControllableParameters.Count) {
-        var min = ControllableParameterBounds[index, 0];
-        var max = ControllableParameterBounds[index, 1];
-        var step = ControllableParameterBounds[index, 2];
-        return new[] { min, max, step };
-      }
-      throw new ArgumentException(string.Format("GetParameterBounds: Unknown parameter {0}.", parameterName));
-    }
-
-    public void SetParameterBounds(string parameterName, double min, double max, double step) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameterName).Count();
-      if (i < ControllableParameterBounds.Rows) {
-        ControllableParameterBounds[i, 0] = min;
-        ControllableParameterBounds[i, 1] = max;
-        ControllableParameterBounds[i, 2] = step;
-        UpdateEncoding();
-        OnParametersChanged(this, EventArgs.Empty);
-      } else {
-        throw new ArgumentException(string.Format("SetParameterBounds: Invalid parameter name {0}", parameterName));
-      }
-
-    }
-
-    public double GetParameterStepSize(string parameter) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameter).Count();
-      if (i < ControllableParameterBounds.Rows)
-        return ControllableParameterBounds[i, 2];
-      throw new ArgumentException(string.Format("GetParameterStepSize: Invalid parameter name {0}", parameter));
-    }
-
-    public void SetParameterStepSize(string parameter, double stepSize) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameter).Count();
-      if (i < ControllableParameterBounds.Rows) {
-        ControllableParameterBounds[i, 2] = stepSize;
-        OnParametersChanged(this, EventArgs.Empty);
-        return;
-      }
-      throw new ArgumentException(string.Format("SetParameterStepSize: Invalid parameter name {0}", parameter));
-    }
-
-    public bool GetParameterActive(string parameter) {
-      var item = ControllableParameters.SingleOrDefault(x => x.Value == parameter);
-      if (item == null)
-        throw new ArgumentException(string.Format("GetParameterActive: Invalid target name {0}", parameter));
-      return ControllableParameters.ItemChecked(item);
-    }
-
-    public void SetParameterActive(string parameter, bool active) {
-      var item = ControllableParameters.SingleOrDefault(x => x.Value == parameter);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetParameterActive: Invalid target name {0}", parameter));
-      ControllableParameters.SetItemCheckedState(item, active);
-      OnParametersChanged(this, EventArgs.Empty);
-    }
-
-    public void SetControllableParameters(IEnumerable<string> parameterNames) {
-      ControllableParameters = new CheckedItemList<StringValue>();
-      foreach (var v in parameterNames) {
-        ControllableParameters.Add(new StringValue(v), false);
-      }
-      ControllableParameters.CheckedItemsChanged += ControllableParameters_OnItemsChanged;
-      ControllableParameterBounds = new DoubleMatrix(ControllableParameters.Count, 3);
-      ControllableParameterBounds.RowNames = GetControllableParameters();
-      ControllableParameterBounds.ColumnNames = new[] { "Min", "Max", "Step" };
-
-      for (int i = 0; i < ControllableParameters.Count; ++i) {
-        var itemName = ControllableParameters[i].Value;
-        var values = ProblemData.Dataset.GetReadOnlyDoubleValues(itemName).Where(x => !double.IsNaN(x) && !double.IsInfinity(x)).ToList();
-        if (!values.Any()) continue;
-
-        // add a 20% margin to allow the optimization algorithm more freedom of exploration
-        ControllableParameterBounds[i, 0] = 0.8 * values.Min(); // min
-        ControllableParameterBounds[i, 1] = 1.2 * values.Max(); // max
-        ControllableParameterBounds[i, 2] = 1e-6;               // step
-      }
-      OnParametersChanged(this, EventArgs.Empty);
-    }
-
-    public IEnumerable<string> GetControllableParameters() {
-      return ControllableParameters.Select(x => x.Value);
-    }
-
     public event EventHandler ParametersChanged;
-    private void OnParametersChanged(object sender, EventArgs args) {
-      var changed = ParametersChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion // process parameters
-    #endregion // IGoalSeekingProblem methods
-
-    #region data members
+    #endregion
+
+    private IEnumerable<GoalParameter> ActiveGoals {
+      get { return Goals.Where(x => x.Active); }
+    }
+    private IEnumerable<InputParameter> ActiveInputs {
+      get { return Inputs.Where(x => x.Active); }
+    }
+    private double QualitySumCutoff {
+      get { return QualitySumCutoffParameter.Value.Value; }
+    }
+
     [Storable]
     private ModifiableDataset dataset; // modifiable dataset
@@ -389,5 +129,4 @@
       get { return (ValueParameter<BoolArray>)Parameters["Maximization"]; }
     }
-    #endregion
 
     #region constructors
@@ -397,5 +136,4 @@
     private MultiObjectiveGoalSeekingProblem(MultiObjectiveGoalSeekingProblem original, Cloner cloner) : base(original, cloner) {
       this.dataset = cloner.Clone(original.dataset);
-      this.problemData = cloner.Clone(original.problemData);
 
       RegisterEvents();
@@ -408,56 +146,22 @@
     [StorableHook(HookType.AfterDeserialization)]
     private void AfterDeserialization() {
-      if (Parameters.ContainsKey("Accuracy"))
-        Parameters.Remove("Accuracy");
-
-      if (!Parameters.ContainsKey(QualitySumCutoffParameterName)) {
-        Parameters.Add(new FixedValueParameter<DoubleValue>(QualitySumCutoffParameterName, new DoubleValue(0.2)));
-        QualitySumCutoffParameter.Hidden = true;
-      }
-
-      if (ProblemData == null && Parameters.ContainsKey(ProblemDataParameterName)) {
-        ProblemData = ProblemDataParameter.Value;
-      }
-
-      if (!Parameters.ContainsKey(ModifiableDatasetParameterName)) {
-        Parameters.Add(new ValueParameter<IDataset>(ModifiableDatasetParameterName, dataset) { Hidden = true });
-      }
-
-      // backwards-compatibility
-      if (Parameters.ContainsKey("Models")) {
-        var solutions = ((IFixedValueParameter<ItemCollection<IRegressionSolution>>)Parameters["Models"]).Value;
-        var models = new ItemCollection<IRegressionModel>();
-        foreach (var solution in solutions) {
-          var model = solution.Model;
-          model.TargetVariable = solution.ProblemData.TargetVariable;
-          models.Add(model);
-        }
-        if (Parameters.ContainsKey(ModelCollectionParameterName))
-          Parameters.Remove(ModelCollectionParameterName);
-        Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelCollectionParameterName, models));
-      }
-
       RegisterEvents();
     }
 
     public MultiObjectiveGoalSeekingProblem() {
-      Parameters.Add(new ValueParameter<IRegressionProblemData>(ProblemDataParameterName, new RegressionProblemData()));
+      dataset = new ModifiableDataset();
       Parameters.Add(new ValueParameter<IDataset>(ModifiableDatasetParameterName, dataset) { Hidden = true });
-      Parameters.Add(new ValueParameter<CheckedItemList<StringValue>>(ControllableParametersParameterName));
-      Parameters.Add(new ValueParameter<CheckedItemList<StringValue>>(TargetsParameterName));
-      Parameters.Add(new ValueParameter<DoubleMatrix>(ControllableParameterBoundsParameterName));
-      Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelCollectionParameterName, new ItemCollection<IRegressionModel>()));
-      Parameters.Add(new ValueParameter<DoubleMatrix>(TargetGoalsParameterName)); // model target weights
-      Parameters.Add(new FixedValueParameter<IntValue>(RowParameterName));
+      Parameters.Add(new ValueParameter<CheckedItemList<InputParameter>>(InputsParameterName));
+      Parameters.Add(new ValueParameter<CheckedItemList<GoalParameter>>(GoalsParameterName));
+      Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelsParameterName, new ItemCollection<IRegressionModel>()));
       Parameters.Add(new FixedValueParameter<DoubleValue>(QualitySumCutoffParameterName, new DoubleValue(0.2)));
-
       QualitySumCutoffParameter.Hidden = true;
-
-      // when the problem is created, the problem data parameter will be set to a default value
-      // set the internal property to the same value
-      ProblemData = ProblemDataParameter.Value;
-
-      UpdateControllableParameters();
-      UpdateTargetList();
+      EncodingParameter.Hidden = true;
+      EvaluatorParameter.Hidden = true;
+      SolutionCreatorParameter.Hidden = true;
+      MaximizationParameter.Hidden = true;
+      GoalSeekingUtil.UpdateInputs(InputsParameter.Value, Models, InputParameterChanged);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+      GoalSeekingUtil.UpdateTargets(GoalsParameter.Value, Models, GoalParameterChanged);
       RegisterEvents();
     }
@@ -466,24 +170,18 @@
     public override double[] Evaluate(Individual individual, IRandom random) {
       var vector = individual.RealVector();
-      vector.ElementNames = ActiveParameters;
-
+      vector.ElementNames = ActiveInputs.Select(x => x.Name);
       int i = 0;
       // round vector according to parameter step sizes
-      foreach (var parameter in ControllableParameters.CheckedItems) {
-        var step = ControllableParameterBounds[parameter.Index, 2];
-        vector[i] = RoundToNearestStepMultiple(vector[i], step);
+      foreach (var parameter in ActiveInputs) {
+        vector[i] = RoundToNearestStepMultiple(vector[i], parameter.Step);
         ++i;
       }
       var estimatedValues = GetEstimatedGoalValues(vector, round: true);
-      var qualities = TargetList.CheckedItems.Zip(estimatedValues, (t, v) => new { Name = t.Value.Value, Index = t.Index, EstimatedValue = v })
-                                .Select(target => {
-                                  var goal = TargetGoals[target.Index, 0];
-                                  var weight = TargetGoals[target.Index, 1];
-                                  var variance = TargetGoals[target.Index, 2];
-                                  return weight * Math.Pow(target.EstimatedValue - goal, 2) / variance;
-                                });
+      var qualities = ActiveGoals.Zip(estimatedValues, (t, v) => new { Target = t, EstimatedValue = v })
+                                 .Select(x => x.Target.Weight * Math.Pow(x.EstimatedValue - x.Target.Goal, 2) / x.Target.Variance);
       return qualities.ToArray();
     }
 
+    #region pareto analyzer
     public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
       var matrix = FilterFrontsByQualitySum(individuals, qualities, Math.Max(QualitySumCutoff, qualities.Min(x => x.Sum())));
@@ -498,18 +196,18 @@
 
     private DoubleMatrix FilterFrontsByQualitySum(Individual[] individuals, double[][] qualities, double qualitySumCutoff) {
-      var activeParameters = ActiveParameters.ToList();
-      var activeTargets = ActiveTargets.ToList();
+      var activeParameters = ActiveInputs.ToList();
+      var activeGoals = ActiveGoals.ToList();
       var filteredModels = new List<double[]>();
       var rowNames = new List<string>();
       // build list of column names by combining target and parameter names (with their respective original and estimated values)
       var columnNames = new List<string> { "Quality Sum" };
-      foreach (var target in activeTargets) {
-        columnNames.Add(target);
-        columnNames.Add(target + " (estimated)");
-      }
-      foreach (var controllableParameter in activeParameters) {
-        columnNames.Add(controllableParameter);
-        columnNames.Add(controllableParameter + " (estimated)");
-        columnNames.Add(controllableParameter + " (deviation)");
+      foreach (var target in activeGoals) {
+        columnNames.Add(target.Name);
+        columnNames.Add(target.Name + " (estimated)");
+      }
+      foreach (var parameter in activeParameters) {
+        columnNames.Add(parameter.Name);
+        columnNames.Add(parameter.Name + " (estimated)");
+        columnNames.Add(parameter.Name + " (deviation)");
       }
       // filter models based on their quality sum; remove duplicate models
@@ -524,14 +222,14 @@
         rowValues[0] = qualitySum;
         int offset = 1;
-        for (int j = 0; j < activeTargets.Count * 2; j += 2) {
+        for (int j = 0; j < activeGoals.Count * 2; j += 2) {
           int k = j + offset;
-          var goal = GetTargetGoal(activeTargets[j / 2]);
+          var goal = activeGoals[j / 2].Goal;
           rowValues[k] = goal; // original value 
           rowValues[k + 1] = estimatedValues[j / 2]; // estimated value
         }
-        offset += activeTargets.Count * 2;
+        offset += activeGoals.Count * 2;
         for (int j = 0; j < activeParameters.Count * 3; j += 3) {
           int k = j + offset;
-          rowValues[k] = problemData.Dataset.GetDoubleValue(columnNames[k], Row);
+          rowValues[k] = 0; // TODO: figure this out and fix
           rowValues[k + 1] = vector[j / 3];
           rowValues[k + 2] = rowValues[k + 1] - rowValues[k];
@@ -550,134 +248,43 @@
       return matrix;
     }
+    #endregion
 
     #region event handlers
     private void RegisterEvents() {
-      ProblemDataParameter.ValueChanged += OnProblemDataChanged;
-      ModelCollectionParameter.Value.ItemsAdded += ModelCollection_OnItemsAdded;
-      ModelCollectionParameter.Value.ItemsRemoved += ModelCollection_OnItemsRemoved;
-      RowParameter.Value.ValueChanged += OnRowChanged;
-      ControllableParameters.CheckedItemsChanged += ControllableParameters_OnItemsChanged;
-      ControllableParameterBounds.ItemChanged += ControllableParameterBounds_ItemChanged;
-    }
-
-    private void OnRowChanged(object o, EventArgs e) {
-      // set variables in the modifiable dataset according to the new row
-      foreach (var v in dataset.DoubleVariables)
-        dataset.SetVariableValue(ProblemData.Dataset.GetDoubleValue(v, Row), v, 0);
-      // set the correct targets
-      UpdateTargetList();
-    }
-
-    private void OnProblemDataChanged(object o, EventArgs e) {
-      try {
-        ProblemData = ProblemDataParameter.Value;
-      }
-      catch (ArgumentException exception) {
-        MessageBox.Show(exception.Message, "Update Problem Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
-        ProblemDataParameter.Value = problemData;
-      }
-    }
-
-    private void ModelCollection_OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
-      if (e.Items == null) return;
-
-      var collection = (IObservableCollection<IRegressionModel>)sender;
-      var newItems = e.Items.ToList();
-
-      foreach (var model in e.Items) {
-        try {
-          CheckIfDatasetContainsTarget(model.TargetVariable);
-        }
-        catch (ArgumentException exception) {
-          MessageBox.Show(exception.Message, "Add Model", MessageBoxButtons.OK, MessageBoxIcon.Error);
-          newItems.Remove(model);
-          collection.Remove(model);
-        }
-      }
-      UpdateTargetList();
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    private void ModelCollection_OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
-      if (e.Items == null) return;
-      UpdateTargetList();
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    private void ControllableParameters_OnItemsChanged(object o, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> e) {
-      UpdateEncoding();
-    }
-
-    private void ControllableParameterBounds_ItemChanged(object o, EventArgs e) {
-      UpdateEncoding();
+      ModelsParameter.Value.ItemsAdded += ModelCollection_ItemsChanged;
+      ModelsParameter.Value.ItemsRemoved += ModelCollection_ItemsChanged;
+      GoalsParameter.Value.CheckedItemsChanged += GoalSeekingUtil.Goals_CheckedItemsChanged;
+      InputsParameter.Value.CheckedItemsChanged += GoalSeekingUtil.Inputs_CheckedItemsChanged;
+    }
+
+    private void ModelCollection_ItemsChanged(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
+      if (e.Items == null || !e.Items.Any()) return;
+      GoalSeekingUtil.UpdateInputs(InputsParameter.Value, Models, InputParameterChanged);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+      GoalSeekingUtil.UpdateTargets(GoalsParameter.Value, Models, GoalParameterChanged);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    private void InputParameterChanged(object sender, EventArgs args) {
+      var inputParameter = (InputParameter)sender;
+      var inputs = InputsParameter.Value;
+      if (inputs.ItemChecked(inputParameter) != inputParameter.Active)
+        inputs.SetItemCheckedState(inputParameter, inputParameter.Active);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+    }
+
+    private void GoalParameterChanged(object sender, EventArgs args) {
+      var goalParameter = (GoalParameter)sender;
+      var goals = GoalsParameter.Value;
+      if (goals.ItemChecked(goalParameter) != goalParameter.Active)
+        goals.SetItemCheckedState(goalParameter, goalParameter.Active);
     }
     #endregion
 
     #region helper methods
-    private void UpdateControllableParameters() {
-      if (ProblemData == null) return;
-      var variablesUsedForPrediction = ModelCollection.Any()
-        ? ModelCollection.SelectMany(x => x.VariablesUsedForPrediction).Distinct()
-        : ProblemData.Dataset.DoubleVariables;
-      SetControllableParameters(variablesUsedForPrediction);
-    }
-
-    private void UpdateTargetList() {
-      if (ProblemData == null) return;
-      if (!Models.Any()) {
-        TargetGoals = new DoubleMatrix();
-        maximization = new[] { false };
-        MaximizationParameter.Value = (BoolArray)new BoolArray(maximization).AsReadOnly();
-        TargetList = new CheckedItemList<StringValue>();
-        return;
-      }
-
-      var targetNames = Models.Select(x => x.TargetVariable).Distinct().ToList();
-      var oldTargetGoals = (DoubleMatrix)TargetGoals.Clone();
-      var oldRowIndices = oldTargetGoals.RowNames.Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i);
-      TargetGoals = new DoubleMatrix(targetNames.Count, 4);
-      TargetGoals.RowNames = targetNames;
-      TargetGoals.ColumnNames = new[] { "Goal", "Weight", "Variance", "Step size" };
-
-      TargetList = new CheckedItemList<StringValue>();
-      for (int i = 0; i < targetNames.Count; ++i) {
-        TargetList.Add(new StringValue(targetNames[i]), true);
-        int rowIndex;
-        if (oldRowIndices.TryGetValue(targetNames[i], out rowIndex)) {
-          for (int j = 0; j < TargetGoals.Columns; ++j)
-            TargetGoals[i, j] = oldTargetGoals[rowIndex, j];
-        } else {
-          TargetGoals[i, 0] = ProblemData.Dataset.GetDoubleValue(targetNames[i], Row);
-          TargetGoals[i, 1] = 1.0;
-          TargetGoals[i, 2] = ProblemData.Dataset.GetReadOnlyDoubleValues(targetNames[i]).Variance();
-          TargetGoals[i, 3] = 1e-6;
-        }
-      }
-      maximization = new bool[targetNames.Count];
-      MaximizationParameter.Value = (BoolArray)new BoolArray(maximization).AsReadOnly();
-    }
-
-    private void UpdateEncoding() {
-      var activeParameters = ActiveParameters.ToList();
-      if (Encoding == null)
-        Encoding = new RealVectorEncoding(activeParameters.Count);
-      else
-        Encoding.Length = activeParameters.Count;
-
-      Encoding.Bounds = new DoubleMatrix(activeParameters.Count, 2); // only two columns: min and max
-      Encoding.Bounds.RowNames = activeParameters;
-      Encoding.Bounds.ColumnNames = new[] { "Min.", "Max." };
-
-      int i = 0;
-      foreach (var item in ControllableParameters.CheckedItems) {
-        var index = item.Index;
-        Encoding.Bounds[i, 0] = ControllableParameterBounds[index, 0];
-        Encoding.Bounds[i, 1] = ControllableParameterBounds[index, 1];
-        ++i;
-      }
-    }
-
-    private bool IsValidTarget(string target) {
-      return TargetList.Any(x => x.Value == target);
+    // method which throws an exception that can be caught in the event handler if the check fails
+    private void CheckIfDatasetContainsTarget(string target) {
+      if (dataset.DoubleVariables.All(x => x != target))
+        throw new ArgumentException(string.Format("Model target \"{0}\" does not exist in the dataset.", target));
     }
     private static double RoundToNearestStepMultiple(double value, double step) {
@@ -685,5 +292,5 @@
     }
     private IEnumerable<IRegressionModel> GetModels(string target) {
-      return ModelCollection.Where(x => x.TargetVariable == target);
+      return Models.Where(x => x.TargetVariable == target);
     }
     private class DoubleEqualityComparer : IEqualityComparer<double> {
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/PreBuildEvent.cmd
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/PreBuildEvent.cmd	(revision 14333)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/PreBuildEvent.cmd	(revision 14333)
@@ -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
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/Properties/AssemblyInfo.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/Properties/AssemblyInfo.cs	(revision 14332)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/Properties/AssemblyInfo.cs	(revision 14333)
@@ -54,3 +54,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.11.14321")]
+[assembly: AssemblyFileVersion("3.3.11.14325")]
Index: /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/SingleObjectiveGoalSeekingProblem.cs
===================================================================
--- /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/SingleObjectiveGoalSeekingProblem.cs	(revision 14332)
+++ /branches/HeuristicLab.GoalSeekingProblem/HeuristicLab.GoalSeekingProblem/3.4/SingleObjectiveGoalSeekingProblem.cs	(revision 14333)
@@ -23,9 +23,7 @@
 using System.Collections.Generic;
 using System.Linq;
-using System.Windows.Forms;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HeuristicLab.Data;
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Optimization;
@@ -41,138 +39,163 @@
     #region parameter names
     private const string ModifiableDatasetParameterName = "Dataset";
-    private const string ProblemDataParameterName = "ProblemData";
-    private const string ControllableParametersParameterName = "ControllableParameters";
-    private const string ControllableParameterBoundsParameterName = "ControllableParameterBounds";
-    private const string TargetGoalsParameterName = "TargetGoals";
-    private const string TargetsParameterName = "Targets";
-    private const string ModelCollectionParameterName = "ModelCollection";
-    private const string RowParameterName = "Row";
-    // these parameters are used by the pareto folding analyzer
-    private const string AllowedRangesParameterName = "AllowedRanges";
-    private const string QualitySumCutoffParameterName = "QualitySumCutoff";
+    private const string InputsParameterName = "Inputs";
+    private const string GoalsParameterName = "Goals";
+    private const string ModelsParameterName = "Models";
     #endregion
 
     #region parameters
-    public IValueParameter<RealVector> AllowedRangesParameter {
-      get { return (IValueParameter<RealVector>)Parameters[AllowedRangesParameterName]; }
-    }
-    public IFixedValueParameter<DoubleValue> QualitySumCutoffParameter {
-      get { return (IFixedValueParameter<DoubleValue>)Parameters[QualitySumCutoffParameterName]; }
-    }
-    public IValueParameter<IRegressionProblemData> ProblemDataParameter {
-      get { return (IValueParameter<IRegressionProblemData>)Parameters[ProblemDataParameterName]; }
-    }
-    public IValueParameter<CheckedItemList<StringValue>> ControllableParametersParameter {
-      get { return (IValueParameter<CheckedItemList<StringValue>>)Parameters[ControllableParametersParameterName]; }
-    }
-    public IValueParameter<DoubleMatrix> ControllableParameterBoundsParameter {
-      get { return (IValueParameter<DoubleMatrix>)Parameters[ControllableParameterBoundsParameterName]; }
-    }
-    public IFixedValueParameter<ItemCollection<IRegressionModel>> ModelCollectionParameter {
-      get { return (IFixedValueParameter<ItemCollection<IRegressionModel>>)Parameters[ModelCollectionParameterName]; }
-    }
-    public IValueParameter<CheckedItemList<StringValue>> TargetsParameter {
-      get { return (IValueParameter<CheckedItemList<StringValue>>)Parameters[TargetsParameterName]; }
-    }
-    public IValueParameter<DoubleMatrix> TargetGoalsParameter {
-      get { return (IValueParameter<DoubleMatrix>)Parameters[TargetGoalsParameterName]; }
-    }
-    public IFixedValueParameter<IntValue> RowParameter {
-      get { return (IFixedValueParameter<IntValue>)Parameters[RowParameterName]; }
-    }
-    #endregion
-
-    #region parameter properties
-    private IItemCollection<IRegressionModel> ModelCollection {
-      get { return ModelCollectionParameter.Value; }
-    }
-    public DoubleMatrix TargetGoals {
-      get { return TargetGoalsParameter.Value; }
-      set { TargetGoalsParameter.Value = value; }
-    }
-    #endregion
-
-    #region IProcessParameterOptimizationProblem properties
-    [Storable]
-    private IRegressionProblemData problemData;
-    public IRegressionProblemData ProblemData {
-      get { return problemData; }
-      set {
-        if (value == null || value == problemData) return;
-        var variables = value.Dataset.DoubleVariables.ToList();
-        if (Models.Any()) {
-          var targets = Models.Select(x => x.TargetVariable);
-          var hashset = new HashSet<string>(variables);
-          foreach (var target in targets) {
-            if (!hashset.Contains(target)) {
-              throw new ArgumentException(string.Format("Incompatible problem data. Target \"{0}\" is missing.", target));
-            }
-          }
-        }
-        problemData = value;
-        dataset = new ModifiableDataset(variables, variables.Select(x => new List<double> { ProblemData.Dataset.GetDoubleValue(x, Row) }));
-        ProblemDataParameter.Value = ProblemData;
-        UpdateControllableParameters();
-        UpdateTargetList();
-      }
-    }
-
-    public int Row {
-      get { return RowParameter.Value.Value; }
-      set { RowParameter.Value.Value = value; }
-    }
-
+    public IValueParameter<CheckedItemList<InputParameter>> InputsParameter {
+      get { return (IValueParameter<CheckedItemList<InputParameter>>)Parameters[InputsParameterName]; }
+    }
+    public IValueParameter<CheckedItemList<GoalParameter>> GoalsParameter {
+      get { return (IValueParameter<CheckedItemList<GoalParameter>>)Parameters[GoalsParameterName]; }
+    }
+    public IFixedValueParameter<ItemCollection<IRegressionModel>> ModelsParameter {
+      get { return (IFixedValueParameter<ItemCollection<IRegressionModel>>)Parameters[ModelsParameterName]; }
+    }
+    #endregion
+
+    #region IGoalSeekingProblem implementation
     public IEnumerable<IRegressionModel> Models {
-      get { return ModelCollectionParameter.Value; }
-    }
-
-    #region targets
-    public ICheckedItemList<StringValue> TargetList {
-      get { return TargetsParameter.Value; }
-      set { TargetsParameter.Value = (CheckedItemList<StringValue>)value; }
-    }
-    private IEnumerable<string> ActiveTargets {
-      get { return TargetList.CheckedItems.Select(x => x.Value.Value); }
-    }
-    #endregion
-
-    #region parameters
-    private IEnumerable<string> ActiveParameters {
-      get { return ControllableParameters.CheckedItems.Select(x => x.Value.Value); }
-    }
-    public ICheckedItemList<StringValue> ControllableParameters {
-      get { return ControllableParametersParameter.Value; }
-      set { ControllableParametersParameter.Value = (CheckedItemList<StringValue>)value; }
-    }
-    public DoubleMatrix ControllableParameterBounds {
-      get { return ControllableParameterBoundsParameter.Value; }
-      set { ControllableParameterBoundsParameter.Value = value; }
-    }
-    #endregion
-    #endregion
-
-    #region IProcessParameterOptimizationProblem methods
-    #region solutions
+      get { return ModelsParameter.Value; }
+    }
+
+    public IEnumerable<GoalParameter> Goals {
+      get { return GoalsParameter.Value; }
+    }
+
+    public IEnumerable<InputParameter> Inputs {
+      get { return InputsParameter.Value; }
+    }
+
+    public void AddModel(IRegressionModel model) {
+      var models = ModelsParameter.Value;
+      models.Add(model);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    public void RemoveModel(IRegressionModel model) {
+      var models = ModelsParameter.Value;
+      models.Remove(model);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    public void Configure(IRegressionProblemData problemData, int row) {
+      GoalSeekingUtil.Configure(Goals, Inputs, problemData, row);
+    }
+
     public IEnumerable<double> GetEstimatedGoalValues(IEnumerable<double> parameterValues, bool round = false) {
       var ds = (ModifiableDataset)dataset.Clone();
-      foreach (var parameter in ActiveParameters.Zip(parameterValues, (p, v) => new { Name = p, Value = v })) {
+      foreach (var parameter in ActiveInputs.Zip(parameterValues, (p, v) => new { Name = p.Name, Value = v })) {
         ds.SetVariableValue(parameter.Value, parameter.Name, 0);
       }
       var rows = new[] { 0 }; // actually just one row
-
       var estimatedValues =
-        round ? ActiveTargets.Select(t => RoundToNearestStepMultiple(GetModels(t).Average(m => m.GetEstimatedValues(ds, rows).Single()), GetTargetStepSize(t)))
-              : ActiveTargets.Select(t => GetModels(t).Average(m => m.GetEstimatedValues(ds, rows).Single()));
-
+        round ? ActiveGoals.Select(t => RoundToNearestStepMultiple(GetModels(t.Name).Average(m => m.GetEstimatedValues(ds, rows).Single()), t.Step))
+              : ActiveGoals.Select(t => GetModels(t.Name).Average(m => m.GetEstimatedValues(ds, rows).Single()));
       return estimatedValues;
     }
 
-    public void AddModel(IRegressionModel model) {
-      var target = model.TargetVariable;
-      CheckIfDatasetContainsTarget(target);
-      ModelCollection.Add(model);
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
+    public event EventHandler ModelsChanged;
+    public event EventHandler TargetsChanged;
+    public event EventHandler ParametersChanged;
+    #endregion
+
+    private IEnumerable<GoalParameter> ActiveGoals {
+      get { return Goals.Where(x => x.Active); }
+    }
+    private IEnumerable<InputParameter> ActiveInputs {
+      get { return Inputs.Where(x => x.Active); }
+    }
+
+    [Storable]
+    private ModifiableDataset dataset; // modifiable dataset
+
+    public override bool Maximization {
+      get { return false; }
+    }
+
+    #region constructors
+    [StorableConstructor]
+    private SingleObjectiveGoalSeekingProblem(bool deserializing) : base(deserializing) { }
+
+    private SingleObjectiveGoalSeekingProblem(SingleObjectiveGoalSeekingProblem original, Cloner cloner) : base(original, cloner) {
+      this.dataset = cloner.Clone(original.dataset);
+      RegisterEvents();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveGoalSeekingProblem(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    public SingleObjectiveGoalSeekingProblem() {
+      dataset = new ModifiableDataset();
+      Parameters.Add(new ValueParameter<IDataset>(ModifiableDatasetParameterName, dataset) { Hidden = true });
+      Parameters.Add(new ValueParameter<CheckedItemList<InputParameter>>(InputsParameterName));
+      Parameters.Add(new ValueParameter<CheckedItemList<GoalParameter>>(GoalsParameterName));
+      Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelsParameterName, new ItemCollection<IRegressionModel>()));
+      EncodingParameter.Hidden = true;
+      EvaluatorParameter.Hidden = true;
+      SolutionCreatorParameter.Hidden = true;
+      GoalSeekingUtil.UpdateInputs(InputsParameter.Value, Models, InputParameterChanged);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+      GoalSeekingUtil.UpdateTargets(GoalsParameter.Value, Models, GoalParameterChanged);
+      RegisterEvents();
+    }
+    #endregion
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var vector = individual.RealVector();
+      vector.ElementNames = ActiveInputs.Select(x => x.Name);
+      int i = 0;
+      // round vector according to parameter step sizes
+      foreach (var parameter in ActiveInputs) {
+        vector[i] = RoundToNearestStepMultiple(vector[i], parameter.Step);
+        ++i;
+      }
+      var estimatedValues = GetEstimatedGoalValues(vector, round: true);
+      var quality = ActiveGoals.Zip(estimatedValues, (t, v) => new { Target = t, EstimatedValue = v })
+                               .Average(x => x.Target.Weight * Math.Pow(x.EstimatedValue - x.Target.Goal, 2) / x.Target.Variance);
+      return quality;
+    }
+    #region event handlers
+
+    private void RegisterEvents() {
+      ModelsParameter.Value.ItemsAdded += ModelCollection_ItemsChanged;
+      ModelsParameter.Value.ItemsRemoved += ModelCollection_ItemsChanged;
+      GoalsParameter.Value.CheckedItemsChanged += GoalSeekingUtil.Goals_CheckedItemsChanged;
+      InputsParameter.Value.CheckedItemsChanged += GoalSeekingUtil.Inputs_CheckedItemsChanged;
+    }
+
+    private void ModelCollection_ItemsChanged(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
+      if (e.Items == null || !e.Items.Any()) return;
+      GoalSeekingUtil.UpdateInputs(InputsParameter.Value, Models, InputParameterChanged);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+      GoalSeekingUtil.UpdateTargets(GoalsParameter.Value, Models, GoalParameterChanged);
+      GoalSeekingUtil.RaiseEvent(this, ModelsChanged);
+    }
+
+    private void InputParameterChanged(object sender, EventArgs args) {
+      var inputParameter = (InputParameter)sender;
+      var inputs = InputsParameter.Value;
+      if (inputs.ItemChecked(inputParameter) != inputParameter.Active)
+        inputs.SetItemCheckedState(inputParameter, inputParameter.Active);
+      Encoding = GoalSeekingUtil.CreateEncoding(ActiveInputs);
+    }
+
+    private void GoalParameterChanged(object sender, EventArgs args) {
+      var goalParameter = (GoalParameter)sender;
+      var goals = GoalsParameter.Value;
+      if (goals.ItemChecked(goalParameter) != goalParameter.Active)
+        goals.SetItemCheckedState(goalParameter, goalParameter.Active);
+    }
+    #endregion
+
+    #region helper methods
     // method which throws an exception that can be caught in the event handler if the check fails
     private void CheckIfDatasetContainsTarget(string target) {
@@ -181,413 +204,11 @@
     }
 
-    public void RemoveModel(IRegressionModel model) {
-      ModelCollection.Remove(model);
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    public event EventHandler ModelsChanged;
-    private void OnModelsChanged(object sender, EventArgs args) {
-      var changed = ModelsChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion
-
-    #region targets
-    public bool GetTargetActive(string target) {
-      var item = TargetList.SingleOrDefault(x => x.Value == target);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetTargetActive: Invalid target name {0}", target));
-      return TargetList.ItemChecked(item);
-    }
-
-    public void SetTargetActive(string target, bool active) {
-      var item = TargetList.SingleOrDefault(x => x.Value == target);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetTargetActive: Invalid target name {0}", target));
-      TargetList.SetItemCheckedState(item, active);
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetGoal(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 0];
-    }
-
-    public void SetTargetGoal(string target, double goal) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 0] = goal;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetWeight(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 1];
-    }
-
-    public void SetTargetWeight(string target, double weight) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 1] = weight;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetVariance(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 2];
-    }
-
-    public void SetTargetVariance(string target, double variance) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 2] = variance;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public double GetTargetStepSize(string target) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      return TargetGoals[i, 3];
-    }
-
-    public void SetTargetStepSize(string target, double stepSize) {
-      if (!IsValidTarget(target))
-        throw new ArgumentException(string.Format("The target variable name \"{0}\" does not exist in the dataset.", target));
-      int i = TargetGoals.RowNames.TakeWhile(x => x != target).Count();
-      TargetGoals[i, 3] = stepSize;
-      OnTargetsChanged(this, EventArgs.Empty);
-    }
-
-    public event EventHandler TargetsChanged;
-    private void OnTargetsChanged(object sender, EventArgs args) {
-      var changed = TargetsChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion // targets
-
-    #region process parameters
-    /// <summary>
-    /// Returns the parameter bounds (min and max) and the step size for the specified parameter
-    /// </summary>
-    /// <param name="parameterName"></param>
-    /// <returns>A double array containing the values (min, max, step) in this order</returns>
-    public double[] GetParameterBounds(string parameterName) {
-      var index = ControllableParameters.TakeWhile(x => x.Value != parameterName).Count();
-      if (index < ControllableParameters.Count) {
-        var min = ControllableParameterBounds[index, 0];
-        var max = ControllableParameterBounds[index, 1];
-        var step = ControllableParameterBounds[index, 2];
-        return new[] { min, max, step };
-      }
-      throw new ArgumentException(string.Format("GetParameterBounds: Unknown parameter {0}.", parameterName));
-    }
-
-    public void SetParameterBounds(string parameterName, double min, double max, double step) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameterName).Count();
-      if (i < ControllableParameterBounds.Rows) {
-        ControllableParameterBounds[i, 0] = min;
-        ControllableParameterBounds[i, 1] = max;
-        ControllableParameterBounds[i, 2] = step;
-        UpdateEncoding();
-        OnParametersChanged(this, EventArgs.Empty);
-      } else {
-        throw new ArgumentException(string.Format("SetParameterBounds: Invalid parameter name {0}", parameterName));
-      }
-    }
-
-    public double GetParameterStepSize(string parameter) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameter).Count();
-      if (i < ControllableParameterBounds.Rows)
-        return ControllableParameterBounds[i, 2];
-      throw new ArgumentException(string.Format("GetParameterStepSize: Invalid parameter name {0}", parameter));
-    }
-
-    public void SetParameterStepSize(string parameter, double stepSize) {
-      int i = ControllableParameterBounds.RowNames.TakeWhile(x => x != parameter).Count();
-      if (i < ControllableParameterBounds.Rows) {
-        ControllableParameterBounds[i, 2] = stepSize;
-        OnParametersChanged(this, EventArgs.Empty);
-        return;
-      }
-      throw new ArgumentException(string.Format("SetParameterStepSize: Invalid parameter name {0}", parameter));
-    }
-
-    public bool GetParameterActive(string parameter) {
-      var item = ControllableParameters.SingleOrDefault(x => x.Value == parameter);
-      if (item == null)
-        throw new ArgumentException(string.Format("GetParameterActive: Invalid target name {0}", parameter));
-      return ControllableParameters.ItemChecked(item);
-    }
-
-    public void SetParameterActive(string parameter, bool active) {
-      var item = ControllableParameters.SingleOrDefault(x => x.Value == parameter);
-      if (item == null)
-        throw new ArgumentException(string.Format("SetParameterActive: Invalid target name {0}", parameter));
-      ControllableParameters.SetItemCheckedState(item, active);
-      OnParametersChanged(this, EventArgs.Empty);
-    }
-
-    public void SetControllableParameters(IEnumerable<string> parameterNames) {
-      ControllableParameters = new CheckedItemList<StringValue>();
-      foreach (var v in parameterNames) {
-        ControllableParameters.Add(new StringValue(v), false);
-      }
-      ControllableParameters.CheckedItemsChanged += ControllableParameters_OnItemsChanged;
-      ControllableParameterBounds = new DoubleMatrix(ControllableParameters.Count, 3);
-      ControllableParameterBounds.RowNames = GetControllableParameters();
-      ControllableParameterBounds.ColumnNames = new[] { "Min", "Max", "Step" };
-
-      for (int i = 0; i < ControllableParameters.Count; ++i) {
-        var itemName = ControllableParameters[i].Value;
-        var values = ProblemData.Dataset.GetReadOnlyDoubleValues(itemName).Where(x => !double.IsNaN(x) && !double.IsInfinity(x)).ToList();
-        if (!values.Any()) continue;
-
-        // add a 20% margin to allow the optimization algorithm more freedom of exploration
-        ControllableParameterBounds[i, 0] = 0.8 * values.Min(); // min
-        ControllableParameterBounds[i, 1] = 1.2 * values.Max(); // max
-        ControllableParameterBounds[i, 2] = 1e-6;               // step
-      }
-      OnParametersChanged(this, EventArgs.Empty);
-    }
-
-    public IEnumerable<string> GetControllableParameters() {
-      return ControllableParameters.Select(x => x.Value);
-    }
-
-    public event EventHandler ParametersChanged;
-    private void OnParametersChanged(object sender, EventArgs args) {
-      var changed = ParametersChanged;
-      if (changed == null) return;
-      changed(sender, args);
-    }
-    #endregion // process parameters
-    #endregion // IGoalSeekingProblem methods
-
-    #region data members
-    [Storable]
-    private ModifiableDataset dataset; // modifiable dataset
-
-    public override bool Maximization {
-      get { return false; }
-    }
-    #endregion
-
-    #region constructors
-    [StorableConstructor]
-    private SingleObjectiveGoalSeekingProblem(bool deserializing) : base(deserializing) { }
-
-    private SingleObjectiveGoalSeekingProblem(SingleObjectiveGoalSeekingProblem original, Cloner cloner) : base(original, cloner) {
-      this.dataset = cloner.Clone(original.dataset);
-      this.problemData = cloner.Clone(original.problemData);
-
-      RegisterEvents();
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new SingleObjectiveGoalSeekingProblem(this, cloner);
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      // backwards-compatibility
-      if (Parameters.ContainsKey("Models")) {
-        var solutions = ((IFixedValueParameter<ItemCollection<IRegressionSolution>>)Parameters["Models"]).Value;
-        var models = new ItemCollection<IRegressionModel>();
-        foreach (var solution in solutions) {
-          var model = solution.Model;
-          model.TargetVariable = solution.ProblemData.TargetVariable;
-          models.Add(model);
-        }
-        if (Parameters.ContainsKey(ModelCollectionParameterName))
-          Parameters.Remove(ModelCollectionParameterName);
-        Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelCollectionParameterName, models));
-      }
-
-      RegisterEvents();
-    }
-
-    public SingleObjectiveGoalSeekingProblem() {
-      Parameters.Add(new ValueParameter<IRegressionProblemData>(ProblemDataParameterName, new RegressionProblemData()));
-      Parameters.Add(new ValueParameter<IDataset>(ModifiableDatasetParameterName, dataset) { Hidden = true });
-      Parameters.Add(new ValueParameter<CheckedItemList<StringValue>>(ControllableParametersParameterName));
-      Parameters.Add(new ValueParameter<CheckedItemList<StringValue>>(TargetsParameterName));
-      Parameters.Add(new ValueParameter<DoubleMatrix>(ControllableParameterBoundsParameterName));
-      Parameters.Add(new FixedValueParameter<ItemCollection<IRegressionModel>>(ModelCollectionParameterName, new ItemCollection<IRegressionModel>()));
-      Parameters.Add(new ValueParameter<DoubleMatrix>(TargetGoalsParameterName)); // model target weights
-      Parameters.Add(new FixedValueParameter<IntValue>(RowParameterName));
-
-      // when the problem is created, the problem data parameter will be set to a default value
-      // set the internal property to the same value
-      ProblemData = ProblemDataParameter.Value;
-
-      UpdateControllableParameters();
-      UpdateTargetList();
-      RegisterEvents();
-    }
-    #endregion
-
-    public override double Evaluate(Individual individual, IRandom random) {
-      var vector = individual.RealVector();
-      vector.ElementNames = ActiveParameters;
-      int i = 0;
-      // round vector according to parameter step sizes
-      foreach (var parameter in ControllableParameters.CheckedItems) {
-        var step = ControllableParameterBounds[parameter.Index, 2];
-        vector[i] = RoundToNearestStepMultiple(vector[i], step);
-        ++i;
-      }
-      var estimatedValues = GetEstimatedGoalValues(vector, round: true);
-      var quality = TargetList.CheckedItems.Zip(estimatedValues, (t, v) => new { Name = t.Value.Value, Index = t.Index, EstimatedValue = v })
-                                .Average(target => {
-                                  var goal = TargetGoals[target.Index, 0];
-                                  var weight = TargetGoals[target.Index, 1];
-                                  var variance = TargetGoals[target.Index, 2];
-                                  return weight * Math.Pow(target.EstimatedValue - goal, 2) / variance;
-                                });
-      return quality;
-    }
-
-    #region event handlers
-    private void RegisterEvents() {
-      ProblemDataParameter.ValueChanged += OnProblemDataChanged;
-      ModelCollectionParameter.Value.ItemsAdded += ModelCollection_OnItemsAdded;
-      ModelCollectionParameter.Value.ItemsRemoved += ModelCollection_OnItemsRemoved;
-      RowParameter.Value.ValueChanged += OnRowChanged;
-      ControllableParameters.CheckedItemsChanged += ControllableParameters_OnItemsChanged;
-      ControllableParameterBounds.ItemChanged += ControllableParameterBounds_ItemChanged;
-    }
-
-    private void OnRowChanged(object o, EventArgs e) {
-      // set variables in the modifiable dataset according to the new row
-      foreach (var v in dataset.DoubleVariables)
-        dataset.SetVariableValue(ProblemData.Dataset.GetDoubleValue(v, Row), v, 0);
-      // set the correct targets
-      UpdateTargetList();
-    }
-
-    private void OnProblemDataChanged(object o, EventArgs e) {
-      try {
-        ProblemData = ProblemDataParameter.Value;
-      }
-      catch (ArgumentException exception) {
-        MessageBox.Show(exception.Message, "Update Problem Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
-        ProblemDataParameter.Value = problemData;
-      }
-    }
-
-    private void ModelCollection_OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
-      if (e.Items == null) return;
-
-      var collection = (IObservableCollection<IRegressionModel>)sender;
-      var newItems = e.Items.ToList();
-
-      foreach (var model in e.Items) {
-        try {
-          CheckIfDatasetContainsTarget(model.TargetVariable);
-        }
-        catch (ArgumentException exception) {
-          MessageBox.Show(exception.Message, "Add Model", MessageBoxButtons.OK, MessageBoxIcon.Error);
-          newItems.Remove(model);
-          collection.Remove(model);
-        }
-      }
-      UpdateTargetList();
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    private void ModelCollection_OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRegressionModel> e) {
-      if (e.Items == null) return;
-      UpdateTargetList();
-      OnModelsChanged(this, EventArgs.Empty);
-    }
-
-    private void ControllableParameters_OnItemsChanged(object o, CollectionItemsChangedEventArgs<IndexedItem<StringValue>> e) {
-      UpdateEncoding();
-    }
-
-    private void ControllableParameterBounds_ItemChanged(object o, EventArgs e) {
-      UpdateEncoding();
-    }
-    #endregion
-
-    #region helper methods
-    private void UpdateControllableParameters() {
-      if (ProblemData == null) return;
-      var variablesUsedForPrediction = ModelCollection.Any()
-        ? ModelCollection.SelectMany(x => x.VariablesUsedForPrediction).Distinct()
-        : ProblemData.Dataset.DoubleVariables;
-      SetControllableParameters(variablesUsedForPrediction);
-    }
-
-    private void UpdateTargetList() {
-      if (ProblemData == null) return;
-      if (!Models.Any()) {
-        TargetGoals = new DoubleMatrix();
-        TargetList = new CheckedItemList<StringValue>();
-        return;
-      }
-      var targetNames = Models.Select(x => x.TargetVariable).Distinct().ToList();
-      var oldTargetGoals = (DoubleMatrix)TargetGoals.Clone();
-      var oldRowIndices = oldTargetGoals.RowNames.Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i);
-      TargetGoals = new DoubleMatrix(targetNames.Count, 4);
-      TargetGoals.RowNames = targetNames;
-      TargetGoals.ColumnNames = new[] { "Goal", "Weight", "Variance", "Step size" };
-
-      TargetList = new CheckedItemList<StringValue>();
-      for (int i = 0; i < targetNames.Count; ++i) {
-        TargetList.Add(new StringValue(targetNames[i]), true);
-        int rowIndex;
-        if (oldRowIndices.TryGetValue(targetNames[i], out rowIndex)) {
-          for (int j = 0; j < TargetGoals.Columns; ++j)
-            TargetGoals[i, j] = oldTargetGoals[rowIndex, j];
-        } else {
-          TargetGoals[i, 0] = ProblemData.Dataset.GetDoubleValue(targetNames[i], Row);
-          TargetGoals[i, 1] = 1.0;
-          TargetGoals[i, 2] = ProblemData.Dataset.GetReadOnlyDoubleValues(targetNames[i]).Variance();
-          TargetGoals[i, 3] = 1e-6;
-        }
-      }
-    }
-
-    private void UpdateEncoding() {
-      var activeParameters = ActiveParameters.ToList();
-      if (Encoding == null)
-        Encoding = new RealVectorEncoding(activeParameters.Count);
-      else
-        Encoding.Length = activeParameters.Count;
-
-      Encoding.Bounds = new DoubleMatrix(activeParameters.Count, 2); // only two columns: min and max
-      Encoding.Bounds.RowNames = activeParameters;
-      Encoding.Bounds.ColumnNames = new[] { "Min.", "Max." };
-
-      int i = 0;
-      foreach (var item in ControllableParameters.CheckedItems) {
-        var index = item.Index;
-        Encoding.Bounds[i, 0] = ControllableParameterBounds[index, 0];
-        Encoding.Bounds[i, 1] = ControllableParameterBounds[index, 1];
-        ++i;
-      }
-    }
-    private bool IsValidTarget(string target) {
-      return TargetList.Any(x => x.Value == target);
-    }
+    private IEnumerable<IRegressionModel> GetModels(string target) {
+      return Models.Where(x => x.TargetVariable == target);
+    }
+
     private static double RoundToNearestStepMultiple(double value, double step) {
       return step * (long)Math.Round(value / step);
     }
-    private IEnumerable<IRegressionModel> GetModels(string target) {
-      return ModelCollection.Where(x => x.TargetVariable == target);
-    }
     #endregion
   }
