Index: /trunk/sources/HeuristicLab 3.3.sln
===================================================================
--- /trunk/sources/HeuristicLab 3.3.sln	(revision 12898)
+++ /trunk/sources/HeuristicLab 3.3.sln	(revision 12899)
@@ -438,4 +438,8 @@
 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}"
 EndProject
 Global
@@ -2141,4 +2145,28 @@
 		{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
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
@@ -2149,4 +2177,6 @@
 		{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}
 	EndGlobalSection
 EndGlobal
Index: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj	(revision 12898)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.3/HeuristicLab.Problems.LawnMower.Views-3.3.csproj	(revision 12899)
@@ -176,5 +176,5 @@
     <ProjectReference Include="..\..\HeuristicLab.Problems.LawnMower\3.3\HeuristicLab.Problems.LawnMower-3.3.csproj">
       <Project>{9A04599C-D608-4240-8DA6-D41F51C515A3}</Project>
-      <Name>HeuristicLab.Problems.LawnMower</Name>
+      <Name>HeuristicLab.Problems.LawnMower-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/HeuristicLab.Problems.LawnMower.Views-3.4.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/HeuristicLab.Problems.LawnMower.Views-3.4.csproj	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/HeuristicLab.Problems.LawnMower.Views-3.4.csproj	(revision 12899)
@@ -0,0 +1,205 @@
+﻿<?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>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{E186E7BD-E90E-4027-9965-D5E0DBEB00E8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.LawnMower.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.LawnMower.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-1.0.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-1.0.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="SolutionLawnView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SolutionLawnView.Designer.cs">
+      <DependentUpon>SolutionLawnView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SolutionProgramView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SolutionProgramView.Designer.cs">
+      <DependentUpon>SolutionProgramView.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </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>
+    </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.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>
+    </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.LawnMower\3.4\HeuristicLab.Problems.LawnMower-3.4.csproj">
+      <Project>{9b44b886-729d-49b2-b887-4bdcacb91110}</Project>
+      <Name>HeuristicLab.Problems.LawnMower-3.4</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: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Plugin.cs.frame	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Plugin.cs.frame	(revision 12899)
@@ -0,0 +1,35 @@
+﻿#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.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.LawnMower.Views {
+  [Plugin("HeuristicLab.Problems.LawnMower.Views", "Lawn mower demo problem for genetic programming (views)", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.LawnMower.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views", "3.4")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.LawnMower", "3.4")]
+  public class HeuristicLabProblemsLawnMowerViewsPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 12899)
@@ -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.LawnMower")]
+[assembly: AssemblyDescription("Provides classes for lawn mower demo problem for genetic programming")]
+[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("c75ca6a0-0d72-4ca8-a24c-8d7b03c81caa")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.Designer.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.Designer.cs	(revision 12899)
@@ -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.LawnMower.Views {
+  partial class SolutionLawnView : 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: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionLawnView.cs	(revision 12899)
@@ -0,0 +1,75 @@
+﻿#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.LawnMower.Views {
+  [View("Lawn Mower Solution View")]
+  [Content(typeof(Solution), IsDefaultView = true)]
+  public sealed partial class SolutionLawnView : NamedItemView {
+    public new Solution Content {
+      get { return (Solution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionLawnView() : 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: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.Designer.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.Designer.cs	(revision 12899)
@@ -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.LawnMower.Views {
+  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: /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower.Views/3.4/SolutionProgramView.cs	(revision 12899)
@@ -0,0 +1,52 @@
+﻿#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.LawnMower.Views {
+  [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: /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/HeuristicLab.Problems.LawnMower-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/HeuristicLab.Problems.LawnMower-3.3.csproj	(revision 12898)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/HeuristicLab.Problems.LawnMower-3.3.csproj	(revision 12899)
@@ -116,4 +116,25 @@
   <ItemGroup>
     <Compile Include="BestSolutionAnalyzer.cs" />
+    <Compile Include="Symbols\Constant.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\ConstantTreeNode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\Forward.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\Frog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\Left.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\Prog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Symbols\Sum.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <None Include="HeuristicLab.snk" />
     <None Include="Plugin.cs.frame" />
@@ -126,11 +147,4 @@
     <Compile Include="Plugin.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Symbols\Constant.cs" />
-    <Compile Include="Symbols\ConstantTreeNode.cs" />
-    <Compile Include="Symbols\Forward.cs" />
-    <Compile Include="Symbols\Frog.cs" />
-    <Compile Include="Symbols\Left.cs" />
-    <Compile Include="Symbols\Prog.cs" />
-    <Compile Include="Symbols\Sum.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/Problem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/Problem.cs	(revision 12898)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.3/Problem.cs	(revision 12899)
@@ -33,5 +33,4 @@
 namespace HeuristicLab.Problems.LawnMower {
   [StorableClass]
-  [Creatable(CreatableAttribute.Categories.GeneticProgrammingProblems, Priority = 160)]
   [Item("Lawn Mower Problem", "The lawn mower demo problem for genetic programming.")]
   public class Problem : SingleObjectiveHeuristicOptimizationProblem<Evaluator, ISymbolicExpressionTreeCreator> {
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/BestSolutionAnalyzer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/BestSolutionAnalyzer.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/BestSolutionAnalyzer.cs	(revision 12899)
@@ -0,0 +1,116 @@
+﻿#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.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  [Item("Best Lawn Mower Solution Analyzer", "Analyzer that stores the best lawn mower solution.")]
+  public class BestSolutionAnalyzer : SingleSuccessorOperator, ISymbolicExpressionTreeAnalyzer {
+
+    private const string QualityParameterName = "Quality";
+    private const string SymbolicExpressionTreeParameterName = "LawnMowerProgram";
+    private const string LawnWidthParameterName = "LawnWidth";
+    private const string LawnLengthParameterName = "LawnLength";
+    private const string BestSolutionParameterName = "Best solution";
+    private const string ResultsParameterName = "Results";
+
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public IScopeTreeLookupParameter<ISymbolicExpressionTree> SymbolicExpressionTreeParameter {
+      get { return (IScopeTreeLookupParameter<ISymbolicExpressionTree>)Parameters[SymbolicExpressionTreeParameterName]; }
+    }
+    public ILookupParameter<IntValue> LawnWidthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[LawnWidthParameterName]; }
+    }
+    public ILookupParameter<IntValue> LawnLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[LawnLengthParameterName]; }
+    }
+    public ILookupParameter<Solution> BestSolutionParameter {
+      get { return (ILookupParameter<Solution>)Parameters[BestSolutionParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; }
+    }
+
+    [StorableConstructor]
+    protected BestSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+    protected BestSolutionAnalyzer(BestSolutionAnalyzer original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public BestSolutionAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>(QualityParameterName, "The solution quality of the lawn mower program."));
+      Parameters.Add(new ScopeTreeLookupParameter<ISymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The lawn mower program to evaluate represented as symbolic expression tree."));
+      Parameters.Add(new LookupParameter<Solution>(BestSolutionParameterName, "The best lawn mower solution."));
+      Parameters.Add(new LookupParameter<IntValue>(LawnWidthParameterName, "The width of the lawn to mow."));
+      Parameters.Add(new LookupParameter<IntValue>(LawnLengthParameterName, "The length of the lawn to mow."));
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection of the algorithm."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BestSolutionAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var trees = SymbolicExpressionTreeParameter.ActualValue;
+      var qualities = QualityParameter.ActualValue;
+
+      // find max tree
+      double maxQuality = double.NegativeInfinity;
+      ISymbolicExpressionTree bestTree = null;
+      for (int i = 0; i < qualities.Length; i++) {
+        if (qualities[i].Value > maxQuality) {
+          maxQuality = qualities[i].Value;
+          bestTree = trees[i];
+        }
+      }
+      int length = LawnLengthParameter.ActualValue.Value;
+      int width = LawnWidthParameter.ActualValue.Value;
+      var bestSolution = new Solution(bestTree, length, width);
+      BestSolutionParameter.ActualValue = bestSolution;
+
+      var resultCollection = ResultParameter.ActualValue;
+      if (!resultCollection.ContainsKey(BestSolutionParameterName)) {
+        resultCollection.Add(new Result(BestSolutionParameterName, "The best lawn mower solution", bestSolution));
+      } else {
+        resultCollection[BestSolutionParameterName].Value = bestSolution;
+      }
+
+      return base.Apply();
+    }
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Evaluator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Evaluator.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Evaluator.cs	(revision 12899)
@@ -0,0 +1,93 @@
+﻿#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.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  [Item("Lawn Mower Evaluator", "Evaluator for the lawn mower demo GP problem.")]
+  public class Evaluator : InstrumentedOperator, ISingleObjectiveEvaluator {
+
+    private const string QualityParameterName = "Quality";
+    private const string LawnMowerProgramParameterName = "LawnMowerProgram";
+    private const string LawnWidthParameterName = "LawnWidth";
+    private const string LawnLengthParameterName = "LawnLength";
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<ISymbolicExpressionTree> LawnMowerProgramParameter {
+      get { return (ILookupParameter<ISymbolicExpressionTree>)Parameters[LawnMowerProgramParameterName]; }
+    }
+    public ILookupParameter<IntValue> LawnWidthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[LawnWidthParameterName]; }
+    }
+    public ILookupParameter<IntValue> LawnLengthParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[LawnLengthParameterName]; }
+    }
+
+    [StorableConstructor]
+    protected Evaluator(bool deserializing) : base(deserializing) { }
+    protected Evaluator(Evaluator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Evaluator() {
+      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The solution quality of the lawn mower program."));
+      Parameters.Add(new LookupParameter<ISymbolicExpressionTree>(LawnMowerProgramParameterName, "The lawn mower program to evaluate represented as symbolic expression tree."));
+      Parameters.Add(new LookupParameter<IntValue>(LawnWidthParameterName, "The width of the lawn to mow."));
+      Parameters.Add(new LookupParameter<IntValue>(LawnLengthParameterName, "The length of the lawn to mow."));
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Evaluator(this, cloner);
+    }
+    public override IOperation InstrumentedApply() {
+      int length = LawnLengthParameter.ActualValue.Value;
+      int width = LawnWidthParameter.ActualValue.Value;
+      ISymbolicExpressionTree tree = LawnMowerProgramParameter.ActualValue;
+
+      bool[,] 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++;
+          }
+
+      QualityParameter.ActualValue = new DoubleValue(numberOfMowedCells);
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Grammar.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Grammar.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Grammar.cs	(revision 12899)
@@ -0,0 +1,75 @@
+﻿#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.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  [Item("Lawn Mower Grammar", "The grammar for the lawn mower GP problem.")]
+  public sealed class Grammar : SymbolicExpressionGrammar {
+    [StorableConstructor]
+    private Grammar(bool deserializing) : base(deserializing) { }
+    private Grammar(Grammar original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Grammar()
+      : base("Grammar", "Gammar for the lawn mower demo GP problem.") {
+      Initialize();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Grammar(this, cloner);
+    }
+    private void Initialize() {
+      // create all symbols
+      var sum = new Sum();
+      var prog = new Prog();
+      var frog = new Frog();
+      var left = new Left();
+      var forward = new Forward();
+      var constant = new Constant();
+
+      var allSymbols = new List<ISymbol>() { sum, prog, frog, left, forward, constant };
+
+      // add all symbols to the grammar
+      foreach (var s in allSymbols)
+        AddSymbol(s);
+
+      // define grammar rules
+      foreach (var s in allSymbols) {
+        AddAllowedChildSymbol(sum, s);
+        AddAllowedChildSymbol(sum, s);
+        AddAllowedChildSymbol(prog, s);
+        AddAllowedChildSymbol(prog, s);
+        AddAllowedChildSymbol(frog, s);
+        AddAllowedChildSymbol(StartSymbol, s);
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/HeuristicLab.Problems.LawnMower-3.4.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/HeuristicLab.Problems.LawnMower-3.4.csproj	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/HeuristicLab.Problems.LawnMower-3.4.csproj	(revision 12899)
@@ -0,0 +1,205 @@
+﻿<?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>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{9B44B886-729D-49B2-B887-4BDCACB91110}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.LawnMower</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.LawnMower-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-1.0.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-1.0.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\trunk\sources\bin\HeuristicLab.Problems.LawnMower-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Interpreter.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Solution.cs" />
+    <Compile Include="Problem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </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.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.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.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+    </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: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Interpreter.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Interpreter.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Interpreter.cs	(revision 12899)
@@ -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.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: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Plugin.cs.frame	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Plugin.cs.frame	(revision 12899)
@@ -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/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [Plugin("HeuristicLab.Problems.LawnMower", "Lawn mower demo problem for genetic programming", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.LawnMower-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "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.Random", "3.3")]
+  public class HeuristicLabProblemsLawnMowerPlugin : PluginBase {
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Problem.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Problem.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Problem.cs	(revision 12899)
@@ -0,0 +1,113 @@
+﻿#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.PluginInfrastructure;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Problems.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: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Properties/AssemblyInfo.cs.frame	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Properties/AssemblyInfo.cs.frame	(revision 12899)
@@ -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.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.LawnMower")]
+[assembly: AssemblyDescription("Provides views for the lawn mower demo problem for genetic programming")]
+[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("c75ca6a0-0d72-4ca8-a24c-8d7b03c81caa")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.0.$WCREV$")]
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Solution.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Solution.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Solution.cs	(revision 12899)
@@ -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.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: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Constant.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Constant.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Constant.cs	(revision 12899)
@@ -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 HeuristicLab.Common;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Constant : Symbol {
+    public override int MinimumArity {
+      get { return 0; }
+    }
+    public override int MaximumArity {
+      get { return 0; }
+    }
+    [StorableConstructor]
+    private Constant(bool deserializing) : base(deserializing) { }
+    private Constant(Constant original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Constant()
+      : base("Constant", "Vector of two random integers.") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+
+    public override ISymbolicExpressionTreeNode CreateTreeNode() {
+      return new ConstantTreeNode();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Constant(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/ConstantTreeNode.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/ConstantTreeNode.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/ConstantTreeNode.cs	(revision 12899)
@@ -0,0 +1,66 @@
+﻿#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 HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class ConstantTreeNode : SymbolicExpressionTreeTerminalNode {
+    private Tuple<int, int> value;
+
+    public override bool HasLocalParameters {
+      get { return true; }
+    }
+
+    [Storable]
+    public Tuple<int, int> Value { get { return value; } private set { this.value = value; } }
+
+    [StorableConstructor]
+    private ConstantTreeNode(bool deserializing) : base(deserializing) { }
+    private ConstantTreeNode(ConstantTreeNode original, Cloner cloner)
+      : base(original, cloner) {
+      this.value = new Tuple<int, int>(original.value.Item1, original.value.Item2);
+    }
+
+    public ConstantTreeNode()
+      : base(new Constant()) {
+      value = Tuple.Create(0, 0);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ConstantTreeNode(this, cloner);
+    }
+    public override void ResetLocalParameters(IRandom random) {
+      value = new Tuple<int, int>(random.Next(-20, 20), random.Next(-20, 20));
+    }
+    public override void ShakeLocalParameters(IRandom random, double shakingFactor) {
+      int dX = (int)Math.Round(random.Next(-10, +10) * shakingFactor);
+      int dY = (int)Math.Round(random.Next(-10, +10) * shakingFactor);
+      value = new Tuple<int, int>(value.Item1 + dX, value.Item2 + dY);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Forward.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Forward.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Forward.cs	(revision 12899)
@@ -0,0 +1,51 @@
+﻿#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.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Forward : Symbol {
+    public override int MinimumArity {
+      get { return 0; }
+    }
+    public override int MaximumArity {
+      get { return 0; }
+    }
+    [StorableConstructor]
+    private Forward(bool deserializing) : base(deserializing) { }
+    private Forward(Forward original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Forward()
+      : base("Forward", "Moves the lawn mower one square forward.") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Forward(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Frog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Frog.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Frog.cs	(revision 12899)
@@ -0,0 +1,51 @@
+﻿#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.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Frog : Symbol {
+    public override int MinimumArity {
+      get { return 1; }
+    }
+    public override int MaximumArity {
+      get { return 1; }
+    }
+    [StorableConstructor]
+    private Frog(bool deserializing) : base(deserializing) { }
+    private Frog(Frog original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Frog()
+      : base("Frog", "Jumps to a relative position (determined by the argument).") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Frog(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Left.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Left.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Left.cs	(revision 12899)
@@ -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 HeuristicLab.Common;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Left : Symbol {
+
+    public override int MinimumArity {
+      get { return 0; }
+    }
+    public override int MaximumArity {
+      get { return 0; }
+    }
+
+    [StorableConstructor]
+    private Left(bool deserializing) : base(deserializing) { }
+    private Left(Left original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Left()
+      : base("Left", "Turns the lawn mower to the left.") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Left(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Prog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Prog.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Prog.cs	(revision 12899)
@@ -0,0 +1,51 @@
+﻿#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.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Prog : Symbol {
+    public override int MinimumArity {
+      get { return 2; }
+    }
+    public override int MaximumArity {
+      get { return 2; }
+    }
+    [StorableConstructor]
+    private Prog(bool deserializing) : base(deserializing) { }
+    private Prog(Prog original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Prog()
+      : base("Prog", "Prog executes two branches sequentially and returns the result of the last branch.") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Prog(this, cloner);
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Sum.cs
===================================================================
--- /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Sum.cs	(revision 12899)
+++ /trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Symbols/Sum.cs	(revision 12899)
@@ -0,0 +1,51 @@
+﻿#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.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LawnMower {
+  [StorableClass]
+  public sealed class Sum : Symbol {
+    public override int MinimumArity {
+      get { return 2; }
+    }
+    public override int MaximumArity {
+      get { return 2; }
+    }
+    [StorableConstructor]
+    private Sum(bool deserializing) : base(deserializing) { }
+    private Sum(Sum original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public Sum()
+      : base("Sum", "Sum of two integer vectors.") {
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new Sum(this, cloner);
+    }
+  }
+}
