Index: /branches/2864_PermutationProblems/Build.cmd
===================================================================
--- /branches/2864_PermutationProblems/Build.cmd	(revision 15521)
+++ /branches/2864_PermutationProblems/Build.cmd	(revision 15521)
@@ -0,0 +1,104 @@
+@ECHO OFF
+
+SET CLEANBEFOREBUILD=
+
+SET SELECTED=
+SET CONFIGURATION=
+SET PLATFORM=
+
+IF "%~1"=="" GOTO :prompt_solution
+
+SET SELECTED=%1
+IF NOT EXIST %SELECTED% (
+  ECHO Solution file %SELECTED% could not be found.
+  GOTO :end
+)
+ECHO Building solution %SELECTED% ...
+GOTO :config_selection
+
+:prompt_solution
+SET /A COUNT=0
+FOR /F "tokens=*" %%A IN ('dir /B *.sln') DO (
+  CALL :forloopbody "%%A"
+)
+
+IF "%COUNT%"=="1" (
+  SET SELECTED=%SOLUTIONS.1%
+  ECHO Building %SOLUTIONS.1% as it is the only solution that was found ...
+  GOTO :config_selection
+)
+
+ECHO Found the following solutions:
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO ECHO %%A = %%B
+ECHO.
+SET /P SOLUTIONINDEX=Which solution to build? Type the number: 
+
+SET SELECTED=""
+FOR /F "tokens=2* delims=.=" %%A IN ('SET SOLUTIONS.') DO (
+  IF "%%A"=="%SOLUTIONINDEX%" SET SELECTED=%%B
+)
+
+IF %SELECTED%=="" GOTO :eof
+
+:config_selection
+IF "%~2"==""  GOTO :prompt_config
+
+SET CONFIGURATION=%~2
+ECHO Building configuration %CONFIGURATION% ...
+GOTO :platform_selection
+
+:prompt_config
+SET /P CONFIGURATION=Which configuration to build [Release]: 
+IF "%CONFIGURATION%"=="" SET CONFIGURATION=Release
+
+:platform_selection
+IF "%~3"=="" GOTO :prompt_platform
+  
+SET PLATFORM=%~3
+ECHO Building platform %PLATFORM% ...
+GOTO :clean
+
+:prompt_platform
+SET /P PLATFORM=Which platform to build [Any CPU]: 
+IF "%PLATFORM%"=="" SET PLATFORM=Any CPU
+
+:clean
+IF "%~4"=="" GOTO :prompt_clean
+
+SET CLEANBEFOREBUILD=%~4
+GOTO :main
+
+:prompt_clean
+SET /P CLEANBEFOREBUILD=Would you like to clean before building [n]: 
+IF "%CLEANBEFOREBUILD%"=="" SET CLEANBEFOREBUILD=n
+
+:main
+REM First find the path to the msbuild.exe by performing a registry query
+FOR /F "tokens=1,3 delims=	 " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0"') DO (
+  IF "%%A"=="MSBuildToolsPath" SET MSBUILDPATH=%%B)
+
+REM Then execute msbuild to clean and build the solution
+REM Disable that msbuild creates a cache file of the solution
+SET MSBuildUseNoSolutionCache=1
+REM Run msbuild to clean and then build
+IF "%CLEANBEFOREBUILD%" NEQ "n" (
+  ECHO Cleaning ...
+  %MSBUILDPATH%msbuild.exe %SELECTED% /target:Clean /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+)
+ECHO Building ...
+%MSBUILDPATH%msbuild.exe %SELECTED% /target:Build /p:Configuration="%CONFIGURATION%",Platform="%PLATFORM%" /m:2 /nologo /verbosity:q /clp:ErrorsOnly
+
+ECHO.
+ECHO DONE.
+
+:end
+
+PAUSE
+
+GOTO :eof
+
+REM This workaround is necessary so that COUNT gets reevaluated
+:forloopbody
+SET /A COUNT+=1
+SET SOLUTIONS.%COUNT%=%1
+GOTO :eof
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBDataDescriptor.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBDataDescriptor.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBDataDescriptor.cs	(revision 15521)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Problems.Instances;
+
+namespace HeuristicLab.Problems.Instances.PFSP {
+  internal class FSSPTAILIBDataDescriptor : IDataDescriptor {
+    public string Name { get; internal set; }
+    public string Description { get; internal set; }
+
+    internal string InstanceIdentifier { get; set; }
+    internal string SolutionIdentifier { get; set; }
+
+    internal FSSPTAILIBDataDescriptor(string name, string description, string instanceIdentifier, string solutionIdentifier) {
+      this.Name = name;
+      this.Description = description;
+      this.InstanceIdentifier = instanceIdentifier;
+      this.SolutionIdentifier = solutionIdentifier;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBInstanceProvider.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBInstanceProvider.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBInstanceProvider.cs	(revision 15521)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Reflection;
+using System.Text.RegularExpressions;
+
+namespace HeuristicLab.Problems.Instances.PFSP
+{
+    public class FSSPTAILIBInstanceProvider : ProblemInstanceProvider<FSSPData>
+    {
+
+        public override string Name
+        {
+            get { return "FSSPTAI"; }
+        }
+
+        public override string Description
+        {
+            get { return "Permutation Flowshop scheduling problems as defined by Taillard."; }
+        }
+
+        public override Uri WebLink
+        {
+            get { return new Uri("http://mistic.heig-vd.ch/taillard/problemes.dir/ordonnancement.dir/ordonnancement.html"); }
+        }
+
+        public override string ReferencePublication
+        {
+            get { return String.Empty; }
+        }
+
+        public override IEnumerable<IDataDescriptor> GetDataDescriptors()
+        {
+            var instanceArchiveName = GetResourceName("FSSPTAI.zip");
+            if (String.IsNullOrEmpty(instanceArchiveName)) yield break;
+
+            using (var instanceStream = new ZipArchive(GetType().Assembly.GetManifestResourceStream(instanceArchiveName), ZipArchiveMode.Read))
+            {
+                foreach (var entry in instanceStream.Entries.Select(x => x.Name).OrderBy(x => x))
+                {
+                    yield return new FSSPTAILIBDataDescriptor(Path.GetFileNameWithoutExtension(entry), GetDescription(), entry, null);
+                }
+            }
+        }
+
+        public override FSSPData LoadData(IDataDescriptor id)
+        {
+            var descriptor = (FSSPTAILIBDataDescriptor)id;
+            var instanceArchiveName = GetResourceName("FSSPTAI.zip");
+            using (var instancesZipFile = new ZipArchive(GetType().Assembly.GetManifestResourceStream(instanceArchiveName), ZipArchiveMode.Read))
+            {
+                var entry = instancesZipFile.GetEntry(descriptor.InstanceIdentifier);
+
+                using (var stream = entry.Open())
+                {
+                    var parser = new FSSPTAILIBParser();
+                    parser.Parse(stream);
+                    return Load(parser);
+                }
+            }
+        }
+
+        public override bool CanImportData
+        {
+            get { return true; }
+        }
+        public override FSSPData ImportData(string path)
+        {
+            var parser = new FSSPTAILIBParser();
+            parser.Parse(path);
+            return Load(parser);
+        }
+
+        private FSSPData Load(FSSPTAILIBParser parser)
+        {
+            var instance = new FSSPData
+            {
+                Name = parser.Name,
+                Description = parser.Description,
+                Jobs = parser.Jobs,
+                Machines = parser.Machines,
+                ProcessingTimes = parser.ProcessingTimes,
+                BestKnownSchedule = parser.BestKnownSchedule,
+                BestKnownQuality = parser.BestKnownQuality
+            };
+            return instance;
+        }
+
+        public override bool CanExportData
+        {
+            get { return true; }
+        }
+
+        public override void ExportData(FSSPData instance, string path)
+        {
+            var parser = new FSSPTAILIBParser
+            {
+                Name = instance.Name,
+                Description = instance.Description,
+                Jobs = instance.Jobs,
+                Machines = instance.Machines,
+                ProcessingTimes = instance.ProcessingTimes,
+            };
+            parser.Export(path);
+        }
+
+        private string GetDescription()
+        {
+            return "Embedded instance of plugin version " + Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).Cast<AssemblyFileVersionAttribute>().First().Version + ".";
+        }
+
+        protected virtual string GetResourceName(string fileName)
+        {
+            return Assembly.GetExecutingAssembly().GetManifestResourceNames()
+              .SingleOrDefault(x => Regex.Match(x, @".*\.Data\." + fileName).Success);
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBParser.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBParser.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/FSSPTAILIBParser.cs	(revision 15521)
@@ -0,0 +1,142 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Problems.Instances.PFSP
+{
+    public class FSSPTAILIBParser
+    {
+        public string Name { get; set; }
+        public string Description { get; set; }
+        public int Jobs { get; set; }
+        public int Machines { get; set; }
+        public double[,] ProcessingTimes { get; set; }
+
+        public int[] BestKnownSchedule { get; set; }
+        public int BestKnownQuality { get; set; }
+
+        public FSSPTAILIBParser()
+        {
+            Reset();
+        }
+
+        public void Reset()
+        {
+            Name = Description = String.Empty;
+            Jobs = Machines = BestKnownQuality = 0;
+            ProcessingTimes = null;
+            BestKnownSchedule = null;
+        }
+
+        public void Parse(string file)
+        {
+            using (Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read))
+            {
+                Parse(stream);
+            }
+        }
+
+        public void Export(string file)
+        {
+            using (Stream stream = new FileStream(file, FileMode.Create, FileAccess.Write))
+            {
+                Export(stream);
+            }
+        }
+
+        /// <summary>
+        /// Reads from the given stream data which is expected to be in the JSSP ORLIB format.
+        /// </summary>
+        /// <remarks>
+        /// The stream is not closed or disposed. The caller has to take care of that.
+        /// </remarks>
+        /// <param name="stream">The stream to read data from.</param>
+        public void Parse(Stream stream)
+        {
+            using (var reader = new StreamReader(stream, Encoding.UTF8, true, 4092, true))
+            {
+                Name = reader.ReadLine().Trim();
+                Description = reader.ReadLine().Trim();
+                var delim = new char[] { ' ', '\t' };
+
+                var info = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+                Jobs = int.Parse(info[0]);
+                Machines = int.Parse(info[1]);
+                var bestKnownQuality = reader.ReadLine().Trim();
+                BestKnownQuality = int.Parse(bestKnownQuality);
+                ProcessingTimes = new double[Machines, Jobs];
+
+                for (int k = 0; k < Machines; k++)
+                {
+                    if (reader.EndOfStream) throw new InvalidDataException("Unexpected End of Stream.");
+                    var valLine = reader.ReadLine();
+                    while (String.IsNullOrWhiteSpace(valLine)) valLine = reader.ReadLine();
+                    var vals = valLine.Split(delim, StringSplitOptions.RemoveEmptyEntries);
+
+
+                    for (int i = 0; i < Jobs; i++)
+                    {
+                        ProcessingTimes[k, i] = double.Parse(vals[i], CultureInfo.InvariantCulture.NumberFormat);
+                    }
+                }
+
+                while (!reader.EndOfStream)
+                {
+                    var vals = reader.ReadLine().Split(delim, StringSplitOptions.RemoveEmptyEntries);
+                    if (vals.Count() == Jobs) { BestKnownSchedule = vals.Select(val => Int32.Parse(val)).ToArray(); }
+                }
+            }
+        }
+
+        /// <summary>
+        /// Writes to the given stream data which is expected to be in the JSSP ORLIB format.
+        /// </summary>
+        /// <remarks>
+        /// The stream is not closed or disposed. The caller has to take care of that.
+        /// </remarks>
+        /// <param name="stream">The stream to write data to.</param>
+        public void Export(Stream stream)
+        {
+            //TODO: complete Export, seems as if it is just a dummy (copy-paste)-implementation
+            using (var writer = new StreamWriter(stream, Encoding.UTF8, 4092, true))
+            {
+                writer.WriteLine(Name);
+                writer.WriteLine(Description);
+                writer.WriteLine(Jobs.ToString(CultureInfo.InvariantCulture.NumberFormat) + " " + Machines.ToString(CultureInfo.InvariantCulture.NumberFormat));
+                for (int i = 0; i < Machines; i++)
+                {
+                    for (int j = 0; j < Jobs; j++)
+                    {
+                        writer.Write(ProcessingTimes[i, j] + " ");
+                    }
+                    writer.WriteLine();
+                }
+                writer.Flush();
+            }
+        }
+
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/HeuristicLab.Problems.Instances.PFSP-3.3.csproj
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/HeuristicLab.Problems.Instances.PFSP-3.3.csproj	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/HeuristicLab.Problems.Instances.PFSP-3.3.csproj	(revision 15521)
@@ -0,0 +1,94 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{9412AA5F-D663-4AF4-B58B-D90FABB343BF}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Instances.PFSP</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Instances.PFSP-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.IO.Compression" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="FSSPTAILIBDataDescriptor.cs" />
+    <Compile Include="FSSPTAILIBInstanceProvider.cs" />
+    <Compile Include="FSSPTAILIBParser.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Data\FSSPTAI.zip" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs	(revision 15521)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Instances.PFSP {
+  [Plugin("HeuristicLab.Problems.Instances.PFSP", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.Instances.PFSP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsInstancesSchedulingPlugin : PluginBase {
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Plugin.cs.frame	(revision 15521)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Instances.PFSP {
+  [Plugin("HeuristicLab.Problems.Instances.PFSP", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.Instances.PFSP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsInstancesSchedulingPlugin : PluginBase {
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs	(revision 15521)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.Instances.PFSP-3.3")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.Instances.PFSP-3.3")]
+[assembly: AssemblyCopyright("Copyright ©  2017")]
+[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("9412aa5f-d663-4af4-b58b-d90fabb343bf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.14965")]
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.Instances.PFSP/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Problems.Instances.PFSP-3.3")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.Instances.PFSP-3.3")]
+[assembly: AssemblyCopyright("Copyright ©  2017")]
+[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("9412aa5f-d663-4af4-b58b-d90fabb343bf")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecoder.cs	(revision 15521)
@@ -0,0 +1,185 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP {
+  [Item("JobSequenceMatrixDecoder", "Applies the GifflerThompson algorithm to create an active schedule from a JobSequence Matrix.")]
+  [StorableClass]
+  public class JSMDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+    public IValueParameter<JSMDecodingErrorPolicy> DecodingErrorPolicyParameter {
+      get { return (IValueParameter<JSMDecodingErrorPolicy>)Parameters["DecodingErrorPolicy"]; }
+    }
+    public IValueParameter<JSMForcingStrategy> ForcingStrategyParameter {
+      get { return (IValueParameter<JSMForcingStrategy>)Parameters["ForcingStrategy"]; }
+    }
+
+    private JSMDecodingErrorPolicyTypes DecodingErrorPolicy {
+      get { return DecodingErrorPolicyParameter.Value.Value; }
+    }
+
+    private JSMForcingStrategyTypes ForcingStrategy {
+      get { return ForcingStrategyParameter.Value.Value; }
+    }
+
+    [StorableConstructor]
+    protected JSMDecoder(bool deserializing) : base(deserializing) { }
+    protected JSMDecoder(JSMDecoder original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMDecoder(this, cloner);
+    }
+
+    public JSMDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the Schedulingproblem - Instance."));
+      Parameters.Add(new ValueParameter<JSMDecodingErrorPolicy>("DecodingErrorPolicy", "Specify the policy that should be used to handle decoding errors.", new JSMDecodingErrorPolicy(JSMDecodingErrorPolicyTypes.RandomPolicy)));
+      Parameters.Add(new ValueParameter<JSMForcingStrategy>("ForcingStrategy", "Specifies a forcing strategy.", new JSMForcingStrategy(JSMForcingStrategyTypes.SwapForcing)));
+
+      ScheduleEncodingParameter.ActualName = "JobSequenceMatrix";
+    }
+
+    private Task SelectTaskFromConflictSet(int conflictedResourceNr, int progressOnConflictedResource, ItemList<Task> conflictSet, ItemList<Permutation> jsm) {
+      if (conflictSet.Count == 1)
+        return conflictSet[0];
+
+      //get solutionCandidate from jobSequencingMatrix
+      int solutionCandidateJobNr = jsm[conflictedResourceNr][progressOnConflictedResource];
+
+      //scan conflictSet for given solutionCandidate, and return if found
+      foreach (Task t in conflictSet) {
+        if (t.JobNr == solutionCandidateJobNr)
+          return t;
+      }
+
+      //if solutionCandidate wasn't found in conflictSet apply DecodingErrorPolicy and ForcingPolicy
+      Task result = ApplyDecodingErrorPolicy(conflictSet, jsm[conflictedResourceNr], progressOnConflictedResource);
+      int newResolutionIndex = 0;
+
+      while (newResolutionIndex < jsm[conflictedResourceNr].Length && jsm[conflictedResourceNr][newResolutionIndex] != result.JobNr)
+        newResolutionIndex++;
+      ApplyForcingStrategy(jsm, conflictedResourceNr, newResolutionIndex, progressOnConflictedResource, result.JobNr);
+
+      return result;
+    }
+
+    private Task ApplyDecodingErrorPolicy(ItemList<Task> conflictSet, Permutation resource, int progress) {
+      if (DecodingErrorPolicy == JSMDecodingErrorPolicyTypes.RandomPolicy) {
+        //Random
+        return conflictSet[RandomParameter.ActualValue.Next(conflictSet.Count - 1)];
+      } else {
+        //Guided
+        for (int i = progress; i < resource.Length; i++) {
+          int j = 0;
+          while (j < conflictSet.Count && conflictSet[j].JobNr != resource[i])
+            j++;
+
+          if (j < conflictSet.Count)
+            return (conflictSet[j]);
+        }
+        return conflictSet[RandomParameter.ActualValue.Next(conflictSet.Count - 1)];
+      }
+    }
+
+    private void ApplyForcingStrategy(ItemList<Permutation> jsm, int conflictedResource, int newResolutionIndex, int progressOnResource, int newResolution) {
+      if (ForcingStrategy == JSMForcingStrategyTypes.SwapForcing) {
+        //SwapForcing
+        jsm[conflictedResource][newResolutionIndex] = jsm[conflictedResource][progressOnResource];
+        jsm[conflictedResource][progressOnResource] = newResolution;
+      } else {
+        //ShiftForcing
+        List<int> asList = jsm[conflictedResource].ToList<int>();
+        if (newResolutionIndex > progressOnResource) {
+          asList.RemoveAt(newResolutionIndex);
+          asList.Insert(progressOnResource, newResolution);
+        } else {
+          asList.Insert(progressOnResource, newResolution);
+          asList.RemoveAt(newResolutionIndex);
+        }
+        jsm[conflictedResource] = new Permutation(PermutationTypes.Absolute, asList.ToArray<int>());
+      }
+    }
+
+    public Schedule CreateScheduleFromEncoding(JSMEncoding solution, ItemList<Job> jobData) {
+      ItemList<Permutation> jobSequenceMatrix = solution.JobSequenceMatrix;
+
+      var jobs = (ItemList<Job>)jobData.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+
+      //Reset scheduled tasks in result
+      foreach (Job j in jobs) {
+        foreach (Task t in j.Tasks) {
+          t.IsScheduled = false;
+        }
+      }
+
+      //GT-Algorithm
+      //STEP 0 - Compute a list of "earliest operations"
+      ItemList<Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      while (earliestTasksList.Count > 0) {
+        //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
+        Task minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);
+        int conflictedResourceNr = minimal.ResourceNr;
+        Resource conflictedResource = resultingSchedule.Resources[conflictedResourceNr];
+
+        //STEP 2 - Compute a conflict set of all operations that can be scheduled on the conflicted resource
+        ItemList<Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);
+
+        //STEP 3 - Select a task from the conflict set
+        int progressOnResource = conflictedResource.Tasks.Count;
+        Task selectedTask = SelectTaskFromConflictSet(conflictedResourceNr, progressOnResource, conflictSet, jobSequenceMatrix);
+
+        //STEP 4 - Add the selected task to the current schedule 
+        selectedTask.IsScheduled = true;
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
+        resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);
+
+        //STEP 5 - Back to STEP 1
+        earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      }
+
+      return resultingSchedule;
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as JSMEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type JSMEncoding");
+      return CreateScheduleFromEncoding(solution, JobDataParameter.ActualValue);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicy.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicy.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicy.cs	(revision 15521)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JSMDecodingErrorPolicy", "Represents a policy for handling decoding errors.")]
+  [StorableClass]
+  public sealed class JSMDecodingErrorPolicy : ValueTypeValue<JSMDecodingErrorPolicyTypes> {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Enum; }
+    }
+
+    [StorableConstructor]
+    private JSMDecodingErrorPolicy(bool deserializing) : base(deserializing) { }
+    private JSMDecodingErrorPolicy(JSMDecodingErrorPolicy original, Cloner cloner) : base(original, cloner) { }
+    public JSMDecodingErrorPolicy() : base() { }
+    public JSMDecodingErrorPolicy(JSMDecodingErrorPolicyTypes types) : base(types) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMDecodingErrorPolicy(this, cloner);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs	(revision 15521)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public enum JSMDecodingErrorPolicyTypes {
+    RandomPolicy,
+    GuidedPolicy
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategy.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategy.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategy.cs	(revision 15521)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JSMForcingStrategy", "Represents a forcing strategy.")]
+  [StorableClass]
+  public sealed class JSMForcingStrategy : ValueTypeValue<JSMForcingStrategyTypes> {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Enum; }
+    }
+
+    [StorableConstructor]
+    private JSMForcingStrategy(bool deserializing) : base(deserializing) { }
+    private JSMForcingStrategy(JSMForcingStrategy original, Cloner cloner) : base(original, cloner) { }
+    public JSMForcingStrategy() { }
+    public JSMForcingStrategy(JSMForcingStrategyTypes types) : base(types) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMForcingStrategy(this, cloner);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategyTypes.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategyTypes.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/JSMForcingStrategyTypes.cs	(revision 15521)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public enum JSMForcingStrategyTypes {
+    ShiftForcing,
+    SwapForcing
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PRVDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PRVDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PRVDecoder.cs	(revision 15521)
@@ -0,0 +1,246 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.PriorityRulesVector;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JobSequencingMatrixDecoder", "Applies the GifflerThompson algorithm to create an active schedule from a JobSequencing Matrix.")]
+  [StorableClass]
+  public class PRVDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+
+    #region Priority Rules
+    //smallest number of remaining tasks
+    private Task FILORule(ItemList<Task> tasks) {
+      Task currentResult = tasks[tasks.Count - 1];
+      return currentResult;
+    }
+
+    //earliest start time
+    private Task ESTRule(ItemList<Task> tasks, Schedule schedule) {
+      Task currentResult = RandomRule(tasks);
+      double currentEST = double.MaxValue;
+      foreach (Task t in tasks) {
+        double est = GTAlgorithmUtils.ComputeEarliestStartTime(t, schedule);
+        if (est < currentEST) {
+          currentEST = est;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //shortest processingtime
+    private Task SPTRule(ItemList<Task> tasks) {
+      Task currentResult = RandomRule(tasks);
+      foreach (Task t in tasks) {
+        if (t.Duration < currentResult.Duration)
+          currentResult = t;
+      }
+      return currentResult;
+    }
+
+    //longest processing time    
+    private Task LPTRule(ItemList<Task> tasks) {
+      Task currentResult = RandomRule(tasks);
+      foreach (Task t in tasks) {
+        if (t.Duration > currentResult.Duration)
+          currentResult = t;
+      }
+      return currentResult;
+    }
+
+    //most work remaining
+    private Task MWRRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      double currentLargestRemainingProcessingTime = 0;
+      foreach (Task t in tasks) {
+        double remainingProcessingTime = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            remainingProcessingTime += jt.Duration;
+        }
+        if (remainingProcessingTime > currentLargestRemainingProcessingTime) {
+          currentLargestRemainingProcessingTime = remainingProcessingTime;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //least work remaining
+    private Task LWRRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      double currentSmallestRemainingProcessingTime = double.MaxValue;
+      foreach (Task t in tasks) {
+        double remainingProcessingTime = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            remainingProcessingTime += jt.Duration;
+        }
+        if (remainingProcessingTime < currentSmallestRemainingProcessingTime) {
+          currentSmallestRemainingProcessingTime = remainingProcessingTime;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //most operations remaining
+    private Task MORRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      int currentLargestNrOfRemainingTasks = 0;
+      foreach (Task t in tasks) {
+        int nrOfRemainingTasks = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            nrOfRemainingTasks++;
+        }
+        if (currentLargestNrOfRemainingTasks < nrOfRemainingTasks) {
+          currentLargestNrOfRemainingTasks = nrOfRemainingTasks;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //least operationsremaining
+    private Task LORRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      int currentSmallestNrOfRemainingTasks = int.MaxValue;
+      foreach (Task t in tasks) {
+        int nrOfRemainingTasks = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            nrOfRemainingTasks++;
+        }
+        if (currentSmallestNrOfRemainingTasks > nrOfRemainingTasks) {
+          currentSmallestNrOfRemainingTasks = nrOfRemainingTasks;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //first operation in Queue
+    private Task FIFORule(ItemList<Task> tasks) {
+      Task currentResult = tasks[0];
+      return currentResult;
+    }
+
+    //random
+    private Task RandomRule(ItemList<Task> tasks) {
+      Task currentResult = tasks[RandomParameter.ActualValue.Next(tasks.Count)];
+      return currentResult;
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    protected PRVDecoder(bool deserializing) : base(deserializing) { }
+    protected PRVDecoder(PRVDecoder original, Cloner cloner) : base(original, cloner) { }
+    public PRVDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the SchedulingProblem - Instance."));
+      ScheduleEncodingParameter.ActualName = "PriorityRulesVector";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PRVDecoder(this, cloner);
+    }
+
+    private Task SelectTaskFromConflictSet(ItemList<Task> conflictSet, int ruleIndex, int nrOfRules, Schedule schedule, ItemList<Job> jobs) {
+      if (conflictSet.Count == 1)
+        return conflictSet[0];
+
+      ruleIndex = ruleIndex % nrOfRules;
+      switch (ruleIndex) {
+        case 0: return FILORule(conflictSet);
+        case 1: return ESTRule(conflictSet, schedule);
+        case 2: return SPTRule(conflictSet);
+        case 3: return LPTRule(conflictSet);
+        case 4: return MWRRule(conflictSet, jobs);
+        case 5: return LWRRule(conflictSet, jobs);
+        case 6: return MORRule(conflictSet, jobs);
+        case 7: return LORRule(conflictSet, jobs);
+        case 8: return FIFORule(conflictSet);
+        case 9: return RandomRule(conflictSet);
+        default: return RandomRule(conflictSet);
+      }
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as PRVEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type PWREncoding");
+
+      var jobs = (ItemList<Job>)JobDataParameter.ActualValue.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+
+      //Reset scheduled tasks in result
+      foreach (Job j in jobs) {
+        foreach (Task t in j.Tasks) {
+          t.IsScheduled = false;
+        }
+      }
+
+      //GT-Algorithm
+      //STEP 0 - Compute a list of "earliest operations"
+      ItemList<Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      //int currentDecisionIndex = 0;
+      while (earliestTasksList.Count > 0) {
+        //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
+        Task minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);
+
+        //STEP 2 - Compute a conflict set of all operations that can be scheduled on the machine the previously selected operation runs on
+        ItemList<Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);
+
+        //STEP 3 - Select an operation from the conflict set (various methods depending on how the algorithm should work..)
+        //Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector [currentDecisionIndex++], solution.NrOfRules.Value);
+        Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector[minimal.JobNr], solution.NrOfRules.Value, resultingSchedule, jobs);
+
+        //STEP 4 - Adding the selected operation to the current schedule
+        selectedTask.IsScheduled = true;
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
+        resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);
+
+        //STEP 5 - Back to STEP 1
+        earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      }
+
+      return resultingSchedule;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PWRDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PWRDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/PWRDecoder.cs	(revision 15521)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.PermutationWithRepetition;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("PWRDecoder", "An item used to convert a PWR-individual into a generalized schedule.")]
+  [StorableClass]
+  public class PWRDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+
+    [StorableConstructor]
+    protected PWRDecoder(bool deserializing) : base(deserializing) { }
+    protected PWRDecoder(PWRDecoder original, Cloner cloner) : base(original, cloner) { }
+    public PWRDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the JSSP - Instance."));
+      ScheduleEncodingParameter.ActualName = "PermutationWithRepetition";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PWRDecoder(this, cloner);
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as PWREncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type PWREncoding");
+
+      var jobs = (ItemList<Job>)JobDataParameter.ActualValue.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+      foreach (int jobNr in solution.PermutationWithRepetition) {
+        int i = 0;
+        while (jobs[jobNr].Tasks[i].IsScheduled) i++;
+        Task currentTask = jobs[jobNr].Tasks[i];
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(currentTask, resultingSchedule);
+        currentTask.IsScheduled = true;
+        resultingSchedule.ScheduleTask(currentTask.ResourceNr, startTime, currentTask.Duration, currentTask.JobNr);
+      }
+      return resultingSchedule;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/ScheduleDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/ScheduleDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Decoders/ScheduleDecoder.cs	(revision 15521)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("ScheduleDecoder", "A schedule decoder translates a respresentation into an actual schedule.")]
+  [StorableClass]
+  public abstract class ScheduleDecoder : SingleSuccessorOperator, IScheduleDecoder {
+
+    public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
+      get { return (ILookupParameter<IScheduleEncoding>)Parameters["ScheduleEncoding"]; }
+    }
+    public ILookupParameter<Schedule> ScheduleParameter {
+      get { return (ILookupParameter<Schedule>)Parameters["Schedule"]; }
+    }
+
+    [StorableConstructor]
+    protected ScheduleDecoder(bool deserializing) : base(deserializing) { }
+    protected ScheduleDecoder(ScheduleDecoder original, Cloner cloner) : base(original, cloner) { }
+    public ScheduleDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IScheduleEncoding>("ScheduleEncoding", "The new scheduling solution represented as encoding."));
+      Parameters.Add(new LookupParameter<Schedule>("Schedule", "The decoded scheduling solution represented as generalized schedule."));
+    }
+
+    public abstract Schedule CreateScheduleFromEncoding(IScheduleEncoding solution);
+
+    public override IOperation Apply() {
+      Schedule result = CreateScheduleFromEncoding(ScheduleEncodingParameter.ActualValue);
+      ScheduleParameter.ActualValue = result;
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/AwesomeTriangulationEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/AwesomeTriangulationEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/AwesomeTriangulationEvaluator.cs	(revision 15521)
@@ -0,0 +1,57 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{ /// <summary>
+  /// An operator which evaluates LOP solutions given in matrix representation.
+  /// </summary>
+    [Item("AwesomeTriangulationEvaluator", "An operator which evaluates LOP solutions given in matrix representation.")]
+    [StorableClass]
+    public sealed class AwesomeTriangulationEvaluator : MatrixTriangulationEvaluator
+    {
+        [StorableConstructor]
+        private AwesomeTriangulationEvaluator(bool deserializing) : base(deserializing) { }
+        private AwesomeTriangulationEvaluator(AwesomeTriangulationEvaluator original, Cloner cloner) : base(original, cloner) { }
+        public AwesomeTriangulationEvaluator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new AwesomeTriangulationEvaluator(this, cloner);
+        }
+
+        /// <summary>
+        /// Calculates the distance between two points using the rounded Euclidean distance metric.
+        /// </summary>
+        /// <param name="x1">The x-coordinate of point 1.</param>
+        /// <param name="y1">The y-coordinate of point 1.</param>
+        /// <param name="x2">The x-coordinate of point 2.</param>
+        /// <param name="y2">The y-coordinate of point 2.</param>
+        /// <returns>The calculated distance.</returns>
+        protected override double CalculateUpperTriangle(DoubleMatrix m, Permutation p)
+        {
+            int[] permutation = p.ToArray();
+
+            //reduce offset, real arrays start with 0
+            if (!permutation.Contains(0)) { permutation = permutation.Select(v => v - 1).ToArray(); }
+
+            double sum = 0;
+            for (int i = 1; i < m.Columns; i++)
+            {
+                for (int j = 0; j < i; j++)
+                {
+                    sum += m[p[j], p[i]];
+                }
+            }
+
+            return sum;
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/LOPEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/LOPEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/LOPEvaluator.cs	(revision 15521)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+    /// <summary>
+    /// A base class for operators which evaluate LOP solutions.
+    /// </summary>
+    [Item("LOPEvaluator", "A base class for operators which evaluate LOP solutions.")]
+    [StorableClass]
+    public abstract class LOPEvaluator : InstrumentedOperator, ILOPEvaluator
+    {
+        public override bool CanChangeName {
+            get { return false; }
+        }
+
+        public ILookupParameter<DoubleValue> QualityParameter {
+            get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+        }
+
+        [StorableConstructor]
+        protected LOPEvaluator(bool deserializing) : base(deserializing) { }
+        protected LOPEvaluator(LOPEvaluator original, Cloner cloner) : base(original, cloner) { }
+        protected LOPEvaluator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the LOP solution."));
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/MatrixTriangulationEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/MatrixTriangulationEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Evaluators/MatrixTriangulationEvaluator.cs	(revision 15521)
@@ -0,0 +1,97 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+    /// <summary>
+    /// A base class for operators which evaluate LOP solutions given in Matrix representation.
+    /// </summary>
+    [Item("MatrixTriangulationEvaluator", "A base class for operators which evaluate LOP solutions given in Matrix representation.")]
+    [StorableClass]
+    public abstract class MatrixTriangulationEvaluator : LOPEvaluator, IMatrixTriangulationEvaluator
+    {
+        private object locker = new object();
+
+        public ILookupParameter<Permutation> PermutationParameter { get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; } }
+        public ILookupParameter<DoubleMatrix> MatrixParameter { get { return (ILookupParameter<DoubleMatrix>)Parameters["Matrix"]; } }
+        public ILookupParameter<Permutation> BestKnownSolutionParameter { get { return (ILookupParameter<Permutation>)Parameters["BestKnownSolution"]; } }
+        public ILookupParameter<DoubleValue> BestKnownQualityParameter { get { return (ILookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; } }
+        [StorableConstructor]
+        protected MatrixTriangulationEvaluator(bool deserializing) : base(deserializing) { }
+        protected MatrixTriangulationEvaluator(MatrixTriangulationEvaluator original, Cloner cloner) : base(original, cloner) { }
+        protected MatrixTriangulationEvaluator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<Permutation>("Permutation", "The TSP solution given in path representation which should be evaluated."));
+            Parameters.Add(new LookupParameter<DoubleMatrix>("Matrix", "The matrix which contains the distances between the cities."));
+            Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The currently best known solution."));
+            Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The currently best known quality."));
+        }
+
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            // BackwardsCompatibility3.3
+            #region Backwards compatible code (remove with 3.4)
+            LookupParameter<DoubleMatrix> oldDistanceMatrixParameter = Parameters["Matrix"] as LookupParameter<DoubleMatrix>;
+            if (oldDistanceMatrixParameter != null)
+            {
+                Parameters.Remove(oldDistanceMatrixParameter);
+                Parameters.Add(new LookupParameter<DoubleMatrix>("Matrix", "The matrix which contains the distances between the cities."));
+                MatrixParameter.ActualName = oldDistanceMatrixParameter.ActualName;
+            }
+            #endregion
+        }
+
+        public static double Apply(MatrixTriangulationEvaluator evaluator, DoubleMatrix matrix, Permutation permut)
+        {
+            double length = evaluator.CalculateUpperTriangle(matrix, permut);
+            return length;
+        }
+
+        public sealed override IOperation InstrumentedApply()
+        {
+            Permutation p = PermutationParameter.ActualValue;
+            DoubleMatrix c = MatrixParameter.ActualValue;
+            if (c == null) throw new InvalidOperationException("No coordinates were given.");
+
+            double upperTriangle = CalculateUpperTriangle(c, p);
+            QualityParameter.ActualValue = new DoubleValue(upperTriangle);
+
+            if (BestKnownQualityParameter.ActualValue == null || BestKnownQualityParameter.ActualValue.Value < upperTriangle)
+            {
+                BestKnownSolutionParameter.ActualValue = p;
+                BestKnownQualityParameter.ActualValue = new DoubleValue(upperTriangle);
+            }
+            return base.InstrumentedApply();
+        }
+
+        protected abstract double CalculateUpperTriangle(DoubleMatrix matrix, Permutation tour);
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/HeuristicLab.Problems.LinearOrdering-3.3.csproj
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/HeuristicLab.Problems.LinearOrdering-3.3.csproj	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/HeuristicLab.Problems.LinearOrdering-3.3.csproj	(revision 15521)
@@ -0,0 +1,140 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{050358B8-2DBA-4224-8AA6-5EB03D86999A}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.LinearOrdering</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.LinearOrdering-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Evaluators\AwesomeTriangulationEvaluator.cs" />
+    <Compile Include="Evaluators\MatrixTriangulationEvaluator.cs" />
+    <Compile Include="Evaluators\LOPEvaluator.cs" />
+    <Compile Include="Interfaces\IMatrixTriangulationEvaluator.cs" />
+    <Compile Include="Interfaces\ILOPEvaluator.cs" />
+    <Compile Include="LinearOrderingProblem.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>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.IntegerVectorEncoding\3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj">
+      <Project>{DDFB14DD-2A85-493C-A52D-E69729BBAEB0}</Project>
+      <Name>HeuristicLab.Encodings.IntegerVectorEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{DBECB8B0-B166-4133-BAF1-ED67C3FD7FCA}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.ScheduleEncoding\3.3\HeuristicLab.Encodings.ScheduleEncoding-3.3.csproj">
+      <Project>{17F3EF80-B2C3-4B8D-A4D5-BE9CE3BA2606}</Project>
+      <Name>HeuristicLab.Encodings.ScheduleEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IJSSPOperator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IJSSPOperator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IJSSPOperator.cs	(revision 15521)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+
+namespace HeuristicLab.Problems.PFSP {
+  public interface IJSSPOperator : IOperator {
+    ILookupParameter<ItemList<Job>> JobDataParameter { get; }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ILOPEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ILOPEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ILOPEvaluator.cs	(revision 15521)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+    /// <summary>
+    /// An evaluator for a Schedule
+    /// </summary>
+    public interface ILOPEvaluator : ISingleObjectiveEvaluator { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IMatrixTriangulationEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IMatrixTriangulationEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IMatrixTriangulationEvaluator.cs	(revision 15521)
@@ -0,0 +1,19 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+    interface IMatrixTriangulationEvaluator : ILOPEvaluator
+    {
+        ILookupParameter<Permutation> PermutationParameter { get; }
+        ILookupParameter<DoubleMatrix> MatrixParameter { get; }
+        ILookupParameter<Permutation> BestKnownSolutionParameter { get; }
+        ILookupParameter<DoubleValue> BestKnownQualityParameter { get; }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleDecoder.cs	(revision 15521)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public interface IScheduleDecoder : IOperator
+  {
+    ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter { get; }
+    ILookupParameter<Schedule> ScheduleParameter { get; }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/IScheduleEvaluator.cs	(revision 15521)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// An evaluator for a Schedule
+    /// </summary>
+    public interface IScheduleEvaluator : ISingleObjectiveEvaluator
+    {
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ISchedulingEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ISchedulingEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Interfaces/ISchedulingEvaluator.cs	(revision 15521)
@@ -0,0 +1,17 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// An evaluator for a scheduling problem representation
+    /// </summary>
+    public interface ISchedulingEvaluator : ISingleObjectiveEvaluator
+    {
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/LinearOrderingProblem.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/LinearOrderingProblem.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/LinearOrderingProblem.cs	(revision 15521)
@@ -0,0 +1,312 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Optimization;
+using System.Collections.Generic;
+using HeuristicLab.Problems.Instances.Types;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+    [Item("Linear Ordering Problem (LOP)", "Represents a Linear Ordering Problem")]
+    [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 999)]
+    [StorableClass]
+    public sealed class LinearOrderingProblem : SingleObjectiveHeuristicOptimizationProblem<ILOPEvaluator, IPermutationCreator>, IProblemInstanceConsumer<LOPData>, IProblemInstanceExporter<LOPData>, IStorableContent
+    {
+        #region Default Instance
+        private static readonly LOPData DefaultInstance = new LOPData()
+        {
+            Name = "Linaer Ordering Problem (LOP)",
+            Description = "The default instance of the LOP in HeuristicLab",
+            Dimension = 4,
+            Matrix = new double[,] {
+                {0 ,3, 6 ,6},
+                {2 ,0, 8 ,4},
+                {4 ,2, 0 ,4},
+                {5 ,3, 8 ,0}
+            }
+        };
+        #endregion
+
+        public string Filename { get; set; }
+
+        #region Parameter Properties
+        public OptionalValueParameter<Permutation> BestKnownSolutionParameter {
+            get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; }
+        }
+
+        public OptionalValueParameter<DoubleMatrix> MatrixParameter {
+            get { return (OptionalValueParameter<DoubleMatrix>)Parameters["Matrix"]; }
+        }
+        #endregion
+
+        #region Properties
+        public Permutation BestKnownSolution {
+            get { return BestKnownSolutionParameter.Value; }
+            set {
+                BestKnownSolutionParameter.Value = value;
+                if (BestKnownSolutionChanged != null) { OnBestKnownSolutionChanged(); }
+            }
+        }
+        public DoubleMatrix Matrix {
+            get { return MatrixParameter.Value; }
+            set { MatrixParameter.Value = value; }
+        }
+        #endregion
+
+        public event EventHandler BestKnownSolutionChanged;
+        private void OnBestKnownSolutionChanged()
+        {
+            var changed = BestKnownSolutionChanged;
+            if (changed != null)
+                changed(this, EventArgs.Empty);
+        }
+
+        // BackwardsCompatibility3.3
+        #region Backwards compatible code, remove with 3.4
+        [Obsolete]
+        [Storable(Name = "operators")]
+        private IEnumerable<IOperator> oldOperators {
+            get { return null; }
+            set {
+                if (value != null && value.Any())
+                    Operators.AddRange(value);
+            }
+        }
+        #endregion
+
+        [StorableConstructor]
+        private LinearOrderingProblem(bool deserializing) : base(deserializing) { }
+        private LinearOrderingProblem(LinearOrderingProblem original, Cloner cloner)
+          : base(original, cloner)
+        {
+            RegisterEventHandlers();
+        }
+        public LinearOrderingProblem()
+          : base(new AwesomeTriangulationEvaluator(), new RandomPermutationCreator())
+        {
+            Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this LOP instance."));
+            Parameters.Add(new OptionalValueParameter<DoubleMatrix>("Matrix", "The matrix which contains the jobs,machines and duration."));
+
+            Load(DefaultInstance);
+            EvaluatorParameter.GetsCollected = false;
+            EvaluatorParameter.Hidden = true;
+
+            Maximization.Value = true;
+            MaximizationParameter.Hidden = true;
+
+            SolutionCreator.PermutationParameter.ActualName = "PFSPOrder";
+            Evaluator.QualityParameter.ActualName = "Makespan";
+            ParameterizeSolutionCreator();
+            ParameterizeEvaluator();
+
+            InitializeOperators();
+            RegisterEventHandlers();
+        }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new LinearOrderingProblem(this, cloner);
+        }
+
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterEventHandlers();
+        }
+
+        private void RegisterEventHandlers()
+        {
+            SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
+            Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+        }
+
+        private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e)
+        {
+            //Nothing to do  ParameterizeAnalyzers();
+        }
+
+        private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e)
+        {
+            ParameterizeEvaluator();
+            //ParameterizeAnalyzers();
+            ParameterizeOperators();
+        }
+
+        #region Events
+        private void ScheduleEvaluator_QualityParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+
+        private void SolutionCreator_SchedulingEncodingParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+
+        private void ScheduleDecoder_ScheduleParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+        #endregion
+
+        #region Problem Instance Handling
+        public void Load(LOPData data)
+        {
+            BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
+            Name = data.Name;
+            Description = data.Description;
+            Matrix = new DoubleMatrix(data.Matrix);
+
+            if (data.BestKnownPermutation != null)
+            {
+                int[] permut = data.BestKnownPermutation;
+                //Clean up if the first index = 1
+                if (!permut.Contains(0)) { permut = permut.Select(v => v - 1).ToArray(); }
+                double bestKnownQuality = MatrixTriangulationEvaluator.Apply(
+                    new AwesomeTriangulationEvaluator(),
+                    new DoubleMatrix(data.Matrix),
+                    new Permutation(PermutationTypes.Absolute, permut)
+                );
+
+                BestKnownSolution = new Permutation(PermutationTypes.Absolute, data.BestKnownPermutation);
+                BestKnownQuality = new DoubleValue(bestKnownQuality);
+            }
+
+            ParameterizeSolutionCreator();
+        }
+
+        public LOPData Export()
+        {
+            var result = new LOPData
+            {
+                Name = Name,
+                Description = Description,
+                BestKnownQuality = BestKnownQuality.Value,
+                //BestKnownPermutation = Matrix.row,
+                //Machines = Matrix.Columns
+            };
+            for (int i = 0; i < Matrix.Rows; i++)
+            {
+                for (int j = 0; j < Matrix.Columns; j++)
+                {
+                    //result.ProcessingTimes[i, j] = Matrix[i, j];
+                }
+            }
+
+            return result;
+        }
+        #endregion
+
+        #region Helpers
+        private void InitializeOperators()
+        {
+            var operators = new HashSet<IPermutationOperator>(new IPermutationOperator[] {
+                new OrderCrossover2(),
+                new InversionManipulator(),
+                new StochasticInversionMultiMoveGenerator()
+            }, new TypeEqualityComparer<IPermutationOperator>());
+
+            foreach (var op in ApplicationManager.Manager.GetInstances<IPermutationOperator>())
+                operators.Add(op);
+            Operators.AddRange(operators);
+            ParameterizeOperators();
+            UpdateMoveEvaluators();
+        }
+
+
+        private void ParameterizeOperators()
+        {
+            foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>())
+            {
+                op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ParentsParameter.Hidden = true;
+                op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ChildParameter.Hidden = true;
+            }
+            foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (IPermutationMultiNeighborhoodShakingOperator op in Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (ISingleObjectiveImprovementOperator op in Operators.OfType<ISingleObjectiveImprovementOperator>())
+            {
+                op.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.SolutionParameter.Hidden = true;
+            }
+            foreach (ISingleObjectivePathRelinker op in Operators.OfType<ISingleObjectivePathRelinker>())
+            {
+                op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ParentsParameter.Hidden = true;
+            }
+            foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>())
+            {
+                op.SolutionVariableName = SolutionCreator.PermutationParameter.ActualName;
+                op.QualityVariableName = Evaluator.QualityParameter.ActualName;
+            }
+        }
+        #endregion
+
+        private void UpdateMoveEvaluators()
+        {
+            ParameterizeOperators();
+            OnOperatorsChanged();
+        }
+
+        private void ParameterizeSolutionCreator()
+        {
+            SolutionCreator.LengthParameter.Value = new IntValue(Matrix.Columns); //Jobs
+
+            SolutionCreator.LengthParameter.Hidden = SolutionCreator.LengthParameter.Value != null;
+            SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
+            SolutionCreator.PermutationTypeParameter.Hidden = true;
+        }
+        private void ParameterizeEvaluator()
+        {
+            if (Evaluator is AwesomeTriangulationEvaluator)
+            {
+                IMatrixTriangulationEvaluator evaluator = (IMatrixTriangulationEvaluator)Evaluator;
+                evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                evaluator.PermutationParameter.Hidden = true;
+            }
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs	(revision 15521)
@@ -0,0 +1,21 @@
+﻿using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+  [Plugin("HeuristicLab.Problems.LinearOrdering", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.LinearOrdering-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsLinearOrderingPlugin : PluginBase { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Plugin.cs.frame	(revision 15521)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.LinearOrdering
+{
+  [Plugin("HeuristicLab.Problems.LinearOrdering", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.LinearOrdering-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsLinearOrderingPlugin : PluginBase { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs	(revision 15521)
@@ -0,0 +1,36 @@
+﻿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.LinearOrdering")]
+[assembly: AssemblyDescription("HeuristicLab Linear Ordering Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("51650b00-4ca6-41ff-8cb6-165fcacc3b51")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.14965")]
+
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.LinearOrdering/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.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.LinearOrdering")]
+[assembly: AssemblyDescription("HeuristicLab Linear Ordering Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("51650b00-4ca6-41ff-8cb6-165fcacc3b51")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
+
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/HeuristicLab.Problems.PFSP.Views-3.3.csproj
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/HeuristicLab.Problems.PFSP.Views-3.3.csproj	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/HeuristicLab.Problems.PFSP.Views-3.3.csproj	(revision 15521)
@@ -0,0 +1,235 @@
+﻿<?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>{F53AECD6-061C-4A62-B2DB-51E36EECBB79}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.PFSP.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.PFSP.Views-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\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>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.PFSP.Views-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>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.PFSP.Views-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>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.PFSP.Views-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>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>..\..\..\..\trunk\sources\bin\HeuristicLab.Problems.PFSP.Views-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>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+    <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.Data" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="JobShopSchedulingProblemView.cs" />
+    <Compile Include="JobShopSchedulingProblemView.Designer.cs">
+      <DependentUpon>JobShopSchedulingProblemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.Views\3.3\HeuristicLab.Core.Views-3.3.csproj">
+      <Project>{E226881D-315F-423D-B419-A766FE0D8685}</Project>
+      <Name>HeuristicLab.Core.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{DBECB8B0-B166-4133-BAF1-ED67C3FD7FCA}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.ScheduleEncoding.Views\3.3\HeuristicLab.Encodings.ScheduleEncoding.Views-3.3.csproj">
+      <Project>{0C378762-D5DB-488A-8931-2BA42B1B7CBF}</Project>
+      <Name>HeuristicLab.Encodings.ScheduleEncoding.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.ScheduleEncoding\3.3\HeuristicLab.Encodings.ScheduleEncoding-3.3.csproj">
+      <Project>{17F3EF80-B2C3-4B8D-A4D5-BE9CE3BA2606}</Project>
+      <Name>HeuristicLab.Encodings.ScheduleEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm.WindowsForms\3.3\HeuristicLab.MainForm.WindowsForms-3.3.csproj">
+      <Project>{AB687BBE-1BFE-476B-906D-44237135431D}</Project>
+      <Name>HeuristicLab.MainForm.WindowsForms-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.MainForm\3.3\HeuristicLab.MainForm-3.3.csproj">
+      <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
+      <Name>HeuristicLab.MainForm-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Views\3.3\HeuristicLab.Optimization.Views-3.3.csproj">
+      <Project>{662B4B15-8F4D-4AE5-B3EB-D91C215F5AF2}</Project>
+      <Name>HeuristicLab.Optimization.Views-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.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.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.PFSP\3.3\HeuristicLab.Problems.PFSP-3.3.csproj">
+      <Project>{51650b00-4ca6-41ff-8cb6-165fcacc3b51}</Project>
+      <Name>HeuristicLab.Problems.PFSP-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Scheduling\3.3\HeuristicLab.Problems.Scheduling-3.3.csproj">
+      <Project>{2BF1D639-1A74-44ED-AAAD-41ECD395AD93}</Project>
+      <Name>HeuristicLab.Problems.Scheduling-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.Designer.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.Designer.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.Designer.cs	(revision 15521)
@@ -0,0 +1,156 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Encodings.ScheduleEncoding.Views;
+namespace HeuristicLab.Problems.PFSP.Views
+{
+    partial class JobShopSchedulingProblemView
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.problemTabControl = new System.Windows.Forms.TabControl();
+            this.problemTabPage = new System.Windows.Forms.TabPage();
+            this.visualizationTabPage = new System.Windows.Forms.TabPage();
+            this.ganttChart = new HeuristicLab.Encodings.ScheduleEncoding.Views.GanttChart();
+            ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).BeginInit();
+            this.problemInstanceSplitContainer.Panel1.SuspendLayout();
+            this.problemInstanceSplitContainer.Panel2.SuspendLayout();
+            this.problemInstanceSplitContainer.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+            this.problemTabControl.SuspendLayout();
+            this.problemTabPage.SuspendLayout();
+            this.visualizationTabPage.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // problemInstanceSplitContainer.Panel2
+            // 
+            this.problemInstanceSplitContainer.Panel2.Controls.Add(this.problemTabControl);
+            // 
+            // parameterCollectionView
+            // 
+            this.parameterCollectionView.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
+            this.parameterCollectionView.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.parameterCollectionView.Location = new System.Drawing.Point(3, 3);
+            this.parameterCollectionView.Size = new System.Drawing.Size(491, 271);
+            // 
+            // nameTextBox
+            // 
+            this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+            this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+            this.nameTextBox.Size = new System.Drawing.Size(439, 20);
+            // 
+            // infoLabel
+            // 
+            this.infoLabel.Location = new System.Drawing.Point(492, 3);
+            // 
+            // problemTabControl
+            // 
+            this.problemTabControl.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.problemTabControl.Controls.Add(this.problemTabPage);
+            this.problemTabControl.Controls.Add(this.visualizationTabPage);
+            this.problemTabControl.Location = new System.Drawing.Point(3, 27);
+            this.problemTabControl.Name = "problemTabControl";
+            this.problemTabControl.SelectedIndex = 0;
+            this.problemTabControl.Size = new System.Drawing.Size(505, 303);
+            this.problemTabControl.TabIndex = 5;
+            // 
+            // problemTabPage
+            // 
+            this.problemTabPage.Controls.Add(this.parameterCollectionView);
+            this.problemTabPage.Location = new System.Drawing.Point(4, 22);
+            this.problemTabPage.Name = "problemTabPage";
+            this.problemTabPage.Padding = new System.Windows.Forms.Padding(3);
+            this.problemTabPage.Size = new System.Drawing.Size(497, 277);
+            this.problemTabPage.TabIndex = 0;
+            this.problemTabPage.Text = "Problem";
+            this.problemTabPage.UseVisualStyleBackColor = true;
+            // 
+            // visualizationTabPage
+            // 
+            this.visualizationTabPage.Controls.Add(this.ganttChart);
+            this.visualizationTabPage.Location = new System.Drawing.Point(4, 22);
+            this.visualizationTabPage.Name = "visualizationTabPage";
+            this.visualizationTabPage.Padding = new System.Windows.Forms.Padding(3);
+            this.visualizationTabPage.Size = new System.Drawing.Size(497, 277);
+            this.visualizationTabPage.TabIndex = 1;
+            this.visualizationTabPage.Text = "Visualization";
+            this.visualizationTabPage.UseVisualStyleBackColor = true;
+            // 
+            // ganttChart
+            // 
+            this.ganttChart.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.ganttChart.Location = new System.Drawing.Point(3, 3);
+            this.ganttChart.Name = "ganttChart";
+            this.ganttChart.Size = new System.Drawing.Size(491, 271);
+            this.ganttChart.TabIndex = 0;
+            // 
+            // JobShopSchedulingProblemView
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.Name = "JobShopSchedulingProblemView";
+            this.problemInstanceSplitContainer.Panel1.ResumeLayout(false);
+            this.problemInstanceSplitContainer.Panel2.ResumeLayout(false);
+            this.problemInstanceSplitContainer.Panel2.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.problemInstanceSplitContainer)).EndInit();
+            this.problemInstanceSplitContainer.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+            this.problemTabControl.ResumeLayout(false);
+            this.problemTabPage.ResumeLayout(false);
+            this.visualizationTabPage.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TabControl problemTabControl;
+        private System.Windows.Forms.TabPage problemTabPage;
+        private System.Windows.Forms.TabPage visualizationTabPage;
+        private GanttChart ganttChart;
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/JobShopSchedulingProblemView.cs	(revision 15521)
@@ -0,0 +1,124 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.Data;
+using System.Linq;
+
+namespace HeuristicLab.Problems.PFSP.Views
+{
+    [View("JobShop Scheduling Problem View")]
+    [Content(typeof(PermutationFlowshopSchedulingProblem), true)]
+    public partial class JobShopSchedulingProblemView : ProblemView
+    {
+
+        public new PermutationFlowshopSchedulingProblem Content
+        {
+            get { return (PermutationFlowshopSchedulingProblem)base.Content; }
+            set { base.Content = value; }
+        }
+
+        public JobShopSchedulingProblemView()
+        {
+            InitializeComponent();
+            Controls.Remove(parameterCollectionView);
+            parameterCollectionView.Dock = DockStyle.Fill;
+            problemTabPage.Controls.Add(parameterCollectionView);
+        }
+
+        protected override void OnContentChanged()
+        {
+            base.OnContentChanged();
+            FillGanttChart();
+        }
+
+        protected override void DeregisterContentEvents()
+        {
+            Content.BestKnownSolutionChanged -= Content_PermutationChanged;
+            base.DeregisterContentEvents();
+        }
+        protected override void RegisterContentEvents()
+        {
+            base.RegisterContentEvents();
+            Content.BestKnownSolutionChanged += new EventHandler(Content_PermutationChanged);
+        }
+
+        private void Content_PermutationChanged(object sender, EventArgs e)
+        {
+            if (InvokeRequired)
+            {
+                Invoke(new EventHandler(Content_PermutationChanged), sender, e);
+            }
+            else
+            {
+                FillGanttChart();
+            }
+        }
+
+        private void FillGanttChart()
+        {
+            ganttChart.Reset();
+            if (Content != null)
+            {
+                var matrix = Content.JobMatrix;
+                var perm = Content.BestKnownSolution;
+                if (matrix == null) { return; }
+
+                if (perm == null)
+                {
+                    perm = new Encodings.PermutationEncoding.Permutation(Encodings.PermutationEncoding.PermutationTypes.Absolute, Enumerable.Range(0, matrix.Columns).ToArray());
+                }
+
+                int[] permutation = perm.ToArray();
+
+                if (!permutation.Contains(0)) { permutation = permutation.Select(v => v - 1).ToArray(); }
+                DoubleMatrix calculatedTime = new DoubleMatrix(matrix.Rows, matrix.Columns);
+
+                for (var machineIdx = 0; machineIdx < matrix.Rows; machineIdx++)
+                {
+                    for (var jobIdx = 0; jobIdx < matrix.Columns; jobIdx++)
+                    {
+                        double runtimeCur = matrix[machineIdx, permutation[jobIdx]];
+                        double runtimePrev = 0;
+
+                        if (jobIdx == 0 && machineIdx == 0) { }
+                        else if (machineIdx == 0) { runtimePrev = calculatedTime[machineIdx, jobIdx - 1]; }
+                        else if (jobIdx == 0) { runtimePrev = calculatedTime[machineIdx - 1, jobIdx]; }
+                        else
+                        {
+                            double runtimePrevMachine = calculatedTime[machineIdx - 1, jobIdx];
+                            double runtimePrevJobOnThisMachine = calculatedTime[machineIdx, jobIdx - 1];
+                            runtimePrev = runtimePrevMachine > runtimePrevJobOnThisMachine ? runtimePrevMachine : runtimePrevJobOnThisMachine;
+                        }
+
+                        calculatedTime[machineIdx, jobIdx] = runtimeCur + runtimePrev;
+                        ganttChart.AddData("Machine " + machineIdx, permutation[jobIdx], jobIdx, runtimePrev, calculatedTime[machineIdx, jobIdx], "");
+                    }
+                }
+            }
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs	(revision 15521)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.PFSP.Views {
+  [Plugin("HeuristicLab.Problems.PFSP.Views", "3.3.14.14190")]
+  [PluginFile("HeuristicLab.Problems.PFSP.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.PFSP", "3.3")]
+  public class HeuristicLabProblemsSchedulingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Plugin.cs.frame	(revision 15521)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.PFSP.Views {
+  [Plugin("HeuristicLab.Problems.PFSP.Views", "3.3.14.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.PFSP.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization.Views", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.PFSP", "3.3")]
+  public class HeuristicLabProblemsSchedulingViewsPlugin : PluginBase {
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs	(revision 15521)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.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.PFSP.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab PFSP Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("ABF1DB5E-5774-48AB-B65A-5CF405C0E2A9")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.14190")]
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.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.PFSP.Views")]
+[assembly: AssemblyDescription("Views of the HeuristicLab PFSP Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("ABF1DB5E-5774-48AB-B65A-5CF405C0E2A8")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers 
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Analyzers/BestPFSPSolutionAnalyzer.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Analyzers/BestPFSPSolutionAnalyzer.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Analyzers/BestPFSPSolutionAnalyzer.cs	(revision 15521)
@@ -0,0 +1,114 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.ScheduleEncoding;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// AAn operator for analyzing the best solution of PFSPs given in Gantt-Chart representation.
+    /// </summary>
+    [Item("BestPFSPSolutionAnalyzer", "An operator for analyzing the best solution of PFSPs given in Gantt-Chart representation")]
+    [StorableClass]
+    public sealed class BestTSPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator
+    {
+        public bool EnabledByDefault
+        {
+            get { return true; }
+        }
+        public LookupParameter<Permutation> BestKnownSolutionParameter
+        {
+            get { return (LookupParameter<Permutation>)Parameters["BestKnownSolution"]; }
+        }
+
+        public LookupParameter<Permutation> BestSolutionParameter
+        {
+            get { return (LookupParameter<Permutation>)Parameters["BestSolution"]; }
+        }
+        public ValueLookupParameter<ResultCollection> ResultsParameter
+        {
+            get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
+        }
+        [StorableConstructor]
+        private BestTSPSolutionAnalyzer(bool deserializing) : base(deserializing) { }
+        private BestTSPSolutionAnalyzer(BestTSPSolutionAnalyzer original, Cloner cloner) : base(original, cloner) { }
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new BestTSPSolutionAnalyzer(this, cloner);
+        }
+        public BestTSPSolutionAnalyzer()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The best known solution of this TSP instance."));
+            Parameters.Add(new LookupParameter<Permutation>("BestSolution", "The best JSSP solution."));
+            Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best JSSP solution should be stored."));
+            BestKnownSolutionParameter.Hidden = true;
+        }
+
+        public override IOperation Apply()
+        {
+            ResultCollection results = ResultsParameter.ActualValue;
+            var bestKnownSolution = BestSolutionParameter.ActualValue;
+            
+            //int i = -1;
+            //if (!max)
+            //    i = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).First().index;
+            //else i = qualities.Select((x, index) => new { index, x.Value }).OrderByDescending(x => x.Value).First().index;
+            //
+            //if (bestKnownQuality == null ||
+            //    max && qualities[i].Value > bestKnownQuality.Value ||
+            //    !max && qualities[i].Value < bestKnownQuality.Value)
+            //{
+            //    BestKnownQualityParameter.ActualValue = new DoubleValue(qualities[i].Value);
+            //    BestKnownSolutionParameter.ActualValue = (Schedule)solutions[i].Clone();
+            //}
+            //
+            //Schedule bestSolution = BestSolutionParameter.ActualValue;
+            //if (bestSolution == null)
+            //{
+            //    bestSolution = (Schedule)solutions[i].Clone();
+            //    bestSolution.Quality = (DoubleValue)qualities[i].Clone();
+            //    BestSolutionParameter.ActualValue = bestSolution;
+            //    results.Add(new Result("Best Scheduling Solution", bestSolution));
+            //}
+            //else
+            //{
+            //    if (max && bestSolution.Quality.Value < qualities[i].Value ||
+            //      !max && bestSolution.Quality.Value > qualities[i].Value)
+            //    {
+            //        bestSolution.Quality.Value = qualities[i].Value;
+            //        bestSolution.Resources = (ItemList<Resource>)solutions[i].Resources.Clone();
+            //    }
+            //}
+
+            return base.Apply();
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecoder.cs	(revision 15521)
@@ -0,0 +1,185 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.JobSequenceMatrix;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP {
+  [Item("JobSequenceMatrixDecoder", "Applies the GifflerThompson algorithm to create an active schedule from a JobSequence Matrix.")]
+  [StorableClass]
+  public class JSMDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+    public IValueParameter<JSMDecodingErrorPolicy> DecodingErrorPolicyParameter {
+      get { return (IValueParameter<JSMDecodingErrorPolicy>)Parameters["DecodingErrorPolicy"]; }
+    }
+    public IValueParameter<JSMForcingStrategy> ForcingStrategyParameter {
+      get { return (IValueParameter<JSMForcingStrategy>)Parameters["ForcingStrategy"]; }
+    }
+
+    private JSMDecodingErrorPolicyTypes DecodingErrorPolicy {
+      get { return DecodingErrorPolicyParameter.Value.Value; }
+    }
+
+    private JSMForcingStrategyTypes ForcingStrategy {
+      get { return ForcingStrategyParameter.Value.Value; }
+    }
+
+    [StorableConstructor]
+    protected JSMDecoder(bool deserializing) : base(deserializing) { }
+    protected JSMDecoder(JSMDecoder original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMDecoder(this, cloner);
+    }
+
+    public JSMDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the Schedulingproblem - Instance."));
+      Parameters.Add(new ValueParameter<JSMDecodingErrorPolicy>("DecodingErrorPolicy", "Specify the policy that should be used to handle decoding errors.", new JSMDecodingErrorPolicy(JSMDecodingErrorPolicyTypes.RandomPolicy)));
+      Parameters.Add(new ValueParameter<JSMForcingStrategy>("ForcingStrategy", "Specifies a forcing strategy.", new JSMForcingStrategy(JSMForcingStrategyTypes.SwapForcing)));
+
+      ScheduleEncodingParameter.ActualName = "JobSequenceMatrix";
+    }
+
+    private Task SelectTaskFromConflictSet(int conflictedResourceNr, int progressOnConflictedResource, ItemList<Task> conflictSet, ItemList<Permutation> jsm) {
+      if (conflictSet.Count == 1)
+        return conflictSet[0];
+
+      //get solutionCandidate from jobSequencingMatrix
+      int solutionCandidateJobNr = jsm[conflictedResourceNr][progressOnConflictedResource];
+
+      //scan conflictSet for given solutionCandidate, and return if found
+      foreach (Task t in conflictSet) {
+        if (t.JobNr == solutionCandidateJobNr)
+          return t;
+      }
+
+      //if solutionCandidate wasn't found in conflictSet apply DecodingErrorPolicy and ForcingPolicy
+      Task result = ApplyDecodingErrorPolicy(conflictSet, jsm[conflictedResourceNr], progressOnConflictedResource);
+      int newResolutionIndex = 0;
+
+      while (newResolutionIndex < jsm[conflictedResourceNr].Length && jsm[conflictedResourceNr][newResolutionIndex] != result.JobNr)
+        newResolutionIndex++;
+      ApplyForcingStrategy(jsm, conflictedResourceNr, newResolutionIndex, progressOnConflictedResource, result.JobNr);
+
+      return result;
+    }
+
+    private Task ApplyDecodingErrorPolicy(ItemList<Task> conflictSet, Permutation resource, int progress) {
+      if (DecodingErrorPolicy == JSMDecodingErrorPolicyTypes.RandomPolicy) {
+        //Random
+        return conflictSet[RandomParameter.ActualValue.Next(conflictSet.Count - 1)];
+      } else {
+        //Guided
+        for (int i = progress; i < resource.Length; i++) {
+          int j = 0;
+          while (j < conflictSet.Count && conflictSet[j].JobNr != resource[i])
+            j++;
+
+          if (j < conflictSet.Count)
+            return (conflictSet[j]);
+        }
+        return conflictSet[RandomParameter.ActualValue.Next(conflictSet.Count - 1)];
+      }
+    }
+
+    private void ApplyForcingStrategy(ItemList<Permutation> jsm, int conflictedResource, int newResolutionIndex, int progressOnResource, int newResolution) {
+      if (ForcingStrategy == JSMForcingStrategyTypes.SwapForcing) {
+        //SwapForcing
+        jsm[conflictedResource][newResolutionIndex] = jsm[conflictedResource][progressOnResource];
+        jsm[conflictedResource][progressOnResource] = newResolution;
+      } else {
+        //ShiftForcing
+        List<int> asList = jsm[conflictedResource].ToList<int>();
+        if (newResolutionIndex > progressOnResource) {
+          asList.RemoveAt(newResolutionIndex);
+          asList.Insert(progressOnResource, newResolution);
+        } else {
+          asList.Insert(progressOnResource, newResolution);
+          asList.RemoveAt(newResolutionIndex);
+        }
+        jsm[conflictedResource] = new Permutation(PermutationTypes.Absolute, asList.ToArray<int>());
+      }
+    }
+
+    public Schedule CreateScheduleFromEncoding(JSMEncoding solution, ItemList<Job> jobData) {
+      ItemList<Permutation> jobSequenceMatrix = solution.JobSequenceMatrix;
+
+      var jobs = (ItemList<Job>)jobData.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+
+      //Reset scheduled tasks in result
+      foreach (Job j in jobs) {
+        foreach (Task t in j.Tasks) {
+          t.IsScheduled = false;
+        }
+      }
+
+      //GT-Algorithm
+      //STEP 0 - Compute a list of "earliest operations"
+      ItemList<Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      while (earliestTasksList.Count > 0) {
+        //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
+        Task minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);
+        int conflictedResourceNr = minimal.ResourceNr;
+        Resource conflictedResource = resultingSchedule.Resources[conflictedResourceNr];
+
+        //STEP 2 - Compute a conflict set of all operations that can be scheduled on the conflicted resource
+        ItemList<Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);
+
+        //STEP 3 - Select a task from the conflict set
+        int progressOnResource = conflictedResource.Tasks.Count;
+        Task selectedTask = SelectTaskFromConflictSet(conflictedResourceNr, progressOnResource, conflictSet, jobSequenceMatrix);
+
+        //STEP 4 - Add the selected task to the current schedule 
+        selectedTask.IsScheduled = true;
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
+        resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);
+
+        //STEP 5 - Back to STEP 1
+        earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      }
+
+      return resultingSchedule;
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as JSMEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type JSMEncoding");
+      return CreateScheduleFromEncoding(solution, JobDataParameter.ActualValue);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicy.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicy.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicy.cs	(revision 15521)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JSMDecodingErrorPolicy", "Represents a policy for handling decoding errors.")]
+  [StorableClass]
+  public sealed class JSMDecodingErrorPolicy : ValueTypeValue<JSMDecodingErrorPolicyTypes> {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Enum; }
+    }
+
+    [StorableConstructor]
+    private JSMDecodingErrorPolicy(bool deserializing) : base(deserializing) { }
+    private JSMDecodingErrorPolicy(JSMDecodingErrorPolicy original, Cloner cloner) : base(original, cloner) { }
+    public JSMDecodingErrorPolicy() : base() { }
+    public JSMDecodingErrorPolicy(JSMDecodingErrorPolicyTypes types) : base(types) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMDecodingErrorPolicy(this, cloner);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMDecodingErrorPolicyTypes.cs	(revision 15521)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public enum JSMDecodingErrorPolicyTypes {
+    RandomPolicy,
+    GuidedPolicy
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategy.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategy.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategy.cs	(revision 15521)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Drawing;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JSMForcingStrategy", "Represents a forcing strategy.")]
+  [StorableClass]
+  public sealed class JSMForcingStrategy : ValueTypeValue<JSMForcingStrategyTypes> {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Enum; }
+    }
+
+    [StorableConstructor]
+    private JSMForcingStrategy(bool deserializing) : base(deserializing) { }
+    private JSMForcingStrategy(JSMForcingStrategy original, Cloner cloner) : base(original, cloner) { }
+    public JSMForcingStrategy() { }
+    public JSMForcingStrategy(JSMForcingStrategyTypes types) : base(types) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new JSMForcingStrategy(this, cloner);
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategyTypes.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategyTypes.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/JSMForcingStrategyTypes.cs	(revision 15521)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public enum JSMForcingStrategyTypes {
+    ShiftForcing,
+    SwapForcing
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PRVDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PRVDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PRVDecoder.cs	(revision 15521)
@@ -0,0 +1,246 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.PriorityRulesVector;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("JobSequencingMatrixDecoder", "Applies the GifflerThompson algorithm to create an active schedule from a JobSequencing Matrix.")]
+  [StorableClass]
+  public class PRVDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+
+    #region Priority Rules
+    //smallest number of remaining tasks
+    private Task FILORule(ItemList<Task> tasks) {
+      Task currentResult = tasks[tasks.Count - 1];
+      return currentResult;
+    }
+
+    //earliest start time
+    private Task ESTRule(ItemList<Task> tasks, Schedule schedule) {
+      Task currentResult = RandomRule(tasks);
+      double currentEST = double.MaxValue;
+      foreach (Task t in tasks) {
+        double est = GTAlgorithmUtils.ComputeEarliestStartTime(t, schedule);
+        if (est < currentEST) {
+          currentEST = est;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //shortest processingtime
+    private Task SPTRule(ItemList<Task> tasks) {
+      Task currentResult = RandomRule(tasks);
+      foreach (Task t in tasks) {
+        if (t.Duration < currentResult.Duration)
+          currentResult = t;
+      }
+      return currentResult;
+    }
+
+    //longest processing time    
+    private Task LPTRule(ItemList<Task> tasks) {
+      Task currentResult = RandomRule(tasks);
+      foreach (Task t in tasks) {
+        if (t.Duration > currentResult.Duration)
+          currentResult = t;
+      }
+      return currentResult;
+    }
+
+    //most work remaining
+    private Task MWRRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      double currentLargestRemainingProcessingTime = 0;
+      foreach (Task t in tasks) {
+        double remainingProcessingTime = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            remainingProcessingTime += jt.Duration;
+        }
+        if (remainingProcessingTime > currentLargestRemainingProcessingTime) {
+          currentLargestRemainingProcessingTime = remainingProcessingTime;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //least work remaining
+    private Task LWRRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      double currentSmallestRemainingProcessingTime = double.MaxValue;
+      foreach (Task t in tasks) {
+        double remainingProcessingTime = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            remainingProcessingTime += jt.Duration;
+        }
+        if (remainingProcessingTime < currentSmallestRemainingProcessingTime) {
+          currentSmallestRemainingProcessingTime = remainingProcessingTime;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //most operations remaining
+    private Task MORRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      int currentLargestNrOfRemainingTasks = 0;
+      foreach (Task t in tasks) {
+        int nrOfRemainingTasks = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            nrOfRemainingTasks++;
+        }
+        if (currentLargestNrOfRemainingTasks < nrOfRemainingTasks) {
+          currentLargestNrOfRemainingTasks = nrOfRemainingTasks;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //least operationsremaining
+    private Task LORRule(ItemList<Task> tasks, ItemList<Job> jobs) {
+      Task currentResult = RandomRule(tasks);
+      int currentSmallestNrOfRemainingTasks = int.MaxValue;
+      foreach (Task t in tasks) {
+        int nrOfRemainingTasks = 0;
+        foreach (Task jt in jobs[t.JobNr].Tasks) {
+          if (!jt.IsScheduled)
+            nrOfRemainingTasks++;
+        }
+        if (currentSmallestNrOfRemainingTasks > nrOfRemainingTasks) {
+          currentSmallestNrOfRemainingTasks = nrOfRemainingTasks;
+          currentResult = t;
+        }
+      }
+      return currentResult;
+    }
+
+    //first operation in Queue
+    private Task FIFORule(ItemList<Task> tasks) {
+      Task currentResult = tasks[0];
+      return currentResult;
+    }
+
+    //random
+    private Task RandomRule(ItemList<Task> tasks) {
+      Task currentResult = tasks[RandomParameter.ActualValue.Next(tasks.Count)];
+      return currentResult;
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    protected PRVDecoder(bool deserializing) : base(deserializing) { }
+    protected PRVDecoder(PRVDecoder original, Cloner cloner) : base(original, cloner) { }
+    public PRVDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the SchedulingProblem - Instance."));
+      ScheduleEncodingParameter.ActualName = "PriorityRulesVector";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PRVDecoder(this, cloner);
+    }
+
+    private Task SelectTaskFromConflictSet(ItemList<Task> conflictSet, int ruleIndex, int nrOfRules, Schedule schedule, ItemList<Job> jobs) {
+      if (conflictSet.Count == 1)
+        return conflictSet[0];
+
+      ruleIndex = ruleIndex % nrOfRules;
+      switch (ruleIndex) {
+        case 0: return FILORule(conflictSet);
+        case 1: return ESTRule(conflictSet, schedule);
+        case 2: return SPTRule(conflictSet);
+        case 3: return LPTRule(conflictSet);
+        case 4: return MWRRule(conflictSet, jobs);
+        case 5: return LWRRule(conflictSet, jobs);
+        case 6: return MORRule(conflictSet, jobs);
+        case 7: return LORRule(conflictSet, jobs);
+        case 8: return FIFORule(conflictSet);
+        case 9: return RandomRule(conflictSet);
+        default: return RandomRule(conflictSet);
+      }
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as PRVEncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type PWREncoding");
+
+      var jobs = (ItemList<Job>)JobDataParameter.ActualValue.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+
+      //Reset scheduled tasks in result
+      foreach (Job j in jobs) {
+        foreach (Task t in j.Tasks) {
+          t.IsScheduled = false;
+        }
+      }
+
+      //GT-Algorithm
+      //STEP 0 - Compute a list of "earliest operations"
+      ItemList<Task> earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      //int currentDecisionIndex = 0;
+      while (earliestTasksList.Count > 0) {
+        //STEP 1 - Get earliest not scheduled operation with minimal earliest completing time
+        Task minimal = GTAlgorithmUtils.GetTaskWithMinimalEC(earliestTasksList, resultingSchedule);
+
+        //STEP 2 - Compute a conflict set of all operations that can be scheduled on the machine the previously selected operation runs on
+        ItemList<Task> conflictSet = GTAlgorithmUtils.GetConflictSetForTask(minimal, earliestTasksList, jobs, resultingSchedule);
+
+        //STEP 3 - Select an operation from the conflict set (various methods depending on how the algorithm should work..)
+        //Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector [currentDecisionIndex++], solution.NrOfRules.Value);
+        Task selectedTask = SelectTaskFromConflictSet(conflictSet, solution.PriorityRulesVector[minimal.JobNr], solution.NrOfRules.Value, resultingSchedule, jobs);
+
+        //STEP 4 - Adding the selected operation to the current schedule
+        selectedTask.IsScheduled = true;
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(selectedTask, resultingSchedule);
+        resultingSchedule.ScheduleTask(selectedTask.ResourceNr, startTime, selectedTask.Duration, selectedTask.JobNr);
+
+        //STEP 5 - Back to STEP 1
+        earliestTasksList = GTAlgorithmUtils.GetEarliestNotScheduledTasks(jobs);
+      }
+
+      return resultingSchedule;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PWRDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PWRDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/PWRDecoder.cs	(revision 15521)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding.PermutationWithRepetition;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("PWRDecoder", "An item used to convert a PWR-individual into a generalized schedule.")]
+  [StorableClass]
+  public class PWRDecoder : ScheduleDecoder, IStochasticOperator, IJSSPOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+    public ILookupParameter<ItemList<Job>> JobDataParameter {
+      get { return (LookupParameter<ItemList<Job>>)Parameters["JobData"]; }
+    }
+
+    [StorableConstructor]
+    protected PWRDecoder(bool deserializing) : base(deserializing) { }
+    protected PWRDecoder(PWRDecoder original, Cloner cloner) : base(original, cloner) { }
+    public PWRDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic manipulation operators."));
+      Parameters.Add(new LookupParameter<ItemList<Job>>("JobData", "Job data taken from the JSSP - Instance."));
+      ScheduleEncodingParameter.ActualName = "PermutationWithRepetition";
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new PWRDecoder(this, cloner);
+    }
+
+    public override Schedule CreateScheduleFromEncoding(IScheduleEncoding encoding) {
+      var solution = encoding as PWREncoding;
+      if (solution == null) throw new InvalidOperationException("Encoding is not of type PWREncoding");
+
+      var jobs = (ItemList<Job>)JobDataParameter.ActualValue.Clone();
+      var resultingSchedule = new Schedule(jobs[0].Tasks.Count);
+      foreach (int jobNr in solution.PermutationWithRepetition) {
+        int i = 0;
+        while (jobs[jobNr].Tasks[i].IsScheduled) i++;
+        Task currentTask = jobs[jobNr].Tasks[i];
+        double startTime = GTAlgorithmUtils.ComputeEarliestStartTime(currentTask, resultingSchedule);
+        currentTask.IsScheduled = true;
+        resultingSchedule.ScheduleTask(currentTask.ResourceNr, startTime, currentTask.Duration, currentTask.JobNr);
+      }
+      return resultingSchedule;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/ScheduleDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/ScheduleDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Decoders/ScheduleDecoder.cs	(revision 15521)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Item("ScheduleDecoder", "A schedule decoder translates a respresentation into an actual schedule.")]
+  [StorableClass]
+  public abstract class ScheduleDecoder : SingleSuccessorOperator, IScheduleDecoder {
+
+    public ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter {
+      get { return (ILookupParameter<IScheduleEncoding>)Parameters["ScheduleEncoding"]; }
+    }
+    public ILookupParameter<Schedule> ScheduleParameter {
+      get { return (ILookupParameter<Schedule>)Parameters["Schedule"]; }
+    }
+
+    [StorableConstructor]
+    protected ScheduleDecoder(bool deserializing) : base(deserializing) { }
+    protected ScheduleDecoder(ScheduleDecoder original, Cloner cloner) : base(original, cloner) { }
+    public ScheduleDecoder()
+      : base() {
+      Parameters.Add(new LookupParameter<IScheduleEncoding>("ScheduleEncoding", "The new scheduling solution represented as encoding."));
+      Parameters.Add(new LookupParameter<Schedule>("Schedule", "The decoded scheduling solution represented as generalized schedule."));
+    }
+
+    public abstract Schedule CreateScheduleFromEncoding(IScheduleEncoding solution);
+
+    public override IOperation Apply() {
+      Schedule result = CreateScheduleFromEncoding(ScheduleEncodingParameter.ActualValue);
+      ScheduleParameter.ActualValue = result;
+      return base.Apply();
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/AwesomeMakeSpanEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/AwesomeMakeSpanEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/AwesomeMakeSpanEvaluator.cs	(revision 15521)
@@ -0,0 +1,91 @@
+﻿using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.PFSP
+{ /// <summary>
+  /// An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.
+  /// </summary>
+    [Item("AwesomeMakeSpanEvaluator", "An operator which evaluates TSP solutions given in path representation using the rounded Euclidean distance metric.")]
+    [StorableClass]
+    public sealed class AwesomeMakeSpanEvaluator : MakeSpanEvaluator
+    {
+        [StorableConstructor]
+        private AwesomeMakeSpanEvaluator(bool deserializing) : base(deserializing) { }
+        private AwesomeMakeSpanEvaluator(AwesomeMakeSpanEvaluator original, Cloner cloner) : base(original, cloner) { }
+        public AwesomeMakeSpanEvaluator() : base() { }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new AwesomeMakeSpanEvaluator(this, cloner);
+        }
+
+        /// <summary>
+        /// Calculates the distance between two points using the rounded Euclidean distance metric.
+        /// </summary>
+        /// <param name="x1">The x-coordinate of point 1.</param>
+        /// <param name="y1">The y-coordinate of point 1.</param>
+        /// <param name="x2">The x-coordinate of point 2.</param>
+        /// <param name="y2">The y-coordinate of point 2.</param>
+        /// <returns>The calculated distance.</returns>
+        protected override double CalculateMakespan(DoubleMatrix m, Permutation p)
+        {
+            DoubleMatrix calculatedTime = new DoubleMatrix(m.Rows, m.Columns);
+            double runtimeCur;
+            double runtimePrev = 0;
+
+            double runtimePrevMachine;
+            double runtimePrevJobOnThisMachine;
+
+            int[] permutation = p.ToArray();
+
+            //reduce offset, real arrays start with 0
+            //if (!permutation.Contains(0)) { permutation = permutation.Select(v => v - 1).ToArray(); }
+
+            for (var machineIdx = 0; machineIdx < m.Rows; machineIdx++)
+            {
+                for (var jobIdx = 0; jobIdx < m.Columns; jobIdx++)
+                {
+                    runtimeCur = m[machineIdx, permutation[jobIdx]];
+                    runtimePrev = 0;
+
+                    //Simply add to calculatedTimeMatrix
+                    if (jobIdx == 0 && machineIdx == 0)
+                    {
+                        //Take default (runtimePrev = 0)
+                    }
+                    //Add the time + the previous time
+                    else if (machineIdx == 0)
+                    {
+                        runtimePrev = calculatedTime[machineIdx, jobIdx - 1];
+                    }
+                    //Check the job-time from the previous machine and previos job and take the greater
+                    else if (jobIdx == 0)
+                    {
+                        runtimePrev = calculatedTime[machineIdx - 1, jobIdx];
+                    }
+                    //X X X X X
+                    //X O O O O
+                    //X O O O O
+                    //X O O O O
+                    else
+                    {
+                        runtimePrevMachine = calculatedTime[machineIdx - 1, jobIdx];
+                        runtimePrevJobOnThisMachine = calculatedTime[machineIdx, jobIdx - 1];
+                        runtimePrev = runtimePrevMachine > runtimePrevJobOnThisMachine ? runtimePrevMachine : runtimePrevJobOnThisMachine;
+                    }
+                    calculatedTime[machineIdx, jobIdx] = runtimeCur + runtimePrev;
+                }
+            }
+            //return the makespan(the total runtime from start till the last job is finished)
+            return calculatedTime[calculatedTime.Rows - 1, calculatedTime.Columns - 1];
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/MakeSpanEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/MakeSpanEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/MakeSpanEvaluator.cs	(revision 15521)
@@ -0,0 +1,97 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// A base class for operators which evaluate TSP solutions given in path representation using city coordinates.
+    /// </summary>
+    [Item("MakeSpanEvaluator", "A base class for operators which evaluate TSP solutions given in path representation using city coordinates.")]
+    [StorableClass]
+    public abstract class MakeSpanEvaluator : PFSPEvaluator, IMakespanEvaluator
+    {
+        private object locker = new object();
+
+        public ILookupParameter<Permutation> PermutationParameter { get { return (ILookupParameter<Permutation>)Parameters["Permutation"]; } }
+        public ILookupParameter<JobMatrix> JobMatrixParameter { get { return (ILookupParameter<JobMatrix>)Parameters["JobMatrix"]; } }
+        public ILookupParameter<Permutation> BestKnownSolutionParameter { get { return (ILookupParameter<Permutation>)Parameters["BestKnownSolution"]; } }
+        public ILookupParameter<DoubleValue> BestKnownQualityParameter { get { return (ILookupParameter<DoubleValue>)Parameters["BestKnownQuality"]; } }
+        [StorableConstructor]
+        protected MakeSpanEvaluator(bool deserializing) : base(deserializing) { }
+        protected MakeSpanEvaluator(MakeSpanEvaluator original, Cloner cloner) : base(original, cloner) { }
+        protected MakeSpanEvaluator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<Permutation>("Permutation", "The TSP solution given in path representation which should be evaluated."));
+            Parameters.Add(new LookupParameter<JobMatrix>("JobMatrix", "The matrix which contains the distances between the cities."));
+            Parameters.Add(new LookupParameter<Permutation>("BestKnownSolution", "The currently best known solution."));
+            Parameters.Add(new LookupParameter<DoubleValue>("BestKnownQuality", "The currently best known quality."));
+        }
+
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            // BackwardsCompatibility3.3
+            #region Backwards compatible code (remove with 3.4)
+            LookupParameter<DoubleMatrix> oldDistanceMatrixParameter = Parameters["JobMatrix"] as LookupParameter<DoubleMatrix>;
+            if (oldDistanceMatrixParameter != null)
+            {
+                Parameters.Remove(oldDistanceMatrixParameter);
+                Parameters.Add(new LookupParameter<JobMatrix>("JobMatrix", "The matrix which contains the distances between the cities."));
+                JobMatrixParameter.ActualName = oldDistanceMatrixParameter.ActualName;
+            }
+            #endregion
+        }
+
+        public static double Apply(MakeSpanEvaluator evaluator, DoubleMatrix matrix, Permutation tour)
+        {
+            double length = evaluator.CalculateMakespan(matrix, tour);
+            return length;
+        }
+
+        public sealed override IOperation InstrumentedApply()
+        {
+            Permutation p = PermutationParameter.ActualValue;
+            DoubleMatrix c = JobMatrixParameter.ActualValue;
+            if (c == null) throw new InvalidOperationException("No coordinates were given.");
+
+            double makespan = CalculateMakespan(c, p);
+            QualityParameter.ActualValue = new DoubleValue(makespan);
+
+            if (BestKnownQualityParameter.ActualValue == null || BestKnownQualityParameter.ActualValue.Value > makespan)
+            {
+                BestKnownSolutionParameter.ActualValue = p;
+                BestKnownQualityParameter.ActualValue = new DoubleValue(makespan);
+            }
+            return base.InstrumentedApply();
+        }
+
+        protected abstract double CalculateMakespan(DoubleMatrix matrix, Permutation tour);
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/PFSPEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/PFSPEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Evaluators/PFSPEvaluator.cs	(revision 15521)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// A base class for operators which evaluate TSP solutions.
+    /// </summary>
+    [Item("PFSPEvaluator", "A base class for operators which evaluate TSP solutions.")]
+    [StorableClass]
+    public abstract class PFSPEvaluator : InstrumentedOperator, IPFSPEvaluator
+    {
+        public override bool CanChangeName
+        {
+            get { return false; }
+        }
+
+        public ILookupParameter<DoubleValue> QualityParameter
+        {
+            get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+        }
+
+        [StorableConstructor]
+        protected PFSPEvaluator(bool deserializing) : base(deserializing) { }
+        protected PFSPEvaluator(PFSPEvaluator original, Cloner cloner) : base(original, cloner) { }
+        protected PFSPEvaluator()
+          : base()
+        {
+            Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the TSP solution."));
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/HeuristicLab.Problems.PFSP-3.3.csproj
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/HeuristicLab.Problems.PFSP-3.3.csproj	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/HeuristicLab.Problems.PFSP-3.3.csproj	(revision 15521)
@@ -0,0 +1,142 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{51650B00-4CA6-41FF-8CB6-165FCACC3B51}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.PFSP</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.PFSP-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Analyzers\BestPFSPSolutionAnalyzer.cs" />
+    <Compile Include="Evaluators\AwesomeMakeSpanEvaluator.cs" />
+    <Compile Include="Evaluators\MakeSpanEvaluator.cs" />
+    <Compile Include="Evaluators\PFSPEvaluator.cs" />
+    <Compile Include="Interfaces\IMakespanEvaluator.cs" />
+    <Compile Include="JobMatrix.cs" />
+    <Compile Include="Interfaces\IPFSPEvaluator.cs" />
+    <Compile Include="PermutationFlowshopSchedulingProblem.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>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{C36BD924-A541-4A00-AFA8-41701378DDC5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.IntegerVectorEncoding\3.3\HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj">
+      <Project>{DDFB14DD-2A85-493C-A52D-E69729BBAEB0}</Project>
+      <Name>HeuristicLab.Encodings.IntegerVectorEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.PermutationEncoding\3.3\HeuristicLab.Encodings.PermutationEncoding-3.3.csproj">
+      <Project>{DBECB8B0-B166-4133-BAF1-ED67C3FD7FCA}</Project>
+      <Name>HeuristicLab.Encodings.PermutationEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.ScheduleEncoding\3.3\HeuristicLab.Encodings.ScheduleEncoding-3.3.csproj">
+      <Project>{17F3EF80-B2C3-4B8D-A4D5-BE9CE3BA2606}</Project>
+      <Name>HeuristicLab.Encodings.ScheduleEncoding-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14AB8D24-25BC-400C-A846-4627AA945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102BC7D3-0EF9-439C-8F6D-96FF0FDB8E1B}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186A6A-5176-4402-AE83-886557B53CCA}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Instances\3.3\HeuristicLab.Problems.Instances-3.3.csproj">
+      <Project>{3540E29E-4793-49E7-8EE2-FEA7F61C3994}</Project>
+      <Name>HeuristicLab.Problems.Instances-3.3</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IJSSPOperator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IJSSPOperator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IJSSPOperator.cs	(revision 15521)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+
+namespace HeuristicLab.Problems.PFSP {
+  public interface IJSSPOperator : IOperator {
+    ILookupParameter<ItemList<Job>> JobDataParameter { get; }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IMakespanEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IMakespanEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IMakespanEvaluator.cs	(revision 15521)
@@ -0,0 +1,22 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    interface IMakespanEvaluator : IPFSPEvaluator
+    {
+        ILookupParameter<Permutation> PermutationParameter { get; }
+        ILookupParameter<JobMatrix> JobMatrixParameter { get; }
+        ILookupParameter<Permutation> BestKnownSolutionParameter { get; }
+        ILookupParameter<DoubleValue> BestKnownQualityParameter { get; }
+
+         
+
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IPFSPEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IPFSPEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IPFSPEvaluator.cs	(revision 15521)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// An evaluator for a Schedule
+    /// </summary>
+    public interface IPFSPEvaluator : ISingleObjectiveEvaluator { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleDecoder.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleDecoder.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleDecoder.cs	(revision 15521)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  public interface IScheduleDecoder : IOperator
+  {
+    ILookupParameter<IScheduleEncoding> ScheduleEncodingParameter { get; }
+    ILookupParameter<Schedule> ScheduleParameter { get; }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/IScheduleEvaluator.cs	(revision 15521)
@@ -0,0 +1,34 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.ScheduleEncoding;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// An evaluator for a Schedule
+    /// </summary>
+    public interface IScheduleEvaluator : ISingleObjectiveEvaluator
+    {
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/ISchedulingEvaluator.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/ISchedulingEvaluator.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Interfaces/ISchedulingEvaluator.cs	(revision 15521)
@@ -0,0 +1,17 @@
+﻿using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    /// <summary>
+    /// An evaluator for a scheduling problem representation
+    /// </summary>
+    public interface ISchedulingEvaluator : ISingleObjectiveEvaluator
+    {
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/JobMatrix.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/JobMatrix.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/JobMatrix.cs	(revision 15521)
@@ -0,0 +1,52 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.PFSP {
+  [Item("JobMatrix", "Represents a matrix of a PFSP.")]
+  [StorableClass]
+  public sealed class JobMatrix : DoubleMatrix {
+    [StorableConstructor]
+    private JobMatrix(bool deserializing) : base(deserializing) { }
+    private JobMatrix(JobMatrix original, Cloner cloner) {
+      throw new NotSupportedException("Distance matrices cannot be cloned.");
+    }
+    public JobMatrix() : base() { }
+    public JobMatrix(int rows, int columns) : base(rows, columns) { }
+    public JobMatrix(int rows, int columns, IEnumerable<string> columnNames) : base(rows, columns, columnNames) { }
+    public JobMatrix(int rows, int columns, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(rows, columns, columnNames, rowNames) { }
+    public JobMatrix(double[,] elements) : base(elements) { }
+    public JobMatrix(double[,] elements, IEnumerable<string> columnNames) : base(elements, columnNames) { }
+    public JobMatrix(double[,] elements, IEnumerable<string> columnNames, IEnumerable<string> rowNames) : base(elements, columnNames, rowNames) { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      // distance matrices are not cloned for performance reasons
+      cloner.RegisterClonedObject(this, this);
+      return this;
+    }
+  }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/PermutationFlowshopSchedulingProblem.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/PermutationFlowshopSchedulingProblem.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/PermutationFlowshopSchedulingProblem.cs	(revision 15521)
@@ -0,0 +1,338 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.Instances;
+using HeuristicLab.Optimization;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.PFSP
+{
+    [Item("Permutation Flowshop Scheduling Problem (PFSP)", "Represents a Permutation Flowshop Scheduling Problem")]
+    [Creatable(CreatableAttribute.Categories.CombinatorialProblems, Priority = 999)]
+    [StorableClass]
+    public sealed class PermutationFlowshopSchedulingProblem : SingleObjectiveHeuristicOptimizationProblem<IPFSPEvaluator, IPermutationCreator>, IProblemInstanceConsumer<FSSPData>, IProblemInstanceExporter<FSSPData>, IStorableContent
+    {
+        #region Default Instance
+        private static readonly FSSPData DefaultInstance = new FSSPData()
+        {
+            Name = "Permutation Flowshop Scheduling Problem (PFSP)",
+            Description = "The default instance of the PFSP problem in HeuristicLab",
+            Jobs = 4,
+            Machines = 4,
+            //BestKnownQuality = 328,
+            ProcessingTimes = new double[,] {
+                {5 ,3, 6 ,6 },
+                {2 ,4, 8 ,4},
+                {4 ,2, 7 ,4},
+                {5 ,3, 8 ,6}
+            }
+        };
+        #endregion
+
+        public string Filename { get; set; }
+
+        #region Parameter Properties
+        public OptionalValueParameter<Permutation> BestKnownSolutionParameter
+        {
+            get { return (OptionalValueParameter<Permutation>)Parameters["BestKnownSolution"]; }
+        }
+
+        public OptionalValueParameter<JobMatrix> JobMatrixParameter
+        {
+            get { return (OptionalValueParameter<JobMatrix>)Parameters["JobMatrix"]; }
+        }
+        #endregion
+
+        #region Properties
+        public Permutation BestKnownSolution
+        {
+            get { return BestKnownSolutionParameter.Value; }
+            set
+            {
+                BestKnownSolutionParameter.Value = value;
+                if (BestKnownSolutionChanged != null) { OnBestKnownSolutionChanged(); }
+            }
+        }
+        public JobMatrix JobMatrix
+        {
+            get { return JobMatrixParameter.Value; }
+            set { JobMatrixParameter.Value = value; }
+        }
+        #endregion
+
+        public event EventHandler BestKnownSolutionChanged;
+        private void OnBestKnownSolutionChanged()
+        {
+            var changed = BestKnownSolutionChanged;
+            if (changed != null)
+                changed(this, EventArgs.Empty);
+        }
+
+        // BackwardsCompatibility3.3
+        #region Backwards compatible code, remove with 3.4
+        [Obsolete]
+        [Storable(Name = "operators")]
+        private IEnumerable<IOperator> oldOperators
+        {
+            get { return null; }
+            set
+            {
+                if (value != null && value.Any())
+                    Operators.AddRange(value);
+            }
+        }
+        #endregion
+
+        [StorableConstructor]
+        private PermutationFlowshopSchedulingProblem(bool deserializing) : base(deserializing) { }
+        private PermutationFlowshopSchedulingProblem(PermutationFlowshopSchedulingProblem original, Cloner cloner)
+          : base(original, cloner)
+        {
+            RegisterEventHandlers();
+        }
+        public PermutationFlowshopSchedulingProblem()
+          : base(new AwesomeMakeSpanEvaluator(), new RandomPermutationCreator())
+        {
+            Parameters.Add(new OptionalValueParameter<Permutation>("BestKnownSolution", "The best known solution of this FSSP instance."));
+            Parameters.Add(new OptionalValueParameter<JobMatrix>("JobMatrix", "The matrix which contains the jobs,machines and duration."));
+
+            Load(DefaultInstance);
+            EvaluatorParameter.GetsCollected = false;
+            EvaluatorParameter.Hidden = true;
+
+            Maximization.Value = false;
+            MaximizationParameter.Hidden = true;
+
+            SolutionCreator.PermutationParameter.ActualName = "PFSPOrder";
+            Evaluator.QualityParameter.ActualName = "Makespan";
+            ParameterizeSolutionCreator();
+            ParameterizeEvaluator();
+
+            InitializeOperators();
+            RegisterEventHandlers();
+        }
+
+        public override IDeepCloneable Clone(Cloner cloner)
+        {
+            return new PermutationFlowshopSchedulingProblem(this, cloner);
+        }
+
+        [StorableHook(HookType.AfterDeserialization)]
+        private void AfterDeserialization()
+        {
+            RegisterEventHandlers();
+        }
+
+        private void RegisterEventHandlers()
+        {
+            SolutionCreator.PermutationParameter.ActualNameChanged += new EventHandler(SolutionCreator_PermutationParameter_ActualNameChanged);
+            Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
+        }
+
+        private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e)
+        {
+            //Nothing to do  ParameterizeAnalyzers();
+        }
+
+        private void SolutionCreator_PermutationParameter_ActualNameChanged(object sender, EventArgs e)
+        {
+            ParameterizeEvaluator();
+            //ParameterizeAnalyzers();
+            ParameterizeOperators();
+        }
+
+        #region Events
+        private void ScheduleEvaluator_QualityParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+
+        private void SolutionCreator_SchedulingEncodingParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+
+        private void ScheduleDecoder_ScheduleParameter_ActualNameChanged(object sender, EventArgs eventArgs)
+        {
+            ParameterizeOperators();
+        }
+        #endregion
+
+        #region Problem Instance Handling
+        public void Load(FSSPData data)
+        {
+
+            BestKnownQuality = data.BestKnownQuality.HasValue ? new DoubleValue(data.BestKnownQuality.Value) : null;
+            Name = data.Name;
+            Description = data.Description;
+            JobMatrix = new JobMatrix(data.ProcessingTimes);
+
+            if (data.BestKnownSchedule != null)
+            {
+                int[] permut = data.BestKnownSchedule;
+                //Clean up if the first index = 1
+                if (!permut.Contains(0)) { permut = permut.Select(v => v - 1).ToArray(); }
+                double bestKnownQuality = MakeSpanEvaluator.Apply(
+                    new AwesomeMakeSpanEvaluator(),
+                    new DoubleMatrix(data.ProcessingTimes),
+                    new Permutation(PermutationTypes.Absolute, permut)
+                );
+
+                BestKnownSolution = new Permutation(PermutationTypes.Absolute, data.BestKnownSchedule);
+                BestKnownQuality = new DoubleValue(bestKnownQuality);
+            }
+
+            ParameterizeSolutionCreator();
+        }
+
+        public FSSPData Export()
+        {
+            var result = new FSSPData
+            {
+                Name = Name,
+                Description = Description,
+                ProcessingTimes = new double[JobMatrix.Rows, JobMatrix.Columns]
+            };
+
+            if (BestKnownQuality != null)
+            {
+                result.BestKnownQuality = BestKnownQuality.Value;
+            }
+
+            if (JobMatrix != null)
+            {
+                result.Jobs = JobMatrix.Rows;
+                result.Machines = JobMatrix.Columns;
+            }
+
+            for (int i = 0; i < JobMatrix.Rows; i++)
+            {
+                for (int j = 0; j < JobMatrix.Columns; j++)
+                {
+                    result.ProcessingTimes[i, j] = JobMatrix[i, j];
+                }
+            }
+
+            result.BestKnownSchedule = BestKnownSolution != null ? (BestKnownSolution as IntArray).ToArray() : null;
+
+            return result;
+        }
+        #endregion
+
+        #region Helpers
+        private void InitializeOperators()
+        {
+            var operators = new HashSet<IPermutationOperator>(new IPermutationOperator[] {
+                new OrderCrossover2(),
+                new InversionManipulator(),
+                new StochasticInversionMultiMoveGenerator()
+            }, new TypeEqualityComparer<IPermutationOperator>());
+
+            foreach (var op in ApplicationManager.Manager.GetInstances<IPermutationOperator>())
+                operators.Add(op);
+            Operators.AddRange(operators);
+            Operators.Add(new BestTSPSolutionAnalyzer());
+            ParameterizeOperators();
+            UpdateMoveEvaluators();
+        }
+
+
+        private void ParameterizeOperators()
+        {
+            foreach (IPermutationCrossover op in Operators.OfType<IPermutationCrossover>())
+            {
+                op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ParentsParameter.Hidden = true;
+                op.ChildParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ChildParameter.Hidden = true;
+            }
+            foreach (IPermutationManipulator op in Operators.OfType<IPermutationManipulator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (IPermutationMoveOperator op in Operators.OfType<IPermutationMoveOperator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (IPermutationMultiNeighborhoodShakingOperator op in Operators.OfType<IPermutationMultiNeighborhoodShakingOperator>())
+            {
+                op.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.PermutationParameter.Hidden = true;
+            }
+            foreach (ISingleObjectiveImprovementOperator op in Operators.OfType<ISingleObjectiveImprovementOperator>())
+            {
+                op.SolutionParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.SolutionParameter.Hidden = true;
+            }
+            foreach (ISingleObjectivePathRelinker op in Operators.OfType<ISingleObjectivePathRelinker>())
+            {
+                op.ParentsParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                op.ParentsParameter.Hidden = true;
+            }
+            foreach (ISolutionSimilarityCalculator op in Operators.OfType<ISolutionSimilarityCalculator>())
+            {
+                op.SolutionVariableName = SolutionCreator.PermutationParameter.ActualName;
+                op.QualityVariableName = Evaluator.QualityParameter.ActualName;
+            }
+        }
+        #endregion
+
+        private void UpdateMoveEvaluators()
+        {
+            Operators.RemoveAll(x => x is ISingleObjectiveMoveEvaluator);
+            foreach (var op in ApplicationManager.Manager.GetInstances<ISingleObjectiveMoveEvaluator>())
+                Operators.Add(op);
+
+            ParameterizeOperators();
+            OnOperatorsChanged();
+        }
+
+        private void ParameterizeSolutionCreator()
+        {
+            SolutionCreator.LengthParameter.Value = new IntValue(JobMatrix.Columns); //Jobs
+
+            SolutionCreator.LengthParameter.Hidden = SolutionCreator.LengthParameter.Value != null;
+            SolutionCreator.PermutationTypeParameter.Value = new PermutationType(PermutationTypes.RelativeUndirected);
+            SolutionCreator.PermutationTypeParameter.Hidden = true;
+        }
+        private void ParameterizeEvaluator()
+        {
+            if (Evaluator is AwesomeMakeSpanEvaluator)
+            {
+                IMakespanEvaluator evaluator = (IMakespanEvaluator)Evaluator;
+                evaluator.PermutationParameter.ActualName = SolutionCreator.PermutationParameter.ActualName;
+                evaluator.PermutationParameter.Hidden = true;
+            }
+        }
+    }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs	(revision 15521)
@@ -0,0 +1,21 @@
+﻿using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Plugin("HeuristicLab.Problems.PFSP", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.PFSP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsPFSPPlugin : PluginBase { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Plugin.cs.frame	(revision 15521)
@@ -0,0 +1,42 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.PFSP
+{
+  [Plugin("HeuristicLab.Problems.PFSP", "3.3.14.14965")]
+  [PluginFile("HeuristicLab.Problems.PFSP-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.IntegerVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.PermutationEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.ScheduleEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Instances", "3.3")]
+  public class HeuristicLabProblemsPFSPPlugin : PluginBase { }
+}
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs	(revision 15521)
@@ -0,0 +1,36 @@
+﻿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.PFSP")]
+[assembly: AssemblyDescription("HeuristicLab Permutation Flowshop Scheduling Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("51650b00-4ca6-41ff-8cb6-165fcacc3b51")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.14965")]
+
Index: /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
+++ /branches/2864_PermutationProblems/HeuristicLab.Problems.PFSP/3.3/Properties/AssemblyInfo.cs.frame	(revision 15521)
@@ -0,0 +1,57 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.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.PFSP")]
+[assembly: AssemblyDescription("HeuristicLab Permutation Flowshop Scheduling Problem classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2016 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("51650b00-4ca6-41ff-8cb6-165fcacc3b51")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.14.$WCREV$")]
+
Index: /branches/2864_PermutationProblems/PermutationProblems.sln
===================================================================
--- /branches/2864_PermutationProblems/PermutationProblems.sln	(revision 15521)
+++ /branches/2864_PermutationProblems/PermutationProblems.sln	(revision 15521)
@@ -0,0 +1,79 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27004.2010
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Instances.PFSP-3.3", "HeuristicLab.Problems.Instances.PFSP\3.3\HeuristicLab.Problems.Instances.PFSP-3.3.csproj", "{9412AA5F-D663-4AF4-B58B-D90FABB343BF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.LinearOrdering-3.3", "HeuristicLab.Problems.LinearOrdering\3.3\HeuristicLab.Problems.LinearOrdering-3.3.csproj", "{050358B8-2DBA-4224-8AA6-5EB03D86999A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.PFSP-3.3", "HeuristicLab.Problems.PFSP\3.3\HeuristicLab.Problems.PFSP-3.3.csproj", "{51650B00-4CA6-41FF-8CB6-165FCACC3B51}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.PFSP.Views-3.3", "HeuristicLab.Problems.PFSP.Views\3.3\HeuristicLab.Problems.PFSP.Views-3.3.csproj", "{F53AECD6-061C-4A62-B2DB-51E36EECBB79}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|x64.Build.0 = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Debug|x86.Build.0 = Debug|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|x64.ActiveCfg = Release|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|x64.Build.0 = Release|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|x86.ActiveCfg = Release|Any CPU
+		{9412AA5F-D663-4AF4-B58B-D90FABB343BF}.Release|x86.Build.0 = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|x64.Build.0 = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Debug|x86.Build.0 = Debug|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|x64.ActiveCfg = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|x64.Build.0 = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|x86.ActiveCfg = Release|Any CPU
+		{050358B8-2DBA-4224-8AA6-5EB03D86999A}.Release|x86.Build.0 = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|x64.Build.0 = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Debug|x86.Build.0 = Debug|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|Any CPU.Build.0 = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|x64.ActiveCfg = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|x64.Build.0 = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|x86.ActiveCfg = Release|Any CPU
+		{51650B00-4CA6-41FF-8CB6-165FCACC3B51}.Release|x86.Build.0 = Release|Any CPU
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|x64.ActiveCfg = Debug|x64
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|x64.Build.0 = Debug|x64
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|x86.ActiveCfg = Debug|x86
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Debug|x86.Build.0 = Debug|x86
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|x64.ActiveCfg = Release|x64
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|x64.Build.0 = Release|x64
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|x86.ActiveCfg = Release|x86
+		{F53AECD6-061C-4A62-B2DB-51E36EECBB79}.Release|x86.Build.0 = Release|x86
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {9CE488E1-A622-4386-862D-26EEDD2381E2}
+	EndGlobalSection
+EndGlobal
Index: /branches/2864_PermutationProblems/PreBuildEvent.cmd
===================================================================
--- /branches/2864_PermutationProblems/PreBuildEvent.cmd	(revision 15521)
+++ /branches/2864_PermutationProblems/PreBuildEvent.cmd	(revision 15521)
@@ -0,0 +1,11 @@
+IF EXIST "%ProjectDir%\Properties\AssemblyInfo.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Properties\AssemblyInfo.cs.frame" "%ProjectDir%\Properties\AssemblyInfo.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+IF EXIST "%ProjectDir%\Plugin.cs.frame" SubWCRev "%ProjectDir%\" "%ProjectDir%\Plugin.cs.frame" "%ProjectDir%\Plugin.cs"
+IF %ERRORLEVEL% NEQ 0 GOTO Error_Handling
+GOTO Done
+
+:Error_Handling
+ECHO There was an error while running subwcrev. Please verify that the *.cs.frame files have been correctly converted to *.cs files, otherwise HeuristicLab won't build. 
+exit 0
+
+:Done
