Index: /stable/HeuristicLab 3.3.sln
===================================================================
--- /stable/HeuristicLab 3.3.sln	(revision 13278)
+++ /stable/HeuristicLab 3.3.sln	(revision 13279)
@@ -432,11 +432,9 @@
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Instances.Orienteering-3.3", "HeuristicLab.Problems.Instances.Orienteering\3.3\HeuristicLab.Problems.Instances.Orienteering-3.3.csproj", "{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ArtificialAnt-3.5", "HeuristicLab.Problems.ArtificialAnt\3.5\HeuristicLab.Problems.ArtificialAnt-3.5.csproj", "{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ArtificialAnt.Views-3.5", "HeuristicLab.Problems.ArtificialAnt.Views\3.5\HeuristicLab.Problems.ArtificialAnt.Views-3.5.csproj", "{0ABD192C-926A-47A9-878C-79B6AF5C07C9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.LawnMower-3.4", "HeuristicLab.Problems.LawnMower\3.4\HeuristicLab.Problems.LawnMower-3.4.csproj", "{9B44B886-729D-49B2-B887-4BDCACB91110}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.LawnMower.Views-3.4", "HeuristicLab.Problems.LawnMower.Views\3.4\HeuristicLab.Problems.LawnMower.Views-3.4.csproj", "{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.GeneticProgramming-3.3", "HeuristicLab.Problems.GeneticProgramming\3.3\HeuristicLab.Problems.GeneticProgramming-3.3.csproj", "{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.GrammaticalEvolution-3.4", "HeuristicLab.Problems.GrammaticalEvolution\3.4\HeuristicLab.Problems.GrammaticalEvolution-3.4.csproj", "{9372D115-D933-40D2-BD29-A2C1EAC35874}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.GeneticProgramming.Views-3.3", "HeuristicLab.Problems.GeneticProgramming.Views\3.3\HeuristicLab.Problems.GeneticProgramming.Views-3.3.csproj", "{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}"
 EndProject
 Global
@@ -2106,52 +2104,40 @@
 		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|x86.ActiveCfg = Release|x86
 		{B37BF2DD-752C-456A-9DEF-FF5B41FC3C77}.Release|x86.Build.0 = Release|x86
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|x64.ActiveCfg = Debug|x64
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|x64.Build.0 = Debug|x64
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|x86.ActiveCfg = Debug|x86
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Debug|x86.Build.0 = Debug|x86
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|Any CPU.Build.0 = Release|Any CPU
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|x64.ActiveCfg = Release|x64
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|x64.Build.0 = Release|x64
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|x86.ActiveCfg = Release|x86
-		{FCB5E075-4B97-4CB9-BB36-848E4FF9EA18}.Release|x86.Build.0 = Release|x86
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|x64.ActiveCfg = Debug|x64
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|x64.Build.0 = Debug|x64
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|x86.ActiveCfg = Debug|x86
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Debug|x86.Build.0 = Debug|x86
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|x64.ActiveCfg = Release|x64
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|x64.Build.0 = Release|x64
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|x86.ActiveCfg = Release|x86
-		{0ABD192C-926A-47A9-878C-79B6AF5C07C9}.Release|x86.Build.0 = Release|x86
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|x64.ActiveCfg = Debug|x64
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|x64.Build.0 = Debug|x64
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|x86.ActiveCfg = Debug|x86
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Debug|x86.Build.0 = Debug|x86
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|Any CPU.Build.0 = Release|Any CPU
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|x64.ActiveCfg = Release|x64
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|x64.Build.0 = Release|x64
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|x86.ActiveCfg = Release|x86
-		{9B44B886-729D-49B2-B887-4BDCACB91110}.Release|x86.Build.0 = Release|x86
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|x64.ActiveCfg = Debug|x64
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|x64.Build.0 = Debug|x64
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|x86.ActiveCfg = Debug|x86
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Debug|x86.Build.0 = Debug|x86
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|Any CPU.Build.0 = Release|Any CPU
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|x64.ActiveCfg = Release|x64
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|x64.Build.0 = Release|x64
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|x86.ActiveCfg = Release|x86
-		{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}.Release|x86.Build.0 = Release|x86
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|x64.ActiveCfg = Debug|x64
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|x64.Build.0 = Debug|x64
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|x86.ActiveCfg = Debug|x86
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Debug|x86.Build.0 = Debug|x86
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|x64.ActiveCfg = Release|x64
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|x64.Build.0 = Release|x64
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|x86.ActiveCfg = Release|x86
+		{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}.Release|x86.Build.0 = Release|x86
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|x64.ActiveCfg = Debug|x64
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|x64.Build.0 = Debug|x64
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|x86.ActiveCfg = Debug|x86
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Debug|x86.Build.0 = Debug|x86
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|x64.ActiveCfg = Release|x64
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|x64.Build.0 = Release|x64
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|x86.ActiveCfg = Release|x86
+		{9372D115-D933-40D2-BD29-A2C1EAC35874}.Release|x86.Build.0 = Release|x86
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|x64.ActiveCfg = Debug|x64
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|x64.Build.0 = Debug|x64
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|x86.ActiveCfg = Debug|x86
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Debug|x86.Build.0 = Debug|x86
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|x64.ActiveCfg = Release|x64
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|x64.Build.0 = Release|x64
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|x86.ActiveCfg = Release|x86
+		{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
@@ -2159,9 +2145,10 @@
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
-		{5E516C4F-9935-437F-8B15-ECEF4451744E} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
-		{0C67A033-F6D9-4237-B3CA-C033A44706BE} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 		{3083C7AA-5AF4-4C75-BA19-B69B86E2F66A} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 		{9A04599C-D608-4240-8DA6-D41F51C515A3} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 		{71CDE004-C50F-48DF-858E-AB0AAA3537BC} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
+		{5E516C4F-9935-437F-8B15-ECEF4451744E} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
+		{0C67A033-F6D9-4237-B3CA-C033A44706BE} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
+		{7FC70D74-1813-48B7-9CE5-0BD913457579} = {D1B1DE45-F9C7-4FBF-B73C-E759BC4223D5}
 	EndGlobalSection
 EndGlobal
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.Designer.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.Designer.cs	(revision 13279)
@@ -0,0 +1,81 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.ArtificialAnt {
+  partial class SolutionProgramView {
+    /// <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) {
+        if (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.symExpressionGroupBox = new System.Windows.Forms.GroupBox();
+      this.SuspendLayout();
+
+      // 
+      // symExpressionGroupBox
+      // 
+      this.symExpressionGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.symExpressionGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.symExpressionGroupBox.Name = "symExpressionGroupBox";
+      this.symExpressionGroupBox.Size = new System.Drawing.Size(386, 304);
+      this.symExpressionGroupBox.TabIndex = 0;
+      this.symExpressionGroupBox.TabStop = false;
+      this.symExpressionGroupBox.Text = "Symbolic Expression Tree";
+      // 
+      // AntTrailSymbolicExpressionTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.symExpressionGroupBox);
+      this.Name = "SolutionProgramView";
+      this.Size = new System.Drawing.Size(392, 310);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox symExpressionGroupBox;
+
+
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionProgramView.cs	(revision 13279)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.GeneticProgramming.ArtificialAnt;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.ArtificialAnt {
+  [View("Artificial Ant Program View")]
+  [Content(typeof(Solution), false)]
+  public sealed partial class SolutionProgramView : ItemView {
+    private readonly GraphicalSymbolicExpressionTreeView treeView;
+
+    public new Solution Content {
+      get { return (Solution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionProgramView() {
+      InitializeComponent();
+      treeView = new GraphicalSymbolicExpressionTreeView();
+      treeView.Dock = DockStyle.Fill;
+      symExpressionGroupBox.Controls.Add(treeView);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        treeView.Content = null;
+      } else {
+        treeView.Content = Content.SymbolicExpressionTree;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.Designer.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.Designer.cs	(revision 13279)
@@ -0,0 +1,105 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.ArtificialAnt {
+  partial class SolutionView {
+    /// <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) {
+        if (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.pictureBox = new System.Windows.Forms.PictureBox();
+      this.playButton = new System.Windows.Forms.Button();
+      this.animationTimer = new System.Windows.Forms.Timer(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.BackColor = System.Drawing.Color.White;
+      this.pictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.pictureBox.Location = new System.Drawing.Point(0, 0);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(392, 275);
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      this.pictureBox.SizeChanged += new System.EventHandler(this.pictureBox_SizeChanged);
+      // 
+      // playButton
+      // 
+      this.playButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.playButton.Location = new System.Drawing.Point(4, 281);
+      this.playButton.Name = "playButton";
+      this.playButton.Size = new System.Drawing.Size(75, 23);
+      this.playButton.TabIndex = 1;
+      this.playButton.Text = "Play";
+      this.playButton.UseVisualStyleBackColor = true;
+      this.playButton.Click += new System.EventHandler(this.playButton_Click);
+      // 
+      // animationTimer
+      // 
+      this.animationTimer.Interval = 15;
+      this.animationTimer.Tick += new System.EventHandler(this.animationTimer_Tick);
+      // 
+      // AntTrailView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.playButton);
+      this.Controls.Add(this.pictureBox);
+      this.Name = "SolutionView";
+      this.Size = new System.Drawing.Size(392, 310);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.PictureBox pictureBox;
+    private System.Windows.Forms.Button playButton;
+    private System.Windows.Forms.Timer animationTimer;
+
+
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/ArtificialAnt/SolutionView.cs	(revision 13279)
@@ -0,0 +1,193 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.GeneticProgramming.ArtificialAnt;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.ArtificialAnt {
+  [View("Artificial Ant Trail View")]
+  [Content(typeof(Solution), true)]
+  public sealed partial class SolutionView : ItemView {
+    public new Solution Content {
+      get { return (Solution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      this.playButton.Enabled = Content != null && !Locked;
+      GenerateImage();
+    }
+
+    protected override void OnLockedChanged() {
+      this.playButton.Enabled = Content != null && !Locked;
+      base.OnLockedChanged();
+    }
+
+    private void GenerateImage() {
+      animationTimer.Stop();
+      pictureBox.Image = null;
+      if ((pictureBox.Width > 0) && (pictureBox.Height > 0)) {
+        if (Content != null) {
+          var nodeStack = new Stack<SymbolicExpressionTreeNode>();
+          int rows = Content.World.Rows;
+          int columns = Content.World.Columns;
+          var expression = Content.SymbolicExpressionTree;
+
+          DrawWorld();
+          using (Graphics graphics = Graphics.FromImage(pictureBox.Image)) {
+            float cellHeight = pictureBox.Height / (float)rows;
+            float cellWidth = pictureBox.Width / (float)columns;
+
+            Interpreter interpreter = new Interpreter(Content.SymbolicExpressionTree, Content.World, Content.MaxTimeSteps);
+            int currentAntLocationColumn;
+            int currentAntLocationRow;
+            // draw initial ant
+            interpreter.AntLocation(out currentAntLocationRow, out currentAntLocationColumn);
+            DrawAnt(graphics, currentAntLocationRow, currentAntLocationColumn, interpreter.AntDirection, cellWidth, cellHeight);
+            // interpret ant code and draw trail
+            while (interpreter.ElapsedTime < interpreter.MaxTimeSteps) {
+              interpreter.Step();
+              interpreter.AntLocation(out currentAntLocationRow, out currentAntLocationColumn);
+              DrawAnt(graphics, currentAntLocationRow, currentAntLocationColumn, interpreter.AntDirection, cellWidth, cellHeight);
+            }
+          }
+          pictureBox.Refresh();
+        }
+      }
+    }
+
+    private void DrawWorld() {
+      int rows = Content.World.Rows;
+      int columns = Content.World.Columns;
+      Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
+      using (Graphics graphics = Graphics.FromImage(bitmap)) {
+        float cellHeight = pictureBox.Height / (float)rows;
+        float cellWidth = pictureBox.Width / (float)columns;
+        // draw world
+        for (int i = 0; i < rows; i++) {
+          graphics.DrawLine(Pens.Black, 0, i * cellHeight, pictureBox.Width, i * cellHeight);
+        }
+        for (int j = 0; j < columns; j++) {
+          graphics.DrawLine(Pens.Black, j * cellWidth, 0, j * cellWidth, pictureBox.Height);
+        }
+        for (int i = 0; i < rows; i++) {
+          for (int j = 0; j < columns; j++) {
+            if (Content.World[i, j])
+              graphics.FillEllipse(Brushes.LightBlue, j * cellWidth, i * cellHeight, cellWidth, cellHeight);
+          }
+        }
+        pictureBox.Image = bitmap;
+      }
+    }
+
+    private void DrawAnt(Graphics g, int row, int column, int direction, float cellWidth, float cellHeight) {
+      //g.FillRectangle(Brushes.White, column * cellWidth, row * cellHeight,
+      //      cellWidth, cellHeight);
+      // draw ant body
+      g.FillRectangle(Brushes.Brown,
+            column * cellWidth + cellWidth * 0.25f, row * cellHeight + cellHeight * 0.25f,
+            cellWidth * 0.5f, cellHeight * 0.5f);
+      // show ant direction
+      float centerX = column * cellWidth + cellWidth * 0.5f;
+      float centerY = row * cellHeight + cellHeight * 0.5f;
+      float directionX = centerX;
+      float directionY = centerY;
+      switch (direction) {
+        case 0: { // EAST
+            directionX = centerX + cellWidth * 0.5f;
+            break;
+          }
+        case 1: { // SOUTH
+            directionY = directionY + cellHeight * 0.5f;
+            break;
+          }
+        case 2: { // WEST 
+            directionX = centerX - cellWidth * 0.5f;
+            break;
+          }
+        case 3: { // NORTH
+            directionY = directionY - cellHeight * 0.5f;
+            break;
+          }
+        default: throw new InvalidOperationException();
+      }
+      g.DrawLine(Pens.Brown, centerX, centerY, directionX, directionY);
+    }
+
+    private void pictureBox_SizeChanged(object sender, EventArgs e) {
+      GenerateImage();
+    }
+
+    #region animation
+    private Interpreter animationInterpreter;
+    private void playButton_Click(object sender, EventArgs e) {
+      playButton.Enabled = false;
+
+      animationInterpreter = new Interpreter(Content.SymbolicExpressionTree, Content.World, Content.MaxTimeSteps);
+
+      DrawWorld();
+      using (Graphics graphics = Graphics.FromImage(pictureBox.Image)) {
+        float cellHeight = pictureBox.Height / (float)Content.World.Rows;
+        float cellWidth = pictureBox.Width / (float)Content.World.Columns;
+        // draw initial ant
+        int currentAntLocationColumn;
+        int currentAntLocationRow;
+        animationInterpreter.AntLocation(out currentAntLocationRow, out currentAntLocationColumn);
+        DrawAnt(graphics, currentAntLocationRow, currentAntLocationColumn, animationInterpreter.AntDirection, cellWidth, cellHeight);
+        pictureBox.Refresh();
+      }
+
+      animationTimer.Start();
+    }
+
+    private void animationTimer_Tick(object sender, EventArgs e) {
+      using (Graphics graphics = Graphics.FromImage(pictureBox.Image)) {
+        float cellHeight = pictureBox.Height / (float)Content.World.Rows;
+        float cellWidth = pictureBox.Width / (float)Content.World.Columns;
+        int currentAntLocationColumn;
+        int currentAntLocationRow;
+        // interpret ant code and draw trail
+        animationInterpreter.Step();
+        animationInterpreter.AntLocation(out currentAntLocationRow, out currentAntLocationColumn);
+        DrawAnt(graphics, currentAntLocationRow, currentAntLocationColumn, animationInterpreter.AntDirection, cellWidth, cellHeight);
+        pictureBox.Refresh();
+        if (animationInterpreter.ElapsedTime < animationInterpreter.MaxTimeSteps) {
+          animationTimer.Start();
+        } else {
+          animationTimer.Stop();
+          playButton.Enabled = true;
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/HeuristicLab.Problems.GeneticProgramming.Views-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/HeuristicLab.Problems.GeneticProgramming.Views-3.3.csproj	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/HeuristicLab.Problems.GeneticProgramming.Views-3.3.csproj	(revision 13279)
@@ -0,0 +1,233 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{26349C8D-72A1-4BAE-95A3-14E96A3B4AE8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.GeneticProgramming.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.GeneticProgramming.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ArtificialAnt\SolutionProgramView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ArtificialAnt\SolutionProgramView.Designer.cs">
+      <DependentUpon>SolutionProgramView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ArtificialAnt\SolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ArtificialAnt\SolutionView.Designer.cs">
+      <DependentUpon>SolutionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LawnMower\SolutionProgramView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LawnMower\SolutionProgramView.Designer.cs">
+      <DependentUpon>SolutionProgramView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="LawnMower\SolutionView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="LawnMower\SolutionView.Designer.cs">
+      <DependentUpon>SolutionView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4.csproj">
+      <Project>{423BD94F-963A-438E-BA45-3BB3D61CD03B}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
+      <Project>{06D4A186-9319-48A0-BADE-A2058D462EEA}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.GeneticProgramming\3.3\HeuristicLab.Problems.GeneticProgramming-3.3.csproj">
+      <Project>{02cddbf5-42a7-4c40-ae6c-e5d29ac9ccec}</Project>
+      <Name>HeuristicLab.Problems.GeneticProgramming-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.Designer.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.Designer.cs	(revision 13279)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.LawnMower {
+  partial class SolutionProgramView {
+    private Panel panel;
+    private GraphicalSymbolicExpressionTreeView graphTreeView;
+
+    private void InitializeComponent() {
+      this.panel = new System.Windows.Forms.Panel();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // panel
+      // 
+      this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel.Location = new System.Drawing.Point(3, 26);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(345, 190);
+      this.panel.TabIndex = 3;
+      // 
+      // SolutionProgramView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.panel);
+      this.Name = "SolutionProgramView";
+      this.Size = new System.Drawing.Size(351, 219);
+      this.Controls.SetChildIndex(this.panel, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionProgramView.cs	(revision 13279)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.GeneticProgramming.LawnMower;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.LawnMower {
+  [View("Lawn Mower Program View")]
+  [Content(typeof(Solution), IsDefaultView = false)]
+  public sealed partial class SolutionProgramView : NamedItemView {
+    public new Solution Content {
+      get { return (Solution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionProgramView() {
+      InitializeComponent();
+      this.graphTreeView = new GraphicalSymbolicExpressionTreeView();
+      graphTreeView.Dock = DockStyle.Fill;
+      panel.Controls.Add(graphTreeView);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        graphTreeView.Content = null;
+      } else {
+        graphTreeView.Content = Content.Tree;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.Designer.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.Designer.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.Designer.cs	(revision 13279)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.LawnMower {
+  partial class SolutionView : NamedItemView {
+    private PictureBox pictureBox;
+    private System.Windows.Forms.GroupBox groupBox;
+
+
+    private void InitializeComponent() {
+      this.groupBox = new System.Windows.Forms.GroupBox();
+      this.pictureBox = new System.Windows.Forms.PictureBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.groupBox.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(270, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(334, 3);
+      // 
+      // groupBox
+      // 
+      this.groupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.groupBox.Controls.Add(this.pictureBox);
+      this.groupBox.Location = new System.Drawing.Point(3, 26);
+      this.groupBox.Name = "groupBox";
+      this.groupBox.Size = new System.Drawing.Size(347, 232);
+      this.groupBox.TabIndex = 3;
+      this.groupBox.TabStop = false;
+      this.groupBox.Text = "Lawn mower solution";
+      // 
+      // pictureBox
+      // 
+      this.pictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+            | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.pictureBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+      this.pictureBox.Location = new System.Drawing.Point(6, 19);
+      this.pictureBox.Name = "pictureBox";
+      this.pictureBox.Size = new System.Drawing.Size(335, 207);
+      this.pictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+      this.pictureBox.TabIndex = 0;
+      this.pictureBox.TabStop = false;
+      // 
+      // SolutionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.Controls.Add(this.groupBox);
+      this.Name = "SolutionView";
+      this.Size = new System.Drawing.Size(353, 261);
+      this.Controls.SetChildIndex(this.groupBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.groupBox.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/LawnMower/SolutionView.cs	(revision 13279)
@@ -0,0 +1,77 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Problems.GeneticProgramming.LawnMower;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views.LawnMower {
+  [View("Lawn Mower View")]
+  [Content(typeof(Solution), IsDefaultView = true)]
+  public sealed partial class SolutionView : NamedItemView {
+    public new Solution Content {
+      get { return (Solution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionView()
+      : base() {
+      InitializeComponent();
+      pictureBox.Image = new Bitmap(200, 200);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        using (var g = Graphics.FromImage(pictureBox.Image))
+          g.Clear(DefaultBackColor);
+      } else {
+        bool[,] lawn = Interpreter.EvaluateLawnMowerProgram(Content.Length, Content.Width, Content.Tree);
+        PaintTiles(pictureBox.Image, lawn);
+      }
+    }
+
+    private void PaintTiles(Image lawnImage, bool[,] mowed) {
+      int w = lawnImage.Width;
+      int h = lawnImage.Height;
+
+      float tileHeight = h / (float)mowed.GetLength(0);
+      float tileWidth = w / (float)mowed.GetLength(1);
+
+      tileWidth = Math.Min(tileWidth, tileHeight);
+      tileHeight = tileWidth; // draw square tiles
+
+      using (var g = Graphics.FromImage(lawnImage)) {
+        g.Clear(DefaultBackColor);
+        for (int i = 0; i < Content.Length; i++)
+          for (int j = 0; j < Content.Width; j++)
+            if (mowed[i, j]) {
+              g.FillRectangle(Brushes.Chartreuse, tileWidth * j, tileHeight * i, tileWidth, tileHeight);
+            } else {
+              g.FillRectangle(Brushes.DarkGreen, tileWidth * j, tileHeight * i, tileWidth, tileHeight);
+            }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Plugin.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Plugin.cs.frame	(revision 13279)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.GeneticProgramming.Views {
+  [Plugin("HeuristicLab.Problems.GeneticProgramming.Views","Provides views for for genetic programming problems such as the artificial ant problem.", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.GeneticProgramming.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Core","3.3")]
+  [PluginDependency("HeuristicLab.Core.Views","3.3")]
+  [PluginDependency("HeuristicLab.Data","3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","3.4")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views","3.4")]
+  [PluginDependency("HeuristicLab.MainForm","3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms","3.3")]
+  [PluginDependency("HeuristicLab.Problems.GeneticProgramming","3.3")]
+  public class HeuristicLabProblemsGeneticProgrammingViewsPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 13279)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.GeneticProgramming.Views")]
+[assembly: AssemblyDescription("Provides views for genetic programming problems such as the artificial ant problem.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("76E5DE50-FF82-417F-AD70-035023CB386F")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Interpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Interpreter.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Interpreter.cs	(revision 13279)
@@ -0,0 +1,166 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.GeneticProgramming.ArtificialAnt {
+  public class Interpreter {
+
+    public int MaxTimeSteps { get; private set; }
+    public int FoodEaten { get; private set; }
+    public BoolMatrix World { get; private set; }
+
+    public ISymbolicExpressionTree Expression { get; private set; }
+
+
+    public int ElapsedTime { get; set; }
+    private int currentDirection;
+    private int currentAntLocationRow;
+    private int currentAntLocationColumn;
+    private int nFoodItems;
+    private Stack<ISymbolicExpressionTreeNode> nodeStack = new Stack<ISymbolicExpressionTreeNode>();
+
+    public Interpreter(ISymbolicExpressionTree tree, BoolMatrix world, int maxTimeSteps) {
+      this.Expression = tree;
+      this.MaxTimeSteps = maxTimeSteps;
+      // create a clone of the world because the ant will remove the food items it can find.
+      World = (BoolMatrix)world.Clone();
+      CountFoodItems();
+    }
+
+    private void CountFoodItems() {
+      nFoodItems = 0;
+      for (int i = 0; i < World.Rows; i++) {
+        for (int j = 0; j < World.Columns; j++) {
+          if (World[i, j]) nFoodItems++;
+        }
+      }
+    }
+
+    public void AntLocation(out int row, out int column) {
+      row = currentAntLocationRow;
+      column = currentAntLocationColumn;
+    }
+
+    public int AntDirection {
+      get { return currentDirection; }
+    }
+
+    public void Run() {
+      while (ElapsedTime < MaxTimeSteps && FoodEaten < nFoodItems) {
+        Step();
+      }
+    }
+
+    public void Step() {
+      // expression evaluated completly => start at root again
+      if (nodeStack.Count == 0) {
+        nodeStack.Push(Expression.Root.GetSubtree(0).GetSubtree(0));
+      }
+
+      var currentNode = nodeStack.Pop();
+      if (currentNode.Symbol.Name == "Left") {
+        currentDirection = (currentDirection + 3) % 4;
+        ElapsedTime++;
+      } else if (currentNode.Symbol.Name == "Right") {
+        currentDirection = (currentDirection + 1) % 4;
+        ElapsedTime++;
+      } else if (currentNode.Symbol.Name == "Move") {
+        MoveAntForward();
+        if (World[currentAntLocationRow, currentAntLocationColumn]) {
+          FoodEaten++;
+          World[currentAntLocationRow, currentAntLocationColumn] = false;
+        }
+        ElapsedTime++;
+      } else if (currentNode.Symbol.Name == "IfFoodAhead") {
+        int nextAntLocationRow;
+        int nextAntLocationColumn;
+        NextField(out nextAntLocationRow, out nextAntLocationColumn);
+        if (World[nextAntLocationRow, nextAntLocationColumn]) {
+          nodeStack.Push(currentNode.GetSubtree(0));
+        } else {
+          nodeStack.Push(currentNode.GetSubtree(1));
+        }
+      } else if (currentNode.Symbol.Name == "Prog2") {
+        nodeStack.Push(currentNode.GetSubtree(1));
+        nodeStack.Push(currentNode.GetSubtree(0));
+      } else if (currentNode.Symbol.Name == "Prog3") {
+        nodeStack.Push(currentNode.GetSubtree(2));
+        nodeStack.Push(currentNode.GetSubtree(1));
+        nodeStack.Push(currentNode.GetSubtree(0));
+      } else if (currentNode.Symbol is InvokeFunction) {
+        var invokeNode = currentNode as InvokeFunctionTreeNode;
+        var functionDefinition = (SymbolicExpressionTreeNode)FindMatchingFunction(invokeNode.Symbol.FunctionName).Clone();
+        var argumentCutPoints = (from node in functionDefinition.IterateNodesPrefix()
+                                 where node.Subtrees.Count() > 0
+                                 from subtree in node.Subtrees
+                                 where subtree is ArgumentTreeNode
+                                 select new { Parent = node, Argument = subtree.Symbol as Argument, ChildIndex = node.IndexOfSubtree(subtree) }).ToList();
+        foreach (var cutPoint in argumentCutPoints) {
+          cutPoint.Parent.RemoveSubtree(cutPoint.ChildIndex);
+          cutPoint.Parent.InsertSubtree(cutPoint.ChildIndex, (SymbolicExpressionTreeNode)invokeNode.GetSubtree(cutPoint.Argument.ArgumentIndex).Clone());
+        }
+        nodeStack.Push(functionDefinition.GetSubtree(0));
+      } else {
+        throw new InvalidOperationException(currentNode.Symbol.ToString());
+      }
+    }
+
+    private void MoveAntForward() {
+      NextField(out currentAntLocationRow, out currentAntLocationColumn);
+    }
+
+    private void NextField(out int nextAntLocationRow, out int nextAntLocationColumn) {
+      switch (currentDirection) {
+        case 0:
+          nextAntLocationColumn = (currentAntLocationColumn + 1) % World.Columns; // EAST
+          nextAntLocationRow = currentAntLocationRow;
+          break;
+        case 1:
+          nextAntLocationRow = (currentAntLocationRow + 1) % World.Rows; // SOUTH
+          nextAntLocationColumn = currentAntLocationColumn;
+          break;
+        case 2:
+          nextAntLocationColumn = (currentAntLocationColumn + World.Columns - 1) % World.Columns; // WEST
+          nextAntLocationRow = currentAntLocationRow;
+          break;
+        case 3:
+          nextAntLocationRow = (currentAntLocationRow + World.Rows - 1) % World.Rows; // NORTH
+          nextAntLocationColumn = currentAntLocationColumn;
+          break;
+        default:
+          throw new InvalidOperationException();
+      }
+    }
+
+
+    private SymbolicExpressionTreeNode FindMatchingFunction(string name) {
+      foreach (var defunBranch in Expression.Root.Subtrees.OfType<DefunTreeNode>()) {
+        if (defunBranch.FunctionName == name) return defunBranch;
+      }
+      throw new ArgumentException("Function definition for " + name + " not found.");
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Problem.cs	(revision 13279)
@@ -0,0 +1,169 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Diagnostics.Contracts;
+using System.Drawing.Text;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+
+namespace HeuristicLab.Problems.GeneticProgramming.ArtificialAnt {
+  [Item("Artificial Ant Problem", "Represents the Artificial Ant problem.")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)]
+  [StorableClass]
+  public sealed class Problem : SymbolicExpressionTreeProblem, IStorableContent {
+    public string Filename { get; set; }
+
+    #region constant for default world (Santa Fe)
+
+    private static readonly char[][] santaFeAntTrail = new[] {
+      " ###                            ".ToCharArray(),
+      "   #                            ".ToCharArray(),
+      "   #                    .###..  ".ToCharArray(),
+      "   #                    #    #  ".ToCharArray(),
+      "   #                    #    #  ".ToCharArray(),
+      "   ####.#####       .##..    .  ".ToCharArray(),
+      "            #       .        #  ".ToCharArray(),
+      "            #       #        .  ".ToCharArray(),
+      "            #       #        .  ".ToCharArray(),
+      "            #       #        #  ".ToCharArray(),
+      "            .       #        .  ".ToCharArray(),
+      "            #       .        .  ".ToCharArray(),
+      "            #       .        #  ".ToCharArray(),
+      "            #       #        .  ".ToCharArray(),
+      "            #       #  ...###.  ".ToCharArray(),
+      "            .   .#...  #        ".ToCharArray(),
+      "            .   .      .        ".ToCharArray(),
+      "            #   .      .        ".ToCharArray(),
+      "            #   #      .#...    ".ToCharArray(),
+      "            #   #          #    ".ToCharArray(),
+      "            #   #          .    ".ToCharArray(),
+      "            #   #          .    ".ToCharArray(),
+      "            #   .      ...#.    ".ToCharArray(),
+      "            #   .      #        ".ToCharArray(),
+      " ..##..#####.   #               ".ToCharArray(),
+      " #              #               ".ToCharArray(),
+      " #              #               ".ToCharArray(),
+      " #     .#######..               ".ToCharArray(),
+      " #     #                        ".ToCharArray(),
+      " .     #                        ".ToCharArray(),
+      " .####..                        ".ToCharArray(),
+      "                                ".ToCharArray()
+    };
+
+
+    #endregion
+
+    #region Parameter Properties
+    public IValueParameter<BoolMatrix> WorldParameter {
+      get { return (IValueParameter<BoolMatrix>)Parameters["World"]; }
+    }
+    public IValueParameter<IntValue> MaxTimeStepsParameter {
+      get { return (IValueParameter<IntValue>)Parameters["MaximumTimeSteps"]; }
+    }
+    #endregion
+
+    #region Properties
+    public BoolMatrix World {
+      get { return WorldParameter.Value; }
+      set { WorldParameter.Value = value; }
+    }
+    public IntValue MaxTimeSteps {
+      get { return MaxTimeStepsParameter.Value; }
+      set { MaxTimeStepsParameter.Value = value; }
+    }
+    #endregion
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    public Problem()
+      : base() {
+      BoolMatrix world = new BoolMatrix(ToBoolMatrix(santaFeAntTrail));
+      Parameters.Add(new ValueParameter<BoolMatrix>("World", "The world for the artificial ant with scattered food items.", world));
+      Parameters.Add(new ValueParameter<IntValue>("MaximumTimeSteps", "The number of time steps the artificial ant has available to collect all food items.", new IntValue(600)));
+
+      base.BestKnownQuality = 89;
+      var g = new SimpleSymbolicExpressionGrammar();
+      g.AddSymbols(new string[] { "IfFoodAhead", "Prog2" }, 2, 2);
+      g.AddSymbols(new string[] { "Prog3" }, 3, 3);
+      g.AddTerminalSymbols(new string[] { "Left", "Right", "Move" });
+      base.Encoding = new SymbolicExpressionTreeEncoding(g, 20, 10);
+    }
+
+
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+      var interpreter = new Interpreter(tree, World, MaxTimeSteps.Value);
+      interpreter.Run();
+      return interpreter.FoodEaten;
+    }
+
+    public override void Analyze(ISymbolicExpressionTree[] trees, double[] qualities, ResultCollection results, IRandom random) {
+      const string bestSolutionResultName = "Best Solution";
+      var bestQuality = Maximization ? qualities.Max() : qualities.Min();
+      var bestIdx = Array.IndexOf(qualities, bestQuality);
+
+      if (!results.ContainsKey(bestSolutionResultName)) {
+        results.Add(new Result(bestSolutionResultName, new Solution(World, trees[bestIdx], MaxTimeSteps.Value, qualities[bestIdx])));
+      } else if (((Solution)(results[bestSolutionResultName].Value)).Quality < qualities[bestIdx]) {
+        results[bestSolutionResultName].Value = new Solution(World, trees[bestIdx], MaxTimeSteps.Value, qualities[bestIdx]);
+      }
+    }
+
+    // persistence
+    [StorableConstructor]
+    private Problem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+
+    // cloning 
+    private Problem(Problem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Problem(this, cloner);
+    }
+
+    #region helpers
+    private bool[,] ToBoolMatrix(char[][] ch) {
+      var rows = ch.Length;
+      var cols = ch[0].Length;
+      var b = new bool[rows, cols];
+      for (int r = 0; r < rows; r++) {
+        Contract.Assert(ch[r].Length == cols); // all rows must have the same number of columns
+        for (int c = 0; c < cols; c++) {
+          b[r, c] = ch[r][c] == '#';
+        }
+      }
+      return b;
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Trail.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Trail.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/ArtificialAnt/Trail.cs	(revision 13279)
@@ -0,0 +1,73 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneticProgramming.ArtificialAnt {
+  /// <summary>
+  /// Represents a trail of an artificial ant which can be visualized in the GUI.
+  /// </summary>
+  [Item("AntTrail", "Represents a trail of an artificial ant which can be visualized in the GUI.")]
+  [StorableClass]
+  public sealed class Solution : Item {
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Image; }
+    }
+    [Storable]
+    public ISymbolicExpressionTree SymbolicExpressionTree { get; private set; }
+    [Storable]
+    public BoolMatrix World { get; private set; }
+    [Storable]
+    public int MaxTimeSteps { get; private set; }
+    [Storable]
+    public double Quality { get; private set; }
+
+    public Solution(BoolMatrix world, ISymbolicExpressionTree expression, int maxTimeSteps, double quality) {
+      this.World = world;
+      this.SymbolicExpressionTree = expression;
+      this.MaxTimeSteps = maxTimeSteps;
+      this.Quality = quality;
+    }
+
+    [StorableConstructor]
+    private Solution(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    private Solution(Solution original, Cloner cloner)
+      : base(original, cloner) {
+      SymbolicExpressionTree = cloner.Clone(original.SymbolicExpressionTree);
+      World = cloner.Clone(original.World);
+      MaxTimeSteps = original.MaxTimeSteps;
+      Quality = original.Quality;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Solution(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/HeuristicLab.Problems.GeneticProgramming-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/HeuristicLab.Problems.GeneticProgramming-3.3.csproj	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/HeuristicLab.Problems.GeneticProgramming-3.3.csproj	(revision 13279)
@@ -0,0 +1,224 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{02CDDBF5-42A7-4C40-AE6C-E5D29AC9CCEC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.GeneticProgramming</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.GeneticProgramming-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ArtificialAnt\Interpreter.cs" />
+    <Compile Include="ArtificialAnt\Problem.cs" />
+    <Compile Include="ArtificialAnt\Trail.cs" />
+    <Compile Include="LawnMower\Interpreter.cs" />
+    <Compile Include="LawnMower\Problem.cs" />
+    <Compile Include="LawnMower\Solution.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
+      <Project>{06D4A186-9319-48A0-BADE-A2058D462EEA}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{f4539fb6-4708-40c9-be64-0a1390aea197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Interpreter.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Interpreter.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Interpreter.cs	(revision 13279)
@@ -0,0 +1,158 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.GeneticProgramming.LawnMower {
+  public class Interpreter {
+    private enum Heading {
+      South,
+      East,
+      North,
+      West
+    };
+
+    private class MowerState {
+      public Heading Heading { get; set; }
+      public Tuple<uint, uint> Position { get; set; }
+      public int Energy { get; set; }
+      public MowerState() {
+        Heading = Heading.South;
+        Position = new Tuple<uint, uint>(0, 0);
+        Energy = 0;
+      }
+    }
+
+
+    public static bool[,] EvaluateLawnMowerProgram(int length, int width, ISymbolicExpressionTree tree) {
+
+      bool[,] lawn = new bool[length, width];
+      var mowerState = new MowerState();
+      mowerState.Heading = Heading.South;
+      mowerState.Energy = length * width * 2;
+      lawn[mowerState.Position.Item1, mowerState.Position.Item2] = true;
+      EvaluateLawnMowerProgram(tree.Root, mowerState, lawn, tree.Root.Subtrees.Skip(1).ToArray());
+      return lawn;
+    }
+
+
+    private static Tuple<int, int> EvaluateLawnMowerProgram(ISymbolicExpressionTreeNode node, MowerState mowerState, bool[,] lawn, IEnumerable<ISymbolicExpressionTreeNode> adfs) {
+      if (mowerState.Energy <= 0) return Tuple.Create(0, 0);
+
+      if (node.Symbol is ProgramRootSymbol) {
+        return EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
+      } else if (node.Symbol is StartSymbol) {
+        return EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
+      } else if (node.Symbol.Name == "Left") {
+        switch (mowerState.Heading) {
+          case Heading.East: mowerState.Heading = Heading.North;
+            break;
+          case Heading.North: mowerState.Heading = Heading.West;
+            break;
+          case Heading.West: mowerState.Heading = Heading.South;
+            break;
+          case Heading.South:
+            mowerState.Heading = Heading.East;
+            break;
+        }
+        return new Tuple<int, int>(0, 0);
+      } else if (node.Symbol.Name == "Forward") {
+        int dRow = 0;
+        int dCol = 0;
+        switch (mowerState.Heading) {
+          case Heading.East:
+            dCol++;
+            break;
+          case Heading.North:
+            dRow--;
+            break;
+          case Heading.West:
+            dCol--;
+            break;
+          case Heading.South:
+            dRow++;
+            break;
+        }
+        uint newRow = (uint)((mowerState.Position.Item1 + lawn.GetLength(0) + dRow) % lawn.GetLength(0));
+        uint newColumn = (uint)((mowerState.Position.Item2 + lawn.GetLength(1) + dCol) % lawn.GetLength(1));
+        mowerState.Position = Tuple.Create(newRow, newColumn);
+        mowerState.Energy = mowerState.Energy - 1;
+        lawn[newRow, newColumn] = true;
+        return Tuple.Create(0, 0);
+      } else if (node.Symbol.Name == "Sum") {
+        var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
+        var q = EvaluateLawnMowerProgram(node.GetSubtree(1), mowerState, lawn, adfs);
+        return Tuple.Create(p.Item1 + q.Item1, p.Item2 + q.Item2);
+      } else if (node.Symbol.Name == "Prog") {
+        EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
+        return EvaluateLawnMowerProgram(node.GetSubtree(1), mowerState, lawn, adfs);
+      } else if (node.Symbol.Name == "Frog") {
+        var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
+        int x = p.Item1;
+        int y = p.Item2;
+        while (x < 0) x += lawn.GetLength(0);
+        while (y < 0) y += lawn.GetLength(1);
+        var newRow = (uint)((mowerState.Position.Item1 + x) % lawn.GetLength(0));
+        var newCol = (uint)((mowerState.Position.Item2 + y) % lawn.GetLength(1));
+        mowerState.Position = Tuple.Create(newRow, newCol);
+        mowerState.Energy = mowerState.Energy - 1;
+        lawn[newRow, newCol] = true;
+        return Tuple.Create(0, 0);
+      } else if (node.Symbol is InvokeFunction) {
+        var invokeNode = node as InvokeFunctionTreeNode;
+
+        // find the function definition for the invoke call
+        var functionDefinition = (from adf in adfs.Cast<DefunTreeNode>()
+                                  where adf.FunctionName == invokeNode.Symbol.FunctionName
+                                  select adf).Single();
+        // clone the function definition because we are replacing the argument nodes
+        functionDefinition = (DefunTreeNode)functionDefinition.Clone();
+        // find the argument tree nodes and their parents in the original function definition
+        // toList is necessary to prevent that newly inserted branches are iterated
+        var argumentCutPoints = (from parent in functionDefinition.IterateNodesPrefix()
+                                 from subtree in parent.Subtrees
+                                 where subtree is ArgumentTreeNode
+                                 select new { Parent = parent, Argument = subtree.Symbol as Argument, ChildIndex = parent.IndexOfSubtree(subtree) })
+                                 .ToList();
+        // replace all argument tree ndoes with the matching argument of the invoke node
+        foreach (var cutPoint in argumentCutPoints) {
+          cutPoint.Parent.RemoveSubtree(cutPoint.ChildIndex);
+          cutPoint.Parent.InsertSubtree(cutPoint.ChildIndex, (SymbolicExpressionTreeNode)invokeNode.GetSubtree(cutPoint.Argument.ArgumentIndex).Clone());
+        }
+        return EvaluateLawnMowerProgram(functionDefinition.GetSubtree(0), mowerState, lawn, adfs);
+      } else {
+        // try to parse as ephemeral random const with format: "x,y" (x, y in [0..32[)
+        int x, y;
+        var tokens = node.Symbol.Name.Split(',');
+        if (tokens.Length == 2 &&
+            int.TryParse(tokens[0], out x) &&
+            int.TryParse(tokens[1], out y)) {
+          return Tuple.Create(x, y);
+        } else {
+          throw new ArgumentException("Invalid symbol in the lawn mower program.");
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Problem.cs	(revision 13279)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.GeneticProgramming.LawnMower {
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 160)]
+  [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")]
+  public class Problem : SymbolicExpressionTreeProblem {
+    private const string LawnWidthParameterName = "LawnWidth";
+    private const string LawnLengthParameterName = "LawnLength";
+
+    public IFixedValueParameter<IntValue> LawnWidthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[LawnWidthParameterName]; }
+    }
+    public IFixedValueParameter<IntValue> LawnLengthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[LawnLengthParameterName]; }
+    }
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    [StorableConstructor]
+    protected Problem(bool deserializing)
+      : base(deserializing) {
+    }
+    protected Problem(Problem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public Problem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>(LawnWidthParameterName, "Width of the lawn.", new IntValue(8)));
+      Parameters.Add(new FixedValueParameter<IntValue>(LawnLengthParameterName, "Length of the lawn.", new IntValue(8)));
+
+      var g = new SimpleSymbolicExpressionGrammar();
+      g.AddSymbols(new string[] { "Sum", "Prog" }, 2, 2);
+      g.AddSymbols(new string[] { "Frog" }, 1, 1);
+      g.AddTerminalSymbols(new string[] { "Left", "Forward" });
+      // initialize 20 ephemeral random constants in [0..32[
+      var fastRand = new FastRandom(314159);
+      for (int i = 0; i < 20; i++) {
+        g.AddTerminalSymbol(string.Format("{0},{1}", fastRand.Next(0, 32), fastRand.Next(0, 32)));
+      }
+
+      Encoding = new SymbolicExpressionTreeEncoding(g, 1000, 17);
+    }
+
+    public override void Analyze(ISymbolicExpressionTree[] trees, double[] qualities, ResultCollection results, IRandom random) {
+      const string bestSolutionResultName = "Best Solution";
+      var bestQuality = Maximization ? qualities.Max() : qualities.Min();
+      var bestIdx = Array.IndexOf(qualities, bestQuality);
+
+      if (!results.ContainsKey(bestSolutionResultName)) {
+        results.Add(new Result(bestSolutionResultName, new Solution(trees[bestIdx], LawnLengthParameter.Value.Value, LawnWidthParameter.Value.Value, bestQuality)));
+      } else if (((Solution)(results[bestSolutionResultName].Value)).Quality < qualities[bestIdx]) {
+        results[bestSolutionResultName].Value = new Solution(trees[bestIdx], LawnLengthParameter.Value.Value, LawnWidthParameter.Value.Value, bestQuality);
+      }
+    }
+
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) {
+      var length = LawnLengthParameter.Value.Value;
+      var width = LawnWidthParameter.Value.Value;
+
+      var lawn = Interpreter.EvaluateLawnMowerProgram(length, width, tree);
+      // count number of squares that have been mowed
+      int numberOfMowedCells = 0;
+      for (int i = 0; i < length; i++)
+        for (int j = 0; j < width; j++)
+          if (lawn[i, j]) {
+            numberOfMowedCells++;
+          }
+      return numberOfMowedCells;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Problem(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Solution.cs
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Solution.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/LawnMower/Solution.cs	(revision 13279)
@@ -0,0 +1,63 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GeneticProgramming.LawnMower {
+  [StorableClass]
+  public sealed class Solution : NamedItem {
+    [Storable]
+    public int Width { get; private set; }
+    [Storable]
+    public int Length { get; private set; }
+    [Storable]
+    public ISymbolicExpressionTree Tree { get; private set; }
+    [Storable]
+    public double Quality { get; private set; }
+
+    [StorableConstructor]
+    private Solution(bool deserializing) : base(deserializing) { }
+    private Solution(Solution original, Cloner cloner)
+      : base(original, cloner) {
+      this.Length = original.Length;
+      this.Width = original.Width;
+      this.Tree = cloner.Clone(original.Tree);
+      this.Quality = original.Quality;
+    }
+
+    public Solution(ISymbolicExpressionTree tree, int length, int width, double quality)
+      : base("Solution", "A lawn mower solution.") {
+      this.Tree = tree;
+      this.Length = length;
+      this.Width = width;
+      this.Quality = quality;
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Solution(this, cloner);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Plugin.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Plugin.cs.frame	(revision 13279)
@@ -0,0 +1,42 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.GeneticProgramming {
+  [Plugin("HeuristicLab.Problems.GeneticProgramming","Provides implementations for genetic programming problems such as the artificial ant problem.", "3.3.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.GeneticProgramming-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding","3.4")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class HeuristicLabProblemsGeneticProgrammingPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Properties/AssemblyInfo.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GeneticProgramming/3.3/Properties/AssemblyInfo.cs.frame	(revision 13279)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.GeneticProgramming")]
+[assembly: AssemblyDescription("Provides implementations of genetic programming problems such as the artificial ant problem.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2015 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1DEACE5B-8084-4141-B9C0-0739B118530E")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs	(revision 13278)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/ArtificialAnt/GEArtificialAntProblem.cs	(revision 13279)
@@ -40,5 +40,4 @@
 namespace HeuristicLab.Problems.GrammaticalEvolution {
   [Item("Grammatical Evolution Artificial Ant Problem", "Represents the Artificial Ant problem, implemented in Grammatical Evolution.")]
-  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)]
   [StorableClass]
   public sealed class GEArtificialAntProblem : SingleObjectiveHeuristicOptimizationProblem<GEArtificialAntEvaluator, IIntegerVectorCreator>, IStorableContent {
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 13278)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.3/Symbolic/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 13279)
@@ -37,5 +37,4 @@
         "Represents grammatical evolution for single objective symbolic regression problems.")]
   [StorableClass]
-  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
   public class GESymbolicRegressionSingleObjectiveProblem : GESymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, IGESymbolicRegressionSingleObjectiveEvaluator, IIntegerVectorCreator>,
                                                             IRegressionProblem {
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/ArtificialAnt/GEArtificialAntProblem.cs	(revision 13279)
@@ -0,0 +1,129 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System.Diagnostics.Contracts;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.GeneticProgramming.ArtificialAnt;
+using HeuristicLab.Problems.GrammaticalEvolution.Mappers;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [Item("Grammatical Evolution Artificial Ant Problem", "Represents the Artificial Ant problem, implemented in Grammatical Evolution.")]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 170)]
+  [StorableClass]
+  public sealed class GEArtificialAntProblem : SingleObjectiveBasicProblem<IntegerVectorEncoding>, IStorableContent {
+    public string Filename { get; set; }
+
+    #region Parameter Properties
+    public IValueParameter<BoolMatrix> WorldParameter {
+      get { return (IValueParameter<BoolMatrix>)Parameters["World"]; }
+    }
+    public IFixedValueParameter<IntValue> MaxTimeStepsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["MaximumTimeSteps"]; }
+    }
+    public IValueParameter<IGenotypeToPhenotypeMapper> GenotypeToPhenotypeMapperParameter {
+      get { return (IValueParameter<IGenotypeToPhenotypeMapper>)Parameters["GenotypeToPhenotypeMapper"]; }
+    }
+    #endregion
+
+    #region Properties
+    public BoolMatrix World {
+      get { return WorldParameter.Value; }
+      set { WorldParameter.Value = value; }
+    }
+    public int MaxTimeSteps {
+      get { return MaxTimeStepsParameter.Value.Value; }
+      set { MaxTimeStepsParameter.Value.Value = value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private GEArtificialAntProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    [Storable]
+    // parameters of the wrapped problem cannot be changed therefore it is not strictly necessary to clone and store it
+    private readonly HeuristicLab.Problems.GeneticProgramming.ArtificialAnt.Problem wrappedAntProblem;
+
+    private GEArtificialAntProblem(GEArtificialAntProblem original, Cloner cloner)
+      : base(original, cloner) {
+      this.wrappedAntProblem = cloner.Clone(original.wrappedAntProblem);
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GEArtificialAntProblem(this, cloner);
+    }
+
+    public GEArtificialAntProblem()
+      : base() {
+      wrappedAntProblem = new HeuristicLab.Problems.GeneticProgramming.ArtificialAnt.Problem();
+      Parameters.Add(new ValueParameter<BoolMatrix>("World", "The world for the artificial ant with scattered food items.", wrappedAntProblem.World));
+      Parameters.Add(new FixedValueParameter<IntValue>("MaximumTimeSteps", "The number of time steps the artificial ant has available to collect all food items.", new IntValue(600)));
+      Parameters.Add(new ValueParameter<IGenotypeToPhenotypeMapper>("GenotypeToPhenotypeMapper", "Maps the genotype (an integer vector) to the phenotype (a symbolic expression tree).", new DepthFirstMapper()));
+
+      Encoding = new IntegerVectorEncoding(30) { Bounds = new IntMatrix(new int[,] { { 0, 100 } }) };
+
+      BestKnownQuality = wrappedAntProblem.BestKnownQuality;
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      var vector = individual.IntegerVector();
+
+      var bounds = Encoding.Bounds;
+      var len = Encoding.Length;
+      var grammar = wrappedAntProblem.Encoding.Grammar;
+      var mapper = GenotypeToPhenotypeMapperParameter.Value;
+
+      var tree = mapper.Map(random, bounds, len, grammar, vector);
+
+      Interpreter interpreter = new Interpreter(tree, World, MaxTimeSteps);
+      interpreter.Run();
+
+      return interpreter.FoodEaten;
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      var bounds = Encoding.Bounds;
+      var len = Encoding.Length;
+      var grammar = wrappedAntProblem.Encoding.Grammar;
+      var mapper = GenotypeToPhenotypeMapperParameter.Value;
+
+      var trees = individuals
+        .Select(ind => mapper.Map(random, bounds, len, grammar, ind.IntegerVector()))
+        .ToArray();
+
+      wrappedAntProblem.Analyze(trees, qualities, results, random);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/HeuristicLab.Problems.GrammaticalEvolution-3.4.csproj
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/HeuristicLab.Problems.GrammaticalEvolution-3.4.csproj	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/HeuristicLab.Problems.GrammaticalEvolution-3.4.csproj	(revision 13279)
@@ -0,0 +1,277 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9372D115-D933-40D2-BD29-A2C1EAC35874}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.GrammaticalEvolution</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.GrammaticalEvolution-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>True</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <NoWin32Manifest>False</NoWin32Manifest>
+    <DelaySign>False</DelaySign>
+    <AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
+    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+    <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+    <NoStdLib>True</NoStdLib>
+    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>
+    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
+    <RunCodeAnalysis>False</RunCodeAnalysis>
+    <SourceAnalysisOverrideSettingsFile>C:\Users\Sabine\AppData\Roaming\ICSharpCode/SharpDevelop4\Settings.SourceAnalysis</SourceAnalysisOverrideSettingsFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>Full</DebugType>
+    <Optimize>False</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="mscorlib" />
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SymbolicRegression\GESymbolicDataAnalysisEvaluator.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicDataAnalysisProblem.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicDataAnalysisSingleObjectiveEvaluator.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicDataAnalysisSingleObjectiveProblem.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicExpressionGrammar.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicRegressionSingleObjectiveEvaluator.cs" />
+    <Compile Include="SymbolicRegression\GESymbolicRegressionSingleObjectiveProblem.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicDataAnalysisEvaluator.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicDataAnalysisProblem.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicDataAnalysisSingleObjectiveEvaluator.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicDataAnalysisValidationAnalyzer.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicRegressionEvaluator.cs" />
+    <Compile Include="SymbolicRegression\IGESymbolicRegressionSingleObjectiveEvaluator.cs" />
+    <None Include="HeuristicLab.snk" />
+    <Compile Include="ArtificialAnt\GEArtificialAntProblem.cs" />
+    <Compile Include="Mappers\BreathFirstMapper.cs" />
+    <Compile Include="Mappers\DepthFirstMapper.cs" />
+    <Compile Include="Mappers\GenotypeToPhenotypeMapper.cs" />
+    <Compile Include="Mappers\IGenotypeToPhenotypeMapper.cs" />
+    <Compile Include="Mappers\PIGEMapper.cs" />
+    <Compile Include="Mappers\RandomMapper.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.IntegerVectorEncoding\3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj">
+      <Project>{ddfb14dd-2a85-493c-a52d-e69729bbaeb0}</Project>
+      <Name>HeuristicLab.Encodings.IntegerVectorEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
+      <Project>{06d4a186-9319-48a0-bade-a2058d462eea}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4.csproj">
+      <Project>{5ac82412-911b-4fa2-a013-edc5e3f3fcc2}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic.Regression-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj">
+      <Project>{3d28463f-ec96-4d82-afee-38be91a0ca00}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis\3.4\HeuristicLab.Problems.DataAnalysis-3.4.csproj">
+      <Project>{df87c13e-a889-46ff-8153-66dcaa8c5674}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.GeneticProgramming\3.3\HeuristicLab.Problems.GeneticProgramming-3.3.csproj">
+      <Project>{02cddbf5-42a7-4c40-ae6c-e5d29ac9ccec}</Project>
+      <Name>HeuristicLab.Problems.GeneticProgramming-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540e29e-4793-49e7-8ee2-fea7f61c3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{f4539fb6-4708-40c9-be64-0a1390aea197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</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: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/BreathFirstMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/BreathFirstMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/BreathFirstMapper.cs	(revision 13279)
@@ -0,0 +1,121 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  /// <summary>
+  /// BreathFirstMapper
+  /// </summary>
+  [Item("BreathFirstMapper", "Resolves the non-terminal symbols of the resulting phenotypic syntax tree in a breath-first manner.")]
+  [StorableClass]
+  public class BreathFirstMapper : GenotypeToPhenotypeMapper {
+
+    [StorableConstructor]
+    protected BreathFirstMapper(bool deserializing) : base(deserializing) { }
+    protected BreathFirstMapper(BreathFirstMapper original, Cloner cloner) : base(original, cloner) { }
+    public BreathFirstMapper() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BreathFirstMapper(this, cloner);
+    }
+
+
+    /// <summary>
+    /// Maps a genotype (an integer vector) to a phenotype (a symbolic expression tree).
+    /// Breath-first approach.
+    /// </summary>
+    /// <param name="random">random number generator</param>
+    /// <param name="bounds">only used for PIGEMapper (ignore here)</param>
+    /// <param name="length">only used for PIGEMapper (ignore here)</param>
+    /// <param name="grammar">grammar definition</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <returns>phenotype (a symbolic expression tree)</returns>
+    public override ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                                               ISymbolicExpressionGrammar grammar,
+                                               IntegerVector genotype) {
+
+      SymbolicExpressionTree tree = new SymbolicExpressionTree();
+      var rootNode = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode();
+      var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode();
+      rootNode.AddSubtree(startNode);
+      tree.Root = rootNode;
+
+      MapBreathFirstIteratively(startNode, genotype, grammar,
+                                genotype.Length, random);
+
+      return tree;
+    }
+
+    /// <summary>
+    /// Genotype-to-Phenotype mapper (iterative breath-first approach, by using a queue -> FIFO).
+    /// </summary>
+    /// <param name="startNode">first node of the tree with arity 1</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <param name="grammar">grammar to determine the allowed child symbols for each node</param>
+    /// <param name="maxSubtreeCount">maximum allowed subtrees (= number of used genomes)</param>
+    /// <param name="random">random number generator</param>
+    private void MapBreathFirstIteratively(ISymbolicExpressionTreeNode startNode,
+                                          IntegerVector genotype,
+                                          ISymbolicExpressionGrammar grammar,
+                                          int maxSubtreeCount, IRandom random) {
+
+      Queue<Tuple<ISymbolicExpressionTreeNode, int>> queue
+        = new Queue<Tuple<ISymbolicExpressionTreeNode, int>>(); // tuples of <node, arity>
+
+      int genotypeIndex = 0;
+      queue.Enqueue(new Tuple<ISymbolicExpressionTreeNode, int>(startNode, 1));
+
+      while (queue.Count > 0) {
+
+        Tuple<ISymbolicExpressionTreeNode, int> current = queue.Dequeue();
+
+        // foreach subtree of the current node, create a new node and enqueue it, if it is no terminal node
+        for (int i = 0; i < current.Item2; ++i) {
+
+          if (genotypeIndex >= maxSubtreeCount) {
+            // if all genomes were used, only add terminal nodes to the remaining subtrees
+            current.Item1.AddSubtree(GetRandomTerminalNode(current.Item1, grammar, random));
+          } else {
+            var newNode = GetNewChildNode(current.Item1, genotype, grammar, genotypeIndex, random);
+            int arity = SampleArity(random, newNode, grammar);
+
+            current.Item1.AddSubtree(newNode);
+            genotypeIndex++;
+            if (arity > 0) {
+              // new node has subtrees so enqueue the node 
+              queue.Enqueue(new Tuple<ISymbolicExpressionTreeNode, int>(newNode, arity));
+            }
+          }
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/DepthFirstMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/DepthFirstMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/DepthFirstMapper.cs	(revision 13279)
@@ -0,0 +1,124 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  /// <summary>
+  /// DepthFirstMapper
+  /// </summary>
+  [Item("DepthFirstMapper", "Resolves the non-terminal symbols of the resulting phenotypic syntax tree in a depth-first manner.")]
+  [StorableClass]
+  public class DepthFirstMapper : GenotypeToPhenotypeMapper {
+
+    [StorableConstructor]
+    protected DepthFirstMapper(bool deserializing) : base(deserializing) { }
+    protected DepthFirstMapper(DepthFirstMapper original, Cloner cloner) : base(original, cloner) { }
+    public DepthFirstMapper() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DepthFirstMapper(this, cloner);
+    }
+
+
+    /// <summary>
+    /// Maps a genotype (an integer vector) to a phenotype (a symbolic expression tree).
+    /// Depth-first approach.
+    /// </summary>
+    /// <param name="random">random number generator</param>
+    /// <param name="bounds">only used for PIGEMapper (ignore here)</param>
+    /// <param name="length">only used for PIGEMapper (ignore here)</param>
+    /// <param name="grammar">grammar definition</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <returns>phenotype (a symbolic expression tree)</returns>
+    public override ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                                               ISymbolicExpressionGrammar grammar,
+                                               IntegerVector genotype) {
+
+      SymbolicExpressionTree tree = new SymbolicExpressionTree();
+      var rootNode = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode();
+      if (rootNode.HasLocalParameters) rootNode.ResetLocalParameters(random);
+      var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode();
+      if (startNode.HasLocalParameters) startNode.ResetLocalParameters(random);
+      rootNode.AddSubtree(startNode);
+      tree.Root = rootNode;
+
+      MapDepthFirstIteratively(startNode, genotype, grammar,
+                               genotype.Length, random);
+      return tree;
+    }
+
+
+    /// <summary>
+    /// Genotype-to-Phenotype mapper (iterative depth-first approach, by using a stack -> LIFO).
+    /// </summary>
+    /// <param name="startNode">first node of the tree with arity 1</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <param name="grammar">grammar to determine the allowed child symbols for each node</param>
+    /// <param name="maxSubtreeCount">maximum allowed subtrees (= number of used genomes)</param>
+    /// <param name="random">random number generator</param>
+    private void MapDepthFirstIteratively(ISymbolicExpressionTreeNode startNode,
+                                          IntegerVector genotype,
+                                          ISymbolicExpressionGrammar grammar,
+                                          int maxSubtreeCount, IRandom random) {
+
+      Stack<Tuple<ISymbolicExpressionTreeNode, int>> stack
+        = new Stack<Tuple<ISymbolicExpressionTreeNode, int>>(); // tuples of <node, arity>
+
+      int genotypeIndex = 0;
+      stack.Push(new Tuple<ISymbolicExpressionTreeNode, int>(startNode, 1));
+
+      while (stack.Count > 0) {
+
+        // get next node from stack and re-push it, if this node still has unhandled subtrees ...
+        Tuple<ISymbolicExpressionTreeNode, int> current = stack.Pop();
+        if (current.Item2 > 1) {
+          stack.Push(new Tuple<ISymbolicExpressionTreeNode, int>(current.Item1, current.Item2 - 1));
+        }
+
+        if (genotypeIndex >= maxSubtreeCount) {
+          // if all genomes were used, only add terminal nodes to the remaining subtrees
+          current.Item1.AddSubtree(GetRandomTerminalNode(current.Item1, grammar, random));
+        } else {
+          var newNode = GetNewChildNode(current.Item1, genotype, grammar, genotypeIndex, random);
+          int arity = SampleArity(random, newNode, grammar);
+
+          current.Item1.AddSubtree(newNode);
+          genotypeIndex++;
+          if (arity > 0) {
+            // new node has subtrees so push it onto the stack 
+            stack.Push(new Tuple<ISymbolicExpressionTreeNode, int>(newNode, arity));
+          }
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/GenotypeToPhenotypeMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/GenotypeToPhenotypeMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/GenotypeToPhenotypeMapper.cs	(revision 13279)
@@ -0,0 +1,132 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.GrammaticalEvolution.Mappers;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  /// <summary>
+  /// Abstract base class for GenotypeToPhenotypeMappers
+  /// </summary>
+  public abstract class GenotypeToPhenotypeMapper : IntegerVectorOperator, IGenotypeToPhenotypeMapper {
+
+    [StorableConstructor]
+    protected GenotypeToPhenotypeMapper(bool deserializing) : base(deserializing) { }
+    protected GenotypeToPhenotypeMapper(GenotypeToPhenotypeMapper original, Cloner cloner) : base(original, cloner) { }
+    protected GenotypeToPhenotypeMapper() : base() { }
+
+    public abstract ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                                               ISymbolicExpressionGrammar grammar,
+                                               IntegerVector genotype);
+
+    /// <summary>
+    /// Randomly returns a terminal node for the given <paramref name="parentNode"/>.
+    /// (A terminal has got a minimum and maximum arity of 0.)
+    /// </summary>
+    /// <param name="parentNode">parent node for which a child node is returned randomly</param>
+    /// <param name="grammar">grammar to determine the allowed child symbols for parentNode</param>
+    /// <param name="random">random number generator</param>
+    /// <returns>randomly chosen terminal node with arity 0 or null, if no terminal node exists</returns>
+    protected ISymbolicExpressionTreeNode GetRandomTerminalNode(ISymbolicExpressionTreeNode parentNode,
+                                                                ISymbolicExpressionGrammar grammar,
+                                                                IRandom random) {
+      // only select specific symbols, which can be interpreted ...
+      var possibleSymbolsList = (from s in grammar.GetAllowedChildSymbols(parentNode.Symbol)
+                                 where s.InitialFrequency > 0.0
+                                 where s.MaximumArity == 0
+                                 where s.MinimumArity == 0
+                                 select s).ToList();
+
+      // no terminal node exists for the given parent node
+      if (!possibleSymbolsList.Any()) return null;
+
+      var newNode = possibleSymbolsList.SampleRandom(random).CreateTreeNode();
+      if (newNode.HasLocalParameters) newNode.ResetLocalParameters(random);
+      return newNode;
+    }
+
+
+    /// <summary>
+    /// Returns a randomly chosen child node for the given <paramref name="parentNode"/>.
+    /// </summary>
+    /// <param name="parentNode">parent node to find a child node randomly for</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <param name="grammar">grammar used to define the allowed child symbols</param>
+    /// <param name="genotypeIndex">index in the integer vector; can be greater than vector length</param>
+    /// <param name="random">random number generator</param>
+    /// <returns>randomly chosen child node or null, if no child node exits</returns>
+    protected ISymbolicExpressionTreeNode GetNewChildNode(ISymbolicExpressionTreeNode parentNode,
+                                                          IntegerVector genotype,
+                                                          ISymbolicExpressionGrammar grammar,
+                                                          int genotypeIndex,
+                                                          IRandom random) {
+
+      // only select specific symbols, which can be interpreted ...
+      IEnumerable<ISymbol> symbolList = (from s in grammar.GetAllowedChildSymbols(parentNode.Symbol)
+                                         where s.InitialFrequency > 0.0
+                                         select s).ToList();
+
+      int prodRuleCount = symbolList.Count();
+
+      // no child node exists for the given parent node
+      if (prodRuleCount < 1) return null;
+
+      // genotypeIndex % genotype.Length, if wrapping is allowed
+      int prodRuleIndex = genotype[genotypeIndex] % prodRuleCount;
+
+      var newNode = symbolList.ElementAt(prodRuleIndex).CreateTreeNode();
+      if (newNode.HasLocalParameters) newNode.ResetLocalParameters(random);
+      return newNode;
+    }
+
+
+    /// <summary>
+    /// Randomly determines an arity for the given node.
+    /// </summary>
+    /// <param name="random">random number generator</param>
+    /// <param name="node">node, for which a random arity is determined</param>
+    /// <param name="grammar">symbolic expression grammar to use</param>
+    /// <returns>random arity in the interval [minArity, maxArity]</returns>
+    protected int SampleArity(IRandom random,
+                              ISymbolicExpressionTreeNode node,
+                              ISymbolicExpressionGrammar grammar) {
+
+      int minArity = grammar.GetMinimumSubtreeCount(node.Symbol);
+      int maxArity = grammar.GetMaximumSubtreeCount(node.Symbol);
+
+      if (minArity == maxArity) {
+        return minArity;
+      }
+
+      return random.Next(minArity, maxArity);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/IGenotypeToPhenotypeMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/IGenotypeToPhenotypeMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/IGenotypeToPhenotypeMapper.cs	(revision 13279)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution.Mappers {
+  /// <summary>
+  /// IGenotypeToPhenotypeMapper
+  /// </summary>
+  public interface IGenotypeToPhenotypeMapper : IIntegerVectorOperator {
+    ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                               ISymbolicExpressionGrammar grammar,
+                               IntegerVector genotype);
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/PIGEMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/PIGEMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/PIGEMapper.cs	(revision 13279)
@@ -0,0 +1,176 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+
+  /// <summary>
+  /// Position Independent (PI) Grammatical Evolution Mapper
+  /// -----------------------------------------------------------------------------------
+  /// Standard GE mappers:
+  ///   Rule = Codon Value % Number Of Rules
+  ///   
+  /// 𝜋GE:
+  ///   𝜋GE codons consist of (nont, rule) tuples, where nont may be one value from an "order"
+  ///   integer vector and rule may be one value from a "content" integer vector.
+  ///   
+  ///   Order:   NT   = nont % Num. NT      ... determines, which non-terminal to expand next
+  ///   Content: Rule = rule % Num. Rules   ... rule determination as with standard GE mappers
+  /// 
+  /// Four mutation and crossover strategies possible:
+  ///  * Order-only:    only "order" vector is modified, "content" vector is fixed (1:0),
+  ///                   worst result according to [2]
+  ///  * Content-only:  only "content" vector is modified, "order" vector is fixed (0:1),
+  ///                   best result according to [2]
+  ///  * 𝜋GE:           genetic operators are applied equally (1:1), 
+  ///  * Content:Order: genetic operators are applied unequally (e.g. 2:1 or 1:2),
+  /// 
+  /// Here, the "content-only" strategy is implemented, as it is the best solution according to [2]
+  /// and it does not require much to change in the problem and evaluator classes.
+  /// 
+  /// </summary>
+  /// <remarks>
+  /// Described in
+  /// 
+  /// [1] Michael O’Neill et al. 𝜋Grammatical Evolution. In: GECCO 2004.
+  /// Vol. 3103. LNCS. Heidelberg: Springer-Verlag Berlin, 2004, pp. 617–629.
+  /// url: http://dynamics.org/Altenberg/UH_ICS/EC_REFS/GP_REFS/GECCO/2004/31030617.pdf.
+  /// 
+  /// [2] David Fagan et al. Investigating Mapping Order in πGE. IEEE, 2010
+  /// url: http://ncra.ucd.ie/papers/pigeWCCI2010.pdf
+  /// </remarks>
+  [Item("PIGEMapper", "Position Independent (PI) Grammatical Evolution Mapper")]
+  [StorableClass]
+  public class PIGEMapper : GenotypeToPhenotypeMapper {
+
+    private object nontVectorLocker = new object();
+    private IntegerVector nontVector;
+
+    public IntegerVector NontVector {
+      get { return nontVector; }
+      set { nontVector = value; }
+    }
+
+    private static IntegerVector GetNontVector(IRandom random, IntMatrix bounds, int length) {
+      IntegerVector v = new IntegerVector(length);
+      v.Randomize(random, bounds);
+      return v;
+    }
+
+    [StorableConstructor]
+    protected PIGEMapper(bool deserializing) : base(deserializing) { }
+    protected PIGEMapper(PIGEMapper original, Cloner cloner) : base(original, cloner) { }
+    public PIGEMapper() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PIGEMapper(this, cloner);
+    }
+
+
+    /// <summary>
+    /// Maps a genotype (an integer vector) to a phenotype (a symbolic expression tree).
+    /// PIGE approach.
+    /// </summary>
+    /// <param name="random">random number generator</param>
+    /// <param name="bounds">integer number range for genomes (codons) of the nont vector</param>
+    /// <param name="length">length of the nont vector to create</param>
+    /// <param name="grammar">grammar definition</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <returns>phenotype (a symbolic expression tree)</returns>
+    public override ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                                               ISymbolicExpressionGrammar grammar,
+                                               IntegerVector genotype) {
+
+      SymbolicExpressionTree tree = new SymbolicExpressionTree();
+      var rootNode = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode();
+      var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode();
+      rootNode.AddSubtree(startNode);
+      tree.Root = rootNode;
+
+      // Map can be called simultaniously on multiple threads
+      lock (nontVectorLocker) {
+        if (NontVector == null) {
+          NontVector = GetNontVector(random, bounds, length);
+        }
+      }
+
+      MapPIGEIteratively(startNode, genotype, grammar,
+                         genotype.Length, random);
+
+      return tree;
+    }
+
+
+    /// <summary>
+    /// Genotype-to-Phenotype mapper (iterative 𝜋GE approach, using a list of not expanded nonTerminals).
+    /// </summary>
+    /// <param name="startNode">first node of the tree with arity 1</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <param name="grammar">grammar to determine the allowed child symbols for each node</param>
+    /// <param name="maxSubtreeCount">maximum allowed subtrees (= number of used genomes)</param>
+    /// <param name="random">random number generator</param>
+    private void MapPIGEIteratively(ISymbolicExpressionTreeNode startNode,
+                                    IntegerVector genotype,
+                                    ISymbolicExpressionGrammar grammar,
+                                    int maxSubtreeCount, IRandom random) {
+
+      List<ISymbolicExpressionTreeNode> nonTerminals = new List<ISymbolicExpressionTreeNode>();
+
+      int genotypeIndex = 0;
+      nonTerminals.Add(startNode);
+
+      while (nonTerminals.Count > 0) {
+
+        if (genotypeIndex >= maxSubtreeCount) {
+          // if all genomes were used, only add terminal nodes to the remaining subtrees
+          ISymbolicExpressionTreeNode current = nonTerminals[0];
+          nonTerminals.RemoveAt(0);
+          current.AddSubtree(GetRandomTerminalNode(current, grammar, random));
+        } else {
+          // Order:   NT   = nont % Num. NT
+          int nt = NontVector[genotypeIndex] % nonTerminals.Count;
+          ISymbolicExpressionTreeNode current = nonTerminals[nt];
+          nonTerminals.RemoveAt(nt);
+
+          // Content: Rule = rule % Num. Rules
+          ISymbolicExpressionTreeNode newNode = GetNewChildNode(current, genotype, grammar, genotypeIndex, random);
+          int arity = SampleArity(random, newNode, grammar);
+
+          current.AddSubtree(newNode);
+          genotypeIndex++;
+          // new node has subtrees, so add "arity" number of copies of this node to the nonTerminals list
+          for (int i = 0; i < arity; ++i) {
+            nonTerminals.Add(newNode);
+          }
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/RandomMapper.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/RandomMapper.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Mappers/RandomMapper.cs	(revision 13279)
@@ -0,0 +1,121 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  /// <summary>
+  /// RandomMapper
+  /// </summary>
+  [Item("RandomMapper", "Randomly determines the next non-terminal symbol to expand.")]
+  [StorableClass]
+  public class RandomMapper : GenotypeToPhenotypeMapper {
+
+    [StorableConstructor]
+    protected RandomMapper(bool deserializing) : base(deserializing) { }
+    protected RandomMapper(RandomMapper original, Cloner cloner) : base(original, cloner) { }
+    public RandomMapper() : base() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RandomMapper(this, cloner);
+    }
+
+
+    /// <summary>
+    /// Maps a genotype (an integer vector) to a phenotype (a symbolic expression tree).
+    /// Random approach.
+    /// </summary>
+    /// <param name="random">random number generator</param>
+    /// <param name="bounds">only used for PIGEMapper (ignore here)</param>
+    /// <param name="length">only used for PIGEMapper (ignore here)</param>
+    /// <param name="grammar">grammar definition</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <returns>phenotype (a symbolic expression tree)</returns>
+    public override ISymbolicExpressionTree Map(IRandom random, IntMatrix bounds, int length,
+                                               ISymbolicExpressionGrammar grammar,
+                                               IntegerVector genotype) {
+
+      SymbolicExpressionTree tree = new SymbolicExpressionTree();
+      var rootNode = (SymbolicExpressionTreeTopLevelNode)grammar.ProgramRootSymbol.CreateTreeNode();
+      var startNode = (SymbolicExpressionTreeTopLevelNode)grammar.StartSymbol.CreateTreeNode();
+      rootNode.AddSubtree(startNode);
+      tree.Root = rootNode;
+
+      MapRandomIteratively(startNode, genotype, grammar,
+                           genotype.Length, random);
+
+      return tree;
+    }
+
+
+    /// <summary>
+    /// Genotype-to-Phenotype mapper (iterative random approach, where the next non-terminal
+    /// symbol to expand is randomly determined).
+    /// </summary>
+    /// <param name="startNode">first node of the tree with arity 1</param>
+    /// <param name="genotype">integer vector, which should be mapped to a tree</param>
+    /// <param name="grammar">grammar to determine the allowed child symbols for each node</param>
+    /// <param name="maxSubtreeCount">maximum allowed subtrees (= number of used genomes)</param>
+    /// <param name="random">random number generator</param>
+    private void MapRandomIteratively(ISymbolicExpressionTreeNode startNode,
+                                     IntegerVector genotype,
+                                     ISymbolicExpressionGrammar grammar,
+                                     int maxSubtreeCount, IRandom random) {
+
+      List<ISymbolicExpressionTreeNode> nonTerminals = new List<ISymbolicExpressionTreeNode>();
+
+      int genotypeIndex = 0;
+      nonTerminals.Add(startNode);
+
+      while (nonTerminals.Count > 0) {
+        if (genotypeIndex >= maxSubtreeCount) {
+          // if all genomes were used, only add terminal nodes to the remaining subtrees
+          ISymbolicExpressionTreeNode current = nonTerminals[0];
+          nonTerminals.RemoveAt(0);
+          current.AddSubtree(GetRandomTerminalNode(current, grammar, random));
+        } else {
+          // similar to PIGEMapper, but here the current node is determined randomly ...
+          ISymbolicExpressionTreeNode current = nonTerminals.SampleRandom(random);
+          nonTerminals.Remove(current);
+
+          ISymbolicExpressionTreeNode newNode = GetNewChildNode(current, genotype, grammar, genotypeIndex, random);
+          int arity = SampleArity(random, newNode, grammar);
+
+          current.AddSubtree(newNode);
+          genotypeIndex++;
+          // new node has subtrees, so add "arity" number of copies of this node to the nonTerminals list
+          for (int i = 0; i < arity; ++i) {
+            nonTerminals.Add(newNode);
+          }
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Plugin.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Plugin.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Plugin.cs.frame	(revision 13279)
@@ -0,0 +1,49 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [Plugin("HeuristicLab.Problems.GrammaticalEvolution","Provides classes for grammatical evolution.", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.GrammaticalEvolution-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.GeneticProgramming", "3.3")] // for artificial ant problem
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic.Regression", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class HeuristicLabProblemsGrammaticalEvolutionPlugin : PluginBase {
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Properties/AssemblyInfo.cs.frame	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/Properties/AssemblyInfo.cs.frame	(revision 13279)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ *
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.GrammaticalEvolution")]
+[assembly: AssemblyDescription("Provides classes for Grammatical Evolution (GE).")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) Sabine Winkler")]
+[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("3E6DC5DA-2C8D-48BF-83C6-9D990872F3A0")]
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisEvaluator.cs	(revision 13279)
@@ -0,0 +1,133 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.GrammaticalEvolution.Mappers;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  public abstract class GESymbolicDataAnalysisEvaluator<T> : SingleSuccessorOperator,
+    IGESymbolicDataAnalysisEvaluator<T>, ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator, IStochasticOperator
+  where T : class, IDataAnalysisProblemData {
+    private const string RandomParameterName = "Random";
+    private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree";
+    private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string IntegerVectorParameterName = "IntegerVector";
+    private const string GenotypeToPhenotypeMapperParameterName = "GenotypeToPhenotypeMapper";
+    private const string SymbolicExpressionTreeGrammarParameterName = "SymbolicExpressionTreeGrammar";
+
+    private const string EstimationLimitsParameterName = "EstimationLimits";
+    private const string EvaluationPartitionParameterName = "EvaluationPartition";
+    private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples";
+    private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";
+    private const string ValidRowIndicatorParameterName = "ValidRowIndicator";
+
+    public override bool CanChangeName { get { return false; } }
+
+    #region parameter properties
+    ILookupParameter<IRandom> IStochasticOperator.RandomParameter {
+      get { return RandomParameter; }
+    }
+
+    public IValueLookupParameter<IRandom> RandomParameter {
+      get { return (IValueLookupParameter<IRandom>)Parameters[RandomParameterName]; }
+    }
+    public ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter {
+      get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[SymbolicDataAnalysisTreeInterpreterParameterName]; }
+    }
+    public IValueLookupParameter<T> ProblemDataParameter {
+      get { return (IValueLookupParameter<T>)Parameters[ProblemDataParameterName]; }
+    }
+    public ILookupParameter<IntegerVector> IntegerVectorParameter {
+      get { return (ILookupParameter<IntegerVector>)Parameters[IntegerVectorParameterName]; }
+    }
+    public ILookupParameter<IGenotypeToPhenotypeMapper> GenotypeToPhenotypeMapperParameter {
+      get { return (ILookupParameter<IGenotypeToPhenotypeMapper>)Parameters[GenotypeToPhenotypeMapperParameterName]; }
+    }
+    public IValueLookupParameter<ISymbolicDataAnalysisGrammar> SymbolicExpressionTreeGrammarParameter {
+      get { return (IValueLookupParameter<ISymbolicDataAnalysisGrammar>)Parameters[SymbolicExpressionTreeGrammarParameterName]; }
+    }
+
+    public IValueLookupParameter<IntRange> EvaluationPartitionParameter {
+      get { return (IValueLookupParameter<IntRange>)Parameters[EvaluationPartitionParameterName]; }
+    }
+    public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter {
+      get { return (IValueLookupParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; }
+    }
+    public IValueLookupParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter {
+      get { return (IValueLookupParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; }
+    }
+    public ILookupParameter<BoolValue> ApplyLinearScalingParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }
+    }
+    public IValueLookupParameter<StringValue> ValidRowIndicatorParameter {
+      get { return (IValueLookupParameter<StringValue>)Parameters[ValidRowIndicatorParameterName]; }
+    }
+    #endregion
+
+
+    [StorableConstructor]
+    protected GESymbolicDataAnalysisEvaluator(bool deserializing) : base(deserializing) { }
+    protected GESymbolicDataAnalysisEvaluator(GESymbolicDataAnalysisEvaluator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public GESymbolicDataAnalysisEvaluator()
+      : base() {
+      Parameters.Add(new ValueLookupParameter<IRandom>(RandomParameterName, "The random generator to use."));
+      Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The interpreter that should be used to calculate the output values of the symbolic data analysis tree."));
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic data analysis solution encoded as a symbolic expression tree."));
+      Parameters.Add(new ValueLookupParameter<T>(ProblemDataParameterName, "The problem data on which the symbolic data analysis solution should be evaluated."));
+      Parameters.Add(new LookupParameter<IntegerVector>(IntegerVectorParameterName, "The symbolic data analysis solution encoded as an integer vector genome."));
+      Parameters.Add(new LookupParameter<IGenotypeToPhenotypeMapper>(GenotypeToPhenotypeMapperParameterName, "Maps the genotype (an integer vector) to the phenotype (a symbolic expression tree)."));
+      Parameters.Add(new ValueLookupParameter<ISymbolicDataAnalysisGrammar>(SymbolicExpressionTreeGrammarParameterName, "The tree grammar that defines the correct syntax of symbolic expression trees that should be created."));
+
+      Parameters.Add(new ValueLookupParameter<IntRange>(EvaluationPartitionParameterName, "The start index of the dataset partition on which the symbolic data analysis solution should be evaluated."));
+      Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The upper and lower limit that should be used as cut off value for the output values of symbolic data analysis trees."));
+      Parameters.Add(new ValueLookupParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation between the start and end index."));
+      Parameters.Add(new LookupParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the individual should be linearly scaled before evaluating."));
+      Parameters.Add(new ValueLookupParameter<StringValue>(ValidRowIndicatorParameterName, "An indicator variable in the data set that specifies which rows should be evaluated (those for which the indicator <> 0) (optional)."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisProblem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisProblem.cs	(revision 13279)
@@ -0,0 +1,319 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.GrammaticalEvolution.Mappers;
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  public abstract class GESymbolicDataAnalysisProblem<T, U, V> : HeuristicOptimizationProblem<U, V>, IDataAnalysisProblem<T>,
+                                                                 IGESymbolicDataAnalysisProblem, IStorableContent,
+                                                                 IProblemInstanceConsumer<T>, IProblemInstanceExporter<T>
+    where T : class, IDataAnalysisProblemData
+    where U : class, IGESymbolicDataAnalysisEvaluator<T>
+    where V : class, IIntegerVectorCreator {
+
+    #region parameter names & descriptions
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string SymbolicExpressionTreeGrammarParameterName = "SymbolicExpressionTreeGrammar";
+    private const string SymbolicExpressionTreeInterpreterParameterName = "SymbolicExpressionTreeInterpreter";
+    private const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength";
+    private const string RelativeNumberOfEvaluatedSamplesParameterName = "RelativeNumberOfEvaluatedSamples";
+    private const string FitnessCalculationPartitionParameterName = "FitnessCalculationPartition";
+    private const string ValidationPartitionParameterName = "ValidationPartition";
+    private const string ApplyLinearScalingParameterName = "ApplyLinearScaling";
+    private const string BoundsParameterName = "Bounds";
+    private const string GenotypeToPhenotypeMapperParameterName = "GenotypeToPhenotypeMapper";
+    private const string ProblemDataParameterDescription = "";
+    private const string SymbolicExpressionTreeGrammarParameterDescription = "The grammar that should be used for symbolic expression tree.";
+    private const string SymbolicExpressionTreeInterpreterParameterDescription = "The interpreter that should be used to evaluate the symbolic expression tree.";
+    private const string MaximumSymbolicExpressionTreeLengthParameterDescription = "Maximal length of the symbolic expression.";
+    private const string RelativeNumberOfEvaluatedSamplesParameterDescription = "The relative number of samples of the dataset partition, which should be randomly chosen for evaluation.";
+    private const string FitnessCalculationPartitionParameterDescription = "The partition of the problem data training partition, that should be used to calculate the fitness of an individual.";
+    private const string ValidationPartitionParameterDescription = "The partition of the problem data training partition, that should be used to select the best model from (optional).";
+    private const string ApplyLinearScalingParameterDescription = "Flag that indicates if the individual should be linearly scaled before evaluating.";
+    private const string BoundsParameterDescription = "The integer number range in which the single genomes of a genotype are created.";
+    private const string GenotypeToPhenotypeMapperParameterDescription = "Maps the genotype (an integer vector) to the phenotype (a symbolic expression tree).";
+    #endregion
+
+    #region parameter properties
+    IParameter IDataAnalysisProblem.ProblemDataParameter {
+      get { return ProblemDataParameter; }
+    }
+    public IValueParameter<T> ProblemDataParameter {
+      get { return (IValueParameter<T>)Parameters[ProblemDataParameterName]; }
+    }
+    public IValueParameter<ISymbolicDataAnalysisGrammar> SymbolicExpressionTreeGrammarParameter {
+      get { return (IValueParameter<ISymbolicDataAnalysisGrammar>)Parameters[SymbolicExpressionTreeGrammarParameterName]; }
+    }
+    public IValueParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter {
+      get { return (IValueParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[SymbolicExpressionTreeInterpreterParameterName]; }
+    }
+    public IFixedValueParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeLengthParameterName]; }
+    }
+    public IFixedValueParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter {
+      get { return (IFixedValueParameter<PercentValue>)Parameters[RelativeNumberOfEvaluatedSamplesParameterName]; }
+    }
+    public IFixedValueParameter<IntRange> FitnessCalculationPartitionParameter {
+      get { return (IFixedValueParameter<IntRange>)Parameters[FitnessCalculationPartitionParameterName]; }
+    }
+    public IFixedValueParameter<IntRange> ValidationPartitionParameter {
+      get { return (IFixedValueParameter<IntRange>)Parameters[ValidationPartitionParameterName]; }
+    }
+    public IFixedValueParameter<BoolValue> ApplyLinearScalingParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[ApplyLinearScalingParameterName]; }
+    }
+    public IValueParameter<IntMatrix> BoundsParameter {
+      get { return (IValueParameter<IntMatrix>)Parameters[BoundsParameterName]; }
+    }
+    public IValueParameter<IGenotypeToPhenotypeMapper> GenotypeToPhenotypeMapperParameter {
+      get { return (IValueParameter<IGenotypeToPhenotypeMapper>)Parameters[GenotypeToPhenotypeMapperParameterName]; }
+    }
+    #endregion
+
+    #region properties
+    public string Filename { get; set; }
+    public static new Image StaticItemImage { get { return VSImageLibrary.Type; } }
+
+    IDataAnalysisProblemData IDataAnalysisProblem.ProblemData {
+      get { return ProblemData; }
+    }
+    public T ProblemData {
+      get { return ProblemDataParameter.Value; }
+      set { ProblemDataParameter.Value = value; }
+    }
+
+    public ISymbolicDataAnalysisGrammar SymbolicExpressionTreeGrammar {
+      get { return SymbolicExpressionTreeGrammarParameter.Value; }
+      set { SymbolicExpressionTreeGrammarParameter.Value = value; }
+    }
+    public ISymbolicDataAnalysisExpressionTreeInterpreter SymbolicExpressionTreeInterpreter {
+      get { return SymbolicExpressionTreeInterpreterParameter.Value; }
+      set { SymbolicExpressionTreeInterpreterParameter.Value = value; }
+    }
+
+    public IntValue MaximumSymbolicExpressionTreeLength {
+      get { return MaximumSymbolicExpressionTreeLengthParameter.Value; }
+    }
+
+    public PercentValue RelativeNumberOfEvaluatedSamples {
+      get { return RelativeNumberOfEvaluatedSamplesParameter.Value; }
+    }
+
+    public IntRange FitnessCalculationPartition {
+      get { return FitnessCalculationPartitionParameter.Value; }
+    }
+    public IntRange ValidationPartition {
+      get { return ValidationPartitionParameter.Value; }
+    }
+    public BoolValue ApplyLinearScaling {
+      get { return ApplyLinearScalingParameter.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected GESymbolicDataAnalysisProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+    protected GESymbolicDataAnalysisProblem(GESymbolicDataAnalysisProblem<T, U, V> original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected GESymbolicDataAnalysisProblem(T problemData, U evaluator, V solutionCreator)
+      : base(evaluator, solutionCreator) {
+      Parameters.Add(new ValueParameter<T>(ProblemDataParameterName, ProblemDataParameterDescription, problemData));
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisGrammar>(SymbolicExpressionTreeGrammarParameterName, SymbolicExpressionTreeGrammarParameterDescription));
+      Parameters.Add(new ValueParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicExpressionTreeInterpreterParameterName, SymbolicExpressionTreeInterpreterParameterDescription));
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, MaximumSymbolicExpressionTreeLengthParameterDescription));
+      Parameters.Add(new FixedValueParameter<IntRange>(FitnessCalculationPartitionParameterName, FitnessCalculationPartitionParameterDescription));
+      Parameters.Add(new FixedValueParameter<IntRange>(ValidationPartitionParameterName, ValidationPartitionParameterDescription));
+      Parameters.Add(new FixedValueParameter<PercentValue>(RelativeNumberOfEvaluatedSamplesParameterName, RelativeNumberOfEvaluatedSamplesParameterDescription, new PercentValue(1)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(ApplyLinearScalingParameterName, ApplyLinearScalingParameterDescription, new BoolValue(false)));
+      IntMatrix m = new IntMatrix(new int[,] { { 0, 100 } });
+      Parameters.Add(new ValueParameter<IntMatrix>(BoundsParameterName, BoundsParameterDescription, m));
+      Parameters.Add(new ValueParameter<IGenotypeToPhenotypeMapper>(GenotypeToPhenotypeMapperParameterName, GenotypeToPhenotypeMapperParameterDescription, new DepthFirstMapper()));
+
+      SymbolicExpressionTreeInterpreterParameter.Hidden = true;
+      ApplyLinearScalingParameter.Hidden = true;
+
+      SymbolicExpressionTreeGrammar = new GESymbolicExpressionGrammar(problemData.AllowedInputVariables, problemData.AllowedInputVariables.Count() * 3);
+      SymbolicExpressionTreeInterpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter();
+
+      FitnessCalculationPartition.Start = ProblemData.TrainingPartition.Start;
+      FitnessCalculationPartition.End = ProblemData.TrainingPartition.End;
+
+      InitializeOperators();
+
+      UpdateGrammar();
+      RegisterEventHandlers();
+    }
+
+    private void DeregisterGrammarHandler() {
+      SymbolicExpressionTreeGrammarParameter.ValueChanged -= SymbolicExpressionTreeGrammarParameter_ValueChanged;
+    }
+    private void RegisterGrammarHandler() {
+      SymbolicExpressionTreeGrammarParameter.ValueChanged += SymbolicExpressionTreeGrammarParameter_ValueChanged;
+    }
+
+    private void UpdateGrammar() {
+      DeregisterGrammarHandler();
+      // create a new grammar instance with the correct allowed input variables
+      SymbolicExpressionTreeGrammarParameter.Value =
+        new GESymbolicExpressionGrammar(ProblemData.AllowedInputVariables, ProblemData.AllowedInputVariables.Count() * 3);
+      RegisterGrammarHandler();
+    }
+
+    private void InitializeOperators() {
+      Operators.AddRange(ApplicationManager.Manager.GetInstances<IIntegerVectorOperator>());
+      Operators.Add(new SymbolicExpressionSymbolFrequencyAnalyzer());
+      Operators.Add(new SymbolicDataAnalysisVariableFrequencyAnalyzer());
+      Operators.Add(new MinAverageMaxSymbolicExpressionTreeLengthAnalyzer());
+      Operators.Add(new SymbolicExpressionTreeLengthAnalyzer());
+      ParameterizeOperators();
+    }
+
+    #region events
+    private void RegisterEventHandlers() {
+      ProblemDataParameter.ValueChanged += new EventHandler(ProblemDataParameter_ValueChanged);
+      ProblemDataParameter.Value.Changed += (object sender, EventArgs e) => OnProblemDataChanged();
+
+      RegisterGrammarHandler();
+    }
+
+    private void ProblemDataParameter_ValueChanged(object sender, EventArgs e) {
+      ValidationPartition.Start = 0;
+      ValidationPartition.End = 0;
+      ProblemDataParameter.Value.Changed += (object s, EventArgs args) => OnProblemDataChanged();
+      OnProblemDataChanged();
+    }
+
+    private void SymbolicExpressionTreeGrammarParameter_ValueChanged(object sender, EventArgs e) {
+      UpdateGrammar();
+    }
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      Evaluator.SymbolicExpressionTreeParameter.ActualNameChanged += new EventHandler(Evaluator_SymbolicExpressionTreeParameter_ActualNameChanged);
+      ParameterizeOperators();
+    }
+
+    private void Evaluator_SymbolicExpressionTreeParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeOperators();
+    }
+
+    public event EventHandler ProblemDataChanged;
+    protected virtual void OnProblemDataChanged() {
+      FitnessCalculationPartition.Start = ProblemData.TrainingPartition.Start;
+      FitnessCalculationPartition.End = ProblemData.TrainingPartition.End;
+
+      UpdateGrammar();
+      ParameterizeOperators();
+
+      var handler = ProblemDataChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+
+      OnReset();
+    }
+    #endregion
+
+    protected virtual void ParameterizeOperators() {
+      var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators).ToList();
+
+      foreach (var op in operators.OfType<ISymbolicExpressionTreeGrammarBasedOperator>()) {
+        op.SymbolicExpressionTreeGrammarParameter.ActualName = SymbolicExpressionTreeGrammarParameter.Name;
+      }
+      foreach (var op in operators.OfType<IGESymbolicDataAnalysisEvaluator<T>>()) {
+        op.ProblemDataParameter.ActualName = ProblemDataParameterName;
+        op.SymbolicExpressionTreeParameter.ActualName = Evaluator.SymbolicExpressionTreeParameter.ActualName;
+        op.EvaluationPartitionParameter.ActualName = FitnessCalculationPartitionParameter.Name;
+        op.RelativeNumberOfEvaluatedSamplesParameter.ActualName = RelativeNumberOfEvaluatedSamplesParameter.Name;
+        op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name;
+        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.Name;
+        op.GenotypeToPhenotypeMapperParameter.ActualName = GenotypeToPhenotypeMapperParameter.Name;
+        op.SymbolicExpressionTreeGrammarParameter.ActualName = SymbolicExpressionTreeGrammarParameter.Name;
+      }
+      foreach (var op in operators.OfType<IIntegerVectorCrossover>()) {
+        op.ParentsParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+        op.ChildParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+      }
+      foreach (var op in operators.OfType<IIntegerVectorManipulator>()) {
+        op.IntegerVectorParameter.ActualName = SolutionCreator.IntegerVectorParameter.ActualName;
+      }
+      foreach (var op in operators.OfType<IIntegerVectorCreator>()) {
+        op.BoundsParameter.ActualName = BoundsParameter.Name;
+        op.LengthParameter.ActualName = MaximumSymbolicExpressionTreeLengthParameter.Name;
+      }
+      foreach (var op in operators.OfType<ISymbolicExpressionTreeAnalyzer>()) {
+        op.SymbolicExpressionTreeParameter.ActualName = Evaluator.SymbolicExpressionTreeParameter.ActualName;
+      }
+      foreach (var op in operators.OfType<ISymbolicDataAnalysisSingleObjectiveAnalyzer>()) {
+        op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name;
+      }
+      foreach (var op in operators.OfType<ISymbolicDataAnalysisMultiObjectiveAnalyzer>()) {
+        op.ApplyLinearScalingParameter.ActualName = ApplyLinearScalingParameter.Name;
+      }
+      foreach (var op in operators.OfType<ISymbolicDataAnalysisAnalyzer>()) {
+        op.SymbolicExpressionTreeParameter.ActualName = Evaluator.SymbolicExpressionTreeParameter.ActualName;
+      }
+      foreach (var op in operators.OfType<IGESymbolicDataAnalysisValidationAnalyzer<U, T>>()) {
+        op.RelativeNumberOfEvaluatedSamplesParameter.ActualName = RelativeNumberOfEvaluatedSamplesParameter.Name;
+        op.ValidationPartitionParameter.ActualName = ValidationPartitionParameter.Name;
+      }
+      foreach (var op in operators.OfType<ISymbolicDataAnalysisInterpreterOperator>()) {
+        op.SymbolicDataAnalysisTreeInterpreterParameter.ActualName = SymbolicExpressionTreeInterpreterParameter.Name;
+      }
+    }
+
+    #region Import & Export
+    public virtual void Load(T data) {
+      Name = data.Name;
+      Description = data.Description;
+      ProblemData = data;
+    }
+
+    public virtual T Export() {
+      return ProblemData;
+    }
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveEvaluator.cs	(revision 13279)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  public abstract class GESymbolicDataAnalysisSingleObjectiveEvaluator<T> : GESymbolicDataAnalysisEvaluator<T>, IGESymbolicDataAnalysisSingleObjectiveEvaluator<T>
+   where T : class, IDataAnalysisProblemData {
+    private const string QualityParameterName = "Quality";
+    #region parameter properties
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    #endregion
+    #region properties
+    public abstract bool Maximization { get; }
+    #endregion
+    [StorableConstructor]
+    protected GESymbolicDataAnalysisSingleObjectiveEvaluator(bool deserializing) : base(deserializing) { }
+    protected GESymbolicDataAnalysisSingleObjectiveEvaluator(GESymbolicDataAnalysisSingleObjectiveEvaluator<T> original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    protected GESymbolicDataAnalysisSingleObjectiveEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The quality of the evaluated symbolic data analysis solution."));
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveProblem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicDataAnalysisSingleObjectiveProblem.cs	(revision 13279)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  public abstract class GESymbolicDataAnalysisSingleObjectiveProblem<T, U, V> : GESymbolicDataAnalysisProblem<T, U, V>,
+                                                                                IGESymbolicDataAnalysisSingleObjectiveProblem
+    where T : class, IDataAnalysisProblemData
+    where U : class, IGESymbolicDataAnalysisSingleObjectiveEvaluator<T>
+    where V : class, IIntegerVectorCreator {
+    private const string MaximizationParameterName = "Maximization";
+    private const string BestKnownQualityParameterName = "BestKnownQuality";
+
+    #region parameter properties
+    public IFixedValueParameter<BoolValue> MaximizationParameter {
+      get { return (IFixedValueParameter<BoolValue>)Parameters[MaximizationParameterName]; }
+    }
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.MaximizationParameter {
+      get { return MaximizationParameter; }
+    }
+    public IFixedValueParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (IFixedValueParameter<DoubleValue>)Parameters[BestKnownQualityParameterName]; }
+    }
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.BestKnownQualityParameter {
+      get { return BestKnownQualityParameter; }
+    }
+    #endregion
+
+    #region properties
+    public BoolValue Maximization {
+      get { return MaximizationParameter.Value; }
+    }
+    public DoubleValue BestKnownQuality {
+      get { return BestKnownQualityParameter.Value; }
+    }
+    ISingleObjectiveEvaluator ISingleObjectiveHeuristicOptimizationProblem.Evaluator {
+      get { return Evaluator; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected GESymbolicDataAnalysisSingleObjectiveProblem(bool deserializing) : base(deserializing) { }
+    protected GESymbolicDataAnalysisSingleObjectiveProblem(GESymbolicDataAnalysisSingleObjectiveProblem<T, U, V> original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandler();
+      MaximizationParameter.Hidden = true;
+    }
+
+    public GESymbolicDataAnalysisSingleObjectiveProblem(T problemData, U evaluator, V solutionCreator)
+      : base(problemData, evaluator, solutionCreator) {
+      Parameters.Add(new FixedValueParameter<BoolValue>(MaximizationParameterName, "Set to false if the problem should be minimized."));
+      Parameters.Add(new FixedValueParameter<DoubleValue>(BestKnownQualityParameterName, "The quality of the best known solution of this problem."));
+
+      MaximizationParameter.Hidden = true;
+      InitializeOperators();
+      RegisterEventHandler();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandler();
+    }
+
+    private void InitializeOperators() {
+      Operators.Add(new SymbolicDataAnalysisAlleleFrequencyAnalyzer());
+      ParameterizeOperators();
+    }
+
+    private void RegisterEventHandler() {
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(QualityParameter_ActualNameChanged);
+    }
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      Evaluator.QualityParameter.ActualNameChanged += new EventHandler(QualityParameter_ActualNameChanged);
+      Maximization.Value = base.Evaluator.Maximization;
+      ParameterizeOperators();
+    }
+
+    private void QualityParameter_ActualNameChanged(object sender, EventArgs e) {
+      ParameterizeOperators();
+    }
+
+    protected override void ParameterizeOperators() {
+      base.ParameterizeOperators();
+
+      foreach (var op in Operators.OfType<ISymbolicDataAnalysisSingleObjectiveAnalyzer>()) {
+        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
+        op.MaximizationParameter.ActualName = MaximizationParameterName;
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicExpressionGrammar.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicExpressionGrammar.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicExpressionGrammar.cs	(revision 13279)
@@ -0,0 +1,154 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  [Item("GESymbolicExpressionGrammar", "Represents a grammar for functional expressions for grammatical evolution.")]
+  public class GESymbolicExpressionGrammar : SymbolicExpressionGrammar, ISymbolicDataAnalysisGrammar {
+    [StorableConstructor]
+    protected GESymbolicExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected GESymbolicExpressionGrammar(GESymbolicExpressionGrammar original, Cloner cloner) : base(original, cloner) { }
+    public GESymbolicExpressionGrammar()
+      : base(ItemAttribute.GetName(typeof(GESymbolicExpressionGrammar)), ItemAttribute.GetDescription(typeof(GESymbolicExpressionGrammar))) {
+      // empty ctor is necessary to allow creation of new GEGrammars from the GUI.
+      // the problem creates a new correctly configured grammar when the grammar is set
+    }
+    internal GESymbolicExpressionGrammar(IEnumerable<string> variableNames, int nConstants)
+      : base(ItemAttribute.GetName(typeof(GESymbolicExpressionGrammar)), ItemAttribute.GetDescription(typeof(GESymbolicExpressionGrammar))) {
+      // this ctor is called by the problem as only the problem knows the allowed input variables
+      Initialize(variableNames, nConstants);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GESymbolicExpressionGrammar(this, cloner);
+    }
+
+    private void Initialize(IEnumerable<string> variableNames, int nConstants) {
+      #region symbol declaration
+      var add = new Addition();
+      var sub = new Subtraction();
+      var mul = new Multiplication();
+      var div = new Division();
+      var mean = new Average();
+      var log = new Logarithm();
+      var pow = new Power();
+      var square = new Square();
+      var root = new Root();
+      var sqrt = new SquareRoot();
+      var exp = new Exponential();
+
+      // we use our own random number generator here because we assume 
+      // that grammars are only initialized once when setting the grammar in the problem.
+      // This means everytime the grammar parameter in the problem is changed
+      // we initialize the constants to new values
+      var rand = new MersenneTwister();
+      // warm up
+      for (int i = 0; i < 1000; i++) rand.NextDouble();
+
+      var constants = new List<Constant>(nConstants);
+      for (int i = 0; i < nConstants; i++) {
+        var constant = new Constant();
+        do {
+          var constVal = rand.NextDouble() * 20.0 - 10.0;
+          constant.Name = string.Format("{0:0.000}", constVal);
+          constant.MinValue = constVal;
+          constant.MaxValue = constVal;
+          constant.ManipulatorSigma = 0.0;
+          constant.ManipulatorMu = 0.0;
+          constant.MultiplicativeManipulatorSigma = 0.0;
+        } while (constants.Any(c => c.Name == constant.Name)); // unlikely, but it could happen that the same constant value is sampled twice. so we resample if necessary.
+        constants.Add(constant);
+      }
+
+      var variables = new List<HeuristicLab.Problems.DataAnalysis.Symbolic.Variable>();
+      foreach (var variableName in variableNames) {
+        var variableSymbol = new HeuristicLab.Problems.DataAnalysis.Symbolic.Variable();
+        variableSymbol.Name = variableName;
+        variableSymbol.WeightManipulatorMu = 0.0;
+        variableSymbol.WeightManipulatorSigma = 0.0;
+        variableSymbol.WeightMu = 1.0;
+        variableSymbol.WeightSigma = 0.0;
+        variableSymbol.MultiplicativeWeightManipulatorSigma = 0.0;
+        variableSymbol.AllVariableNames = new[] { variableName };
+        variableSymbol.VariableNames = new[] { variableName };
+        variables.Add(variableSymbol);
+      }
+
+      #endregion
+
+      AddSymbol(add);
+      AddSymbol(sub);
+      AddSymbol(mul);
+      AddSymbol(div);
+      AddSymbol(mean);
+      AddSymbol(log);
+      AddSymbol(pow);
+      AddSymbol(square);
+      AddSymbol(root);
+      AddSymbol(sqrt);
+      AddSymbol(exp);
+      constants.ForEach(AddSymbol);
+      variables.ForEach(AddSymbol);
+
+      #region subtree count configuration
+      SetSubtreeCount(add, 2, 2);
+      SetSubtreeCount(sub, 2, 2);
+      SetSubtreeCount(mul, 2, 2);
+      SetSubtreeCount(div, 2, 2);
+      SetSubtreeCount(mean, 2, 2);
+      SetSubtreeCount(log, 1, 1);
+      SetSubtreeCount(pow, 2, 2);
+      SetSubtreeCount(square, 1, 1);
+      SetSubtreeCount(root, 2, 2);
+      SetSubtreeCount(sqrt, 1, 1);
+      SetSubtreeCount(exp, 1, 1);
+      constants.ForEach((c) => SetSubtreeCount(c, 0, 0));
+      variables.ForEach((v) => SetSubtreeCount(v, 0, 0));
+      #endregion
+
+      var functions = new ISymbol[] { add, sub, mul, div, mean, log, pow, root, square, sqrt };
+      var terminalSymbols = variables.Concat<ISymbol>(constants);
+      var allSymbols = functions.Concat(terminalSymbols);
+
+      #region allowed child symbols configuration
+      foreach (var s in allSymbols) {
+        AddAllowedChildSymbol(StartSymbol, s);
+      }
+      foreach (var parentSymb in functions)
+        foreach (var childSymb in allSymbols) {
+          AddAllowedChildSymbol(parentSymb, childSymb);
+        }
+
+      #endregion
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveEvaluator.cs	(revision 13279)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [StorableClass]
+  public class GESymbolicRegressionSingleObjectiveEvaluator : GESymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData>,
+                                                              IGESymbolicRegressionSingleObjectiveEvaluator {
+
+    public const string EvaluatorParameterName = "Evaluator";
+    public const string RandomParameterName = "Random";
+    public const string BoundsParameterName = "Bounds";
+    public const string MaximumSymbolicExpressionTreeLengthParameterName = "MaximumSymbolicExpressionTreeLength";
+
+    public IValueParameter<ISymbolicRegressionSingleObjectiveEvaluator> EvaluatorParameter {
+      get { return (IValueParameter<ISymbolicRegressionSingleObjectiveEvaluator>)Parameters[EvaluatorParameterName]; }
+    }
+    public ILookupParameter<IntMatrix> BoundsParameter {
+      get { return (ILookupParameter<IntMatrix>)Parameters[BoundsParameterName]; }
+    }
+    public ILookupParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[MaximumSymbolicExpressionTreeLengthParameterName]; }
+    }
+
+    public ISymbolicRegressionSingleObjectiveEvaluator Evaluator {
+      get { return EvaluatorParameter.Value; }
+    }
+
+
+    [StorableConstructor]
+    protected GESymbolicRegressionSingleObjectiveEvaluator(bool deserializing) : base(deserializing) { }
+    protected GESymbolicRegressionSingleObjectiveEvaluator(GESymbolicRegressionSingleObjectiveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public GESymbolicRegressionSingleObjectiveEvaluator()
+      : base() {
+      Parameters.Add(new ValueParameter<ISymbolicRegressionSingleObjectiveEvaluator>(EvaluatorParameterName, "The symbolic regression evaluator that should be used to assess the quality of trees.", new SymbolicRegressionSingleObjectivePearsonRSquaredEvaluator()));
+      Parameters.Add(new LookupParameter<IntMatrix>(BoundsParameterName, "The integer number range in which the single genomes of a genotype are created."));
+      Parameters.Add(new LookupParameter<IntValue>(MaximumSymbolicExpressionTreeLengthParameterName, "Genotype length."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GESymbolicRegressionSingleObjectiveEvaluator(this, cloner);
+    }
+
+    public override bool Maximization {
+      get { return Evaluator.Maximization; }
+    }
+
+    public override IOperation Apply() {
+      var genotype = IntegerVectorParameter.ActualValue;
+
+      // translate to phenotype
+      var tree = GenotypeToPhenotypeMapperParameter.ActualValue.Map(
+        RandomParameter.ActualValue,
+        BoundsParameter.ActualValue,
+        MaximumSymbolicExpressionTreeLengthParameter.ActualValue.Value,
+        SymbolicExpressionTreeGrammarParameter.ActualValue,
+        genotype
+      );
+      SymbolicExpressionTreeParameter.ActualValue = tree; // write to scope for analyzers
+
+      // create operation for evaluation
+      var evalOp = ExecutionContext.CreateChildOperation(Evaluator);
+      var successorOp = base.Apply();
+
+      return new OperationCollection(evalOp, successorOp);
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/GESymbolicRegressionSingleObjectiveProblem.cs	(revision 13279)
@@ -0,0 +1,138 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  [Item("Grammatical Evolution Symbolic Regression Problem (single objective)",
+        "Represents grammatical evolution for single objective symbolic regression problems.")]
+  [StorableClass]
+  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 180)]
+  public class GESymbolicRegressionSingleObjectiveProblem : GESymbolicDataAnalysisSingleObjectiveProblem<IRegressionProblemData, IGESymbolicRegressionSingleObjectiveEvaluator, IIntegerVectorCreator>,
+                                                            IRegressionProblem {
+    private const double PunishmentFactor = 10;
+    private const int InitialMaximumTreeLength = 30;
+    private const string EstimationLimitsParameterName = "EstimationLimits";
+    private const string EstimationLimitsParameterDescription
+      = "The limits for the estimated value that can be returned by the symbolic regression model.";
+
+    #region parameter properties
+    public IFixedValueParameter<DoubleLimit> EstimationLimitsParameter {
+      get { return (IFixedValueParameter<DoubleLimit>)Parameters[EstimationLimitsParameterName]; }
+    }
+    #endregion
+    #region properties
+    public DoubleLimit EstimationLimits {
+      get { return EstimationLimitsParameter.Value; }
+    }
+    #endregion
+    [StorableConstructor]
+    protected GESymbolicRegressionSingleObjectiveProblem(bool deserializing) : base(deserializing) { }
+    protected GESymbolicRegressionSingleObjectiveProblem(GESymbolicRegressionSingleObjectiveProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new GESymbolicRegressionSingleObjectiveProblem(this, cloner); }
+
+    public GESymbolicRegressionSingleObjectiveProblem()
+      : base(new RegressionProblemData(), new GESymbolicRegressionSingleObjectiveEvaluator(), new UniformRandomIntegerVectorCreator()) {
+      Parameters.Add(new FixedValueParameter<DoubleLimit>(EstimationLimitsParameterName, EstimationLimitsParameterDescription));
+
+      EstimationLimitsParameter.Hidden = true;
+
+
+      ApplyLinearScalingParameter.Value.Value = true;
+      Maximization.Value = Evaluator.Maximization;
+      MaximumSymbolicExpressionTreeLength.Value = InitialMaximumTreeLength;
+
+      RegisterEventHandlers();
+      InitializeOperators();
+      UpdateEstimationLimits();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    private void RegisterEventHandlers() {
+      // when the ge evaluator itself changes
+      EvaluatorParameter.ValueChanged += (sender, args) => {
+        // register a new hander for the symbreg evaluator in the ge evaluator
+        // hacky because we the evaluator does not have an event for changes of the maximization property
+        EvaluatorParameter.Value.EvaluatorParameter.ValueChanged +=
+          (_, __) => Maximization.Value = Evaluator.Maximization;
+      };
+      EvaluatorParameter.Value.EvaluatorParameter.ValueChanged +=
+        (sender, args) => Maximization.Value = Evaluator.Maximization;
+    }
+
+
+    private void InitializeOperators() {
+      Operators.Add(new SymbolicRegressionSingleObjectiveTrainingBestSolutionAnalyzer());
+      Operators.Add(new SymbolicRegressionSingleObjectiveValidationBestSolutionAnalyzer());
+      Operators.Add(new SymbolicRegressionSingleObjectiveOverfittingAnalyzer());
+      Operators.Add(new SymbolicRegressionSingleObjectiveTrainingParetoBestSolutionAnalyzer());
+      Operators.Add(new SymbolicRegressionSingleObjectiveValidationParetoBestSolutionAnalyzer());
+
+      ParameterizeOperators();
+    }
+
+    private void UpdateEstimationLimits() {
+      if (ProblemData.TrainingIndices.Any()) {
+        var targetValues = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices).ToList();
+        var mean = targetValues.Average();
+        var range = targetValues.Max() - targetValues.Min();
+        EstimationLimits.Upper = mean + PunishmentFactor * range;
+        EstimationLimits.Lower = mean - PunishmentFactor * range;
+      } else {
+        EstimationLimits.Upper = double.MaxValue;
+        EstimationLimits.Lower = double.MinValue;
+      }
+    }
+
+    protected override void OnProblemDataChanged() {
+      base.OnProblemDataChanged();
+      UpdateEstimationLimits();
+    }
+
+    protected override void ParameterizeOperators() {
+      base.ParameterizeOperators();
+      if (Parameters.ContainsKey(EstimationLimitsParameterName)) {
+        var operators = Parameters.OfType<IValueParameter>().Select(p => p.Value).OfType<IOperator>().Union(Operators);
+        foreach (var op in operators.OfType<ISymbolicDataAnalysisBoundedOperator>()) {
+          op.EstimationLimitsParameter.ActualName = EstimationLimitsParameter.Name;
+        }
+      }
+    }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisEvaluator.cs	(revision 13279)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Problems.GrammaticalEvolution.Mappers;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+
+  public interface IGESymbolicDataAnalysisEvaluator<T> : IEvaluator
+    where T : class, IDataAnalysisProblemData {
+
+    ILookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter { get; }  // phenotype
+    IValueLookupParameter<IntRange> EvaluationPartitionParameter { get; }
+    IValueLookupParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter { get; }
+    ILookupParameter<BoolValue> ApplyLinearScalingParameter { get; }
+
+    IValueLookupParameter<T> ProblemDataParameter { get; }
+
+    ILookupParameter<IntegerVector> IntegerVectorParameter { get; } // genotype
+    ILookupParameter<IGenotypeToPhenotypeMapper> GenotypeToPhenotypeMapperParameter { get; }
+    IValueLookupParameter<ISymbolicDataAnalysisGrammar> SymbolicExpressionTreeGrammarParameter { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisProblem.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisProblem.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisProblem.cs	(revision 13279)
@@ -0,0 +1,50 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  public interface IGESymbolicDataAnalysisProblem : IDataAnalysisProblem, IHeuristicOptimizationProblem {
+
+    IValueParameter<ISymbolicDataAnalysisGrammar> SymbolicExpressionTreeGrammarParameter { get; }
+    IValueParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicExpressionTreeInterpreterParameter { get; }
+    IFixedValueParameter<IntValue> MaximumSymbolicExpressionTreeLengthParameter { get; }
+    IFixedValueParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter { get; }
+    IFixedValueParameter<IntRange> FitnessCalculationPartitionParameter { get; }
+    IFixedValueParameter<IntRange> ValidationPartitionParameter { get; }
+
+    ISymbolicDataAnalysisGrammar SymbolicExpressionTreeGrammar { get; set; }
+    ISymbolicDataAnalysisExpressionTreeInterpreter SymbolicExpressionTreeInterpreter { get; set; }
+    IntValue MaximumSymbolicExpressionTreeLength { get; }
+    PercentValue RelativeNumberOfEvaluatedSamples { get; }
+    IntRange FitnessCalculationPartition { get; }
+    IntRange ValidationPartition { get; }
+  }
+
+  public interface IGESymbolicDataAnalysisSingleObjectiveProblem : IGESymbolicDataAnalysisProblem, ISingleObjectiveHeuristicOptimizationProblem { }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisSingleObjectiveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisSingleObjectiveEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisSingleObjectiveEvaluator.cs	(revision 13279)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  public interface IGESymbolicDataAnalysisSingleObjectiveEvaluator<T> : IGESymbolicDataAnalysisEvaluator<T>, ISingleObjectiveEvaluator
+    where T : class,IDataAnalysisProblemData {
+    bool Maximization { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisValidationAnalyzer.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisValidationAnalyzer.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicDataAnalysisValidationAnalyzer.cs	(revision 13279)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  public interface IGESymbolicDataAnalysisValidationAnalyzer<T, U> : ISymbolicDataAnalysisAnalyzer, ISymbolicDataAnalysisInterpreterOperator
+    where T : class,IGESymbolicDataAnalysisEvaluator<U>
+    where U : class, IDataAnalysisProblemData {
+    ILookupParameter<IRandom> RandomParameter { get; }
+    ILookupParameter<U> ProblemDataParameter { get; }
+    ILookupParameter<T> EvaluatorParameter { get; }
+    IValueLookupParameter<IntRange> ValidationPartitionParameter { get; }
+    IValueLookupParameter<PercentValue> RelativeNumberOfEvaluatedSamplesParameter { get; }
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionEvaluator.cs	(revision 13279)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  public interface IGESymbolicRegressionEvaluator : IGESymbolicDataAnalysisEvaluator<IRegressionProblemData> {
+  }
+}
Index: /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionSingleObjectiveEvaluator.cs
===================================================================
--- /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionSingleObjectiveEvaluator.cs	(revision 13279)
+++ /stable/HeuristicLab.Problems.GrammaticalEvolution/3.4/SymbolicRegression/IGESymbolicRegressionSingleObjectiveEvaluator.cs	(revision 13279)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 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/>.
+ * 
+ * Author: Sabine Winkler
+ */
+
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.DataAnalysis.Symbolic.Regression;
+
+namespace HeuristicLab.Problems.GrammaticalEvolution {
+  public interface IGESymbolicRegressionSingleObjectiveEvaluator : IGESymbolicRegressionEvaluator,
+                                                                   IGESymbolicDataAnalysisSingleObjectiveEvaluator<IRegressionProblemData> {
+    IValueParameter<ISymbolicRegressionSingleObjectiveEvaluator> EvaluatorParameter { get; }
+  }
+}
