Index: stable/HeuristicLab 3.3.sln
===================================================================
--- stable/HeuristicLab 3.3.sln	(revision 11995)
+++ stable/HeuristicLab 3.3.sln	(revision 12005)
@@ -37,4 +37,5 @@
 		{14AB8D24-25BC-400C-A846-4627AA945192} = {14AB8D24-25BC-400C-A846-4627AA945192}
 		{C36BD924-A541-4A00-AFA8-41701378DDC5} = {C36BD924-A541-4A00-AFA8-41701378DDC5}
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D} = {8A0B2A2B-47A7-410D-97A0-4296293BB00D}
 		{D58A232D-04BA-4186-B73E-0EC86FD31ABE} = {D58A232D-04BA-4186-B73E-0EC86FD31ABE}
 		{6A5F8C2D-B0C3-4B36-BC20-9B1A91EE6DB6} = {6A5F8C2D-B0C3-4B36-BC20-9B1A91EE6DB6}
@@ -52,4 +53,5 @@
 		{49F28045-7B5F-411B-8D59-16C846FA26E0} = {49F28045-7B5F-411B-8D59-16C846FA26E0}
 		{1256B945-EEA9-4BE4-9880-76B5B113F089} = {1256B945-EEA9-4BE4-9880-76B5B113F089}
+		{9319C447-8183-4DBC-8145-0E3CF98084CC} = {9319C447-8183-4DBC-8145-0E3CF98084CC}
 		{0C39A349-1979-419A-89BD-E4E2F26BD287} = {0C39A349-1979-419A-89BD-E4E2F26BD287}
 		{C49CB749-8B24-4628-8003-E86475749410} = {C49CB749-8B24-4628-8003-E86475749410}
@@ -84,4 +86,5 @@
 		{7FC70D74-1813-48B7-9CE5-0BD913457579} = {7FC70D74-1813-48B7-9CE5-0BD913457579}
 		{20831A74-D18F-42D9-A667-1CE3AF53DF93} = {20831A74-D18F-42D9-A667-1CE3AF53DF93}
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E} = {F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}
 		{76945D76-CA61-4147-9DC2-0ACDCDDF87F9} = {76945D76-CA61-4147-9DC2-0ACDCDDF87F9}
 		{2E782078-FA81-4B70-B56F-74CE38DAC6C8} = {2E782078-FA81-4B70-B56F-74CE38DAC6C8}
@@ -94,4 +97,5 @@
 		{D767C38D-8014-46B0-9A32-03A3AECCE34A} = {D767C38D-8014-46B0-9A32-03A3AECCE34A}
 		{B1BA398F-953F-4C3A-B07B-1E5E17A27DD9} = {B1BA398F-953F-4C3A-B07B-1E5E17A27DD9}
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F} = {6F023B90-2091-40A9-8AC0-B0338DFF8E5F}
 		{FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2} = {FE856595-64CD-46DA-9CD2-FFF3E6B0D4F2}
 		{9A04599C-D608-4240-8DA6-D41F51C515A3} = {9A04599C-D608-4240-8DA6-D41F51C515A3}
@@ -105,4 +109,5 @@
 		{068C70A7-8CAF-4AB6-8721-4564D62292BC} = {068C70A7-8CAF-4AB6-8721-4564D62292BC}
 		{3083C7AA-5AF4-4C75-BA19-B69B86E2F66A} = {3083C7AA-5AF4-4C75-BA19-B69B86E2F66A}
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3} = {64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}
 		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8} = {5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}
 		{847A8DAE-DB95-4CEE-B48B-EFEE4531D611} = {847A8DAE-DB95-4CEE-B48B-EFEE4531D611}
@@ -136,4 +141,5 @@
 		{88B9B0E3-344E-4196-82A3-0F9732506FE8} = {88B9B0E3-344E-4196-82A3-0F9732506FE8}
 		{AE5B1CE5-9862-4D6F-A700-D72CD9AEA295} = {AE5B1CE5-9862-4D6F-A700-D72CD9AEA295}
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F} = {FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}
 		{C9CF6AE8-4637-4A75-9141-042F479B5D50} = {C9CF6AE8-4637-4A75-9141-042F479B5D50}
 		{BF1E4DF4-A4CC-451F-9D50-303F405E265E} = {BF1E4DF4-A4CC-451F-9D50-303F405E265E}
@@ -142,4 +148,5 @@
 		{BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937} = {BBAB9DF5-5EF3-4BA8-ADE9-B36E82114937}
 		{6AE0E1F5-D3FF-43A3-90E1-2435E7493FB5} = {6AE0E1F5-D3FF-43A3-90E1-2435E7493FB5}
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9} = {EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}
 		{E4EE5AFB-D552-447B-8A16-6CBE7938AF32} = {E4EE5AFB-D552-447B-8A16-6CBE7938AF32}
 	EndProjectSection
@@ -407,4 +414,18 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.CodeEditor-3.4", "HeuristicLab.CodeEditor\3.4\HeuristicLab.CodeEditor-3.4.csproj", "{C38691AE-ECB4-489A-A05D-B035554E0168}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3", "HeuristicLab.Algorithms.ParameterlessPopulationPyramid\3.3\HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj", "{9319C447-8183-4DBC-8145-0E3CF98084CC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Binary-3.3", "HeuristicLab.Problems.Binary\3.3\HeuristicLab.Problems.Binary-3.3.csproj", "{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Programmable-3.3", "HeuristicLab.Problems.Programmable\3.3\HeuristicLab.Problems.Programmable-3.3.csproj", "{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.Programmable.Views-3.3", "HeuristicLab.Problems.Programmable.Views\3.3\HeuristicLab.Problems.Programmable.Views-3.3.csproj", "{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation-3.4", "HeuristicLab.Problems.ExternalEvaluation\3.4\HeuristicLab.Problems.ExternalEvaluation-3.4.csproj", "{8A0B2A2B-47A7-410D-97A0-4296293BB00D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation.GP-3.5", "HeuristicLab.Problems.ExternalEvaluation.GP\3.5\HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj", "{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Problems.ExternalEvaluation.Views-3.4", "HeuristicLab.Problems.ExternalEvaluation.Views\3.4\HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj", "{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}"
 EndProject
 Global
@@ -1948,6 +1969,8 @@
 		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|Any CPU.Build.0 = Release|Any CPU
-		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.ActiveCfg = Release|Any CPU
-		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.ActiveCfg = Release|Any CPU
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.ActiveCfg = Release|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x64.Build.0 = Release|x64
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.ActiveCfg = Release|x86
+		{3FC7515E-D8A0-41FE-8CFA-50E3ADA61A1E}.Release|x86.Build.0 = Release|x86
 		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{052881B5-4D5D-41C5-9555-FECA01E0BAC8}.Debug|Any CPU.Build.0 = Debug|Any CPU
@@ -1974,7 +1997,98 @@
 		{C38691AE-ECB4-489A-A05D-B035554E0168}.Release|x86.ActiveCfg = Release|x86
 		{C38691AE-ECB4-489A-A05D-B035554E0168}.Release|x86.Build.0 = Release|x86
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|x64.ActiveCfg = Debug|x64
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|x64.Build.0 = Debug|x64
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|x86.ActiveCfg = Debug|x86
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Debug|x86.Build.0 = Debug|x86
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|x64.ActiveCfg = Release|x64
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|x64.Build.0 = Release|x64
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|x86.ActiveCfg = Release|x86
+		{9319C447-8183-4DBC-8145-0E3CF98084CC}.Release|x86.Build.0 = Release|x86
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|x64.ActiveCfg = Debug|x64
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|x64.Build.0 = Debug|x64
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|x86.ActiveCfg = Debug|x86
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Debug|x86.Build.0 = Debug|x86
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|x64.ActiveCfg = Release|x64
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|x64.Build.0 = Release|x64
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|x86.ActiveCfg = Release|x86
+		{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}.Release|x86.Build.0 = Release|x86
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|x64.ActiveCfg = Debug|x64
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|x64.Build.0 = Debug|x64
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|x86.ActiveCfg = Debug|x86
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Debug|x86.Build.0 = Debug|x86
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|x64.ActiveCfg = Release|x64
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|x64.Build.0 = Release|x64
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|x86.ActiveCfg = Release|x86
+		{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}.Release|x86.Build.0 = Release|x86
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|x64.ActiveCfg = Debug|x64
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|x64.Build.0 = Debug|x64
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|x86.ActiveCfg = Debug|x86
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Debug|x86.Build.0 = Debug|x86
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|x64.ActiveCfg = Release|x64
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|x64.Build.0 = Release|x64
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|x86.ActiveCfg = Release|x86
+		{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}.Release|x86.Build.0 = Release|x86
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|x64.ActiveCfg = Debug|x64
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|x64.Build.0 = Debug|x64
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|x86.ActiveCfg = Debug|x86
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Debug|x86.Build.0 = Debug|x86
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|x64.ActiveCfg = Release|x64
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|x64.Build.0 = Release|x64
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|x86.ActiveCfg = Release|x86
+		{8A0B2A2B-47A7-410D-97A0-4296293BB00D}.Release|x86.Build.0 = Release|x86
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|x64.ActiveCfg = Debug|x64
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|x64.Build.0 = Debug|x64
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|x86.ActiveCfg = Debug|x86
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Debug|x86.Build.0 = Debug|x86
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|x64.ActiveCfg = Release|x64
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|x64.Build.0 = Release|x64
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|x86.ActiveCfg = Release|x86
+		{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}.Release|x86.Build.0 = Release|x86
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|x64.ActiveCfg = Debug|x64
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|x64.Build.0 = Debug|x64
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|x86.ActiveCfg = Debug|x86
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Debug|x86.Build.0 = Debug|x86
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|x64.ActiveCfg = Release|x64
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|x64.Build.0 = Release|x64
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|x86.ActiveCfg = Release|x86
+		{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{F62BCD22-FB83-4444-9401-8031C2487A86} = {7EB6A587-BD45-40F2-BB15-4A69677A326C}
+		{4FE983A1-AAF8-4977-B9E2-52B3224510CB} = {7EB6A587-BD45-40F2-BB15-4A69677A326C}
+		{25735DB4-8E54-4A2C-83E3-A60C76565E55} = {7EB6A587-BD45-40F2-BB15-4A69677A326C}
+		{3081630C-9521-47D7-8075-1777C12F212C} = {7EB6A587-BD45-40F2-BB15-4A69677A326C}
+		{B7A64A60-B538-479F-9C47-A3180C458F6C} = {7EB6A587-BD45-40F2-BB15-4A69677A326C}
+	EndGlobalSection
 EndGlobal
Index: stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAAnalyzer.cs	(revision 12005)
@@ -35,5 +35,5 @@
   [Item("CMAAnalyzer", "Analyzes the development of strategy parameters and visualizes the performance of CMA-ES.")]
   [StorableClass]
-  public sealed class CMAAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public sealed class CMAAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
 
     public bool EnabledByDefault {
Index: stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAOperators/CMAUpdater.cs
===================================================================
--- stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAOperators/CMAUpdater.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/CMAOperators/CMAUpdater.cs	(revision 12005)
@@ -34,5 +34,5 @@
   [Item("CMAUpdater", "Updates the covariance matrix and strategy parameters of CMA-ES.")]
   [StorableClass]
-  public class CMAUpdater : SingleSuccessorOperator, ICMAUpdater, IIterationBasedOperator {
+  public class CMAUpdater : SingleSuccessorOperator, ICMAUpdater, IIterationBasedOperator, ISingleObjectiveOperator {
 
     public Type CMAType {
Index: stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/Terminator.cs
===================================================================
--- stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/Terminator.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.CMAEvolutionStrategy/3.3/Terminator.cs	(revision 12005)
@@ -33,5 +33,5 @@
   [Item("Terminator", "Decides if the algorithm should terminate or not.")]
   [StorableClass]
-  public class Terminator : Operator, IIterationBasedOperator {
+  public class Terminator : Operator, IIterationBasedOperator, ISingleObjectiveOperator {
 
     protected OperatorParameter ContinueParameter {
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 11995)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 12005)
@@ -286,5 +286,5 @@
     <ProjectReference Include="..\..\HeuristicLab.Algorithms.GradientDescent\3.3\HeuristicLab.Algorithms.GradientDescent-3.3.csproj">
       <Project>{1256B945-EEA9-4BE4-9880-76B5B113F089}</Project>
-      <Name>HeuristicLab.Algorithms.GradientDescent</Name>
+      <Name>HeuristicLab.Algorithms.GradientDescent-3.3</Name>
       <Private>False</Private>
     </ProjectReference>
Index: stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaGradientCalculator.cs
===================================================================
--- stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaGradientCalculator.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.DataAnalysis/3.4/Nca/NcaGradientCalculator.cs	(revision 12005)
@@ -28,4 +28,5 @@
 using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -35,5 +36,5 @@
   [Item("NcaGradientCalculator", "Calculates the quality and gradient of a certain NCA matrix.")]
   [StorableClass]
-  public class NcaGradientCalculator : SingleSuccessorOperator {
+  public class NcaGradientCalculator : SingleSuccessorOperator, ISingleObjectiveOperator {
 
     #region Parameter Properties
Index: stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs
===================================================================
--- stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.LocalSearch/3.3/LocalSearchImprovementOperator.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("LocalSearchImprovementOperator", "A local search improvement operator.")]
   [StorableClass]
-  public sealed class LocalSearchImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator {
+  public sealed class LocalSearchImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator, ISingleObjectiveOperator {
     #region IGenericLocalImprovementOperator Properties
     public Type ProblemType { get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } }
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EnumerableBoolEqualityComparer.cs	(revision 12005)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 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;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  public class EnumerableBoolEqualityComparer : IEqualityComparer<IEnumerable<bool>> {
+    public bool Equals(IEnumerable<bool> first, IEnumerable<bool> second) {
+      return first.SequenceEqual(second);
+    }
+    public int GetHashCode(IEnumerable<bool> obj) {
+      int hash = 0;
+      int word = 1;
+      foreach (bool bit in obj) {
+        // load bits into an integer
+        word <<= 1;
+        word |= Convert.ToInt32(bit);
+        // only happens when the leading 1 reaches the sign bit
+        if (word < 0) {
+          // combine word into the hash
+          hash ^= word;
+          word = 1;
+        }
+      }
+      // combine in any remaining content
+      if (word > 1) {
+        hash ^= word;
+      }
+      return hash;
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/EvaluationTracker.cs	(revision 12005)
@@ -0,0 +1,118 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ *
+ * 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.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  internal sealed class EvaluationTracker : BinaryProblem {
+    private readonly BinaryProblem problem;
+
+    private int maxEvaluations;
+
+    #region Properties
+    public double BestQuality {
+      get;
+      private set;
+    }
+
+    public int Evaluations {
+      get;
+      private set;
+    }
+
+    public int BestFoundOnEvaluation {
+      get;
+      private set;
+    }
+
+    public BinaryVector BestSolution {
+      get;
+      private set;
+    }
+    #endregion
+
+    [StorableConstructor]
+    private EvaluationTracker(bool deserializing) : base(deserializing) { }
+    private EvaluationTracker(EvaluationTracker original, Cloner cloner)
+      : base(original, cloner) {
+      problem = cloner.Clone(original.problem);
+      maxEvaluations = original.maxEvaluations;
+      BestQuality = original.BestQuality;
+      Evaluations = original.Evaluations;
+      BestFoundOnEvaluation = original.BestFoundOnEvaluation;
+      BestSolution = cloner.Clone(BestSolution);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationTracker(this, cloner);
+    }
+    public EvaluationTracker(BinaryProblem problem, int maxEvaluations) {
+      this.problem = problem;
+      this.maxEvaluations = maxEvaluations;
+      BestSolution = new BinaryVector(Length);
+      BestQuality = double.NaN;
+      Evaluations = 0;
+      BestFoundOnEvaluation = 0;
+
+      if (Parameters.ContainsKey("Maximization")) Parameters.Remove("Maximization");
+      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", (BoolValue)new BoolValue(Maximization).AsReadOnly()) { Hidden = true });
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      if (Evaluations >= maxEvaluations) throw new OperationCanceledException("Maximum Evaluation Limit Reached");
+      Evaluations++;
+      double fitness = problem.Evaluate(vector, random);
+      if (double.IsNaN(BestQuality) || problem.IsBetter(fitness, BestQuality)) {
+        BestQuality = fitness;
+        BestSolution = (BinaryVector)vector.Clone();
+        BestFoundOnEvaluation = Evaluations;
+      }
+      return fitness;
+    }
+
+    public override int Length {
+      get { return problem.Length; }
+      set { problem.Length = value; }
+    }
+
+    public override bool Maximization {
+      get {
+        if (problem == null) return false;
+        return problem.Maximization;
+      }
+    }
+
+    public bool IsBetter(double quality, double bestQuality) {
+      return problem.IsBetter(quality, bestQuality);
+    }
+
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.csproj	(revision 12005)
@@ -0,0 +1,186 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{9319C447-8183-4DBC-8145-0E3CF98084CC}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Algorithms.ParameterlessPopulationPyramid</RootNamespace>
+    <AssemblyName>HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </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>
+  </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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="EnumerableBoolEqualityComparer.cs" />
+    <Compile Include="EvaluationTracker.cs" />
+    <Compile Include="LinkageCrossover.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="HillClimber.cs" />
+    <Compile Include="LinkageTree.cs" />
+    <Compile Include="ParameterlessPopulationPyramid.cs" />
+    <Compile Include="Population.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.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.BinaryVectorEncoding\3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj">
+      <Project>{66d249c3-a01d-42a8-82a2-919bc8ec3d83}</Project>
+      <Name>HeuristicLab.Encodings.BinaryVectorEncoding-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.Binary\3.3\HeuristicLab.Problems.Binary-3.3.csproj">
+      <Project>{fc627be5-0f93-47d8-bd2e-530ea2b8aa5f}</Project>
+      <Name>HeuristicLab.Problems.Binary-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
+      <Project>{f4539fb6-4708-40c9-be64-0a1390aea197}</Project>
+      <Name>HeuristicLab.Random-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">
+      set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+      set ProjectDir=$(ProjectDir)
+      set SolutionDir=$(SolutionDir)
+      set Outdir=$(Outdir)
+
+      call PreBuildEvent.cmd
+    </PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+      export ProjectDir=$(ProjectDir)
+      export SolutionDir=$(SolutionDir)
+
+      $SolutionDir/PreBuildEvent.sh
+    </PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/HillClimber.cs	(revision 12005)
@@ -0,0 +1,120 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ *
+ * 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 System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+using HeuristicLab.Random;
+
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  [Item("Hill Climber", "Binary Hill Climber.")]
+  [StorableClass]
+  [Creatable("Algorithms")]
+  public class HillClimber : BasicAlgorithm {
+    [Storable]
+    private IRandom random;
+
+    private const string IterationsParameterName = "Iterations";
+
+    public override Type ProblemType {
+      get { return typeof(BinaryProblem); }
+    }
+    public new BinaryProblem Problem {
+      get { return (BinaryProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+
+    public IFixedValueParameter<IntValue> IterationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[IterationsParameterName]; }
+    }
+
+    public int Iterations {
+      get { return IterationsParameter.Value.Value; }
+      set { IterationsParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    protected HillClimber(bool deserializing) : base(deserializing) { }
+    protected HillClimber(HillClimber original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HillClimber(this, cloner);
+    }
+
+    public HillClimber()
+      : base() {
+      random = new MersenneTwister();
+      Parameters.Add(new FixedValueParameter<IntValue>(IterationsParameterName, "", new IntValue(100)));
+    }
+    protected override void Run(CancellationToken cancellationToken) {
+      var BestQuality = new DoubleValue(double.NaN);
+      Results.Add(new Result("Best quality", BestQuality));
+      for (int iteration = 0; iteration < Iterations; iteration++) {
+        var solution = new BinaryVector(Problem.Length);
+        for (int i = 0; i < solution.Length; i++) {
+          solution[i] = random.Next(2) == 1;
+        }
+
+        var fitness = Problem.Evaluate(solution, random);
+
+        fitness = ImproveToLocalOptimum(Problem, solution, fitness, random);
+        if (double.IsNaN(BestQuality.Value) || Problem.IsBetter(fitness, BestQuality.Value)) {
+          BestQuality.Value = fitness;
+        }
+      }
+    }
+    // In the GECCO paper, Section 2.1
+    public static double ImproveToLocalOptimum(BinaryProblem problem, BinaryVector solution, double fitness, IRandom rand) {
+      var tried = new HashSet<int>();
+      do {
+        var options = Enumerable.Range(0, solution.Length).Shuffle(rand);
+        foreach (var option in options) {
+          if (tried.Contains(option)) continue;
+          solution[option] = !solution[option];
+          double newFitness = problem.Evaluate(solution, rand);
+          if (problem.IsBetter(newFitness, fitness)) {
+            fitness = newFitness;
+            tried.Clear();
+          } else {
+            solution[option] = !solution[option];
+          }
+          tried.Add(option);
+        }
+      } while (tried.Count != solution.Length);
+      return fitness;
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageCrossover.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Problems.Binary;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  public static class LinkageCrossover {
+    // In the GECCO paper, Figure 3
+    public static double ImproveUsingTree(LinkageTree tree, IList<BinaryVector> donors, BinaryVector solution, double fitness, BinaryProblem problem, IRandom rand) {
+      var options = Enumerable.Range(0, donors.Count).ToArray();
+      foreach (var cluster in tree.Clusters) {
+        // Find a donor which has at least one gene value different
+        // from the current solution for this cluster of genes
+        bool donorFound = false;
+        foreach (var donorIndex in options.ShuffleList(rand)) {
+          // Attempt the donation
+          fitness = Donate(solution, fitness, donors[donorIndex], cluster, problem, rand, out donorFound);
+          if (donorFound) break;
+        }
+      }
+      return fitness;
+    }
+
+    private static double Donate(BinaryVector solution, double fitness, BinaryVector source, IEnumerable<int> cluster, BinaryProblem problem, IRandom rand, out bool changed) {
+      // keep track of which bits flipped to make the donation
+      List<int> flipped = new List<int>();
+      foreach (var index in cluster) {
+        if (solution[index] != source[index]) {
+          flipped.Add(index);
+          solution[index] = !solution[index];
+        }
+      }
+      changed = flipped.Count > 0;
+      if (changed) {
+        double newFitness = problem.Evaluate(solution, rand);
+        // if the original is strictly better, revert the change
+        if (problem.IsBetter(fitness, newFitness)) {
+          foreach (var index in flipped) {
+            solution[index] = !solution[index];
+          }
+        } else {
+          // new solution is no worse than original, keep change to solution
+          fitness = newFitness;
+        }
+      }
+      return fitness;
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/LinkageTree.cs	(revision 12005)
@@ -0,0 +1,251 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ *
+ * 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.BinaryVectorEncoding;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  public class LinkageTree {
+    private readonly int[][][] occurances;
+    private readonly List<int>[] clusters;
+    private List<int> clusterOrdering;
+    private readonly int length;
+    private readonly IRandom rand;
+    private bool rebuildRequired = false;
+
+    public LinkageTree(int length, IRandom rand) {
+      this.length = length;
+      this.rand = rand;
+      occurances = new int[length][][];
+
+      // Create a lower triangular matrix without the diagonal
+      for (int i = 1; i < length; i++) {
+        occurances[i] = new int[i][];
+        for (int j = 0; j < i; j++) {
+          occurances[i][j] = new int[4];
+        }
+      }
+      clusters = new List<int>[2 * length - 1];
+      for (int i = 0; i < clusters.Length; i++) {
+        clusters[i] = new List<int>();
+      }
+      clusterOrdering = new List<int>();
+
+      // first "length" clusters just contain a single gene
+      for (int i = 0; i < length; i++) {
+        clusters[i].Add(i);
+      }
+    }
+
+    public void Add(BinaryVector solution) {
+      if (solution.Length != length) throw new ArgumentException("The individual has not the correct length.");
+      for (int i = 1; i < solution.Length; i++) {
+        for (int j = 0; j < i; j++) {
+          // Updates the entry of the 4 long array based on the two bits
+
+          var pattern = (Convert.ToByte(solution[j]) << 1) + Convert.ToByte(solution[i]);
+          occurances[i][j][pattern]++;
+        }
+      }
+      rebuildRequired = true;
+    }
+
+    // While "total" always has an integer value, it is a double to reduce
+    // how often type casts are needed to prevent integer divison
+    // In the GECCO paper, calculates Equation 2
+    private static double NegativeEntropy(int[] counts, double total) {
+      double sum = 0;
+      for (int i = 0; i < counts.Length; i++) {
+        if (counts[i] != 0) {
+          sum += ((counts[i] / total) * Math.Log(counts[i] / total));
+        }
+      }
+      return sum;
+    }
+
+    // Uses the frequency table to calcuate the entropy distance between two indices.
+    // In the GECCO paper, calculates Equation 1
+    private int[] bits = new int[4];
+    private double EntropyDistance(int i, int j) {
+      // This ensures you are using the lower triangular part of "occurances"
+      if (i < j) {
+        int temp = i;
+        i = j;
+        j = temp;
+      }
+      var entry = occurances[i][j];
+      // extracts the occurrences of the individual bits
+      bits[0] = entry[0] + entry[2];  // i zero
+      bits[1] = entry[1] + entry[3];  // i one
+      bits[2] = entry[0] + entry[1];  // j zero
+      bits[3] = entry[2] + entry[3];  // j one
+      double total = bits[0] + bits[1];
+      // entropy of the two bits on their own
+      double separate = NegativeEntropy(bits, total);
+      // entropy of the two bits as a single unit
+      double together = NegativeEntropy(entry, total);
+      // If together there is 0 entropy, the distance is zero
+      if (together.IsAlmost(0)) {
+        return 0.0;
+      }
+      return 2 - (separate / together);
+    }
+
+
+
+    // Performs O(N^2) clustering based on the method described in:
+    // "Optimal implementations of UPGMA and other common clustering algorithms"
+    // by I. Gronau and S. Moran
+    // In the GECCO paper, Figure 2 is a simplified version of this algorithm.
+    private double[][] distances;
+    private void Rebuild() {
+      if (distances == null) {
+        distances = new double[clusters.Length * 2 - 1][];
+        for (int i = 0; i < distances.Length; i++)
+          distances[i] = new double[clusters.Length * 2 - 1];
+      }
+
+
+      // Keep track of which clusters have not been merged
+      var topLevel = new List<int>(length);
+      for (int i = 0; i < length; i++)
+        topLevel.Add(i);
+
+      bool[] useful = new bool[clusters.Length];
+      for (int i = 0; i < useful.Length; i++)
+        useful[i] = true;
+
+      // Store the distances between all clusters
+      for (int i = 1; i < length; i++) {
+        for (int j = 0; j < i; j++) {
+          distances[i][j] = EntropyDistance(clusters[i][0], clusters[j][0]);
+          // make it symmetric
+          distances[j][i] = distances[i][j];
+        }
+      }
+      // Each iteration we add some amount to the path, and remove the last
+      // two elements.  This keeps track of how much of usable is in the path.
+      int end_of_path = 0;
+
+      // build all clusters of size greater than 1
+      for (int index = length; index < clusters.Length; index++) {
+        // Shuffle everything not yet in the path
+        topLevel.ShuffleInPlace(rand, end_of_path, topLevel.Count - 1);
+
+        // if nothing in the path, just add a random usable node
+        if (end_of_path == 0) {
+          end_of_path = 1;
+        }
+        while (end_of_path < topLevel.Count) {
+          // last node in the path
+          int final = topLevel[end_of_path - 1];
+
+          // best_index stores the location of the best thing in the top level
+          int best_index = end_of_path;
+          double min_dist = distances[final][topLevel[best_index]];
+          // check all options which might be closer to "final" than "topLevel[best_index]"
+          for (int option = end_of_path + 1; option < topLevel.Count; option++) {
+            if (distances[final][topLevel[option]] < min_dist) {
+              min_dist = distances[final][topLevel[option]];
+              best_index = option;
+            }
+          }
+          // If the current last two in the path are minimally distant
+          if (end_of_path > 1 && min_dist >= distances[final][topLevel[end_of_path - 2]]) {
+            break;
+          }
+
+          // move the best to the end of the path
+          topLevel.Swap(end_of_path, best_index);
+          end_of_path++;
+        }
+        // Last two elements in the path are the clusters to join
+        int first = topLevel[end_of_path - 2];
+        int second = topLevel[end_of_path - 1];
+
+        // Only keep a cluster if the distance between the joining clusters is > zero
+        bool keep = !distances[first][second].IsAlmost(0.0);
+        useful[first] = keep;
+        useful[second] = keep;
+
+        // create the new cluster
+        clusters[index] = clusters[first].Concat(clusters[second]).ToList();
+        // Calculate distances from all clusters to the newly created cluster
+        int i = 0;
+        int end = topLevel.Count - 1;
+        while (i <= end) {
+          int x = topLevel[i];
+          // Moves 'first' and 'second' to after "end" in topLevel
+          if (x == first || x == second) {
+            topLevel.Swap(i, end);
+            end--;
+            continue;
+          }
+          // Use the previous distances to calculate the joined distance
+          double first_distance = distances[first][x];
+          first_distance *= clusters[first].Count;
+          double second_distance = distances[second][x];
+          second_distance *= clusters[second].Count;
+          distances[x][index] = ((first_distance + second_distance)
+              / (clusters[first].Count + clusters[second].Count));
+          // make it symmetric
+          distances[index][x] = distances[x][index];
+          i++;
+        }
+
+        // Remove first and second from the path
+        end_of_path -= 2;
+        topLevel.RemoveAt(topLevel.Count - 1);
+        topLevel[topLevel.Count - 1] = index;
+      }
+      // Extract the useful clusters
+      clusterOrdering.Clear();
+      // Add all useful clusters. The last one is never useful.
+      for (int i = 0; i < useful.Length - 1; i++) {
+        if (useful[i]) clusterOrdering.Add(i);
+      }
+
+      // Shuffle before sort to ensure ties are broken randomly
+      clusterOrdering.ShuffleInPlace(rand);
+      clusterOrdering = clusterOrdering.OrderBy(i => clusters[i].Count).ToList();
+    }
+
+    public IEnumerable<List<int>> Clusters {
+      get {
+        // Just in time rebuilding
+        if (rebuildRequired) Rebuild();
+        foreach (var index in clusterOrdering) {
+          // Send out the clusters in the desired order
+          yield return clusters[index];
+        }
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/ParameterlessPopulationPyramid.cs	(revision 12005)
@@ -0,0 +1,264 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ * 
+ * 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.Threading;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.Binary;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  [Item("Parameter-less Population Pyramid", "Binary value optimization algorithm which requires no configuration. B. W. Goldman and W. F. Punch, Parameter-less Population Pyramid, GECCO, pp. 785–792, 2014")]
+  [StorableClass]
+  [Creatable("Algorithms")]
+  public class ParameterlessPopulationPyramid : BasicAlgorithm {
+    public override Type ProblemType {
+      get { return typeof(BinaryProblem); }
+    }
+    public new BinaryProblem Problem {
+      get { return (BinaryProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+
+    private readonly IRandom random = new MersenneTwister();
+    private List<Population> pyramid;
+    private EvaluationTracker tracker;
+
+    // Tracks all solutions in Pyramid for quick membership checks
+    private HashSet<BinaryVector> seen = new HashSet<BinaryVector>(new EnumerableBoolEqualityComparer());
+
+    #region ParameterNames
+    private const string MaximumIterationsParameterName = "Maximum Iterations";
+    private const string MaximumEvaluationsParameterName = "Maximum Evaluations";
+    private const string MaximumRuntimeParameterName = "Maximum Runtime";
+    private const string SeedParameterName = "Seed";
+    private const string SetSeedRandomlyParameterName = "SetSeedRandomly";
+    #endregion
+
+    #region ParameterProperties
+    public IFixedValueParameter<IntValue> MaximumIterationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[MaximumIterationsParameterName]; }
+    }
+    public IFixedValueParameter<IntValue> MaximumEvaluationsParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[MaximumEvaluationsParameterName]; }
+    }
+    public IFixedValueParameter<IntValue> MaximumRuntimeParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[MaximumRuntimeParameterName]; }
+    }
+    public IFixedValueParameter<IntValue> SeedParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[SeedParameterName]; }
+    }
+    public FixedValueParameter<BoolValue> SetSeedRandomlyParameter {
+      get { return (FixedValueParameter<BoolValue>)Parameters[SetSeedRandomlyParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    public int MaximumIterations {
+      get { return MaximumIterationsParameter.Value.Value; }
+      set { MaximumIterationsParameter.Value.Value = value; }
+    }
+    public int MaximumEvaluations {
+      get { return MaximumEvaluationsParameter.Value.Value; }
+      set { MaximumEvaluationsParameter.Value.Value = value; }
+    }
+    public int MaximumRuntime {
+      get { return MaximumRuntimeParameter.Value.Value; }
+      set { MaximumRuntimeParameter.Value.Value = value; }
+    }
+    public int Seed {
+      get { return SeedParameter.Value.Value; }
+      set { SeedParameter.Value.Value = value; }
+    }
+    public bool SetSeedRandomly {
+      get { return SetSeedRandomlyParameter.Value.Value; }
+      set { SetSeedRandomlyParameter.Value.Value = value; }
+    }
+    #endregion
+
+    #region ResultsProperties
+    private double ResultsBestQuality {
+      get { return ((DoubleValue)Results["Best Quality"].Value).Value; }
+      set { ((DoubleValue)Results["Best Quality"].Value).Value = value; }
+    }
+
+    private BinaryVector ResultsBestSolution {
+      get { return (BinaryVector)Results["Best Solution"].Value; }
+      set { Results["Best Solution"].Value = value; }
+    }
+
+    private int ResultsBestFoundOnEvaluation {
+      get { return ((IntValue)Results["Evaluation Best Solution Was Found"].Value).Value; }
+      set { ((IntValue)Results["Evaluation Best Solution Was Found"].Value).Value = value; }
+    }
+
+    private int ResultsEvaluations {
+      get { return ((IntValue)Results["Evaluations"].Value).Value; }
+      set { ((IntValue)Results["Evaluations"].Value).Value = value; }
+    }
+    private int ResultsIterations {
+      get { return ((IntValue)Results["Iterations"].Value).Value; }
+      set { ((IntValue)Results["Iterations"].Value).Value = value; }
+    }
+
+    private DataTable ResultsQualities {
+      get { return ((DataTable)Results["Qualities"].Value); }
+    }
+    private DataRow ResultsQualitiesBest {
+      get { return ResultsQualities.Rows["Best Quality"]; }
+    }
+
+    private DataRow ResultsQualitiesIteration {
+      get { return ResultsQualities.Rows["Iteration Quality"]; }
+    }
+
+
+    private DataRow ResultsLevels {
+      get { return ((DataTable)Results["Pyramid Levels"].Value).Rows["Levels"]; }
+    }
+
+    private DataRow ResultsSolutions {
+      get { return ((DataTable)Results["Stored Solutions"].Value).Rows["Solutions"]; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    protected ParameterlessPopulationPyramid(bool deserializing) : base(deserializing) { }
+
+    protected ParameterlessPopulationPyramid(ParameterlessPopulationPyramid original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterlessPopulationPyramid(this, cloner);
+    }
+
+    public ParameterlessPopulationPyramid() {
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumIterationsParameterName, "", new IntValue(Int32.MaxValue)));
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumEvaluationsParameterName, "", new IntValue(Int32.MaxValue)));
+      Parameters.Add(new FixedValueParameter<IntValue>(MaximumRuntimeParameterName, "The maximum runtime in seconds after which the algorithm stops. Use -1 to specify no limit for the runtime", new IntValue(3600)));
+      Parameters.Add(new FixedValueParameter<IntValue>(SeedParameterName, "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
+      Parameters.Add(new FixedValueParameter<BoolValue>(SetSeedRandomlyParameterName, "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
+    }
+
+    protected override void OnExecutionTimeChanged() {
+      base.OnExecutionTimeChanged();
+      if (CancellationTokenSource == null) return;
+      if (MaximumRuntime == -1) return;
+      if (ExecutionTime.TotalSeconds > MaximumRuntime) CancellationTokenSource.Cancel();
+    }
+
+    private void AddIfUnique(BinaryVector solution, int level) {
+      // Don't add things you have seen
+      if (seen.Contains(solution)) return;
+      if (level == pyramid.Count) {
+        pyramid.Add(new Population(tracker.Length, random));
+      }
+      var copied = (BinaryVector)solution.Clone();
+      pyramid[level].Add(copied);
+      seen.Add(copied);
+    }
+
+    // In the GECCO paper, Figure 1
+    private double iterate() {
+      // Create a random solution
+      BinaryVector solution = new BinaryVector(tracker.Length);
+      for (int i = 0; i < solution.Length; i++) {
+        solution[i] = random.Next(2) == 1;
+      }
+      double fitness = tracker.Evaluate(solution, random);
+      fitness = HillClimber.ImproveToLocalOptimum(tracker, solution, fitness, random);
+      AddIfUnique(solution, 0);
+
+      for (int level = 0; level < pyramid.Count; level++) {
+        var current = pyramid[level];
+        double newFitness = LinkageCrossover.ImproveUsingTree(current.Tree, current.Solutions, solution, fitness, tracker, random);
+        // add it to the next level if its a strict fitness improvement
+        if (tracker.IsBetter(newFitness, fitness)) {
+          fitness = newFitness;
+          AddIfUnique(solution, level + 1);
+        }
+      }
+      return fitness;
+    }
+
+    protected override void Run(CancellationToken cancellationToken) {
+      // Set up the algorithm
+      if (SetSeedRandomly) Seed = new System.Random().Next();
+      pyramid = new List<Population>();
+      seen.Clear();
+      random.Reset(Seed);
+      tracker = new EvaluationTracker(Problem, MaximumEvaluations);
+
+      // Set up the results display
+      Results.Add(new Result("Iterations", new IntValue(0)));
+      Results.Add(new Result("Evaluations", new IntValue(0)));
+      Results.Add(new Result("Best Solution", new BinaryVector(tracker.BestSolution)));
+      Results.Add(new Result("Best Quality", new DoubleValue(tracker.BestQuality)));
+      Results.Add(new Result("Evaluation Best Solution Was Found", new IntValue(tracker.BestFoundOnEvaluation)));
+      var table = new DataTable("Qualities");
+      table.Rows.Add(new DataRow("Best Quality"));
+      var iterationRows = new DataRow("Iteration Quality");
+      iterationRows.VisualProperties.LineStyle = DataRowVisualProperties.DataRowLineStyle.Dot;
+      table.Rows.Add(iterationRows);
+      Results.Add(new Result("Qualities", table));
+
+      table = new DataTable("Pyramid Levels");
+      table.Rows.Add(new DataRow("Levels"));
+      Results.Add(new Result("Pyramid Levels", table));
+
+      table = new DataTable("Stored Solutions");
+      table.Rows.Add(new DataRow("Solutions"));
+      Results.Add(new Result("Stored Solutions", table));
+
+      // Loop until iteration limit reached or canceled.
+      for (ResultsIterations = 0; ResultsIterations < MaximumIterations; ResultsIterations++) {
+        double fitness = double.NaN;
+
+        try {
+          fitness = iterate();
+          cancellationToken.ThrowIfCancellationRequested();
+        } finally {
+          ResultsEvaluations = tracker.Evaluations;
+          ResultsBestSolution = new BinaryVector(tracker.BestSolution);
+          ResultsBestQuality = tracker.BestQuality;
+          ResultsBestFoundOnEvaluation = tracker.BestFoundOnEvaluation;
+          ResultsQualitiesBest.Values.Add(tracker.BestQuality);
+          ResultsQualitiesIteration.Values.Add(fitness);
+          ResultsLevels.Values.Add(pyramid.Count);
+          ResultsSolutions.Values.Add(seen.Count);
+        }
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,46 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  /// <summary>
+  /// Plugin class for HeuristicLab.Algorithms.ParameterlessPopulationPyramid plugin.
+  /// </summary>
+  [Plugin("HeuristicLab.Algorithms.ParameterlessPopulationPyramid", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Binary", "3.3")]
+  [PluginDependency("HeuristicLab.Random", "3.3")]
+  public class Plugin : PluginBase {
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Population.cs	(revision 12005)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ * and the BEACON Center for the Study of Evolution in Action.
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+
+namespace HeuristicLab.Algorithms.ParameterlessPopulationPyramid {
+  // This code is based off the publication
+  // B. W. Goldman and W. F. Punch, "Parameter-less Population Pyramid," GECCO, pp. 785–792, 2014
+  // and the original source code in C++11 available from: https://github.com/brianwgoldman/Parameter-less_Population_Pyramid
+  public class Population {
+    public List<BinaryVector> Solutions {
+      get;
+      private set;
+    }
+
+    public LinkageTree Tree {
+      get;
+      private set;
+    }
+
+    public Population(int length, IRandom rand) {
+      Solutions = new List<BinaryVector>();
+      Tree = new LinkageTree(length, rand);
+    }
+    public void Add(BinaryVector solution) {
+      Solutions.Add(solution);
+      Tree.Add(solution);
+    }
+  }
+}
Index: stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Algorithms.ParameterlessPopulationPyramid/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -0,0 +1,56 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core")]
+[assembly: AssemblyDescription("HeuristicLab core classes")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("7d0840b8-3382-4b99-ab4e-5d1eb91fbec1")]
+
+// 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.10.$WCREV$")]
Index: stable/HeuristicLab.Algorithms.ScatterSearch/3.3/PopulationRebuildMethod.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ScatterSearch/3.3/PopulationRebuildMethod.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.ScatterSearch/3.3/PopulationRebuildMethod.cs	(revision 12005)
@@ -25,4 +25,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -34,5 +35,5 @@
   [Item("PopulationRebuildMethod", "An operator that updates the reference set and rebuilds the population.")]
   [StorableClass]
-  public sealed class PopulationRebuildMethod : SingleSuccessorOperator {
+  public sealed class PopulationRebuildMethod : SingleSuccessorOperator, ISingleObjectiveOperator {
     #region Parameter properties
     public ScopeParameter CurrentScopeParameter {
Index: stable/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPoolUpdateMethod.cs
===================================================================
--- stable/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPoolUpdateMethod.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.ScatterSearch/3.3/SolutionPoolUpdateMethod.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("SolutionPoolUpdateMethod", "An operator that updates the solution pool.")]
   [StorableClass]
-  public sealed class SolutionPoolUpdateMethod : SingleSuccessorOperator, ISimilarityBasedOperator {
+  public sealed class SolutionPoolUpdateMethod : SingleSuccessorOperator, ISimilarityBasedOperator, ISingleObjectiveOperator {
     #region ISimilarityBasedOperator Members
     [Storable]
Index: stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs
===================================================================
--- stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs	(revision 11995)
+++ stable/HeuristicLab.Algorithms.SimulatedAnnealing/3.3/SimulatedAnnealingImprovementOperator.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("SimulatedAnnealingImprovementOperator", "A simulated annealing improvement operator.")]
   [StorableClass]
-  public sealed class SimulatedAnnealingImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator {
+  public sealed class SimulatedAnnealingImprovementOperator : SingleSuccessorOperator, ILocalImprovementAlgorithmOperator, IStochasticOperator, ISingleObjectiveOperator {
     #region IGenericLocalImprovementOperator Properties
     public Type ProblemType { get { return typeof(ISingleObjectiveHeuristicOptimizationProblem); } }
Index: stable/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalysis/AlleleFrequencyAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalysis/AlleleFrequencyAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/AlleleFrequencyAnalysis/AlleleFrequencyAnalyzer.cs	(revision 12005)
@@ -37,5 +37,5 @@
   [Item("AlleleFrequencyAnalyzer", "An operator for analyzing the frequency of alleles.")]
   [StorableClass]
-  public abstract class AlleleFrequencyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
+  public abstract class AlleleFrequencyAnalyzer<T> : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator where T : class, IItem {
     public virtual bool EnabledByDefault {
       get { return false; }
Index: stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/BestScopeSolutionAnalyzer.cs	(revision 12005)
@@ -37,5 +37,5 @@
   [Item("BestScopeSolutionAnalyzer", "An operator that extracts the scope containing the best quality.")]
   [StorableClass]
-  public class BestScopeSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class BestScopeSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
 
     public virtual bool EnabledByDefault {
Index: stable/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/MultiObjective/ParetoFrontAnalyzer.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("ParetoFrontAnalyzer", "Analyzer for multiobjective problems that collects and presents the current Pareto front as double matrix as well as the solution scopes that lie on the current front.")]
   [StorableClass]
-  public abstract class ParetoFrontAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public abstract class ParetoFrontAnalyzer : SingleSuccessorOperator, IAnalyzer, IMultiObjectiveOperator {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/PopulationDiversityAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/PopulationDiversityAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/PopulationDiversityAnalyzer.cs	(revision 12005)
@@ -40,5 +40,5 @@
   [Item("PopulationDiversityAnalyzer", "An operator for analyzing the solution diversity in a population.")]
   [StorableClass]
-  public abstract class PopulationDiversityAnalyzer<T> : SingleSuccessorOperator, IAnalyzer where T : class, IItem {
+  public abstract class PopulationDiversityAnalyzer<T> : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator where T : class, IItem {
     public virtual bool EnabledByDefault {
       get { return false; }
Index: stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/PopulationDiversityAnalysis/SingleObjectivePopulationDiversityAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("SingleObjectivePopulationDiversityAnalyzer", "An operator for analyzing the solution diversity in a population.")]
   [StorableClass]
-  public class SingleObjectivePopulationDiversityAnalyzer : SingleSuccessorOperator, IAnalyzer, ISimilarityBasedOperator {
+  public class SingleObjectivePopulationDiversityAnalyzer : SingleSuccessorOperator, IAnalyzer, ISimilarityBasedOperator, ISingleObjectiveOperator {
     #region ISimilarityBasedOperator Members
     [Storable]
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestAverageWorstQualityAnalyzer", "An operator which analyzes the best, average and worst quality of solutions in the scope tree.")]
   [StorableClass]
-  public sealed class BestAverageWorstQualityAnalyzer : AlgorithmOperator, IAnalyzer {
+  public sealed class BestAverageWorstQualityAnalyzer : AlgorithmOperator, IAnalyzer, ISingleObjectiveOperator {
     #region Parameter properties
     public ValueLookupParameter<BoolValue> MaximizationParameter {
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityCalculator.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityCalculator.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestAverageWorstQualityCalculator.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,5 +34,5 @@
   [Item("BestAverageWorstQualityCalculator", "An operator which calculates the best, average and worst quality of solutions in the scope tree.")]
   [StorableClass]
-  public sealed class BestAverageWorstQualityCalculator : SingleSuccessorOperator {
+  public sealed class BestAverageWorstQualityCalculator : SingleSuccessorOperator, ISingleObjectiveOperator {
     public ValueLookupParameter<BoolValue> MaximizationParameter {
       get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestQualityMemorizer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestQualityMemorizer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/BestQualityMemorizer.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -33,5 +34,5 @@
   [Item("BestQualityMemorizer", "An operator that updates the best quality found so far with those qualities contained in the scope tree.")]
   [StorableClass]
-  public class BestQualityMemorizer : SingleSuccessorOperator {
+  public class BestQualityMemorizer : SingleSuccessorOperator, ISingleObjectiveOperator {
     public ValueLookupParameter<BoolValue> MaximizationParameter {
       get { return (ValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("QualityAnalyzer", "An operator which analyzes the quality of solutions in the scope tree.")]
   [StorableClass]
-  public sealed class QualityAnalyzer : AlgorithmOperator, IAnalyzer {
+  public sealed class QualityAnalyzer : AlgorithmOperator, IAnalyzer, ISingleObjectiveOperator {
     #region Parameter properties
     public ValueLookupParameter<BoolValue> MaximizationParameter {
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/QualityDistributionAnalyzer.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("QualityDistributionAnalyzer", "Analyzes the distribution of the quality values in that it adds a Histogram of them into the result collection.")]
   [StorableClass]
-  public class QualityDistributionAnalyzer : SingleSuccessorOperator, IAnalyzer, IIterationBasedOperator {
+  public class QualityDistributionAnalyzer : SingleSuccessorOperator, IAnalyzer, IIterationBasedOperator, ISingleObjectiveOperator {
 
     #region Parameter properties
Index: stable/HeuristicLab.Analysis/3.3/QualityAnalysis/ScaledQualityDifferenceAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Analysis/3.3/QualityAnalysis/ScaledQualityDifferenceAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Analysis/3.3/QualityAnalysis/ScaledQualityDifferenceAnalyzer.cs	(revision 12005)
@@ -33,5 +33,5 @@
 A value towards 0 always means that it's closer to the better fitness value, while a value towards 1 means that it's closer to the worse fitness value.")]
   [StorableClass]
-  public class ScaledQualityDifferenceAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class ScaledQualityDifferenceAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs
===================================================================
--- stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Clients.OKB/3.3/RunCreation/OKBProblem.cs	(revision 12005)
@@ -111,4 +111,6 @@
     }
 
+    public IEnumerable<IParameterizedItem> ExecutionContextItems { get { return new[] { this }; } }
+
     #region Persistence Properties
     [Storable(Name = "ProblemId")]
Index: stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs
===================================================================
--- stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/BinaryVectorEncoding.cs	(revision 12005)
@@ -0,0 +1,179 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.BinaryVectorEncoding {
+  [Item("BinaryVectorEncoding", "Describes a binary vector encoding.")]
+  [StorableClass]
+  public sealed class BinaryVectorEncoding : Encoding<IBinaryVectorCreator> {
+    #region Encoding Parameters
+    [Storable]
+    private IFixedValueParameter<IntValue> lengthParameter;
+    public IFixedValueParameter<IntValue> LengthParameter {
+      get { return lengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
+        if (lengthParameter == value) return;
+
+        if (lengthParameter != null) Parameters.Remove(lengthParameter);
+        lengthParameter = value;
+        Parameters.Add(lengthParameter);
+        OnLengthParameterChanged();
+      }
+    }
+    #endregion
+
+
+    public int Length {
+      get { return LengthParameter.Value.Value; }
+      set { LengthParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    private BinaryVectorEncoding(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new BinaryVectorEncoding(this, cloner); }
+    private BinaryVectorEncoding(BinaryVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      lengthParameter = cloner.Clone(original.lengthParameter);
+      RegisterParameterEvents();
+    }
+
+    public BinaryVectorEncoding() : this("BinaryVector", 10) { }
+    public BinaryVectorEncoding(string name) : this(name, 10) { }
+    public BinaryVectorEncoding(int length) : this("BinaryVector", length) { }
+    public BinaryVectorEncoding(string name, int length)
+      : base(name) {
+      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      Parameters.Add(lengthParameter);
+
+      SolutionCreator = new RandomBinaryVectorCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private void OnLengthParameterChanged() {
+      RegisterLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void RegisterParameterEvents() {
+      RegisterLengthParameterEvents();
+    }
+    private void RegisterLengthParameterEvents() {
+      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    #region Operator Discovery
+    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    static BinaryVectorEncoding() {
+      encodingSpecificOperatorTypes = new List<Type>() {
+        typeof (IBinaryVectorOperator),
+        typeof (IBinaryVectorCreator),
+        typeof (IBinaryVectorCrossover),
+        typeof (IBinaryVectorManipulator),
+        typeof (IBinaryVectorMoveOperator),
+        typeof (IBinaryVectorMultiNeighborhoodShakingOperator),
+      };
+    }
+    private void DiscoverOperators() {
+      var assembly = typeof(IBinaryVectorOperator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+    }
+    #endregion
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      ConfigureCreators(operators.OfType<IBinaryVectorCreator>());
+      ConfigureCrossovers(operators.OfType<IBinaryVectorCrossover>());
+      ConfigureManipulators(operators.OfType<IBinaryVectorManipulator>());
+      ConfigureMoveOperators(operators.OfType<IBinaryVectorMoveOperator>());
+      ConfigureBitFlipMoveOperators(operators.OfType<IOneBitflipMoveOperator>());
+      ConfigureShakingOperators(operators.OfType<IBinaryVectorMultiNeighborhoodShakingOperator>());
+    }
+
+    #region Specific Operator Wiring
+    private void ConfigureCreators(IEnumerable<IBinaryVectorCreator> creators) {
+      foreach (var creator in creators) {
+        creator.BinaryVectorParameter.ActualName = Name;
+        creator.LengthParameter.ActualName = LengthParameter.Name;
+      }
+    }
+    private void ConfigureCrossovers(IEnumerable<IBinaryVectorCrossover> crossovers) {
+      foreach (var crossover in crossovers) {
+        crossover.ParentsParameter.ActualName = Name;
+        crossover.ChildParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureManipulators(IEnumerable<IBinaryVectorManipulator> manipulators) {
+      foreach (var manipulator in manipulators) {
+        manipulator.BinaryVectorParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureMoveOperators(IEnumerable<IBinaryVectorMoveOperator> moveOperators) {
+      foreach (var moveOperator in moveOperators) {
+        moveOperator.BinaryVectorParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureBitFlipMoveOperators(IEnumerable<IOneBitflipMoveOperator> oneBitflipMoveOperators) {
+      foreach (var oneBitFlipMoveOperator in oneBitflipMoveOperators) {
+        oneBitFlipMoveOperator.OneBitflipMoveParameter.ActualName = Name + "_OneBitFlipMove";
+      }
+    }
+    private void ConfigureShakingOperators(IEnumerable<IBinaryVectorMultiNeighborhoodShakingOperator> shakingOperators) {
+      foreach (var shakingOperator in shakingOperators) {
+        shakingOperator.BinaryVectorParameter.ActualName = Name;
+      }
+    }
+    #endregion
+  }
+
+  public static class IndividualExtensionMethods {
+    public static BinaryVector BinaryVector(this Individual individual) {
+      var encoding = individual.GetEncoding<BinaryVectorEncoding>();
+      return individual.BinaryVector(encoding.Name);
+    }
+
+    public static BinaryVector BinaryVector(this Individual individual, string name) {
+      return (BinaryVector)individual[name];
+    }
+  }
+}
Index: stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj
===================================================================
--- stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj	(revision 12005)
@@ -119,4 +119,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="BinaryVectorEncoding.cs" />
     <Compile Include="Creators\RandomBinaryVectorCreator.cs" />
     <Compile Include="Crossovers\MultiBinaryVectorCrossover.cs" />
Index: stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Moves/OneBitflipMove/OneBitflipMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Moves/OneBitflipMove/OneBitflipMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.BinaryVectorEncoding/3.3/Moves/OneBitflipMove/OneBitflipMoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("OneBitflipMoveMaker", "Peforms a one bitflip move on a given BitVector and updates the quality.")]
   [StorableClass]
-  public class OneBitflipMoveMaker : SingleSuccessorOperator, IOneBitflipMoveOperator, IMoveMaker {
+  public class OneBitflipMoveMaker : SingleSuccessorOperator, IOneBitflipMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedBlendAlphaBetaCrossover.cs
===================================================================
--- stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedBlendAlphaBetaCrossover.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedBlendAlphaBetaCrossover.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -37,5 +38,5 @@
   [Item("RoundedBlendAlphaBetaCrossover", "The rounded blend alpha beta crossover (BLX-a-b) for integer vectors is similar to the blend alpha crossover (BLX-a), but distinguishes between the better and worse of the parents. The interval from which to choose the new offspring can be extended beyond the better parent by specifying a higher alpha value, and beyond the worse parent by specifying a higher beta value. The new offspring is sampled uniformly in the extended range and rounded to the next feasible integer.")]
   [StorableClass]
-  public class RoundedBlendAlphaBetaCrossover : BoundedIntegerVectorCrossover {
+  public class RoundedBlendAlphaBetaCrossover : BoundedIntegerVectorCrossover, ISingleObjectiveOperator {
     /// <summary>
     /// Whether the problem is a maximization or minimization problem.
Index: stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedHeuristicCrossover.cs
===================================================================
--- stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedHeuristicCrossover.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/Crossovers/RoundedHeuristicCrossover.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -35,5 +36,5 @@
   [Item("RoundedHeuristicCrossover", "The heuristic crossover produces offspring that extend the better parent in direction from the worse to the better parent.")]
   [StorableClass]
-  public class RoundedHeuristicCrossover : BoundedIntegerVectorCrossover {
+  public class RoundedHeuristicCrossover : BoundedIntegerVectorCrossover, ISingleObjectiveOperator {
     /// <summary>
     /// Whether the problem is a maximization or minimization problem.
Index: stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj
===================================================================
--- stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/HeuristicLab.Encodings.IntegerVectorEncoding-3.3.csproj	(revision 12005)
@@ -129,4 +129,5 @@
     </Compile>
     <Compile Include="Crossovers\RoundedUniformArithmeticCrossover.cs" />
+    <Compile Include="IntegerVectorEncoding.cs" />
     <Compile Include="IntegerVectorOperator.cs" />
     <Compile Include="Interfaces\IBoundedIntegerVectorOperator.cs" />
Index: stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs
===================================================================
--- stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Encodings.IntegerVectorEncoding/3.3/IntegerVectorEncoding.cs	(revision 12005)
@@ -0,0 +1,281 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.IntegerVectorEncoding {
+  [Item("IntegerVectorEncoding", "Describes an integer vector encoding.")]
+  [StorableClass]
+  public sealed class IntegerVectorEncoding : Encoding<IIntegerVectorCreator> {
+    #region Encoding Parameters
+    [Storable]
+    private IFixedValueParameter<IntValue> lengthParameter;
+    public IFixedValueParameter<IntValue> LengthParameter {
+      get { return lengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
+        if (lengthParameter == value) return;
+
+        if (lengthParameter != null) Parameters.Remove(lengthParameter);
+        lengthParameter = value;
+        Parameters.Add(lengthParameter);
+        OnLengthParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IValueParameter<IntMatrix> boundsParameter;
+    public IValueParameter<IntMatrix> BoundsParameter {
+      get { return boundsParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
+        if (boundsParameter == value) return;
+
+        if (boundsParameter != null) Parameters.Remove(boundsParameter);
+        boundsParameter = value;
+        Parameters.Add(boundsParameter);
+        OnBoundsParameterChanged();
+      }
+    }
+    #endregion
+
+    public int Length {
+      get { return LengthParameter.Value.Value; }
+      set { LengthParameter.Value.Value = value; }
+    }
+    public IntMatrix Bounds {
+      get { return BoundsParameter.Value; }
+      set { BoundsParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    private IntegerVectorEncoding(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private IntegerVectorEncoding(IntegerVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      lengthParameter = cloner.Clone(original.lengthParameter);
+      boundsParameter = cloner.Clone(original.boundsParameter);
+      RegisterParameterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new IntegerVectorEncoding(this, cloner); }
+
+
+    public IntegerVectorEncoding() : this("IntegerVector", 10) { }
+    public IntegerVectorEncoding(string name) : this(name, 10) { }
+    public IntegerVectorEncoding(int length) : this("integerVector", length) { }
+    public IntegerVectorEncoding(string name, int length, int min = int.MinValue, int max = int.MaxValue, int? step = null)
+      : base(name) {
+      if (min >= max) throw new ArgumentException("min must be less than max", "min");
+      if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step");
+
+      var bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
+      bounds[0, 0] = min;
+      bounds[0, 1] = max;
+      if (step.HasValue) bounds[0, 2] = step.Value;
+
+      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      boundsParameter = new ValueParameter<IntMatrix>(Name + ".Bounds", bounds);
+      Parameters.Add(lengthParameter);
+      Parameters.Add(boundsParameter);
+
+      SolutionCreator = new UniformRandomIntegerVectorCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+    public IntegerVectorEncoding(string name, int length, IList<int> min, IList<int> max, IList<int> step = null)
+      : base(name) {
+      if (min.Count == 0) throw new ArgumentException("Bounds must be given for the integer parameters.");
+      if (min.Count != max.Count) throw new ArgumentException("min must be of the same length as max", "min");
+      if (step != null && min.Count != step.Count) throw new ArgumentException("step must be of the same length as min or null", "step");
+      if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
+
+      var bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
+      for (int i = 0; i < min.Count; i++) {
+        bounds[i, 0] = min[i];
+        bounds[i, 1] = max[i];
+        if (step != null) bounds[i, 2] = step[i];
+      }
+
+      LengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<IntMatrix>(Name + ".Bounds", bounds);
+
+      SolutionCreator = new UniformRandomIntegerVectorCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private void OnLengthParameterChanged() {
+      RegisterLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnBoundsParameterChanged() {
+      RegisterBoundsParameterEvents();
+      ConfigureOperators(Operators);
+    }
+
+    private void RegisterParameterEvents() {
+      RegisterLengthParameterEvents();
+      RegisterBoundsParameterEvents();
+    }
+    private void RegisterLengthParameterEvents() {
+      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+    private void RegisterBoundsParameterEvents() {
+      BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+
+    #region Operator Discovery
+    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    static IntegerVectorEncoding() {
+      encodingSpecificOperatorTypes = new List<Type>() {
+        typeof (IIntegerVectorOperator),
+        typeof (IIntegerVectorCreator),
+        typeof (IIntegerVectorCrossover),
+        typeof (IIntegerVectorManipulator),
+        typeof (IIntegerVectorStdDevStrategyParameterOperator),
+        typeof (IIntegerVectorMultiNeighborhoodShakingOperator),
+      };
+    }
+    private void DiscoverOperators() {
+      var assembly = typeof(IIntegerVectorOperator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+    }
+    #endregion
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      ConfigureBoundedOperators(operators.OfType<IBoundedIntegerVectorOperator>());
+      ConfigureCreators(operators.OfType<IIntegerVectorCreator>());
+      ConfigureCrossovers(operators.OfType<IIntegerVectorCrossover>());
+      ConfigureManipulators(operators.OfType<IIntegerVectorManipulator>());
+      ConfigureShakingOperators(operators.OfType<IIntegerVectorMultiNeighborhoodShakingOperator>());
+      ConfigureStrategyVectorOperator(operators.OfType<IIntegerVectorStdDevStrategyParameterOperator>());
+    }
+
+    #region Specific Operator Wiring
+    private void ConfigureBoundedOperators(IEnumerable<IBoundedIntegerVectorOperator> boundedOperators) {
+      foreach (var boundedOperator in boundedOperators) {
+        boundedOperator.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+
+    private void ConfigureCreators(IEnumerable<IIntegerVectorCreator> creators) {
+      foreach (var creator in creators) {
+        creator.IntegerVectorParameter.ActualName = Name;
+        creator.BoundsParameter.ActualName = BoundsParameter.Name;
+        creator.LengthParameter.ActualName = LengthParameter.Name;
+      }
+    }
+
+    private void ConfigureCrossovers(IEnumerable<IIntegerVectorCrossover> crossovers) {
+      foreach (var crossover in crossovers) {
+        crossover.ChildParameter.ActualName = Name;
+        crossover.ParentsParameter.ActualName = Name;
+      }
+    }
+
+    private void ConfigureManipulators(IEnumerable<IIntegerVectorManipulator> manipulators) {
+      foreach (var manipulator in manipulators) {
+        manipulator.IntegerVectorParameter.ActualName = Name;
+        manipulator.IntegerVectorParameter.Hidden = true;
+        var sm = manipulator as ISelfAdaptiveManipulator;
+        if (sm != null) {
+          var p = sm.StrategyParameterParameter as ILookupParameter;
+          if (p != null) {
+            p.ActualName = Name + "Strategy";
+          }
+        }
+      }
+    }
+
+    private void ConfigureShakingOperators(IEnumerable<IIntegerVectorMultiNeighborhoodShakingOperator> shakingOperators) {
+      foreach (var shakingOperator in shakingOperators) {
+        shakingOperator.IntegerVectorParameter.ActualName = Name;
+      }
+    }
+
+    private void ConfigureStrategyVectorOperator(IEnumerable<IIntegerVectorStdDevStrategyParameterOperator> strategyVectorOperators) {
+      var bounds = new DoubleMatrix(Bounds.Rows, Bounds.Columns);
+      for (var i = 0; i < bounds.Rows; i++) {
+        bounds[i, 1] = (int)Math.Ceiling(0.33 * (Bounds[i, 1] - Bounds[i, 0]));
+        bounds[i, 0] = 0;
+        if (bounds.Columns > 2) bounds[i, 2] = Bounds[i, 2];
+      }
+      foreach (var s in strategyVectorOperators) {
+        var c = s as IIntegerVectorStdDevStrategyParameterCreator;
+        if (c != null) {
+          c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
+          c.LengthParameter.ActualName = Name;
+          c.StrategyParameterParameter.ActualName = Name + "Strategy";
+        }
+        var m = s as IIntegerVectorStdDevStrategyParameterManipulator;
+        if (m != null) {
+          m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
+          m.StrategyParameterParameter.ActualName = Name + "Strategy";
+        }
+        var mm = s as StdDevStrategyVectorManipulator;
+        if (mm != null) {
+          mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Length));
+          mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(Length)));
+        }
+        var x = s as IIntegerVectorStdDevStrategyParameterCrossover;
+        if (x != null) {
+          x.ParentsParameter.ActualName = Name + "Strategy";
+          x.StrategyParameterParameter.ActualName = Name + "Strategy";
+        }
+      }
+    }
+    #endregion
+  }
+
+  public static class IndividualExtensionMethods {
+    public static IntegerVector IntegerVector(this Individual individual) {
+      var encoding = individual.GetEncoding<IntegerVectorEncoding>();
+      return individual.IntegerVector(encoding.Name);
+    }
+    public static IntegerVector IntegerVector(this Individual individual, string name) {
+      return (IntegerVector)individual[name];
+    }
+  }
+}
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/HeuristicLab.Encodings.PermutationEncoding-3.3.csproj	(revision 12005)
@@ -193,4 +193,5 @@
     <Compile Include="Moves\TwoOpt\StochasticInversionMultiMoveGenerator.cs" />
     <Compile Include="Moves\TwoOpt\StochasticInversionSingleMoveGenerator.cs" />
+    <Compile Include="PermutationEncoding.cs" />
     <Compile Include="PermutationEqualityComparer.cs" />
     <Compile Include="PermutationManipulator.cs" />
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Scramble/ScrambleMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Scramble/ScrambleMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Scramble/ScrambleMoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("ScrambleMoveMaker", "Peforms a scramble move on a given permutation and updates the quality.")]
   [StorableClass]
-  public class ScrambleMoveMaker : SingleSuccessorOperator, IPermutationScrambleMoveOperator, IMoveMaker {
+  public class ScrambleMoveMaker : SingleSuccessorOperator, IPermutationScrambleMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap2/Swap2MoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap2/Swap2MoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/Swap2/Swap2MoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("Swap2MoveMaker", "Peforms a swap-2 move on a given permutation and updates the quality.")]
   [StorableClass]
-  public class Swap2MoveMaker : SingleSuccessorOperator, IPermutationSwap2MoveOperator, IMoveMaker {
+  public class Swap2MoveMaker : SingleSuccessorOperator, IPermutationSwap2MoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/ThreeOpt/TranslocationMoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("TranslocationMoveMaker", "Peforms a translocation or insertion move (3-opt) on a given permutation and updates the quality.")]
   [StorableClass]
-  public class TranslocationMoveMaker : SingleSuccessorOperator, IPermutationTranslocationMoveOperator, IMoveMaker {
+  public class TranslocationMoveMaker : SingleSuccessorOperator, IPermutationTranslocationMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/Moves/TwoOpt/InversionMoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("InversionMoveMaker", "Peforms an inversion move (2-opt) on a given permutation and updates the quality.")]
   [StorableClass]
-  public class InversionMoveMaker : SingleSuccessorOperator, IPermutationInversionMoveOperator, IMoveMaker {
+  public class InversionMoveMaker : SingleSuccessorOperator, IPermutationInversionMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs
===================================================================
--- stable/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEncoding.cs	(revision 12005)
@@ -0,0 +1,236 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.PermutationEncoding {
+  [Item("PermutationEncoding", "Describes a permutation encoding.")]
+  [StorableClass]
+  public sealed class PermutationEncoding : Encoding<IPermutationCreator> {
+    #region encoding parameters
+    [Storable]
+    private IFixedValueParameter<IntValue> lengthParameter;
+    public IFixedValueParameter<IntValue> LengthParameter {
+      get { return lengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
+        if (lengthParameter == value) return;
+
+        if (lengthParameter != null) Parameters.Remove(lengthParameter);
+        lengthParameter = value;
+        Parameters.Add(lengthParameter);
+        OnLengthParameterChanged();
+      }
+    }
+
+    [Storable]
+    private IFixedValueParameter<PermutationType> permutationTypeParameter;
+    public IFixedValueParameter<PermutationType> PermutationTypeParameter {
+      get { return permutationTypeParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Permutation type parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Permutation type parameter value must not be null.");
+        if (permutationTypeParameter == value) return;
+
+        if (permutationTypeParameter != null) Parameters.Remove(permutationTypeParameter);
+        permutationTypeParameter = value;
+        Parameters.Add(permutationTypeParameter);
+        OnPermutationTypeParameterChanged();
+      }
+    }
+    #endregion
+
+    public int Length {
+      get { return LengthParameter.Value.Value; }
+      set { LengthParameter.Value.Value = value; }
+    }
+
+    public PermutationTypes Type {
+      get { return PermutationTypeParameter.Value.Value; }
+      set { PermutationTypeParameter.Value.Value = value; }
+    }
+
+    [StorableConstructor]
+    private PermutationEncoding(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new PermutationEncoding(this, cloner); }
+    private PermutationEncoding(PermutationEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      lengthParameter = cloner.Clone(original.lengthParameter);
+      permutationTypeParameter = cloner.Clone(original.permutationTypeParameter);
+      RegisterParameterEvents();
+    }
+
+
+    public PermutationEncoding() : this("Permutation", 10, PermutationTypes.Absolute) { }
+    public PermutationEncoding(string name) : this(name, 10, PermutationTypes.Absolute) { }
+    public PermutationEncoding(int length) : this("Permuration", length, PermutationTypes.Absolute) { }
+    public PermutationEncoding(string name, int length, PermutationTypes type)
+      : base(name) {
+      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      permutationTypeParameter = new FixedValueParameter<PermutationType>(Name + ".Type", new PermutationType(type));
+      Parameters.Add(lengthParameter);
+      Parameters.Add(permutationTypeParameter);
+
+      SolutionCreator = new RandomPermutationCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private void OnLengthParameterChanged() {
+      RegisterLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+
+    private void OnPermutationTypeParameterChanged() {
+      RegisterPermutationTypeParameterEvents();
+      ConfigureOperators(Operators);
+    }
+
+    private void RegisterParameterEvents() {
+      RegisterLengthParameterEvents();
+      RegisterPermutationTypeParameterEvents();
+    }
+    private void RegisterLengthParameterEvents() {
+      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+    private void RegisterPermutationTypeParameterEvents() {
+      PermutationTypeParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    #region Operator Discovery
+    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    static PermutationEncoding() {
+      encodingSpecificOperatorTypes = new List<Type>() {
+          typeof (IPermutationOperator),
+          typeof (IPermutationCreator),
+          typeof (IPermutationCrossover),
+          typeof (IPermutationManipulator),
+          typeof (IPermutationMultiNeighborhoodShakingOperator),
+          typeof (IPermutationMoveOperator),
+          typeof (IPermutationInversionMoveOperator),
+          typeof (IPermutationScrambleMoveOperator),
+          typeof (IPermutationSwap2MoveOperator),                    
+          typeof (IPermutationTranslocationMoveOperator)
+      };
+    }
+    private void DiscoverOperators() {
+      var assembly = typeof(IPermutationOperator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+    }
+    #endregion
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      ConfigureCreators(operators.OfType<IPermutationCreator>());
+      ConfigureCrossovers(operators.OfType<IPermutationCrossover>());
+      ConfigureManipulators(operators.OfType<IPermutationManipulator>());
+      ConfigureShakingOperators(operators.OfType<IPermutationMultiNeighborhoodShakingOperator>());
+      ConfigureMoveOperators(operators.OfType<IPermutationMoveOperator>());
+      ConfigureInversionMoveOperators(operators.OfType<IPermutationInversionMoveOperator>());
+      ConfigureScrambleMoveOperators(operators.OfType<IPermutationScrambleMoveOperator>());
+      ConfigureSwap2MoveOperators(operators.OfType<IPermutationSwap2MoveOperator>());
+      ConfigureTranslocationMoveOperators(operators.OfType<IPermutationTranslocationMoveOperator>());
+    }
+
+    #region specific operator wiring
+    private void ConfigureCreators(IEnumerable<IPermutationCreator> creators) {
+      foreach (var creator in creators) {
+        creator.LengthParameter.ActualName = LengthParameter.Name;
+        creator.PermutationParameter.ActualName = Name;
+        creator.PermutationTypeParameter.Value.Value = Type;
+      }
+    }
+    private void ConfigureCrossovers(IEnumerable<IPermutationCrossover> crossovers) {
+      foreach (var crossover in crossovers) {
+        crossover.ChildParameter.ActualName = Name;
+        crossover.ParentsParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureManipulators(IEnumerable<IPermutationManipulator> manipulators) {
+      foreach (var manipulator in manipulators) {
+        manipulator.PermutationParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureShakingOperators(IEnumerable<IPermutationMultiNeighborhoodShakingOperator> shakingOperators) {
+      foreach (var shakingOperator in shakingOperators) {
+        shakingOperator.PermutationParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureMoveOperators(IEnumerable<IPermutationMoveOperator> moveOperators) {
+      foreach (var moveOperator in moveOperators) {
+        moveOperator.PermutationParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureInversionMoveOperators(IEnumerable<IPermutationInversionMoveOperator> inversionMoveOperators) {
+      foreach (var inversionMoveOperator in inversionMoveOperators) {
+        inversionMoveOperator.InversionMoveParameter.ActualName = Name + ".InversionMove";
+      }
+    }
+    private void ConfigureScrambleMoveOperators(IEnumerable<IPermutationScrambleMoveOperator> scrambleMoveOperators) {
+      foreach (var scrambleMoveOperator in scrambleMoveOperators) {
+        scrambleMoveOperator.ScrambleMoveParameter.ActualName = Name + ".ScambleMove";
+      }
+    }
+    private void ConfigureSwap2MoveOperators(IEnumerable<IPermutationSwap2MoveOperator> swap2MoveOperators) {
+      foreach (var swap2MoveOperator in swap2MoveOperators) {
+        swap2MoveOperator.Swap2MoveParameter.ActualName = Name + ".Swap2Move";
+      }
+    }
+    private void ConfigureTranslocationMoveOperators(IEnumerable<IPermutationTranslocationMoveOperator> translocationMoveOperators) {
+      foreach (var translocationMoveOperator in translocationMoveOperators) {
+        translocationMoveOperator.TranslocationMoveParameter.ActualName = Name + ".TranslocationMove";
+      }
+    }
+
+    #endregion
+  }
+
+  public static class IndividualExtensionMethods {
+    public static Permutation Permutation(this Individual individual) {
+      var encoding = individual.GetEncoding<PermutationEncoding>();
+      return individual.Permutation(encoding.Name);
+    }
+    public static Permutation Permutation(this Individual individual, string name) {
+      return (Permutation)individual[name];
+    }
+  }
+}
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/BlendAlphaBetaCrossover.cs
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/BlendAlphaBetaCrossover.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/BlendAlphaBetaCrossover.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -40,5 +41,5 @@
   [Item("BlendAlphaBetaCrossover", "The blend alpha beta crossover (BLX-a-b) for real vectors is similar to the blend alpha crossover (BLX-a), but distinguishes between the better and worse of the parents. The interval from which to choose the new offspring can be extended beyond the better parent by specifying a higher alpha value, and beyond the worse parent by specifying a higher beta value. The new offspring is sampled uniformly in the extended range. It is implemented as described in Takahashi, M. and Kita, H. 2001. A crossover operator using independent component analysis for real-coded genetic algorithms Proceedings of the 2001 Congress on Evolutionary Computation, pp. 643-649.")]
   [StorableClass]
-  public class BlendAlphaBetaCrossover : RealVectorCrossover {
+  public class BlendAlphaBetaCrossover : RealVectorCrossover, ISingleObjectiveOperator {
     /// <summary>
     /// Whether the problem is a maximization or minimization problem.
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/HeuristicCrossover.cs
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/HeuristicCrossover.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Crossovers/HeuristicCrossover.cs	(revision 12005)
@@ -24,4 +24,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -37,5 +38,5 @@
   [Item("HeuristicCrossover", "The heuristic crossover produces offspring that extend the better parent in direction from the worse to the better parent. It is implemented as described in Wright, A.H. (1994), Genetic algorithms for real parameter optimization, Foundations of Genetic Algorithms, G.J.E. Rawlins (Ed.), Morgan Kaufmann, San Mateo, CA, 205-218.")]
   [StorableClass]
-  public class HeuristicCrossover : RealVectorCrossover {
+  public class HeuristicCrossover : RealVectorCrossover, ISingleObjectiveOperator {
     /// <summary>
     /// Whether the problem is a maximization or minimization problem.
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj	(revision 12005)
@@ -136,4 +136,5 @@
     <Compile Include="RealVectorCrossover.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="RealVectorEncoding.cs" />
     <Compile Include="RealVectorManipulator.cs" />
   </ItemGroup>
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/Moves/AdditiveMoveMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("AdditiveMoveMaker", "Peforms an additive move on a given real vector and updates the quality.")]
   [StorableClass]
-  public class AdditiveMoveMaker : SingleSuccessorOperator, IAdditiveRealVectorMoveOperator, IMoveMaker {
+  public class AdditiveMoveMaker : SingleSuccessorOperator, IAdditiveRealVectorMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs	(revision 12005)
@@ -35,5 +35,5 @@
   [Item("RealVectorSwarmUpdater", "Updates personal best point and quality as well as global best point and quality.")]
   [StorableClass]
-  public sealed class RealVectorSwarmUpdater : SingleSuccessorOperator, IRealVectorSwarmUpdater {
+  public sealed class RealVectorSwarmUpdater : SingleSuccessorOperator, IRealVectorSwarmUpdater, ISingleObjectiveOperator {
 
     [Storable]
@@ -235,5 +235,5 @@
 
     void VelocityBoundsStartValueParameter_Value_ValueChanged(object sender, EventArgs e) {
-      UpdateVelocityBoundsParamater(); 
+      UpdateVelocityBoundsParamater();
     }
 
@@ -257,5 +257,5 @@
         VelocityBoundsStartValueParameter.Value.ValueChanged += new EventHandler(VelocityBoundsStartValueParameter_Value_ValueChanged);
       }
-      UpdateVelocityBoundsParamater(); 
+      UpdateVelocityBoundsParamater();
     }
 
Index: stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs
===================================================================
--- stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Encodings.RealVectorEncoding/3.3/RealVectorEncoding.cs	(revision 12005)
@@ -0,0 +1,328 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Encodings.RealVectorEncoding {
+  [Item("RealVectorEncoding", "Describes a real vector encoding.")]
+  [StorableClass]
+  public sealed class RealVectorEncoding : Encoding<IRealVectorCreator> {
+    #region Encoding Parameters
+    [Storable]
+    private IFixedValueParameter<IntValue> lengthParameter;
+    public IFixedValueParameter<IntValue> LengthParameter {
+      get { return lengthParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Length parameter must not be null.");
+        if (value.Value == null) throw new ArgumentNullException("Length parameter value must not be null.");
+        if (lengthParameter == value) return;
+
+        if (lengthParameter != null) Parameters.Remove(lengthParameter);
+        lengthParameter = value;
+        Parameters.Add(lengthParameter);
+        OnLengthParameterChanged();
+      }
+    }
+    [Storable]
+    private IValueParameter<DoubleMatrix> boundsParameter;
+    public IValueParameter<DoubleMatrix> BoundsParameter {
+      get { return boundsParameter; }
+      set {
+        if (value == null) throw new ArgumentNullException("Bounds parameter must not be null.");
+        if (boundsParameter == value) return;
+
+        if (boundsParameter != null) Parameters.Remove(boundsParameter);
+        boundsParameter = value;
+        Parameters.Add(boundsParameter);
+        OnBoundsParameterChanged();
+      }
+    }
+    #endregion
+
+    public int Length {
+      get { return LengthParameter.Value.Value; }
+      set { LengthParameter.Value.Value = value; }
+    }
+    public DoubleMatrix Bounds {
+      get { return BoundsParameter.Value; }
+      set { BoundsParameter.Value = value; }
+    }
+
+    [StorableConstructor]
+    private RealVectorEncoding(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new RealVectorEncoding(this, cloner); }
+    private RealVectorEncoding(RealVectorEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      lengthParameter = cloner.Clone(original.lengthParameter);
+      boundsParameter = cloner.Clone(original.boundsParameter);
+      RegisterParameterEvents();
+    }
+
+    public RealVectorEncoding() : this("RealVector", 10) { }
+    public RealVectorEncoding(string name) : this(name, 10) { }
+    public RealVectorEncoding(int length) : this("RealVector", length) { }
+    public RealVectorEncoding(string name, int length, double min = double.MinValue, double max = double.MaxValue)
+      : base(name) {
+      if (min >= max) throw new ArgumentException("min must be less than max", "min");
+
+      var bounds = new DoubleMatrix(1, 2);
+      bounds[0, 0] = min;
+      bounds[0, 1] = max;
+
+      lengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      boundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds);
+      Parameters.Add(lengthParameter);
+      Parameters.Add(boundsParameter);
+
+      SolutionCreator = new UniformRandomRealVectorCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    public RealVectorEncoding(string name, int length, IList<double> min, IList<double> max)
+      : base(name) {
+      if (min.Count == 0) throw new ArgumentException("Bounds must be given for the real parameters.");
+      if (min.Count != max.Count) throw new ArgumentException("min must be of the same length as max", "min");
+      if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
+
+      var bounds = new DoubleMatrix(min.Count, 2);
+      for (int i = 0; i < min.Count; i++) {
+        bounds[i, 0] = min[i];
+        bounds[i, 1] = max[i];
+      }
+      LengthParameter = new FixedValueParameter<IntValue>(Name + ".Length", new IntValue(length));
+      BoundsParameter = new ValueParameter<DoubleMatrix>(Name + ".Bounds", bounds);
+
+      SolutionCreator = new UniformRandomRealVectorCreator();
+      RegisterParameterEvents();
+      DiscoverOperators();
+    }
+
+    private void OnLengthParameterChanged() {
+      RegisterLengthParameterEvents();
+      ConfigureOperators(Operators);
+    }
+    private void OnBoundsParameterChanged() {
+      RegisterBoundsParameterEvents();
+      ConfigureOperators(Operators);
+    }
+
+    private void RegisterParameterEvents() {
+      RegisterLengthParameterEvents();
+      RegisterBoundsParameterEvents();
+    }
+    private void RegisterLengthParameterEvents() {
+      LengthParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      LengthParameter.Value.ValueChanged += (o, s) => ConfigureOperators(Operators);
+    }
+    private void RegisterBoundsParameterEvents() {
+      BoundsParameter.ValueChanged += (o, s) => ConfigureOperators(Operators);
+      boundsParameter.Value.ToStringChanged += (o, s) => ConfigureOperators(Operators);
+    }
+
+    #region Operator Discovery
+    private static readonly IEnumerable<Type> encodingSpecificOperatorTypes;
+    static RealVectorEncoding() {
+      encodingSpecificOperatorTypes = new List<Type>() {
+          typeof (IRealVectorOperator),
+          typeof (IRealVectorCreator),
+          typeof (IRealVectorCrossover),
+          typeof (IRealVectorManipulator),
+          typeof (IRealVectorStdDevStrategyParameterOperator),
+          typeof (IRealVectorSwarmUpdater),
+          typeof (IRealVectorParticleCreator),
+          typeof (IRealVectorParticleUpdater),
+          typeof (IRealVectorMultiNeighborhoodShakingOperator),
+          typeof (IRealVectorBoundsChecker),
+          typeof (IRealVectorMoveOperator),
+          typeof (IRealVectorMoveGenerator)
+      };
+    }
+    private void DiscoverOperators() {
+      var assembly = typeof(IRealVectorOperator).Assembly;
+      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, assembly, true, false, false);
+      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
+      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
+
+      ConfigureOperators(newOperators);
+      foreach (var @operator in newOperators)
+        AddOperator(@operator);
+
+      foreach (var strategyVectorCreator in Operators.OfType<IRealVectorStdDevStrategyParameterCreator>())
+        strategyVectorCreator.BoundsParameter.ValueChanged += strategyVectorCreator_BoundsParameter_ValueChanged;
+    }
+    #endregion
+
+
+    private void strategyVectorCreator_BoundsParameter_ValueChanged(object sender, EventArgs e) {
+      var boundsParameter = (IValueLookupParameter<DoubleMatrix>)sender;
+      if (boundsParameter.Value == null) return;
+      foreach (var strategyVectorManipulator in Operators.OfType<IRealVectorStdDevStrategyParameterManipulator>())
+        strategyVectorManipulator.BoundsParameter.Value = (DoubleMatrix)boundsParameter.Value.Clone();
+    }
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+      ConfigureCreators(operators.OfType<IRealVectorCreator>());
+      ConfigureCrossovers(operators.OfType<IRealVectorCrossover>());
+      ConfigureManipulators(operators.OfType<IRealVectorManipulator>());
+      ConfigureStdDevStrategyParameterOperators(operators.OfType<IRealVectorStdDevStrategyParameterOperator>());
+      ConfigureSwarmUpdaters(operators.OfType<IRealVectorSwarmUpdater>());
+      ConfigureParticleCreators(operators.OfType<IRealVectorParticleCreator>());
+      ConfigureParticleUpdaters(operators.OfType<IRealVectorParticleUpdater>());
+      ConfigureShakingOperators(operators.OfType<IRealVectorMultiNeighborhoodShakingOperator>());
+      ConfigureBoundsCheckers(operators.OfType<IRealVectorBoundsChecker>());
+      ConfigureMoveGenerators(operators.OfType<IRealVectorMoveGenerator>());
+      ConfigureMoveOperators(operators.OfType<IRealVectorMoveOperator>());
+      ConfigureAdditiveMoveOperator(operators.OfType<IAdditiveRealVectorMoveOperator>());
+    }
+
+    #region Specific Operator Wiring
+    private void ConfigureCreators(IEnumerable<IRealVectorCreator> creators) {
+      foreach (var creator in creators) {
+        creator.RealVectorParameter.ActualName = Name;
+        creator.LengthParameter.ActualName = LengthParameter.Name;
+        creator.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+    private void ConfigureCrossovers(IEnumerable<IRealVectorCrossover> crossovers) {
+      foreach (var crossover in crossovers) {
+        crossover.ChildParameter.ActualName = Name;
+        crossover.ParentsParameter.ActualName = Name;
+        crossover.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+    private void ConfigureManipulators(IEnumerable<IRealVectorManipulator> manipulators) {
+      foreach (var manipulator in manipulators) {
+        manipulator.RealVectorParameter.ActualName = Name;
+        manipulator.BoundsParameter.ActualName = BoundsParameter.Name;
+        manipulator.BoundsParameter.Hidden = true;
+        var sm = manipulator as ISelfAdaptiveManipulator;
+        if (sm != null) {
+          var p = sm.StrategyParameterParameter as ILookupParameter;
+          if (p != null) {
+            p.ActualName = Name + ".Strategy";
+          }
+        }
+      }
+    }
+    private void ConfigureStdDevStrategyParameterOperators(IEnumerable<IRealVectorStdDevStrategyParameterOperator> strategyOperators) {
+      var bounds = new DoubleMatrix(Bounds.Rows, Bounds.Columns);
+      for (var i = 0; i < Bounds.Rows; i++) {
+        bounds[i, 0] = 0;
+        bounds[i, 1] = 0.1 * (Bounds[i, 1] - Bounds[i, 0]);
+      }
+      foreach (var s in strategyOperators) {
+        var c = s as IRealVectorStdDevStrategyParameterCreator;
+        if (c != null) {
+          c.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
+          c.LengthParameter.ActualName = LengthParameter.Name;
+          c.StrategyParameterParameter.ActualName = Name + ".Strategy";
+        }
+        var m = s as IRealVectorStdDevStrategyParameterManipulator;
+        if (m != null) {
+          m.BoundsParameter.Value = (DoubleMatrix)bounds.Clone();
+          m.StrategyParameterParameter.ActualName = Name + ".Strategy";
+        }
+        var mm = s as StdDevStrategyVectorManipulator;
+        if (mm != null) {
+          mm.GeneralLearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Length));
+          mm.LearningRateParameter.Value = new DoubleValue(1.0 / Math.Sqrt(2 * Math.Sqrt(Length)));
+        }
+        var x = s as IRealVectorStdDevStrategyParameterCrossover;
+        if (x != null) {
+          x.ParentsParameter.ActualName = Name + ".Strategy";
+          x.StrategyParameterParameter.ActualName = Name + ".Strategy";
+        }
+      }
+    }
+    private void ConfigureSwarmUpdaters(IEnumerable<IRealVectorSwarmUpdater> swarmUpdaters) {
+      foreach (var su in swarmUpdaters) {
+        su.RealVectorParameter.ActualName = Name;
+      }
+    }
+    private void ConfigureParticleCreators(IEnumerable<IRealVectorParticleCreator> particleCreators) {
+      foreach (var particleCreator in particleCreators) {
+        particleCreator.RealVectorParameter.ActualName = Name;
+        particleCreator.BoundsParameter.ActualName = BoundsParameter.Name;
+        particleCreator.ProblemSizeParameter.ActualName = LengthParameter.Name;
+      }
+    }
+    private void ConfigureParticleUpdaters(IEnumerable<IRealVectorParticleUpdater> particleUpdaters) {
+      foreach (var particleUpdater in particleUpdaters) {
+        particleUpdater.RealVectorParameter.ActualName = Name;
+        particleUpdater.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+    private void ConfigureShakingOperators(IEnumerable<IRealVectorMultiNeighborhoodShakingOperator> shakingOperators) {
+      foreach (var shakingOperator in shakingOperators) {
+        shakingOperator.RealVectorParameter.ActualName = Name;
+        shakingOperator.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+    private void ConfigureBoundsCheckers(IEnumerable<IRealVectorBoundsChecker> boundsCheckers) {
+      foreach (var boundsChecker in boundsCheckers) {
+        boundsChecker.RealVectorParameter.ActualName = Name;
+        boundsChecker.BoundsParameter.ActualName = BoundsParameter.Name;
+      }
+    }
+    private void ConfigureMoveOperators(IEnumerable<IRealVectorMoveOperator> moveOperators) {
+      foreach (var moveOperator in moveOperators)
+        moveOperator.RealVectorParameter.ActualName = Name;
+    }
+
+    private void ConfigureMoveGenerators(IEnumerable<IRealVectorMoveGenerator> moveGenerators) {
+      foreach (var moveGenerator in moveGenerators)
+        moveGenerator.BoundsParameter.ActualName = BoundsParameter.Name;
+    }
+
+    private void ConfigureAdditiveMoveOperator(IEnumerable<IAdditiveRealVectorMoveOperator> additiveMoveOperators) {
+      foreach (var additiveMoveOperator in additiveMoveOperators) {
+        additiveMoveOperator.AdditiveMoveParameter.ActualName = Name + ".AdditiveMove";
+      }
+    }
+    #endregion
+  }
+
+  public static class IndividualExtensionMethods {
+    public static RealVector RealVector(this Individual individual) {
+      var encoding = individual.GetEncoding<RealVectorEncoding>();
+      return individual.RealVector(encoding.Name);
+    }
+    public static RealVector RealVector(this Individual individual, string name) {
+      return (RealVector)individual[name];
+    }
+  }
+}
Index: stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/EmptySymbolicExpressionTreeGrammar.cs
===================================================================
--- stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/EmptySymbolicExpressionTreeGrammar.cs	(revision 11995)
+++ stable/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/EmptySymbolicExpressionTreeGrammar.cs	(revision 12005)
@@ -136,7 +136,7 @@
     }
     
-    #pragma warning disable 0169 //disable usage warning
+    #pragma warning disable 0067 //disable usage warning
     public event EventHandler Changed;
-    #pragma warning restore 0169
+    #pragma warning restore 0067
     #endregion
   }
Index: stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/CrowdingDistanceAssignment.cs
===================================================================
--- stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/CrowdingDistanceAssignment.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/CrowdingDistanceAssignment.cs	(revision 12005)
@@ -33,5 +33,5 @@
   [Item("CrowdingDistanceAssignment", "Calculates the crowding distances for each sub-scope as described in Deb et al. 2002. A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II. IEEE Transactions on Evolutionary Computation, 6(2), pp. 182-197.")]
   [StorableClass]
-  public class CrowdingDistanceAssignment : SingleSuccessorOperator {
+  public class CrowdingDistanceAssignment : SingleSuccessorOperator, IMultiObjectiveOperator {
 
     public ScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
Index: stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs
===================================================================
--- stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/FastNonDominatedSort.cs	(revision 12005)
@@ -37,5 +37,5 @@
 Genetic Algorithm: NSGA-II"", IEEE Transactions On Evolutionary Computation, Vol. 6, No. 2, April 2002")]
   [StorableClass]
-  public class FastNonDominatedSort : SingleSuccessorOperator {
+  public class FastNonDominatedSort : SingleSuccessorOperator, IMultiObjectiveOperator {
     private enum DominationResult { Dominates, IsDominated, IsNonDominated };
 
Index: stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs
===================================================================
--- stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization.Operators/3.3/MultiObjective/RankAndCrowdingSorter.cs	(revision 12005)
@@ -29,5 +29,5 @@
 
 namespace HeuristicLab.Optimization.Operators {
-  public class RankAndCrowdingSorter : AlgorithmOperator {
+  public class RankAndCrowdingSorter : AlgorithmOperator, IMultiObjectiveOperator {
     public ValueLookupParameter<BoolArray> MaximizationParameter {
       get { return (ValueLookupParameter<BoolArray>)Parameters["Maximization"]; }
Index: stable/HeuristicLab.Optimization.Operators/3.3/TabuMaker.cs
===================================================================
--- stable/HeuristicLab.Optimization.Operators/3.3/TabuMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization.Operators/3.3/TabuMaker.cs	(revision 12005)
@@ -31,5 +31,5 @@
   [Item("TabuMaker", "Base class for all operators that set a move tabu.")]
   [StorableClass]
-  public abstract class TabuMaker : SingleSuccessorOperator, ITabuMaker {
+  public abstract class TabuMaker : SingleSuccessorOperator, ITabuMaker, ISingleObjectiveOperator {
     public override bool CanChangeName {
       get { return false; }
Index: stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.Designer.cs	(revision 12005)
@@ -0,0 +1,149 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization.Views {
+  partial class CreateNewSingleEncodingDialog {
+    /// <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 Windows Form 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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CreateNewSingleEncodingDialog));
+      this.label1 = new System.Windows.Forms.Label();
+      this.encodingTypeComboBox = new System.Windows.Forms.ComboBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.encodingNameTextBox = new System.Windows.Forms.TextBox();
+      this.okButton = new System.Windows.Forms.Button();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(22, 20);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(34, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "Type:";
+      // 
+      // encodingTypeComboBox
+      // 
+      this.encodingTypeComboBox.DisplayMember = "Name";
+      this.encodingTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+      this.encodingTypeComboBox.FormattingEnabled = true;
+      this.encodingTypeComboBox.Location = new System.Drawing.Point(66, 17);
+      this.encodingTypeComboBox.Name = "encodingTypeComboBox";
+      this.encodingTypeComboBox.Size = new System.Drawing.Size(232, 21);
+      this.encodingTypeComboBox.TabIndex = 1;
+      this.encodingTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.encodingTypeComboBox_SelectedIndexChanged);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(22, 47);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(38, 13);
+      this.label2.TabIndex = 2;
+      this.label2.Text = "Name:";
+      // 
+      // encodingNameTextBox
+      // 
+      this.encodingNameTextBox.Location = new System.Drawing.Point(66, 44);
+      this.encodingNameTextBox.Name = "encodingNameTextBox";
+      this.encodingNameTextBox.Size = new System.Drawing.Size(232, 20);
+      this.encodingNameTextBox.TabIndex = 3;
+      this.encodingNameTextBox.TextChanged += new System.EventHandler(this.encodingNameTextBox_TextChanged);
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.Location = new System.Drawing.Point(142, 70);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 4;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      this.okButton.Click += new System.EventHandler(this.okButton_Click);
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(223, 70);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 4;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // CreateNewSingleEncodingDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(320, 105);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.encodingNameTextBox);
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.encodingTypeComboBox);
+      this.Controls.Add(this.label1);
+      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "CreateNewSingleEncodingDialog";
+      this.ShowInTaskbar = false;
+      this.Text = "Create new encoding";
+      this.Load += new System.EventHandler(this.CreateNewSingleEncodingDialog_Load);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.ComboBox encodingTypeComboBox;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.TextBox encodingNameTextBox;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.Button cancelButton;
+  }
+}
Index: stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.cs	(revision 12005)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Optimization.Views {
+  public partial class CreateNewSingleEncodingDialog : Form {
+    private HashSet<string> forbiddenNames;
+    public IEnumerable<string> ForbiddenNames {
+      get { return forbiddenNames; }
+      set { forbiddenNames = new HashSet<string>(value); }
+    }
+
+    public Type EncodingType { get; private set; }
+    public string EncodingName { get; private set; }
+
+    public CreateNewSingleEncodingDialog() {
+      InitializeComponent();
+      forbiddenNames = new HashSet<string>();
+    }
+
+    private void CreateNewSingleEncodingDialog_Load(object sender, EventArgs e) {
+      encodingTypeComboBox.Items.Clear();
+      var encodings = ApplicationManager.Manager.GetTypes(typeof(IEncoding));
+      foreach (var enc in encodings) {
+        if (enc != typeof(MultiEncoding))
+          encodingTypeComboBox.Items.Add(enc);
+      }
+      if (encodingTypeComboBox.Items.Count > 0)
+        encodingTypeComboBox.SelectedIndex = 0;
+      else encodingTypeComboBox.SelectedIndex = -1;
+    }
+
+    private void encodingNameTextBox_TextChanged(object sender, EventArgs e) {
+      EncodingName = encodingNameTextBox.Text;
+      SetEnabledStateOfControls();
+    }
+
+    private void encodingTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) {
+      if (encodingTypeComboBox.SelectedIndex >= 0)
+        EncodingType = (Type)encodingTypeComboBox.SelectedItem;
+      else EncodingType = null;
+      SetEnabledStateOfControls();
+    }
+
+    private void SetEnabledStateOfControls() {
+      okButton.Enabled = EncodingType != null
+                         && !string.IsNullOrEmpty(EncodingName)
+                         && !forbiddenNames.Contains(EncodingName);
+    }
+
+    private void okButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.OK;
+      Close();
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      DialogResult = DialogResult.Cancel;
+      Close();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.resx
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.resx	(revision 12005)
+++ stable/HeuristicLab.Optimization.Views/3.3/CreateNewSingleEncodingDialog.resx	(revision 12005)
@@ -0,0 +1,1787 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAUAEBAAAAEAIABoBAAAVgAAACAgAAABACAAqBAAAL4EAAAwMAAAAQAgAKglAABmFQAAQEAAAAEA
+        IAAoQgAADjsAAICAAAABACAAKAgBADZ9AAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR/gAbk/YAAAAAABuS9gAAAAAAGpD2AAAAAAAAAAAAAAAAABuQ
+        9QAAAAAAAAAAAByS9QAAAAAAAAAAAAAAAAAakfUAAAAAABuR9QIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJD2QAAAAAAAAAAAGo/4CBuR9f8akPVCAAAAABuT9gAAAAAAG5H1/xuR9YEbkPYUG5H1/xqR
+        9v8bkfX/G5H1/xuS9P8bkfX/GpH1QwAAAAAbkfX/G5H1eQAAAAAAAAAAAAAAABuR9cgbkPSjAAAAABuR
+        9f8dkfWZG5H1QRyR9kAbkfWrG5L1TwAAAAAAAAAAHJH1zhuR9p4AAAAAAAAAAAAAAAAckvaHG5H15QAA
+        AAAbkfXkHJH2hgAAAAAAAAAAAAAAAAAAAAAbkvUAAAAAABuS9YwbkfXiGpHzJhuS9TQbkfQwG5H1fhuR
+        9f8AAAAAG5L1qhuR9cUAAAAAHJD2AAAAAAAbkfYAAAAAAAAAAAAbkfVqG5H1/xuR9f8akfX/G5H1/xuR
+        9f8bkfX/GpLzFhuQ9n0bkfX/AAAAABiQ9gAAAAAAAAAAAAAAAAAAAAAAG5H2KRuR9f8ckfYcI5D3Ax+U
+        /AUAAAAAG5H1/xyR9VEckvVBG5H1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckfX/GpH1TgAA
+        AAAAAAAAAAAAABuR9esakfWBGI7xBhyR9f8akfQwAAAAAAAAAAAAAAAAAAAAABuS9QAAAAAAG5L1+huR
+        9YAAAAAAGpH1AAAAAAAbkfalG5H0ugAAAAAbkfX/HJL1bwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+        9ccbkfXIAAAAAAAAAAAAAAAAG5L17BuR9f8dkvMXG5H17BqR9Z0AAAAAAAAAAAAAAAAAAAAAAAAAABuR
+        9QEAAAAAAAAAABuR9QEbkfQAAAAAAB6P9w8akfXwAAAAAAAAAAAAAAAAG5H1AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9gAAAAAAAAAAABqR9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5L1AAAAAAAckvQAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//AAD//wAA//8AALyBAAC8mwAAnJ8AAJ6fAADA3wAA3t8AAN5fAADOXwAAzk8AAP9/
+        AAD//wAA//8AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//////////////////////////////78fxwAPH8cABx/HAB8f5x+/H+Mf/5/jH/+f4
+        5//j+OP/4ADj/+AA4//j/GP/8/xj//H8c//x/HH/8f5x//H+cf/5/BH/+f4x///+P////3//////////
+        ////////////////////////KAAAADAAAABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpD2AByX+AAAAAAAAAAAABuT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2AByT9gAbkvcAHJL2AByS9wAAAAAAHJL3AAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAbkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJH2AByS9gIAAAAAHJH1TRuS
+        9v8bkfb/G5H1TgAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2AByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAek/YAAAAAABuR9ocbkvXlGpL2DgAAAAAakPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvUAAAAAABuR9hEbkvUuAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakfgAHJL1AQAAAAAAAAAAHZH2ABuS9QAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9gAckvUBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAD///////8AAP//
+        /////wAA////////AAD///////8AAP///////wAA////////AAD//////x8AAMH/w8AADwAA4f/D4AAD
+        AADh/8HgAAMAAOH/4eAADwAA4f/h4f8fAADg/+Hh//8AAPD/4eD//wAA8P/h8P//AADw//Dw//8AAPD/
+        8PD//wAA8P/w8P//AADwAADw//8AAPgAAPD//wAA+AAAeH//AAD4AAB4f/8AAPg/+Hh//wAA+D/4eH//
+        AAD8P/h4f/8AAPw/+Hg//wAA/D/8PD//AAD8P/w8P/8AAPw//Dw//wAA/B/8PD//AAD+H/w8P/8AAP4f
+        +Awf/wAA/h/4Dh//AAD+H/weH/8AAP///h///wAA////P///AAD///8///8AAP///////wAA////////
+        AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AACgA
+        AABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/YAAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAbkvcAAAAAAAAAAAAbk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqQ9gQbk/cUAAAAAEac7AAckvYAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AByS
+        9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyR
+        9oEAAAAAAAAAAByS9gAfkPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9ikdk/crG5P3LhyS
+        9zEck/c0HJL3LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZb3ARyS9hQckvcSHZP3Eh2R9hIbkfcTIJX0BAAAAAAck/cAAAAAAAAAAAAAAAAAHJL2ExyQ
+        9hIckvUSHZP3EhyS9hIdkvYSHJL2Eh2T9xIdkfYSHZP3EhyU9xIck/YSHZH2EhyT9xIck/cSG5D2EhyT
+        9xIckfYSG5r9AhyS9/8ckvb/HJL2+hyS9kAAAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAHZP2AAAA
+        AAAckvbSHJL2/xyS9v8ckvb/HZP2/xyS9v8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvb/HJL2/xyS9v8ck/f/HZL2/xuS9ooAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9u4ck/b/HJL2/x2S9/8ck/f/HJP3/xyS9/8ckvb/HJP3/xyS9v8ckff/HJL2/xyT
+        9/8ckvb/HJL2/x2T9/8ckfb/HJL2/xyS9v8ckvb9HJL2/xyS9v0ckvb/HJL2xR+R+AcAAAAAAAAAAByS
+        9wAAAAAAAAAAAByS9gAAAAAAG5H3hh2T9v8ckvb+HJL2/hyS9v4ckvb/IZ3/AQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9gAAAAAAHJL2zRyS9v8ckvb+HJL2/hyS
+        9v8ckfbAAAAAAAAAAAAAAAAAG5H1AAAAAAAckvevHJL1/xyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvf+HJL2/hyS9v4ck/b9HJL2/hyS9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyT
+        9v8ckvb/HJP1ggAAAAAAAAAAHZL2AAAAAAAAAAAAAAAAAB2S91Yckvb/HJL2/hyS9v4ckvb/HJL2/xyS
+        9ikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlPQAAAAAAByS
+        9pYckvb/HJL3/hyS9/4ckvf/HJL29AAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2fByS9v8ckvb+HJL2/hyS
+        9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/hyS9v8ckvf/HJP2/hyR9/8ckvb/HJL2/hyS
+        9v4ckvb/HJL3/xyS9v4ckvf+HZL2/hyS9/8ckvb/HZH1IQAAAAAAAAAAHJL2AAAAAAAakvQYHJL2/xyS
+        9v8ckvb+HJL2/xyS9v8bkvZXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvZhHJL2/xyS9v4ckvb+HJL2/hyS9v8dk/cJAAAAAAAAAAAAAAAAAAAAAB2S
+        9kwckvb/HJL2/hyS9v4ckvb/HJL2/xyS9v4ckvb+HJL2/hyS9v8ckfb/HJL2/xyS9/4ckvb/HJL2/xyT
+        9/4ckvb/HJL2/xyS9v4ckvb+HJL2/xyS9v8ckvb+HJL2/hyS9v8ckvb+HJL2RgAAAAAckvUAAAAAAAAA
+        AAAAAAAAAAAAAByS9v8dkvb+HJP2/hyS9f8ckvb/HZP2kQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        9v8dk/b+HZP2/hyS9v4dk/f/HZL3KwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJP2SxyS9v8ckvb+HJL2/hyS9v4ckvb/AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAbkvaCHZL2/x2T9v4dk/b+HJL2/hyS9v8AAAAAAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvb/HJL2/xyS9/8ckvb/HZL3/RyS9/8ckvb/HJH2/xyS9v8ckvb/HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8ckvb+HJL2/xyS9v8ckvb/HJL2/xyS
+        9j0AAAAAAAAAAAAAAAAAAAAAHZP3TB2S9v8ckvb/HJL3/xyS9v8ckvf/HJL2DwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL26R2S9v8dkvb/HJL2/hyS9v4dkvb+HJH2/hyR
+        9v8ckfb/HZL2/hyR9v8ckfb/HJL2/hyR9v8ckfb/HJL2/h2S9v4dkvb/HZL2/xyS9v4ckvb+HZL2/hyR
+        9v8ckfb/HJH2/xyT9/8ckfVrAAAAAAAAAAAAAAAAAAAAABuR9R8ckvb/HZL2/x2S9v8ckvb+HJL2/xyS
+        9kUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAByS9q0ckvb/HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9/4ckvb+HJL2/hyT9v0ckvb+HJL2/hyS9v4ckvb+HJL2/hyS
+        9v4ckvb+HJL2/hyS9v4ckvb+HJL2/hyS9v4ck/f/HJL2pwAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2/xyS
+        9v4ckvb+HJL2/hyS9v8ckvdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvZ+HJL2/xyS9/8ckvb+HJL3/hyS9/4ckvb/HJH2/xyS9v8ckvf+HJL2/xyS9/8ck/b+HJH3/xyS
+        9v8ckvb+HJL2/hyS9v8ckvf/HJL2/hyS9/4ckvf+HJL2/xyR9v8ckvb/HJL3/xyS9tIAAAAAHJL2AAAA
+        AAAAAAAAAAAAAByS9uYckvb/HJL3/xyS9v4ck/b/HJL1qAAAAAAdkvYAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAG5L2QByS9v8ckvb/HJL2/hyS9v4dk/b+HJL2/xyR9v8ckvb/HJP2/xyS
+        9v8ckvb/HJP2/xyS9v8ckvb/HJL2/xyS9v8ck/b/HJP2/xyS9v8ckvb/HJP3/xyS9v0ckfb/HJL2/xyS
+        9/8ckvb/AAAAAAAAAAAdk/YAHJP3AAAAAAAckvesHJL2/xyS9v8ckvb+HJL2/xyS9tMAAAAAHJL2AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9hUckvb/HJL1/xyS9v4dkvb+HJL2/x2S
+        9rYckvd1HZL3eB2T93gck/Z4HZL3eByS9ngdkvd4HJP2eB2T93gdkvd4HJL3eByT93gdkvd4HJP2dx2R
+        944dk/b/HJH1/xyS9v8ck/f+HJL2/x6V+A0AAAAAAAAAAAAAAAAAAAAAHJL2fxyS9v8ckvX/HJL2/h2S
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbk/YAAAAAAByS9tcckvb/G5L2/hyS
+        9v8bkfVEAAAAAByS9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAII34AAAA
+        AAAAAAAAHJL2/xyS9v8ckvbyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdkvcAAAAAABqR+CIckvb/G5L2agAAAAAck/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL2ABqS+AAAAAAAHJL2cCWU7gEAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YAHJL2AAAA
+        AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ///////////8//////////x/4H//A+AAAB/gf/8D4AAAB/B//wPwAAAD8H//g/AAAAfwP/+D8AAAD/A/
+        /4PwP/w/8D//gfA//P/4P/+B8D/9//g//8HwP///+D//wfg////4H//B+D////gf/8D4P///+B//wPgf
+        ///8H//A+B////wf/+D4H////AAAAPwf///8AAAA/B////wAAAB8H////gAAAHwP///+AAAAfA////4H
+        /+B+D////gf/8H4P///+B//wfg////4H//A+B////wf/8D4H////B//4Pgf///8H//g/B////wP/+D8H
+        ////A//4Hwf///8D//gfA////4P/+B8D////g//8HwP///+D//AHg////4H/8AeD////gf/4B4P////B
+        //wPg////////A/////////+H/////////8f/////////7//////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////8oAAAAgAAAAAABAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAIJX1AB2T9gIclvsAHYvvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOY9AAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAABuS9xgck/d9HZT4BwAAAAAAAAAAHJH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5P2ExyT9v8dkvfnHJP2VQAA
+        AAAAAAAAHZP2ARqR9gAdkvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAbkvYSHJL39R2T9v8dkvf/HZL3shyS9yQAAAAAAAAAAB2S9wAdk/YAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAB2T
+        9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZT2AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR9wAdk/YAAID/AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByV9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeT9wYck/f2HZL3/x2T
+        9/8dk/b/HJL3/xyT9oEck/UKAAAAAB+R9wEbk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9kQdk/d5HZP3bh2T93Ick/d0HJP3dx2T
+        93kckvd8HZP3fhyT94AckveLHZP4RQAAAAAckvgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZT3Cx2T90AckvZHHJP3RR2S90Udk/dFHZP3RR2S90Udk/dFHZP3RRyS
+        90cdk/Y4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByn7QAck/Y0HZL3SRyS
+        9kUdkvdFHJL2RR2T9kUdk/dFHZP3RR2T90Uck/dFHZP3RR2T90Uck/dFHZL3RR2T90Udk/dFHZL3RR2T
+        90Udk/dFHZP3RRyT90Udk/dFHJP2RR2T90UdkvdFHZP3RRyT90Udk/dFHJP3RR2T90UdkvdFHJL3RR2S
+        90Uck/dFHJL2RR2S90Udk/dCHJP3UxyT9/kdk/f/HZP2/hyS9/8dk/b/HZL3/x2S990ck/ZWAAAAAAAA
+        AAAAAAAAHJL2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2jR2T9/8dk/f/HZP2/x2T9v8dkvb/HZP3/x2T9/8dk/b/HZP3/xyS9/8dk/e0AAAAAByS
+        9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/YXHJP21h2S
+        9/8ckvb6HZP3+h2T9/ockvb6HZP3+hyT9/odk/f6HZP3/RyS9u8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9qsckvf/HJP2+h2T9/odk/f6HJL2+h2S9/odk/f6HZP3+hyT
+        9/odk/f6HJP3+hyS9/odk/f6HZP3+hyS9vodk/f6HJP3+h2T9/ockvb6HJL3+h2S9/ock/b6HZL3+h2T
+        9/ock/f6HJL2+h2T9/ockvb6HZP3+h2T9/odk/f6HZL2+hyS9/ockvb6HZP3+hyT9/odkvb7HZP3/hyT
+        9/8dk/f/HJL2/x2S9/4ck/b6HZL2/xyT9/8ck/ezHJL2IgAAAAAAAAAAHpL3ABuT9wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHI3xAAAAAAAdk/dZHJP2/xyS9/8dk/b/HJP3/xyS
+        9v8dkvf/HJP2/x2T9v8dk/b/HZP3/xyS9tMAAAAAHpT3AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvbBHZP3/x2S9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T
+        9/8dkvb/HJP3/xyT9yMAAAAAHJP3AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACue8QAAAAAAHJL3jh2T
+        9v8dk/f/HZP3/x2T9/8dkvb/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZL2/x2T
+        9/8dk/f/HZP3/xyS9v8dkvf/HZL3/x2T9/8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9v8dk/f/HZP3/x2T
+        9/8dkvb/HZL3/x2S9/8dk/f/HJP2/xyS9v8dkvf/HZP2/h2S9v8dkvb/HZL2/xyT9/8ck/f+HZL2/x2S
+        9v8ckvf/HZL3gBuT9ggAAAAAAAAAAAAAAAAckvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9y4ckvf8HZP2/x2T9/8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS9v8dkvb/HJP34xyU
+        +BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95wck/b/HJL2/x2T9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyT9v8dkvf/HZL3VAAAAAAdkvcCAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/ZlHJL3/x2T9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+        9/8dk/f+HJL3/xyS9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T
+        9/4ckvb/HJL2/xyS9v8ckvb/HJL2/xyS9v8dk/f/HZP3/RyT9v8dk/b/HJL32xyT9lMAAAAAAAAAAAAA
+        AAAck/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxmNYAAH7/AByS9/Adk/b/HZP2/xyT
+        9v4dk/f/HZP3/h2T9v4dk/b+HZP3/hyS9v8dk/f2HZP3PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9QAAAAAAHZP3ax2T9v8dkvf/HJP3/h2T9/4dk/f/HZP3/h2T
+        9/4dk/f+HZP3/xyS9v8dk/aIAAAAAByT9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T
+        9zsdk/f/HJL2/xyS9v4ck/b+HZP3/x2T9/4dk/b+HZP2/h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T
+        9/8dk/f+HZP3/h2T9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT
+        9/4ck/b+HZP3/x2T9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT
+        9/4dk/f+HZP2/hyS9v8dkvf/HZP2/x2T9rYdkvcrAAAAAAAAAAAek/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gIAAAAAHZP30RyS9v8dkvf+HZP2/x2S9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2S
+        9v8ck/ZdAAAAAB2S9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdkvZAHZL2/xyT9/8dk/f/HZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP2/xyT97YAAAAAHZP2BQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2FRyS9vYdk/f/HZL2/x2T9v8dkvf/HZL3/x2T
+        9v8dk/b/HZP3/x2T9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T
+        9v8dkvf/HZP3/x2T9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S
+        9/8dkvf/HZP2/x2T9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9v4ckvf/HZP3/xyS
+        9vwdk/eEH5L2EAAAAAAWmP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AQAAAAAdkvefHJP2/x2S
+        9/0ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvb/HJP2/x2S938AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9xIck/f8HZL2/xyT9/8dk/f+HJL3/x2T
+        9/4ckvf/HJL3/xyT9/4dkvb/HJP30gqT+AAgkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR
+        9QEAAAAAHZP36RyS9v8ckvb+HJP3/hyS9/8dk/f+HJL2/xyT9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T
+        9/4ckvf/HZP3/hyS9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS
+        9/8ck/f+HJP3/hyS9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS
+        9v8ck/f+HZP3/hyS9/8dk/f+HZL3/x2T9/8ckvf7HJP3/x2T9v8dkvaOAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAck/YAAAAAAByT9modkvf/HJP2/ByT9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyT
+        9v4dkvf/HJP2pgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAelPUBAAAAAByS9+Mdk/b/HJL3/h2T9/8dk/f/HZP3/x2T9/8dk/f/HZP3/h2S9/8ck/bpHJL2JgAA
+        AAAAqv4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AgAAAAAdkva+HJP3/x2T9v0ck/f/HZP3/x2S
+        9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S
+        9/8ck/f/HZL3/x2T9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT
+        9/8dk/f/HZL3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9v4dk/f+HZL2/xyT
+        9/8dk/fkHJL2VQAAAAAolP8AHZH2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9gAAAAAAHJL2Ox2T
+        9/8ckvb6HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/x2T9v8ckvfJHJL3CwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP2sxyS9/8dk/f9HZP3/hyS
+        9v8dk/f+HJL2/xyS9/8ckvb/HJP3/x2S9v8dk/dIAAAAAByR9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvYBAAAAAB2T95Mckvb/HZL3/B2T9/4ckvb/HZP3/hyS9v8ck/b/HJL2/xyS9v8ck/b/HJL2/x2T
+        9/4dk/f+HJL2/x2T9/4ckvb/HJL3/xyS9v8ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9/8ckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/4ckvb/HJL2/xyS9v8ckvb/HZP3/hyS9v8dk/f+HJL2/xyT9v8ckvb/HJL2/xyT
+        9v8ckvb/HZP3/h2T9/8ckvb+HJL3/x2T9/8ck/f/HZL2kR2S9hIAAAAAH5L4AQBVuAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvcbHJL2+x2T9/4dk/f+HZL2/x2T9/4dk/b/HZP2/x2T
+        9v8dk/b/HJP3/x2T9vEdk/ccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2AAAAAAAdk/Z9HJL3/x2T9vsdk/f+HZL2/x2T9/4dk/b/HZP3/xyS9v8dk/f/HZL2/xyT
+        924AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHJL2Yx2T9/8ckvb7HZP3/h2S
+        9v8dk/f+HZP2/x2T9v8dk/b/HZP2/x2T9/4dkvf/HZP3/R2T9/0dk/f9HZP3/R2T9/0dk/f9HZP3/R2S
+        9/0dkvf9HJP2/R2S9/0dk/f9HZP2/RyS9/0dk/b9HZL3/R2T9/0dk/f9HZP3/R2S9/0dkvf9HZP3/R2T
+        9/0dk/b9HZP2/R2S9/4dk/b/HZP2/x2T9v8dk/b/HZP2/x2S9/8ck/b/HZP3/RyS9/8dkvb/HJL2yRyS
+        9zcAAAAAAAAAAB+V9gAakfcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2U
+        9g4dk/bUHJL3/x2T9/4dk/b/HZP3/hyT9v8dkvb/HJP2/x2T9v8ckvb6HZP3/xyT9i4AAAAAGpP2AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cAAAAAAByT904dkvb/HJP3+h2T
+        9/4dk/b/HZP3/hyT9v8dk/f/HJP2/x2S9v4dk/f/HJL2lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZT3AAAAAAAdk/c4HJL3/x2T9vodk/f+HZP2/x2T9/4ck/b/HZL2/xyT9v8dk/b/HZL3/x2T
+        9v0dkvf/HZL3/x2S9/8dk/f/HZP3/x2T9/8ckvb/HJL2/x2S9v8dk/b/HJL3/x2T9/8dk/f/HJP2/xyT
+        9/8ck/b/HJP2/x2T9v8dk/b/HZP2/x2S9v8ck/b/HZL2/xyT9/8dkvb/HZP3/xyT9v4dkvb/HJP2/x2T
+        9v8dk/f/HJP3/h2S9/8dkvb/HJP3+hyT928AAAAAAAAAAB+V+gAAAAAAHpH2AAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT96kdkvb/HJP3/x2S9/8dk/f+HJL2/x2T
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6Q+QEAAAAAAAAAAAAAAAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckvYDAAAAAByT9ngckvf/HJP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS
+        9v8dk/f/HJL3kQAAAAAdk/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdkPgBAAAAAByT9tsckvf/HZL2/x2T9/4dk/f+HZP3/hyS9v8dk/f+HZL3/xyT9v8dkvf1HZH3HAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByR9g4dkvbeHZP3/x2S9v8dk/f+HZP3/h2T
+        9/4dk/f+HZP3/h2T9/4dk/b/HJL3+xyR9yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAekPkAAAAAAByT
+        9wIdkvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wEAAAAAHJL3QxyS
+        9/8ckvf+HZL3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HJL3/hyT9v8dkve2AAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wQAAAAAHJL2thyT9/8ckvb+HZP3/h2T
+        9/4dk/f+HJL2/x2S9/4dkvf+HJP3/xyS9v8dkvZLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/cEAAAAAB2S9sgdk/f/HZL2/h2S9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyS9/8dk/b/HZP2TQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZP2AAAAAAAdk/YVHZP3/x2T9/4dkvf/HZP2/x2T9v8dk/f/HZP3/x2T
+        9/8dkvb/HJL2/x2T99Adk/kOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL3AgAAAAAdk/aFHZL3/x2S9v4dk/f/HZP3/x2T9/8dk/b+HZL3/x2S9v8dk/b/HJP3/x2S
+        9nQAAAAAHJT3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9gQAAAAAHJP3pR2S9v8dk/f+HZL3/x2T
+        9v8dk/b/HZP3/x2T9/8dk/f/HZP2/xyS9v8ckvdxAAAAAB2T9gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAdk/bmHZP3/x2S9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2S9/8dkvb/HJP37hyS9yoAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAByT91Ack/f/HJP3/R2T
+        9/8dk/f/HZP3/xyT9v8ckvf/HZL3/xyT9v4ckvb/HZP3nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2AwAAAAAckvZzHJL2/xyS9v4dkvf/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvb/HJP3/x2T
+        9poAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS97gckvb/HZL3/h2T9v8dk/b/HZP2/x2T
+        9v8dk/b/HZL2/x2T9/8ckvb/HZP3QQAAAAAZkfYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAByS9gAAAAAAHJL2IByS9v8ckvb9HZP3/h2T9v8dk/b/HZP2/x2S9v8dkvb/HZP2/h2S
+        9v8ck/e/HJb6AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cBAAAAAB2T90cdk/f/HZP3/h2S
+        9/4dk/b/HZP2/x2T9v8dk/b/HZP2/xyS9v4ckvb/HJL3tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL2jByT9/8dk/f+HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL2/hyS9v8dk/dhAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvYHHZL28x2S
+        9v8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJP3/x2S9t8ckvYaAAAAADOZ/wAAAAAAAAAAAAAA
+        AAAAAAAAAAAAABuS9gAAAAAAHJL2GRyS9v8ckvb+HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZP3/xyT
+        9v8dkvfOHZP3DQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/dbHZL2/x2S9/8dk/b/HZP2/x2T
+        9/8dk/f/HZP3/x2S9v8ck/f+HZP2/xyS95EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvfCHJP2/x2T9/8dk/f/HZP3/xyS9v8ckvf/HZL2/xyT
+        9v8dkvf/HJP2/x2S9zMAAAAAGZP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL27hyS
+        9v8dkvf/HZP2/x2T9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9ukdkvYlAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAij/UAAAAAAByT9z0dkvb/HZP3/xyT9v8dk/b/HJP3/x2T9/8ck/f/HJL2/x2T9/4dk/f/HZP2ugAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95gck/b/HZP3/hyT9/8dk/f/HJP2/xyS9/8dkvb/HJP2/x2T9/4ckvf/HZP2UQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAakvYAAAAAAAAAAAAck/bDHJL3/x2T9/4ck/b/HZP2/xyT9/8dk/f/HJP3/xyS
+        9v8dk/f/HJP2/x2S9zsAAAAAHZP2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq/gAAAAAAHZL2IByS9uQdk/f/HZP2/x2T
+        9v8dk/b/HZP2/x2T9v8dkvb/HZP3/hyS9/8ckvfqF4T/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL3aByT9v8ck/b/HZP2/x2T9/8ckvb/HZL2/x2S
+        9v8dk/b/HJL3/h2S9/8ck/aFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S
+        95Qck/b/HZL3/x2T9v8dk/b/HZP2/x2T9v8dk/b/HZL2/x2T9/4ck/b/HZL3WwAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdlfkGHZP3yByS9v8dk/b+HZP2/xyT9v8dk/b/HJP2/xyS9v8ck/f+HJL3/hyS
+        9/8bkvcSAAAAABqR9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL3AAAA
+        AAAck/ZHHZL3/x2T9/8ck/b/HZP2/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP2/xyS97QAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3ah2T9v8dk/f+HJP2/x2T9v8ck/b/HZP2/xyT
+        9v8ckvb/HJP3/h2S9v8ck/eDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/asHZL3/x2S
+        9v4dk/f+HZP3/h2T9/4dk/f+HZL3/hyT9/4ck/b+HJP2/xyT9j8AAAAAHJP2AQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9ysdk/btHJL3/x2T9/4dk/f+HJL2/xyS
+        9/4dkvf+HJP3/h2S9/8ck/f/HZL25QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAck/ZHHZL3/x2S9/8dk/f+HZP3/h2T9/4dk/f+HZP3/h2S9/4ck/f/HZP2/xyS96sAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdk/gAAAAAAByS9oEdk/f/HZP2/x2T9v8dk/b/HZP2/x2T9v8dkvb/HJP2/x2T
+        9/4dk/f/HZL3cQAAAAAdk/cDHZP3AByT9wAdk/YAHJL3AB+V8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGpn2BxyT9s8dkvf/HZP2/x2T9/8dk/b/HJL2/x2S9v8ck/b/HZL3/xyS9v8dk/f/HpP3EgAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAakvgAAAAAAB2T9iwckvfxHZL3/x2T9v8dk/b/HZP2/x2T
+        9v8dk/b/HZL2/xyT9v8ckvf/HZL22QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2Vh2S
+        9/8dk/f/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/h2T9/8dk/ecAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfmPkEH5v5BB+a+QQfmvkEH5r5BCCd
+        +gQdkfcIHo/zCx6P8wsej/MLHo/zCx6P8woekPQLHpL4EB6Q+A84hP8AHZP3uxyS9v8dk/f+HZP3/hyS
+        9v8dk/f+HZP3/h2T9/4ckvf/HZP2/xyS9/8ckvdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2FByT9tYdkvf/HZP3/h2T9/4dk/f+HZP3/h2T9/4dk/f+HZP3/hyT9/8ck/f/GpT3BgAA
+        AAAPmvcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YnHZP2/ByS9/8dk/f/HZP3/x2T9/8dk/f/HZP3/xyT
+        9/8dk/f/HZP3/x2T9/4dk/fxHZP3+B2T9/kckvf4HZL2+B2T9vgckvf4HJL2+R2T9vkdk/b5HZP2+R2T
+        9vkdk/b5HZP2+R2T9/odk/f6HZP3+h2T9/odk/f6HZP3+h2S9/sdkvb7HZL2+x2S9vsdkvb7HZL2+x2S
+        9vsdkvf8HZL3/B2S9/odkvf8HJP2/x2T9/8dk/f/HJL2/xyT9/8dk/f/HJP3/x2S9/8ck/f/HZL2/xyS
+        9nUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3uB2S9v8dk/f+HZP3/x2T
+        9/8dk/f/HZP3/x2T9/8ck/f/HJP3/hyT9/8ck/YtAAAAAByT9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZHvAAAA
+        AAAck/fyHZL2/x2T9v8ckvf/HZL3/xyT9/8ckvb/HJL3/x2S9/8dkvf+HZP3/xyS9/8ckvb/HZP3/xyS
+        9/8dkvb/HJL3/x2T9v8dk/f/HJL3/xyS9/8ckvf/HJL3/xyS9/8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS
+        9v8ckvb/HJP2/xyT9/8ck/f/HJP3/xyT9/8ck/f/HJP3/xyT9v8ck/b/HJP2/xyS9v8dkvf+HJL3/x2S
+        9/8ckvb/HJL3/x2S9v8ckvb/HZL3/x2S9/8ckvb/HZP3pQAAAAAbjfMAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdk/eaHZL2/x2S9v8dk/b/HJL3/x2S9/8ck/f/HJL2/xyS9/8dkvf+HZL3/x2S
+        91kAAAAAHZL3AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YBAAAAAByS980dk/b/HZP3/h2S9/8dkvf/HZP3/x2S
+        9/8dk/f+HZP3/hyS9v8dk/f+HZL3/h2S9/4ckvb/HZL3/x2S9/8dkvf/HJL3/x2T9/4dkvf/HJL2/x2S
+        9/8ckvb/HZL3/x2T9/4dk/f+HJL2/x2S9/8ckvf/HZL3/x2T9/4ckvb/HZP3/h2S9/8dk/f/HZL3/x2S
+        9/8dk/f/HZL3/x2T9/4dk/f+HJL2/x2T9/4dkvf/HZL3/xyS9v8dkvf/HZL3/x2S9/8ckvf/HZP3/hyT
+        9/8dkvbHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdm/8AAAAAAByS9nMdk/f/HJP2/x2T
+        9/8dkvf/HZL3/x2T9/8dkvf/HZP3/h2T9v4ck/b/HZL3gwAAAAAck/YDAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9wEAAAAAHZP2mByS9/8dk/f8HZL2/x2S9v8dkvb/HZL2/xyS9v8dkvb/HJL2/x2S9v8dkvb/HZL3/xyS
+        9v8ckvb/HZL2/xyS9v8ckvf/HZL2/x2S9/8ckvb/HZL2/xyS9v8dkvb/HJL2/xyS9v8ckvb/HZL2/xyS
+        9v8dkvb/HJL2/xyS9v8dkvb/HZL2/x2S9v8dkvb/HZL2/x2S9v8dkvb/HJL2/x2S9v8ckvb/HZL2/x2S
+        9v8dkvf/HJL2/xyS9v8dkvb/HJL2/xyS9/8dk/f+HZP3/xyS9t8ckvYYAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHZL2Rh2S9v8ck/f/HZL2/x2S9v8dkvb/HZL2/x2S9v8ckvb/HZP3/h2S
+        9/8ck/a0AAAAAB2S9wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL2AAAAAAAckvZpHZP3/xyS9vsckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/4ckvb/HZP3/hyS9v8ckvf/HJL2/xyS9v8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS
+        9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8ckvb/HJL3/xyS9v8dk/f+HJL2/x2T9/4ckvb/HJL2/xyS
+        9v8ckvb/HJL2/xyS9v8dk/f+HZP3/hyS9v8dk/f+HJL2/xyS9/8ckvb/HJL2/xyS9v8ckvb/HJL3/x2T
+        9/4dk/f/HJP29B2S9zYAAAAAHJf2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cdHJP3+x2S
+        9v8ck/b/HJL2/xyS9v8ckvb/HJL2/x2T9/4dk/b/HZL2/xyT99AAAAAAHZL2AgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAaj/UAAAAAAByS9jYdk/f/HJL2+h2T9/4dk/f+HZP3/h2T9v4ck/f+HZP3/h2T9/8dk/f+HZP3/h2T
+        9/4dk/b/HJP3/h2T9v4ck/b+HZL3/x2T9/4dk/f+HJP2/x2T9/4dk/f/HZP3/hyT9/4ck/b+HZP3/x2T
+        9/4dk/f/HZP2/hyT9v4dk/f/HZP3/h2T9v4dk/b+HZP3/h2T9/4dk/f+HZP2/hyT9/4dk/f+HZP3/x2T
+        9/4dk/f+HZP3/h2T9v8ck/f+HZP2/hyT9v4dkvf/HZP3/hyT9/8ckvf/HZP2WAAAAAAbjPcAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAH5H1AQAAAAAck/fsHZL2/x2T9v4dk/f+HZP3/h2T9/4dk/b+HJP3/h2T
+        9/8ck/b/HZL35B2S9xsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3HhyS9vgdk/f/HZP3/x2T
+        9/8dk/f/HZL2/x2T9/8dk/f/HZL3/x2T9/8dk/f/HZP3/xyS9v8dkvf/HZL2/x2T9v8dkvf/HZP3/x2T
+        9/8ckvb/HZP3/xyS9/8dk/f/HZP3/x2T9v8dkvf/HZL3/x2S9/8dk/b/HZP2/x2S9/8dkvf/HZP2/x2T
+        9v8dk/f/HZP3/x2T9/8dkvb/HZP3/x2T9/8dkvf/HZP3/x2T9/8dk/f/HJL2/x2S9/8dkvb/HZP2/x2S
+        9/8dk/f/HJL3/h2S9/8ck/Z6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAck/cBAAAAAB2S
+        9sQck/f/HZP2/R2T9/8dk/f/HZP3/x2S9v8dk/f/HZP3/x2T9/8ck/b1HZL2OgAAAAAVlf8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGo/2AAAAAAAdkvYPHZP30RyS9v8ckvf/HJL3/xyT9/8ckvb/HJP3/h2T9/4ckvf/HZP3/hyS
+        9/8ckvf/HJL2/xyS9/8ckvb/HJL2/xyS9/8dk/f+HJL3/xyS9v8ckvf/HJL3/xyS9/8ck/f+HJP3/hyS
+        9/8ckvf/HJL3/xyS9v8ck/f+HJL3/x2T9/4ckvb/HJP2/xyS9/8ckvf/HJP3/xyS9v8ck/f+HZP3/hyS
+        9/8dk/f+HJL3/xyS9/8ckvb/HJL3/xyS9v8ckvb/HJL3/x2T9/4dk/f/HZP2/xyS96IAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9gAAAAAAHJL3lR2T9v8ckvb8HJL3/xyS9/8ck/f/HJL2/xyT
+        9/4dk/f+HJP2/x2S9v8ck/dZAAAAAB+S9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckveoHZP2/xyT
+        9/4dk/f/HZP3/x2S9/8ck/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HJL3/x2S9/8ck/f/HZL3/x2T
+        9/8dk/f/HJP3/x2T9/8dk/f/HZP3/xyT9/8ck/f/HZP3/x2S9/8dk/f/HZP3/xyT9/8dk/f/HZL3/x2T
+        9/8dk/f/HZP3/x2T9/8dk/f/HZL3/xyT9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8ckvf/HZL3/xyT
+        9/8dkvf/HZP3/x2T9/8ckvf/HZP2zh2S9gQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZP3AAAA
+        AAAdk/dkHJL3/x2T9/sdk/f/HZP3/x2T9/8dkvf/HJP3/x2T9/8dk/f/HJL3/x2T9n0AAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9oQdkvf/HJP3/hyS9v8ck/b/HJL2/x2T9/4dk/f+HJL2/x2T
+        9/4dk/b+HZP3/xyS9v8ckvb/HZL2/xyT9v8ckvb/HZP3/xyT9v8ckvb/HJP2/xyS9v8ck/b/HZP3/x2T
+        9v8ckvb/HJL2/xyS9v8dk/b/HZP2/xyS9v8dkvf/HJP2/x2T9v8ck/b/HZP2/xyT9v8ckvb/HZP3/x2T
+        9/8ckvb/HZP3/xyT9/8dkvf+HJP2/hyS9v8ckvb/HJL2/xyS9v8dk/f+HJL3/xyS9v8dk/f2HJL2DQAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbk/cAAAAAAByT9jgdkvf/HJP2+hyS9v8ckvb/HJP2/xyS
+        9v8dk/f+HZP3/hyS9v4ck/f/HZL2nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP3XByT
+        9/8dkvb/HZP2/x2T9v8dkvb/HZP3/h2T9/4dkvb/HZP3/h2T9/8dkvb8HZL22x2T990dkvfdHZP33R2S
+        990dk/fdHZP33RyT9t0dk/fdHZP33R2T990dk/fdHZP33R2T990dkvfdHZP23R2T990dk/fdHZP33R2S
+        990dk/fdHZP33R2T990dk/fdHZP33R2S990dk/fdHZP33R2T9t0dkvfaHZL38R2T9v8dk/f+HJL2/x2S
+        9v8ck/b/HZL3/x2T9/4dk/f/HZP3+xyS9v8dk/cpAAAAAB2U9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHJL2Hh2T9/gckvb/HZP2/x2T9v8dk/b/HZL2/x2T9/4dk/f+HZL2/x2S9v8ck/fGHJL3CQAA
+        AAAkkv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJf2AAAAAAAdkvY5HZL29RyT9/8dk/b/HJL2/xyS9v8dk/f+HZP3/h2T
+        9v8dk/f+HJL2/x2T9/Mck/ceHJL2FRyT9xYckvcWHJP2Fh2T9xYck/YWHZP3FhyT9hYckvYWHJL2Fh2S
+        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
+        AAAAAAAAAAAAACGT/QAAAAAAHJL2aB2T9/8dk/f/HJL2/xyT9v8ckvb/HJP2/x2T9v8ckvb/HJL2/B2S
+        9/8ck/aLAAAAAByS9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AgAAAAAdk/dwHZL3/x2T9/4ck/f/HJL2/x2T
+        9/4dk/f+HZL3/x2T9/4ck/b+HZL2/xyT96QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJL2BAAAAAAdk/fLHJL2/xyT9/4dkvb/HJL2/x2S9/8dk/f+HJL3/xyS
+        9v8ckvb/HZP27hyU9h8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJHyAAAAAAAdk/dCHJL2+R2T
+        9/8dkvf/HJP3/xyS9v8dk/f+HZP3/h2S9/8dk/f+HZP2/xyS98UAAAAAHZP2AgAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAckvYBAAAAAByS9kEckvb/HJL2/hyT9v8ckvb/HZP3/h2T9/4dkvb/HZP3/h2T9/4ck/f/HZL3vx2E
+        9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cDAAAAAByS
+        9qAdk/f/HJP2/h2S9v8ckvb/HZL3/x2T9/4ckvb/HJL2/x2T9/8dkvf6HJL2RgAAAAAkkv8AAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9iEdk/bpHJL3/x2S9/8ck/b/HJL2/x2T9/4dk/f+HZL2/x2T
+        9/4dk/b/HJL37QAAAAAhlvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6V+gAAAAAAHZP4EB2T9/8ckvf+HZP2/x2S
+        9v8dk/f+HZP3/h2S9v8dk/f+HZP2/xyT9v8ckvfdHZL2GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9wIAAAAAHZL3bhyT9v8dkvf9HZL2/x2T9v8dkvf/HZP3/h2T
+        9/8ckvb/HZP3/xyT9v8dkvdxAAAAABmV8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/YBAAAAAByS
+        99Ydk/b/HZP2/x2T9v8dkvb/HZP3/h2T9/4dkvb/HZP3/x2T9/8ckvb7HJL2KQAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAckfYBHJL25B2T9v8dk/f/HZL2/xyT9/8dk/f/HZP3/x2T9/8dk/f/HZL3/x2T
+        9vkck/cvAAAAAB2R9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP2AQAA
+        AAAck/ZCHZL3/xyT9vwdkvb/HJP2/x2S9/8dk/f/HZP3/xyT9v8dk/f/HZL3/xyT9pUAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9gUAAAAAHJL3uh2T9v8ckvb+HZP3/x2S9v8ck/f/HZP3/x2T
+        9/8dk/f/HJL3/x2T9/8dk/ZWAAAAAB6U9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAglfkAAAAAAAAAAAAdk/a5HJL3/x2T
+        9/4dk/f+HZP3/h2T9/4dkvb/HZP3/h2T9/4ckvf/HJP3/x2S9kUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdlvkAAAAAAB2T9xkckvb/HZP3/B2T9/4dk/f+HZL3/x2T
+        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
+        AAAAAAAAAAAAABaO8QAAAAAAHZP3TxyS9v8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8dk/f/HZL2/ByT
+        9/8dkvacAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSS/gAAAAAAAAAAAB2S96wckvf/HZP3/x2T
+        9/8dk/f/HZP3/x2T9/8dk/f/HZP3/x2T9/8ck/b/HZL3TgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZP2sRyS9/8dk/b+HJP3/x2T9/8dkvb/HZP3/x2T9/8dk/f/HZP3/xyS9v8ckvZDAAAAAByS
+        9gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIpn/AAAAAAAckvYwHZP38B2S
+        9/8ck/b/HZL3/x2T9/8dk/f/HJL2/x2T9/8dkvb9HZP3/xyS9s8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAHJL2fh2T9/8dkvf+HZL2/xyT9/8dk/f/HZL2/x2T9/8dk/f/HZP3/hyT
+        9v8dkvd6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        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
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGW+Agdk/eUHJL2rx2T
+        96gdk/eoHZP2qB2T96gck/eoHJP2qB2S96gdkvauHJP3kgAAAAAejvYCAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS9wAAAAAAHZP2RxyS9v8dk/b/HZP3/hyT9/8ckvb/HJL2/xyS
+        9v8ckvb/HZP3/h2T9/8ckvb/HZL3/xyT9kMAAAAAHZH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuR
+        9gYckveCHZP3rhyT96gdk/eoHZP3qB2T9qgdk/eoHJP3qByT9qgckvanHJP3qR2T9hIAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAdlPYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAGpr3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJL3AAAA
+        AAAAAAAAHJL3cx2S9/8ck/b/HZL3/xyS9v8dk/b/HJL2/x2T9v8dk/f+HJP3/hyS9v8dk/fCAAAAAByS
+        9wMamfIAAAAAAAAAAAAAAAAAAAAAAAAAAAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2T9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACua/gAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfivYAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAglfQAHJL2ABuS0QAAAAAAHJP3rB2S9v8ck/f9HJP2/hyT
+        9v8ck/b/HJP2/x2T9/4dkvb8HZP3/xyT9kwAAAAAHZP2AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByS
+        9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJP3AAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAHZL4AAAAAAAgjfgEHJP32x2T9v8ckvb+HJP3/xyS9/8ckvf/HJP3/h2T9/8ckvbVAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZL1AAAAAAAdkvcvHJL2+xyT
+        9v8dk/b+HJP2/xyT9/4dkvb/HJP3/xyS9mwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAACuA/wAAAAAAHZX2AAAAAAAdkvdhHZP2/xyT9/8ckvb+HZL3/hyT9/8dkvbmHZP3GAAA
+        AAAdkfUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAckvYAAAAAAAAA
+        AAAck/eZHZL2/xyT9/4ck/b/HJP3/x2S9owAAAAAG5T6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdkvYAAAAAABWU/AIckvfMHZP2/x2S9v8ck/f/HJP2GgAA
+        AAAekPIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuU
+        +AAdkvYBAAAAAByT9xockvbuHZL3/xyS9qIAAAAAHpL3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuS9wAdk/YBAAAAAB2T904ck/f/HZP2NgAA
+        AAAZlPoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2S9kYckvYOAAAAAByS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByT9wAAAAAAAAAAAAAA
+        AAAdk/cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC2S/wAdkvYAHJL1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+        AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        //////////////////////////////////////////////////////////P////////////////////w
+        ////////////////////8D////5///////////////Af//wAP////wAf/AAAAAAAB//+AD////8AH/wA
+        AAAAAAH//gA/////AB/+AAAAAAAA//4AP////4AP/gAAAAAAAD/+AD////+AD/4AAAAAAAAP/gA/////
+        gA/+AAAAAAAAB/8AH////4AP/gAAAAAAAB//AB////+AD/4AAAAAAAA//wAf////wA//AAAAAAAA//8A
+        H////8AH/wAAAAAAA///AB/////AB/8ACD//8Af//wAP////wAf/AB////Af//+AD////8AH/wAf///w
+        P///gA/////AB/8AD///8P///4AP////4AP/gA////P///+AD////+AD/4AP///3////gA/////gA/+A
+        D////////8AH////4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////
+        8AH/wAf////////AB/////AB/8AH////////wAf////wAf/AB////////+AD////8AH/wAf////////g
+        A/////AB/8AH////////4AP////4AP/AB////////+AD////+AD/4AP////////gA/////gA/+AD////
+        ////4AP////4AP/gA/////////AB////+AD/4AP////////wAAAAAAAA/+AD////////8AAAAAAAAH/g
+        A/////////AAAAAAAAB/8AH////////wAAAAAAAAf/AB////////+AAAAAAAAH/wAf////////gAAAAA
+        AAB/8AH////////4AAAAAAAAf/AB////////+AAAAAAAAD/wAf////////gAAAAAAAA/+AH////////4
+        AAAAAAAAP/gA/////////AAAAAAAAD/4AP////////wAf////gA/+AD////////8AH////8AH/gA////
+        /////AB/////AB/4AP////////wAf////wAf/AB////////+AD////8AH/wAf////////gA/////AB/8
+        AH////////4AP////4Af/AB////////+AD////+AD/wAf////////gA/////gA/8AD////////4AP///
+        /4AP/gA/////////AB////+AD/4AP////////wAf////gA/+AD////////8AH////8AP/gA/////////
+        AB/////AB/4AP////////wAf////wAf/AD////////8AH////8AH/wAf////////gA/////AB/8AH///
+        /////4AP////wAf/AB////////+AD////+AD/wAf////////gA/////gA/8AH////////4AP////4AP/
+        AB/////////AD////+AD/4AP////////wAf////gA/+AD////////8AH////4AP/gA/////////AB///
+        /gAAH4AP////////wAf///8AAD+AD////////8AH////gAA/wA/////////gB////4AAP8AH////////
+        4AP////AAH/AB////////+AD////4AB/wAf////////gA/////AA/8AH///////////////4AP//////
+        ////////////+AH///////////////////wB///////////////////+A////////////////////wP/
+        //////////////////8D////////////////////h////////////////////8f/////////////////
+        ///v////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////////////////////////////////////////////////////////////
+        ////////////////////////
+</value>
+  </data>
+</root>
Index: stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Optimization.Views/3.3/HeuristicLab.Optimization.Views-3.3.csproj	(revision 12005)
@@ -142,4 +142,10 @@
       <DependentUpon>BatchRunView.cs</DependentUpon>
     </Compile>
+    <Compile Include="CreateNewSingleEncodingDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="CreateNewSingleEncodingDialog.Designer.cs">
+      <DependentUpon>CreateNewSingleEncodingDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="ISingleObjectiveSolutionSimilarityCalculatorView.cs">
       <SubType>UserControl</SubType>
@@ -159,4 +165,10 @@
     <Compile Include="ISimilarityCalculatorView.Designer.cs">
       <DependentUpon>ISimilarityCalculatorView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MultiEncodingView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MultiEncodingView.Designer.cs">
+      <DependentUpon>MultiEncodingView.cs</DependentUpon>
     </Compile>
     <Compile Include="Plugin.cs" />
@@ -403,4 +415,9 @@
       <Private>False</Private>
     </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CreateNewSingleEncodingDialog.resx">
+      <DependentUpon>CreateNewSingleEncodingDialog.cs</DependentUpon>
+    </EmbeddedResource>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.Designer.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.Designer.cs	(revision 12005)
@@ -0,0 +1,272 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization.Views {
+  partial class MultiEncodingView {
+    /// <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.encodingsListView = new System.Windows.Forms.ListView();
+      this.encodingNameColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.encodingTypeColumnHeader = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.addEncodingButton = new System.Windows.Forms.Button();
+      this.removeEncodingButton = new System.Windows.Forms.Button();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.encodingDetailsGroupBox = new System.Windows.Forms.GroupBox();
+      this.encodingDetailViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.encodingsGroupBox = new System.Windows.Forms.GroupBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.encodingsTabPage = new System.Windows.Forms.TabPage();
+      this.parametersTabPage = new System.Windows.Forms.TabPage();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.encodingDetailsGroupBox.SuspendLayout();
+      this.encodingsGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.encodingsTabPage.SuspendLayout();
+      this.parametersTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Location = new System.Drawing.Point(6, 6);
+      this.parameterCollectionView.Size = new System.Drawing.Size(643, 433);
+      this.parameterCollectionView.TabIndex = 0;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(583, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(647, 3);
+      // 
+      // encodingsListView
+      // 
+      this.encodingsListView.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.encodingsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+            this.encodingNameColumnHeader,
+            this.encodingTypeColumnHeader});
+      this.encodingsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
+      this.encodingsListView.HideSelection = false;
+      this.encodingsListView.Location = new System.Drawing.Point(3, 33);
+      this.encodingsListView.MultiSelect = false;
+      this.encodingsListView.Name = "encodingsListView";
+      this.encodingsListView.ShowGroups = false;
+      this.encodingsListView.Size = new System.Drawing.Size(241, 378);
+      this.encodingsListView.TabIndex = 2;
+      this.encodingsListView.UseCompatibleStateImageBehavior = false;
+      this.encodingsListView.View = System.Windows.Forms.View.Details;
+      this.encodingsListView.SelectedIndexChanged += new System.EventHandler(this.encodingsListView_SelectedIndexChanged);
+      // 
+      // encodingNameColumnHeader
+      // 
+      this.encodingNameColumnHeader.Text = "Name";
+      this.encodingNameColumnHeader.Width = 100;
+      // 
+      // encodingTypeColumnHeader
+      // 
+      this.encodingTypeColumnHeader.Text = "Type";
+      this.encodingTypeColumnHeader.Width = 136;
+      // 
+      // addEncodingButton
+      // 
+      this.addEncodingButton.Location = new System.Drawing.Point(3, 3);
+      this.addEncodingButton.Name = "addEncodingButton";
+      this.addEncodingButton.Size = new System.Drawing.Size(24, 24);
+      this.addEncodingButton.TabIndex = 0;
+      this.addEncodingButton.Text = "+";
+      this.addEncodingButton.UseVisualStyleBackColor = true;
+      this.addEncodingButton.Click += new System.EventHandler(this.addEncodingButton_Click);
+      // 
+      // removeEncodingButton
+      // 
+      this.removeEncodingButton.Location = new System.Drawing.Point(33, 3);
+      this.removeEncodingButton.Name = "removeEncodingButton";
+      this.removeEncodingButton.Size = new System.Drawing.Size(24, 24);
+      this.removeEncodingButton.TabIndex = 1;
+      this.removeEncodingButton.Text = "x";
+      this.removeEncodingButton.UseVisualStyleBackColor = true;
+      this.removeEncodingButton.Click += new System.EventHandler(this.removeEncodingButton_Click);
+      // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
+      this.splitContainer.Location = new System.Drawing.Point(3, 16);
+      this.splitContainer.Name = "splitContainer";
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.encodingsListView);
+      this.splitContainer.Panel1.Controls.Add(this.removeEncodingButton);
+      this.splitContainer.Panel1.Controls.Add(this.addEncodingButton);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.encodingDetailsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(637, 414);
+      this.splitContainer.SplitterDistance = 247;
+      this.splitContainer.TabIndex = 5;
+      // 
+      // encodingDetailsGroupBox
+      // 
+      this.encodingDetailsGroupBox.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.encodingDetailsGroupBox.Controls.Add(this.encodingDetailViewHost);
+      this.encodingDetailsGroupBox.Location = new System.Drawing.Point(3, 27);
+      this.encodingDetailsGroupBox.Name = "encodingDetailsGroupBox";
+      this.encodingDetailsGroupBox.Size = new System.Drawing.Size(380, 384);
+      this.encodingDetailsGroupBox.TabIndex = 0;
+      this.encodingDetailsGroupBox.TabStop = false;
+      this.encodingDetailsGroupBox.Text = "Details";
+      // 
+      // encodingDetailViewHost
+      // 
+      this.encodingDetailViewHost.Caption = "View";
+      this.encodingDetailViewHost.Content = null;
+      this.encodingDetailViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.encodingDetailViewHost.Enabled = false;
+      this.encodingDetailViewHost.Location = new System.Drawing.Point(3, 16);
+      this.encodingDetailViewHost.Name = "encodingDetailViewHost";
+      this.encodingDetailViewHost.ReadOnly = false;
+      this.encodingDetailViewHost.Size = new System.Drawing.Size(374, 365);
+      this.encodingDetailViewHost.TabIndex = 0;
+      this.encodingDetailViewHost.ViewsLabelVisible = true;
+      this.encodingDetailViewHost.ViewType = null;
+      // 
+      // encodingsGroupBox
+      // 
+      this.encodingsGroupBox.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.encodingsGroupBox.Controls.Add(this.splitContainer);
+      this.encodingsGroupBox.Location = new System.Drawing.Point(6, 6);
+      this.encodingsGroupBox.Name = "encodingsGroupBox";
+      this.encodingsGroupBox.Size = new System.Drawing.Size(643, 433);
+      this.encodingsGroupBox.TabIndex = 0;
+      this.encodingsGroupBox.TabStop = false;
+      this.encodingsGroupBox.Text = "Encodings";
+      // 
+      // tabControl
+      // 
+      this.tabControl.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.tabControl.Controls.Add(this.encodingsTabPage);
+      this.tabControl.Controls.Add(this.parametersTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 26);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(663, 471);
+      this.tabControl.TabIndex = 3;
+      // 
+      // encodingsTabPage
+      // 
+      this.encodingsTabPage.Controls.Add(this.encodingsGroupBox);
+      this.encodingsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.encodingsTabPage.Name = "encodingsTabPage";
+      this.encodingsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.encodingsTabPage.Size = new System.Drawing.Size(655, 445);
+      this.encodingsTabPage.TabIndex = 0;
+      this.encodingsTabPage.Text = "Encodings";
+      this.encodingsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // parametersTabPage
+      // 
+      this.parametersTabPage.Controls.Add(this.parameterCollectionView);
+      this.parametersTabPage.Location = new System.Drawing.Point(4, 22);
+      this.parametersTabPage.Name = "parametersTabPage";
+      this.parametersTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.parametersTabPage.Size = new System.Drawing.Size(655, 445);
+      this.parametersTabPage.TabIndex = 1;
+      this.parametersTabPage.Text = "Parameters";
+      this.parametersTabPage.UseVisualStyleBackColor = true;
+      // 
+      // MultiEncodingView
+      // 
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.tabControl);
+      this.Name = "MultiEncodingView";
+      this.Size = new System.Drawing.Size(666, 497);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.tabControl, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
+      this.splitContainer.ResumeLayout(false);
+      this.encodingDetailsGroupBox.ResumeLayout(false);
+      this.encodingsGroupBox.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.encodingsTabPage.ResumeLayout(false);
+      this.parametersTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView encodingsListView;
+    private System.Windows.Forms.Button addEncodingButton;
+    private System.Windows.Forms.Button removeEncodingButton;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private System.Windows.Forms.ColumnHeader encodingNameColumnHeader;
+    private System.Windows.Forms.ColumnHeader encodingTypeColumnHeader;
+    private System.Windows.Forms.GroupBox encodingDetailsGroupBox;
+    private MainForm.WindowsForms.ViewHost encodingDetailViewHost;
+    private System.Windows.Forms.GroupBox encodingsGroupBox;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage encodingsTabPage;
+    private System.Windows.Forms.TabPage parametersTabPage;
+  }
+}
Index: stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.cs
===================================================================
--- stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization.Views/3.3/MultiEncodingView.cs	(revision 12005)
@@ -0,0 +1,144 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Windows.Forms;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimization.Views {
+  [View("MultiEncoding View")]
+  [Content(typeof(MultiEncoding), IsDefaultView = true)]
+  public sealed partial class MultiEncodingView : ParameterizedNamedItemView {
+
+    public new MultiEncoding Content {
+      get { return (MultiEncoding)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MultiEncodingView() {
+      InitializeComponent();
+      addEncodingButton.Text = string.Empty;
+      addEncodingButton.Image = VSImageLibrary.Add;
+      removeEncodingButton.Text = string.Empty;
+      removeEncodingButton.Image = VSImageLibrary.Remove;
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.EncodingsChanged -= ContentOnEncodingsChanged;
+    }
+
+    protected override void RegisterContentEvents() {
+      Content.EncodingsChanged += ContentOnEncodingsChanged;
+      base.RegisterContentEvents();
+    }
+
+    private void ContentOnEncodingsChanged(object sender, EventArgs eventArgs) {
+      RecreateEncodingsList();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      encodingDetailViewHost.Content = null;
+      RecreateEncodingsList();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      addEncodingButton.Enabled = !Locked && !ReadOnly && Content != null;
+      removeEncodingButton.Enabled = !Locked && !ReadOnly && Content != null
+                                     && encodingsListView.SelectedItems.Count > 0;
+    }
+
+    private void addEncodingButton_Click(object sender, EventArgs e) {
+      using (var dialog = new CreateNewSingleEncodingDialog()) {
+        dialog.ForbiddenNames = Content.Encodings.Select(x => x.Name).Concat(new[] { Content.Name });
+        if (dialog.ShowDialog() == DialogResult.OK) {
+          IEncoding encoding;
+          try {
+            encoding = (IEncoding)Activator.CreateInstance(dialog.EncodingType, dialog.EncodingName);
+          } catch (MissingMethodException mmex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog("The encoding must have a constructor that takes the name as a single string argument", mmex);
+            return;
+          } catch (TargetInvocationException tiex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog("The encoding could not be created due to an error in the constructor.", tiex);
+            return;
+          } catch (MethodAccessException maex) {
+            PluginInfrastructure.ErrorHandling.ShowErrorDialog("The encoding's string constructor is not public.", maex);
+            return;
+          }
+          Content.Add(encoding);
+        }
+      }
+    }
+
+    private void removeEncodingButton_Click(object sender, EventArgs e) {
+      var encoding = GetSelectedEncoding();
+      var success = Content.Remove(encoding);
+      encodingDetailViewHost.Content = null;
+      if (!success) MessageBox.Show("Could not remove encoding.", "Error while removing encoding.", MessageBoxButtons.OK, MessageBoxIcon.Error);
+    }
+
+    private void encodingsListView_SelectedIndexChanged(object sender, EventArgs e) {
+      if (encodingsListView.SelectedItems.Count > 0) {
+        var encoding = GetSelectedEncoding();
+        encodingDetailViewHost.Content = encoding;
+      } else encodingDetailViewHost.Content = null;
+      SetEnabledStateOfControls();
+    }
+
+    private IEncoding GetSelectedEncoding() {
+      var selected = encodingsListView.SelectedItems[0];
+      var encodingName = selected.Text;
+      var encoding = Content.Encodings.Single(x => x.Name == encodingName);
+      return encoding;
+    }
+
+    private void RecreateEncodingsList() {
+      encodingsListView.SelectedIndices.Clear();
+      encodingsListView.Items.Clear();
+      if (encodingsListView.SmallImageList != null)
+        foreach (Image img in encodingsListView.SmallImageList.Images) img.Dispose();
+      encodingsListView.SmallImageList = new ImageList();
+      if (Content != null) {
+        foreach (var enc in Content.Encodings)
+          CreateListViewItem(enc);
+      }
+    }
+
+    private void CreateListViewItem(IEncoding enc) {
+      encodingsListView.SmallImageList.Images.Add(enc.ItemImage);
+      var item = new ListViewItem() {
+        ImageIndex = encodingsListView.SmallImageList.Images.Count - 1,
+        Text = enc.Name
+      };
+      item.SubItems.Add(new ListViewItem.ListViewSubItem() {
+        Text = enc.GetType().Name
+      });
+      encodingsListView.Items.Add(item);
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Algorithms/EngineAlgorithm.cs	(revision 12005)
@@ -159,5 +159,8 @@
       if ((engine != null) && (operatorGraph.InitialOperator != null)) {
         ExecutionContext context = null;
-        if (Problem != null) context = new ExecutionContext(context, Problem, globalScope);
+        if (Problem != null) {
+          foreach (var item in Problem.ExecutionContextItems)
+            context = new ExecutionContext(context, item, globalScope);
+        }
         context = new ExecutionContext(context, this, globalScope);
         context = new ExecutionContext(context, operatorGraph.InitialOperator, globalScope);
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/BasicProblem.cs	(revision 12005)
@@ -0,0 +1,160 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  public abstract class BasicProblem<TEncoding, TEvaluator> : HeuristicOptimizationProblem<TEvaluator, ISolutionCreator>, IProblemDefinition, IStorableContent
+    where TEncoding : class, IEncoding
+    where TEvaluator : class, IEvaluator {
+
+    public string Filename { get; set; }
+
+    protected IValueParameter<TEncoding> EncodingParameter {
+      get { return (IValueParameter<TEncoding>)Parameters["Encoding"]; }
+    }
+
+    //mkommend necessary for reuse of operators if the encoding changes
+    private TEncoding oldEncoding;
+
+    IEncoding IProblemDefinition.Encoding { get { return Encoding; } }
+    public TEncoding Encoding {
+      get { return EncodingParameter.Value; }
+      protected set {
+        if (value == null) throw new ArgumentNullException("Encoding must not be null.");
+        EncodingParameter.Value = value;
+      }
+    }
+
+    protected override IEnumerable<IItem> GetOperators() {
+      if (Encoding == null) return base.GetOperators();
+      return base.GetOperators().Concat(Encoding.Operators);
+    }
+    public override IEnumerable<IParameterizedItem> ExecutionContextItems {
+      get {
+        if (Encoding == null) return base.ExecutionContextItems;
+        return base.ExecutionContextItems.Concat(new[] { Encoding });
+      }
+    }
+
+    protected BasicProblem()
+      : base() {
+      Parameters.Add(new ValueParameter<TEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));
+      oldEncoding = Encoding;
+      if(Encoding != null) Parameterize();
+      RegisterEvents();
+    }
+
+    protected BasicProblem(BasicProblem<TEncoding, TEvaluator> original, Cloner cloner)
+      : base(original, cloner) {
+      oldEncoding = cloner.Clone(original.oldEncoding);
+      RegisterEvents();
+    }
+
+    [StorableConstructor]
+    protected BasicProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      oldEncoding = Encoding;
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      EncodingParameter.ValueChanged += (o, e) => OnEncodingChanged();
+      var multiEncoding = Encoding as MultiEncoding;
+      if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
+    }
+
+    protected virtual void OnEncodingChanged() {
+      Parameterize();
+
+      OnOperatorsChanged();
+      OnReset();
+    }
+
+    private void Parameterize() {
+      if (oldEncoding != null) {
+        AdaptEncodingOperators(oldEncoding, Encoding);
+        var oldMultiEncoding = oldEncoding as MultiEncoding;
+        if (oldMultiEncoding != null)
+          oldMultiEncoding.EncodingsChanged -= MultiEncodingOnEncodingsChanged;
+      }
+      oldEncoding = Encoding;
+
+      foreach (var op in Operators.OfType<IEncodingOperator>())
+        op.EncodingParameter.ActualName = EncodingParameter.Name;
+
+      var solutionCreatorType = Encoding.GetType().BaseType.GetGenericArguments();
+      var paramType = typeof(ValueParameter<>).MakeGenericType(solutionCreatorType);
+      var solutionCreatorParam = (IParameter)Activator.CreateInstance(paramType, SolutionCreatorParameter.Name, SolutionCreatorParameter.Description,
+        Encoding.SolutionCreator);
+      Parameters.Remove(SolutionCreatorParameter);
+      Parameters.Add(solutionCreatorParam);
+      ((IValueParameter)solutionCreatorParam).ValueChanged += SolutionCreatorParameter_ValueChanged;
+
+      var multiEncoding = Encoding as MultiEncoding;
+      if (multiEncoding != null) multiEncoding.EncodingsChanged += MultiEncodingOnEncodingsChanged;
+    }
+
+    protected override void OnSolutionCreatorChanged() {
+      base.OnSolutionCreatorChanged();
+      Encoding.SolutionCreator = SolutionCreator;
+    }
+
+    private static void AdaptEncodingOperators(IEncoding oldEncoding, IEncoding newEncoding) {
+      if (oldEncoding.GetType() != newEncoding.GetType()) return;
+
+      if (oldEncoding.GetType() == typeof(MultiEncoding)) {
+        var oldMultiEncoding = (MultiEncoding)oldEncoding;
+        var newMultiEncoding = (MultiEncoding)newEncoding;
+        if (!oldMultiEncoding.Encodings.SequenceEqual(newMultiEncoding.Encodings, new TypeEqualityComparer<IEncoding>())) return;
+
+        var nestedEncodings = oldMultiEncoding.Encodings.Zip(newMultiEncoding.Encodings, (o, n) => new { oldEnc = o, newEnc = n });
+        foreach (var multi in nestedEncodings)
+          AdaptEncodingOperators(multi.oldEnc, multi.newEnc);
+      }
+
+      var comparer = new TypeEqualityComparer<IOperator>();
+      var cloner = new Cloner();
+      var oldOperators = oldEncoding.Operators;
+      var newOperators = newEncoding.Operators;
+
+      cloner.RegisterClonedObject(oldEncoding, newEncoding);
+      var operators = oldOperators.Intersect(newOperators, comparer)
+                                  .Select(cloner.Clone)
+                                  .Union(newOperators, comparer).ToList();
+
+      newEncoding.ConfigureOperators(operators);
+      newEncoding.Operators = operators;
+    }
+
+    protected virtual void MultiEncodingOnEncodingsChanged(object sender, EventArgs e) {
+      OnOperatorsChanged();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Encoding.cs	(revision 12005)
@@ -0,0 +1,125 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Encoding", "Base class for describing different encodings.")]
+  [StorableClass]
+  public abstract class Encoding<T> : ParameterizedNamedItem, IEncoding
+    where T : class,ISolutionCreator {
+    public override sealed bool CanChangeName {
+      get { return false; }
+    }
+
+    private ItemSet<IOperator> encodingOperators = new ItemSet<IOperator>(new TypeEqualityComparer<IOperator>());
+
+    [Storable(Name = "Operators")]
+    private IEnumerable<IOperator> StorableOperators {
+      get { return encodingOperators; }
+      set { encodingOperators = new ItemSet<IOperator>(value, new TypeEqualityComparer<IOperator>()); ; }
+    }
+
+    public IEnumerable<IOperator> Operators {
+      get { return encodingOperators; }
+      set {
+        if (!value.OfType<T>().Any())
+          throw new ArgumentException("The provided operators contain no suitable solution creator");
+        encodingOperators.Clear();
+        foreach (var op in value) encodingOperators.Add(op);
+
+        T newSolutionCreator = (T)encodingOperators.FirstOrDefault(o => o.GetType() == solutionCreator.GetType()) ??
+                               encodingOperators.OfType<T>().First();
+        SolutionCreator = newSolutionCreator;
+        OnOperatorsChanged();
+      }
+    }
+
+    ISolutionCreator IEncoding.SolutionCreator {
+      get { return SolutionCreator; }
+      set {
+        if (!(value is T)) throw new ArgumentException(string.Format("Cannot assign the solution creator {0} to the encoding {1}.", value.GetType().GetPrettyName(), GetType().GetPrettyName()));
+        SolutionCreator = (T)value;
+      }
+    }
+    private T solutionCreator;
+    public T SolutionCreator {
+      get {
+        return solutionCreator;
+      }
+      set {
+        if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
+        if (solutionCreator == value) return;
+        encodingOperators.Remove(solutionCreator);
+        encodingOperators.Add(value);
+        solutionCreator = value;
+        OnSolutionCreatorChanged();
+      }
+    }
+
+    [StorableConstructor]
+    protected Encoding(bool deserializing) : base(deserializing) { }
+    protected Encoding(Encoding<T> original, Cloner cloner)
+      : base(original, cloner) {
+      encodingOperators = cloner.Clone(original.encodingOperators);
+      solutionCreator = cloner.Clone(original.solutionCreator);
+    }
+    protected Encoding(string name)
+      : base(name) {
+      Parameters.Add(new FixedValueParameter<ReadOnlyItemSet<IOperator>>(name + ".Operators", "The operators that the encoding specifies.", encodingOperators.AsReadOnly()));
+    }
+
+    public virtual Individual GetIndividual(IScope scope) {
+      return new SingleEncodingIndividual(this, scope);
+    }
+
+    protected bool AddOperator(IOperator @operator) {
+      return encodingOperators.Add(@operator);
+    }
+
+    protected bool RemoveOperator(IOperator @operator) {
+      return encodingOperators.Remove(@operator);
+    }
+
+    public void ConfigureOperator(IOperator @operator) { ConfigureOperators(new[] { @operator }); }
+    public abstract void ConfigureOperators(IEnumerable<IOperator> operators);
+
+    public event EventHandler SolutionCreatorChanged;
+    protected virtual void OnSolutionCreatorChanged() {
+      ConfigureOperator(SolutionCreator);
+      var handler = SolutionCreatorChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler OperatorsChanged;
+    protected virtual void OnOperatorsChanged() {
+      ConfigureOperators(Operators);
+      var handler = OperatorsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/Individual.cs	(revision 12005)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  public abstract class Individual {
+    protected IEncoding Encoding { get; private set; }
+    protected IScope Scope { get; private set; }
+
+    public string Name { get { return Encoding.Name; } }
+
+    protected Individual(IEncoding encoding, IScope scope) {
+      Encoding = encoding;
+      Scope = scope;
+    }
+
+    public abstract IItem this[string name] { get; set; }
+    public abstract TEncoding GetEncoding<TEncoding>() where TEncoding : class, IEncoding;
+
+    public Individual Copy() {
+      return CopyToScope(new Scope());
+    }
+
+    public abstract Individual CopyToScope(IScope scope);
+
+    protected static IItem ExtractScopeValue(string name, IScope scope) {
+      if (!scope.Variables.ContainsKey(name)) throw new ArgumentException(string.Format(" {0} cannot be found in the provided scope.", name));
+      var value = scope.Variables[name].Value;
+      if (value == null) throw new InvalidOperationException(string.Format("Value of {0} is null.", name));
+      return value;
+    }
+
+    protected static void SetScopeValue(string name, IScope scope, IItem value) {
+      if (value == null) throw new ArgumentNullException("value");
+      if (!scope.Variables.ContainsKey(name)) scope.Variables.Add(new Variable(name, value));
+      else scope.Variables[name].Value = value;
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/MultiEncodingIndividual.cs	(revision 12005)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public sealed class MultiEncodingIndividual : Individual {
+    private new MultiEncoding Encoding {
+      get { return (MultiEncoding)base.Encoding; }
+    }
+
+    private readonly IEnumerable<Individual> individuals;
+
+    public MultiEncodingIndividual(MultiEncoding encoding, IScope scope)
+      : base(encoding, scope) {
+      individuals = encoding.Encodings.Select(e => e.GetIndividual(scope)).ToArray();
+    }
+
+    private MultiEncodingIndividual(MultiEncoding encoding, IScope scope, IEnumerable<Individual> individuals)
+      : base(encoding, scope) {
+      this.individuals = individuals;
+    }
+
+
+    public override IItem this[string name] {
+      get {
+        var individual = individuals.SingleOrDefault(i => i.Name == name);
+        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
+        return individual[name];
+      }
+      set {
+        var individual = individuals.SingleOrDefault(i => i.Name == name);
+        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
+        individual[name] = value;
+      }
+    }
+
+    public override TEncoding GetEncoding<TEncoding>() {
+      TEncoding encoding;
+      try {
+        encoding = (TEncoding)Encoding.Encodings.SingleOrDefault(e => e is TEncoding);
+      } catch (InvalidOperationException) {
+        throw new InvalidOperationException(string.Format("The individual uses multiple {0} .", typeof(TEncoding).GetPrettyName()));
+      }
+      if (encoding == null) throw new InvalidOperationException(string.Format("The individual does not use a {0}.", typeof(TEncoding).GetPrettyName()));
+      return encoding;
+    }
+
+    public override Individual CopyToScope(IScope scope) {
+      var copies = individuals.Select(i => i.CopyToScope(scope)).ToArray();
+      return new MultiEncodingIndividual(Encoding, scope, copies);
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Individuals/SingleEncodingIndividual.cs	(revision 12005)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public sealed class SingleEncodingIndividual : Individual {
+    public SingleEncodingIndividual(IEncoding encoding, IScope scope)
+      : base(encoding, scope) {
+      if (encoding is MultiEncoding) throw new ArgumentException("A MultiEncoding must not be used for the creation of a SingleEncodingIndividual");
+      if (!scope.Variables.ContainsKey(encoding.Name)) throw new ArgumentException("The provided scope does not contain an individual.");
+    }
+
+    public override IItem this[string name] {
+      get {
+        if (Name != name) throw new ArgumentException(string.Format("{0} is not part of the individual.", name));
+        return ExtractScopeValue(Name, Scope);
+      }
+      set {
+        if (Name != name) throw new ArgumentException(string.Format("{0} is not part of the individual.", name));
+        SetScopeValue(Name, Scope, value);
+      }
+    }
+
+    public override TEncoding GetEncoding<TEncoding>() {
+      TEncoding encoding = Encoding as TEncoding;
+      if (encoding == null) throw new InvalidOperationException(string.Format("The individual does not use a {0}.", typeof(TEncoding).GetPrettyName()));
+      return encoding;
+    }
+
+    public override Individual CopyToScope(IScope scope) {
+      SetScopeValue(Name, scope, (IItem)this[Name].Clone());
+      return new SingleEncodingIndividual(Encoding, scope);
+    }
+  }
+
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncoding.cs	(revision 12005)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  public interface IEncoding : IParameterizedNamedItem {
+    ISolutionCreator SolutionCreator { get; set; }
+    IEnumerable<IOperator> Operators { get; set; }
+
+    Individual GetIndividual(IScope scope);
+    void ConfigureOperator(IOperator @operator);
+    void ConfigureOperators(IEnumerable<IOperator> operators);
+
+    event EventHandler SolutionCreatorChanged;
+    event EventHandler OperatorsChanged;
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodingOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodingOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IEncodingOperator.cs	(revision 12005)
@@ -0,0 +1,28 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public interface IEncodingOperator : IOperator {
+    ILookupParameter<IEncoding> EncodingParameter { get; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiEncodingOperator.cs	(revision 12005)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public interface IMultiEncodingOperator : IOperator {
+    void AddEncoding(IEncoding encoding);
+    bool RemoveEncoding(IEncoding encoding);
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IMultiObjectiveProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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;
+
+namespace HeuristicLab.Optimization {
+  public interface IMultiObjectiveProblemDefinition : IProblemDefinition {
+    bool[] Maximization { get; }
+    double[] Evaluate(Individual individual, IRandom random);
+    void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random);
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/IProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,26 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Optimization {
+  public interface IProblemDefinition {
+    IEncoding Encoding { get; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveMoveOperator.cs	(revision 12005)
@@ -0,0 +1,25 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Optimization {
+  public interface ISingleObjectiveMoveOperator : IMoveOperator, ISingleObjectiveOperator {
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/ISingleObjectiveProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,32 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Optimization {
+  public interface ISingleObjectiveProblemDefinition : IProblemDefinition {
+    bool Maximization { get; }
+    double Evaluate(Individual individual, IRandom random);
+    void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random);
+    IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random);
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveAnalysisOperator.cs	(revision 12005)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  internal interface IMultiObjectiveAnalysisOperator : IEncodingOperator, IAnalyzer, IMultiObjectiveOperator {
+    Action<Individual[], double[][], ResultCollection, IRandom> AnalyzeAction { get; set; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/IMultiObjectiveEvaluationOperator.cs	(revision 12005)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  internal interface IMultiObjectiveEvaluationOperator : IMultiObjectiveEvaluator, IEncodingOperator {
+    Func<Individual, IRandom, double[]> EvaluateFunc { get; set; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/INeighborBasedOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/INeighborBasedOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/INeighborBasedOperator.cs	(revision 12005)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  internal interface INeighborBasedOperator : IEncodingOperator {
+    Func<Individual, IRandom, IEnumerable<Individual>> GetNeighborsFunc { get; set; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveAnalysisOperator.cs	(revision 12005)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  internal interface ISingleObjectiveAnalysisOperator : IEncodingOperator, ISingleObjectiveOperator {
+    Action<Individual[], double[], ResultCollection, IRandom> AnalyzeAction { get; set; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveEvaluationOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveEvaluationOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Interfaces/internal/ISingleObjectiveEvaluationOperator.cs	(revision 12005)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Optimization {
+  internal interface ISingleObjectiveEvaluationOperator : ISingleObjectiveEvaluator, IEncodingOperator {
+    Func<Individual, IRandom, double> EvaluateFunc { get; set; }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiEncoding.cs	(revision 12005)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Optimization {
+  [Item("MultiEncoding", "Describes a combined encoding consisting of multiple simpler encodings.")]
+  [StorableClass]
+  public sealed class MultiEncoding : Encoding<MultiEncodingCreator> {
+
+    private readonly List<IEncoding> encodings;
+    [Storable]
+    public IEnumerable<IEncoding> Encodings {
+      get { return encodings; }
+      private set { encodings.AddRange(value); }
+    }
+
+    [StorableConstructor]
+    private MultiEncoding(bool deserializing)
+      : base(deserializing) {
+      encodings = new List<IEncoding>();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncoding(this, cloner); }
+    private MultiEncoding(MultiEncoding original, Cloner cloner)
+      : base(original, cloner) {
+      encodings = new List<IEncoding>(original.Encodings.Select(cloner.Clone));
+    }
+    public MultiEncoding()
+      : base("MultiEncoding") {
+      encodings = new List<IEncoding>();
+      SolutionCreator = new MultiEncodingCreator();
+
+      foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>())
+        AddOperator(@operator);
+    }
+
+    public override Individual GetIndividual(IScope scope) {
+      return new MultiEncodingIndividual(this, scope);
+    }
+
+    public MultiEncoding Add(IEncoding encoding) {
+      if (encoding is MultiEncoding) throw new InvalidOperationException("Nesting of MultiEncodings is not supported.");
+      if (Encodings.Any(e => e.Name == encoding.Name)) throw new ArgumentException("Encoding name must be unique", "encoding.Name");
+      encodings.Add(encoding);
+
+      Parameters.AddRange(encoding.Parameters);
+
+      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
+        @operator.AddEncoding(encoding);
+      }
+      OnEncodingsChanged();
+      return this;
+    }
+
+    public bool Remove(IEncoding encoding) {
+      var success = encodings.Remove(encoding);
+      Parameters.RemoveRange(encoding.Parameters);
+      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
+        @operator.RemoveEncoding(encoding);
+      }
+      OnEncodingsChanged();
+      return success;
+    }
+
+    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
+    }
+
+    public event EventHandler EncodingsChanged;
+    private void OnEncodingsChanged() {
+      var handler = EncodingsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/MultiObjectiveBasicProblem.cs	(revision 12005)
@@ -0,0 +1,100 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  public abstract class MultiObjectiveBasicProblem<TEncoding> : BasicProblem<TEncoding, MultiObjectiveEvaluator>, IMultiObjectiveHeuristicOptimizationProblem, IMultiObjectiveProblemDefinition
+  where TEncoding : class, IEncoding {
+    [StorableConstructor]
+    protected MultiObjectiveBasicProblem(bool deserializing) : base(deserializing) { }
+
+    protected MultiObjectiveBasicProblem(MultiObjectiveBasicProblem<TEncoding> original, Cloner cloner)
+      : base(original, cloner) {
+      ParameterizeOperators();
+    }
+
+    protected MultiObjectiveBasicProblem()
+      : base() {
+      Parameters.Add(new ValueParameter<BoolArray>("Maximization", "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(Maximization).AsReadOnly()));
+
+      Operators.Add(Evaluator);
+      Operators.Add(new MultiObjectiveAnalyzer());
+
+      ParameterizeOperators();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ParameterizeOperators();
+    }
+
+    public abstract bool[] Maximization { get; }
+    public abstract double[] Evaluate(Individual individual, IRandom random);
+    public virtual void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) { }
+
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      if (Encoding != null) {
+        PruneSingleObjectiveOperators(Encoding);
+        var multiEncoding = Encoding as MultiEncoding;
+        if (multiEncoding != null) {
+          foreach (var encoding in multiEncoding.Encodings.ToList()) {
+            PruneSingleObjectiveOperators(encoding);
+          }
+        }
+      }
+    }
+
+    private void PruneSingleObjectiveOperators(IEncoding encoding) {
+      if (encoding != null && encoding.Operators.Any(x => x is ISingleObjectiveOperator && !(x is IMultiObjectiveOperator)))
+        encoding.Operators = encoding.Operators.Where(x => !(x is ISingleObjectiveOperator) || x is IMultiObjectiveOperator).ToList();
+    }
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      ParameterizeOperators();
+    }
+
+    private void ParameterizeOperators() {
+      foreach (var op in Operators.OfType<IMultiObjectiveEvaluationOperator>())
+        op.EvaluateFunc = Evaluate;
+      foreach (var op in Operators.OfType<IMultiObjectiveAnalysisOperator>())
+        op.AnalyzeAction = Analyze;
+    }
+
+
+    #region IMultiObjectiveHeuristicOptimizationProblem Members
+    IParameter IMultiObjectiveHeuristicOptimizationProblem.MaximizationParameter {
+      get { return Parameters["Maximization"]; }
+    }
+    IMultiObjectiveEvaluator IMultiObjectiveHeuristicOptimizationProblem.Evaluator {
+      get { return Evaluator; }
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCreator.cs	(revision 12005)
@@ -0,0 +1,65 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("MultiEncodingCreator", "Contains solution creators that together create a multi-encoding.")]
+  [StorableClass]
+  public sealed class MultiEncodingCreator : MultiEncodingOperator<ISolutionCreator>, ISolutionCreator {
+    [StorableConstructor]
+    private MultiEncodingCreator(bool deserializing) : base(deserializing) { }
+
+    private MultiEncodingCreator(MultiEncodingCreator original, Cloner cloner) : base(original, cloner) { }
+    public MultiEncodingCreator() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiEncodingCreator(this, cloner);
+    }
+
+    public override void AddEncoding(IEncoding encoding) {
+      base.AddEncoding(encoding);
+      var parameter = GetParameter(encoding);
+      parameter.Value = encoding.SolutionCreator;
+      encoding.SolutionCreatorChanged += Encoding_SolutionCreatorChanged;
+    }
+
+    public override bool RemoveEncoding(IEncoding encoding) {
+      var success = base.RemoveEncoding(encoding);
+      encoding.SolutionCreatorChanged -= Encoding_SolutionCreatorChanged;
+      return success;
+    }
+
+    private void Encoding_SolutionCreatorChanged(object sender, EventArgs e) {
+      var encoding = (IEncoding)sender;
+      var parameter = GetParameter(encoding);
+
+      var oldCreator = parameter.ValidValues.Single(creator => creator.GetType() == encoding.SolutionCreator.GetType());
+      parameter.ValidValues.Remove(oldCreator);
+      parameter.ValidValues.Add(encoding.SolutionCreator);
+      parameter.Value = encoding.SolutionCreator;
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingCrossover.cs	(revision 12005)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("MultiEncoding Crossover", "Applies different crossovers to cross a multi-encoding.")]
+  [StorableClass]
+  public sealed class MultiEncodingCrossover : MultiEncodingOperator<ICrossover>, ICrossover {
+    [StorableConstructor]
+    private MultiEncodingCrossover(bool deserializing) : base(deserializing) { }
+    private MultiEncodingCrossover(MultiEncodingCrossover original, Cloner cloner) : base(original, cloner) { }
+    public MultiEncodingCrossover() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingCrossover(this, cloner); }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingManipulator.cs	(revision 12005)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("MultiEncoding Manipulator", "Applies different manipulators to change a multi-encoding.")]
+  [StorableClass]
+  public sealed class MultiEncodingManipulator : MultiEncodingOperator<IManipulator>, IManipulator {
+    [StorableConstructor]
+    private MultiEncodingManipulator(bool deserializing) : base(deserializing) { }
+    private MultiEncodingManipulator(MultiEncodingManipulator original, Cloner cloner)
+      : base(original, cloner) { }
+    public MultiEncodingManipulator() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingManipulator(this, cloner); }
+
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiEncodingOperator.cs	(revision 12005)
@@ -0,0 +1,104 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  public abstract class MultiEncodingOperator<T> : Operator, IMultiEncodingOperator where T : class,IOperator {
+    private List<IEncoding> encodings = new List<IEncoding>();
+    [Storable(Name = "Encodings")]
+    private IEnumerable<IEncoding> StorableEncodings {
+      get { return encodings; }
+      set { encodings = new List<IEncoding>(value); }
+    }
+
+    [StorableConstructor]
+    protected MultiEncodingOperator(bool deserializing)
+      : base(deserializing) {
+    }
+
+    protected MultiEncodingOperator(MultiEncodingOperator<T> original, Cloner cloner)
+      : base(original, cloner) {
+      encodings = new List<IEncoding>(original.encodings.Select(cloner.Clone));
+      foreach (var encoding in encodings)
+        encoding.OperatorsChanged += Encoding_OperatorsChanged;
+    }
+
+    protected MultiEncodingOperator() : base() { }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      foreach (var encoding in encodings)
+        encoding.OperatorsChanged += Encoding_OperatorsChanged;
+    }
+
+
+    public override IOperation Apply() {
+      var operations = Parameters.Select(p => p.ActualValue).OfType<IOperator>().Select(op => ExecutionContext.CreateOperation(op));
+      return new OperationCollection(operations);
+    }
+
+    public virtual void AddEncoding(IEncoding encoding) {
+      if (Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was already added.", encoding.Name));
+
+      encodings.Add(encoding);
+      encoding.OperatorsChanged += Encoding_OperatorsChanged;
+
+      var param = new ConstrainedValueParameter<T>(encoding.Name, new ItemSet<T>(encoding.Operators.OfType<T>()));
+      param.Value = param.ValidValues.First();
+      Parameters.Add(param);
+    }
+
+    public virtual bool RemoveEncoding(IEncoding encoding) {
+      if (!encodings.Remove(encoding)) throw new ArgumentException(string.Format("Encoding {0} was not added to the MultiEncoding.", encoding.Name));
+      encoding.OperatorsChanged -= Encoding_OperatorsChanged;
+      return Parameters.Remove(encoding.Name);
+    }
+
+    protected IConstrainedValueParameter<T> GetParameter(IEncoding encoding) {
+      if (!Parameters.ContainsKey(encoding.Name)) throw new ArgumentException(string.Format("Encoding {0} was not added to the MultiEncoding.", encoding.Name));
+
+      return (IConstrainedValueParameter<T>)Parameters[encoding.Name];
+    }
+
+    private void Encoding_OperatorsChanged(object sender, EventArgs e) {
+      var encoding = (IEncoding)sender;
+      var param = GetParameter(encoding);
+
+      var oldParameterValue = param.Value;
+      param.ValidValues.Clear();
+      foreach (var op in encoding.Operators.OfType<T>())
+        param.ValidValues.Add(op);
+
+      var newValue = param.ValidValues.FirstOrDefault(op => op.GetType() == oldParameterValue.GetType());
+      if (newValue == null) newValue = param.ValidValues.First();
+      param.Value = newValue;
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveAnalyzer.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveAnalyzer.cs	(revision 12005)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Multi-objective Analyzer", "Calls the Analyze method of the problem definition.")]
+  [StorableClass]
+  public class MultiObjectiveAnalyzer : SingleSuccessorOperator, IMultiObjectiveAnalysisOperator, IStochasticOperator {
+    public bool EnabledByDefault { get { return true; } }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public IScopeTreeLookupParameter<DoubleArray> QualitiesParameter {
+      get { return (IScopeTreeLookupParameter<DoubleArray>)Parameters["Qualities"]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public Action<Individual[], double[][], ResultCollection, IRandom> AnalyzeAction { get; set; }
+
+    [StorableConstructor]
+    protected MultiObjectiveAnalyzer(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveAnalyzer(MultiObjectiveAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public MultiObjectiveAnalyzer() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleArray>("Qualities", "The qualities of the parameter vector."));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The results collection to write to."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var encoding = EncodingParameter.ActualValue;
+      var results = ResultsParameter.ActualValue;
+      var random = RandomParameter.ActualValue;
+
+      IEnumerable<IScope> scopes = new[] { ExecutionContext.Scope };
+      for (var i = 0; i < QualitiesParameter.Depth; i++)
+        scopes = scopes.Select(x => (IEnumerable<IScope>)x.SubScopes).Aggregate((a, b) => a.Concat(b));
+
+      var individuals = scopes.Select(encoding.GetIndividual).ToArray();
+      AnalyzeAction(individuals, QualitiesParameter.ActualValue.Select(x => x.ToArray()).ToArray(), results, random);
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveEvaluator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/MultiObjectiveEvaluator.cs	(revision 12005)
@@ -0,0 +1,70 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Multi-objective Evaluator", "Calls the Evaluate method of the problem definition and writes the return value into the scope.")]
+  [StorableClass]
+  public class MultiObjectiveEvaluator : SingleSuccessorOperator, IMultiObjectiveEvaluationOperator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public ILookupParameter<DoubleArray> QualitiesParameter {
+      get { return (ILookupParameter<DoubleArray>)Parameters["Qualities"]; }
+    }
+
+    public Func<Individual, IRandom, double[]> EvaluateFunc { get; set; }
+
+    [StorableConstructor]
+    protected MultiObjectiveEvaluator(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveEvaluator(MultiObjectiveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public MultiObjectiveEvaluator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new LookupParameter<DoubleArray>("Qualities", "The qualities of the parameter vector."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveEvaluator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var random = RandomParameter.ActualValue;
+      var encoding = EncodingParameter.ActualValue;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      QualitiesParameter.ActualValue = new DoubleArray(EvaluateFunc(individual, random));
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveAnalyzer.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveAnalyzer.cs	(revision 12005)
@@ -0,0 +1,84 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective Analyzer", "Calls the script's Analyze method to be able to write into the results collection.")]
+  [StorableClass]
+  public sealed class SingleObjectiveAnalyzer : SingleSuccessorOperator, ISingleObjectiveAnalysisOperator, IAnalyzer, IStochasticOperator {
+    public bool EnabledByDefault { get { return true; } }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public IScopeTreeLookupParameter<DoubleValue> QualityParameter {
+      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ILookupParameter<ResultCollection> ResultsParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public Action<Individual[], double[], ResultCollection, IRandom> AnalyzeAction { get; set; }
+
+    [StorableConstructor]
+    private SingleObjectiveAnalyzer(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveAnalyzer(SingleObjectiveAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveAnalyzer() {
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The results collection to write to."));
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var encoding = EncodingParameter.ActualValue;
+      var results = ResultsParameter.ActualValue;
+      var random = RandomParameter.ActualValue;
+
+      IEnumerable<IScope> scopes = new[] { ExecutionContext.Scope };
+      for (var i = 0; i < QualityParameter.Depth; i++)
+        scopes = scopes.Select(x => (IEnumerable<IScope>)x.SubScopes).Aggregate((a, b) => a.Concat(b));
+
+      var individuals = scopes.Select(encoding.GetIndividual).ToArray();
+      AnalyzeAction(individuals, QualityParameter.ActualValue.Select(x => x.Value).ToArray(), results, random);
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveEvaluator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveEvaluator.cs	(revision 12005)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective Evaluator", "Calls the script's Evaluate method to get the quality value of the parameter vector.")]
+  [StorableClass]
+  public sealed class SingleObjectiveEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluationOperator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public Func<Individual, IRandom, double> EvaluateFunc { get; set; }
+
+    [StorableConstructor]
+    private SingleObjectiveEvaluator(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveEvaluator(SingleObjectiveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveEvaluator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) { return new SingleObjectiveEvaluator(this, cloner); }
+
+    public override IOperation Apply() {
+      var random = RandomParameter.ActualValue;
+      var encoding = EncodingParameter.ActualValue;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      QualityParameter.ActualValue = new DoubleValue(EvaluateFunc(individual, random));
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveImprover.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveImprover.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveImprover.cs	(revision 12005)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective Improver", "Improves a solution by calling GetNeighbors and Evaluate of the corresponding problem definition.")]
+  [StorableClass]
+  public sealed class SingleObjectiveImprover : SingleSuccessorOperator, INeighborBasedOperator, IImprovementOperator, ISingleObjectiveEvaluationOperator, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ILookupParameter<BoolValue> MaximizationParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
+    }
+
+    public IValueLookupParameter<IntValue> ImprovementAttemptsParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["ImprovementAttempts"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public ILookupParameter<IntValue> LocalEvaluatedSolutionsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters["LocalEvaluatedSolutions"]; }
+    }
+
+    public Func<Individual, IRandom, double> EvaluateFunc { get; set; }
+    public Func<Individual, IRandom, IEnumerable<Individual>> GetNeighborsFunc { get; set; }
+
+    [StorableConstructor]
+    private SingleObjectiveImprover(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveImprover(SingleObjectiveImprover original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveImprover() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "Whether the problem should be minimized or maximized."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("ImprovementAttempts", "The number of improvement attempts the operator should perform.", new IntValue(100)));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of samples to draw from the neighborhood function at maximum.", new IntValue(300)));
+      Parameters.Add(new LookupParameter<IntValue>("LocalEvaluatedSolutions", "The number of solution evaluations that have been performed."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveImprover(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var random = RandomParameter.ActualValue;
+      var encoding = EncodingParameter.ActualValue;
+      var maximize = MaximizationParameter.ActualValue.Value;
+      var maxAttempts = ImprovementAttemptsParameter.ActualValue.Value;
+      var sampleSize = SampleSizeParameter.ActualValue.Value;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      var quality = QualityParameter.ActualValue == null ? EvaluateFunc(individual, random) : QualityParameter.ActualValue.Value;
+
+      var count = 0;
+      for (var i = 0; i < maxAttempts; i++) {
+        Individual best = null;
+        var bestQuality = quality;
+        foreach (var neighbor in GetNeighborsFunc(individual, random).Take(sampleSize)) {
+          var q = EvaluateFunc(neighbor, random);
+          count++;
+          if (maximize && bestQuality > q || !maximize && bestQuality < q) continue;
+          best = neighbor;
+          bestQuality = q;
+        }
+        if (best == null) break;
+        individual = best;
+        quality = bestQuality;
+      }
+
+      LocalEvaluatedSolutionsParameter.ActualValue = new IntValue(count);
+      QualityParameter.ActualValue = new DoubleValue(quality);
+      individual.CopyToScope(ExecutionContext.Scope);
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveEvaluator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveEvaluator.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective MoveEvaluator", "Evaluates a parameter vector that results from a move.")]
+  [StorableClass]
+  public class SingleObjectiveMoveEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluationOperator, ISingleObjectiveMoveEvaluator, IStochasticOperator, ISingleObjectiveMoveOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+
+    public Func<Individual, IRandom, double> EvaluateFunc { get; set; }
+
+    [StorableConstructor]
+    protected SingleObjectiveMoveEvaluator(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveMoveEvaluator(SingleObjectiveMoveEvaluator original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveMoveEvaluator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveMoveEvaluator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var random = RandomParameter.ActualValue;
+      var encoding = EncodingParameter.ActualValue;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      MoveQualityParameter.ActualValue = new DoubleValue(EvaluateFunc(individual, random));
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveGenerator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveGenerator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveGenerator.cs	(revision 12005)
@@ -0,0 +1,82 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Globalization;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective MoveGenerator", "Calls the GetNeighbors method of the problem definition to obtain the moves.")]
+  [StorableClass]
+  public class SingleObjectiveMoveGenerator : SingleSuccessorOperator, INeighborBasedOperator, IMultiMoveGenerator, IStochasticOperator, ISingleObjectiveMoveOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public IValueLookupParameter<IntValue> SampleSizeParameter {
+      get { return (IValueLookupParameter<IntValue>)Parameters["SampleSize"]; }
+    }
+
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public Func<Individual, IRandom, IEnumerable<Individual>> GetNeighborsFunc { get; set; }
+
+    [StorableConstructor]
+    protected SingleObjectiveMoveGenerator(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveMoveGenerator(SingleObjectiveMoveGenerator original, Cloner cloner)
+      : base(original, cloner) { }
+    public SingleObjectiveMoveGenerator() {
+      Parameters.Add(new LookupParameter<IRandom>("Random", "The random number generator to use."));
+      Parameters.Add(new ValueLookupParameter<IntValue>("SampleSize", "The number of moves to sample."));
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveMoveGenerator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var random = RandomParameter.ActualValue;
+      var sampleSize = SampleSizeParameter.ActualValue.Value;
+      var encoding = EncodingParameter.ActualValue;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      var nbhood = GetNeighborsFunc(individual, random).Take(sampleSize).ToList();
+
+      var moveScopes = new Scope[nbhood.Count];
+      for (int i = 0; i < moveScopes.Length; i++) {
+        moveScopes[i] = new Scope(i.ToString(CultureInfo.InvariantCulture.NumberFormat));
+        nbhood[i].CopyToScope(moveScopes[i]);
+      }
+      ExecutionContext.Scope.SubScopes.AddRange(moveScopes);
+
+      return base.Apply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveMaker.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/Operators/SingleObjectiveMoveMaker.cs	(revision 12005)
@@ -0,0 +1,72 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [Item("Single-objective MoveMaker", "Applies a move.")]
+  [StorableClass]
+  public class SingleObjectiveMoveMaker : InstrumentedOperator, IMoveMaker, ISingleObjectiveMoveOperator {
+    public ILookupParameter<IEncoding> EncodingParameter {
+      get { return (ILookupParameter<IEncoding>)Parameters["Encoding"]; }
+    }
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+
+    public ILookupParameter<DoubleValue> MoveQualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
+    }
+
+    [StorableConstructor]
+    protected SingleObjectiveMoveMaker(bool deserializing) : base(deserializing) { }
+    protected SingleObjectiveMoveMaker(SingleObjectiveMoveMaker original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveMoveMaker() {
+      Parameters.Add(new LookupParameter<IEncoding>("Encoding", "An item that holds the problem's encoding."));
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The quality of the parameter vector."));
+      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the move."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveMoveMaker(this, cloner);
+    }
+
+    public override IOperation InstrumentedApply() {
+      if (MoveQualityParameter.ActualValue == null) throw new InvalidOperationException("Move has not been evaluated!");
+
+      var encoding = EncodingParameter.ActualValue;
+      var individual = encoding.GetIndividual(ExecutionContext.Scope);
+      individual.CopyToScope(ExecutionContext.Scope.Parent.Parent);
+
+      if (QualityParameter.ActualValue == null) QualityParameter.ActualValue = new DoubleValue(MoveQualityParameter.ActualValue.Value);
+      else QualityParameter.ActualValue.Value = MoveQualityParameter.ActualValue.Value;
+
+      return base.InstrumentedApply();
+    }
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/BasicProblems/SingleObjectiveBasicProblem.cs	(revision 12005)
@@ -0,0 +1,130 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Optimization {
+  [StorableClass]
+  public abstract class SingleObjectiveBasicProblem<TEncoding> : BasicProblem<TEncoding, SingleObjectiveEvaluator>,
+    ISingleObjectiveProblemDefinition, ISingleObjectiveHeuristicOptimizationProblem
+  where TEncoding : class, IEncoding {
+
+    protected IValueParameter<DoubleValue> BestKnownQualityParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
+    }
+
+    public double BestKnownQuality {
+      get {
+        if (BestKnownQualityParameter.Value == null) return double.NaN;
+        return BestKnownQualityParameter.Value.Value;
+      }
+      set {
+        if (BestKnownQualityParameter.Value == null) BestKnownQualityParameter.Value = new DoubleValue(value);
+        else BestKnownQualityParameter.Value.Value = value;
+      }
+    }
+
+    [StorableConstructor]
+    protected SingleObjectiveBasicProblem(bool deserializing) : base(deserializing) { }
+
+    protected SingleObjectiveBasicProblem(SingleObjectiveBasicProblem<TEncoding> original, Cloner cloner)
+      : base(original, cloner) {
+      ParameterizeOperators();
+    }
+
+    protected SingleObjectiveBasicProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", (BoolValue)new BoolValue(Maximization).AsReadOnly()) { Hidden = true });
+      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this problem."));
+
+      Operators.Add(Evaluator);
+      Operators.Add(new SingleObjectiveAnalyzer());
+      Operators.Add(new SingleObjectiveImprover());
+      Operators.Add(new SingleObjectiveMoveEvaluator());
+      Operators.Add(new SingleObjectiveMoveGenerator());
+      Operators.Add(new SingleObjectiveMoveMaker());
+
+      ParameterizeOperators();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ParameterizeOperators();
+    }
+
+    public abstract bool Maximization { get; }
+    public abstract double Evaluate(Individual individual, IRandom random);
+    public virtual void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) { }
+    public virtual IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      return Enumerable.Empty<Individual>();
+    }
+
+    protected override void OnOperatorsChanged() {
+      base.OnOperatorsChanged();
+      if (Encoding != null) {
+        PruneMultiObjectiveOperators(Encoding);
+        var multiEncoding = Encoding as MultiEncoding;
+        if (multiEncoding != null) {
+          foreach (var encoding in multiEncoding.Encodings.ToList()) {
+            PruneMultiObjectiveOperators(encoding);
+          }
+        }
+      }
+    }
+
+    private void PruneMultiObjectiveOperators(IEncoding encoding) {
+      if (encoding.Operators.Any(x => x is IMultiObjectiveOperator && !(x is ISingleObjectiveOperator)))
+        encoding.Operators = encoding.Operators.Where(x => !(x is IMultiObjectiveOperator) || x is ISingleObjectiveOperator).ToList();
+    }
+
+    protected override void OnEvaluatorChanged() {
+      base.OnEvaluatorChanged();
+      ParameterizeOperators();
+    }
+
+    private void ParameterizeOperators() {
+      foreach (var op in Operators.OfType<ISingleObjectiveEvaluationOperator>())
+        op.EvaluateFunc = Evaluate;
+      foreach (var op in Operators.OfType<ISingleObjectiveAnalysisOperator>())
+        op.AnalyzeAction = Analyze;
+      foreach (var op in Operators.OfType<INeighborBasedOperator>())
+        op.GetNeighborsFunc = GetNeighbors;
+    }
+
+    #region ISingleObjectiveHeuristicOptimizationProblem Members
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.MaximizationParameter {
+      get { return Parameters["Maximization"]; }
+    }
+    IParameter ISingleObjectiveHeuristicOptimizationProblem.BestKnownQualityParameter {
+      get { return Parameters["BestKnownQuality"]; }
+    }
+    ISingleObjectiveEvaluator ISingleObjectiveHeuristicOptimizationProblem.Evaluator {
+      get { return Evaluator; }
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj
===================================================================
--- stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj	(revision 12005)
@@ -121,5 +121,39 @@
   <ItemGroup>
     <Compile Include="Algorithms\BasicAlgorithm.cs" />
+    <Compile Include="BasicProblems\BasicProblem.cs" />
+    <Compile Include="BasicProblems\Encoding.cs" />
+    <Compile Include="BasicProblems\Individuals\Individual.cs" />
+    <Compile Include="BasicProblems\Individuals\MultiEncodingIndividual.cs" />
+    <Compile Include="BasicProblems\Individuals\SingleEncodingIndividual.cs" />
+    <Compile Include="BasicProblems\Interfaces\IEncoding.cs" />
+    <Compile Include="BasicProblems\Interfaces\IEncodingOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\IMultiEncodingOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\IMultiObjectiveProblemDefinition.cs" />
+    <Compile Include="BasicProblems\Interfaces\internal\IMultiObjectiveAnalysisOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\internal\IMultiObjectiveEvaluationOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\internal\INeighborBasedOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\internal\ISingleObjectiveAnalysisOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\internal\ISingleObjectiveEvaluationOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\IProblemDefinition.cs" />
+    <Compile Include="BasicProblems\Interfaces\ISingleObjectiveMoveOperator.cs" />
+    <Compile Include="BasicProblems\Interfaces\ISingleObjectiveProblemDefinition.cs" />
+    <Compile Include="BasicProblems\MultiEncoding.cs" />
+    <Compile Include="BasicProblems\MultiObjectiveBasicProblem.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingCreator.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingCrossover.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingManipulator.cs" />
+    <Compile Include="BasicProblems\Operators\MultiEncodingOperator.cs" />
+    <Compile Include="BasicProblems\Operators\MultiObjectiveAnalyzer.cs" />
+    <Compile Include="BasicProblems\Operators\MultiObjectiveEvaluator.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveAnalyzer.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveEvaluator.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveImprover.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveMoveEvaluator.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveMoveGenerator.cs" />
+    <Compile Include="BasicProblems\Operators\SingleObjectiveMoveMaker.cs" />
+    <Compile Include="BasicProblems\SingleObjectiveBasicProblem.cs" />
     <Compile Include="Interfaces\ILocalImprovementAlgorithmOperator.cs" />
+    <Compile Include="Interfaces\IMultiObjectiveOperator.cs" />
+    <Compile Include="Interfaces\ISingleObjectiveOperator.cs" />
     <Compile Include="Interfaces\ISingleObjectivePathRelinker.cs" />
     <Compile Include="Interfaces\ISingleObjectiveImprovementOperator.cs" />
@@ -246,4 +280,9 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
       <Project>{56F9106A-079F-4C61-92F6-86A84C2D84B7}</Project>
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveEvaluator.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents an evaluation operator for multi-objective optimization problems.
   /// </summary>
-  public interface IMultiObjectiveEvaluator : IEvaluator {
+  public interface IMultiObjectiveEvaluator : IEvaluator, IMultiObjectiveOperator {
     ILookupParameter<DoubleArray> QualitiesParameter { get; }
   }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveOperator.cs	(revision 12005)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// This is only a marker interface to prevent operators that expect to work with multiple quality values
+  /// and/or multiple maximization flags to appear in single-objective algorithms.
+  /// </summary>
+  /// <remarks>
+  /// Marker interfaces are typically not a good design, however specifying a reasonable non-empty common
+  /// interface for all multi-objective operators is difficult. There are many different variants of
+  /// multi-ojective operators with specific needs that can currently only be abstracted by an empty interface.
+  /// In the following, please find a list of different kinds of multi-objective operators.
+  /// <list type="bullet">
+  ///   <item>
+  ///     <term>Evaluators</term>
+  ///     <description>These only need a qualities parameter, but not a maximization parameter.</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Population-based operators</term>
+  ///     <description>These require the qualities parameter to be a scope-tree lookup, e.g. analyzers, crossovers, multi-objective selectors.</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Problem-specific operators</term>
+  ///     <description>They may perform multiple operations on a solution, evaluate and select without taking into account maximization or the evaluator</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Other multi-objective operators</term>
+  ///     <description>They would need both a qualities, and a maximization parameter, and may be population-based or not.</description>
+  ///   </item>
+  /// </list>
+  /// </remarks>
+  public interface IMultiObjectiveOperator { }
+}
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/IMultiObjectiveSelector.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents a selection operator for selecting solutions of multi-objective optimization problems.
   /// </summary>
-  public interface IMultiObjectiveSelector : ISelector {
+  public interface IMultiObjectiveSelector : ISelector, IMultiObjectiveOperator {
     ILookupParameter<BoolArray> MaximizationParameter { get; }
     ILookupParameter<ItemArray<DoubleArray>> QualitiesParameter { get; }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/IProblem.cs	(revision 12005)
@@ -31,4 +31,6 @@
     IEnumerable<IItem> Operators { get; }
 
+
+    IEnumerable<IParameterizedItem> ExecutionContextItems { get; }
     event EventHandler OperatorsChanged;
     event EventHandler Reset;
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleMoveGenerator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleMoveGenerator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleMoveGenerator.cs	(revision 12005)
@@ -21,5 +21,5 @@
 
 namespace HeuristicLab.Optimization {
-  public interface ISingleMoveGenerator : IMoveGenerator {
+  public interface ISingleMoveGenerator : IMoveGenerator, ISingleObjectiveOperator {
   }
 }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveEvaluator.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents an evaluation operator for single-objective optimization problems.
   /// </summary>
-  public interface ISingleObjectiveEvaluator : IEvaluator {
+  public interface ISingleObjectiveEvaluator : IEvaluator, ISingleObjectiveOperator {
     ILookupParameter<DoubleValue> QualityParameter { get; }
   }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveImprovementOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveImprovementOperator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveImprovementOperator.cs	(revision 12005)
@@ -26,5 +26,5 @@
   /// An interface which represents an operator for improvement of a single objective solution.
   /// </summary>
-  public interface ISingleObjectiveImprovementOperator : IImprovementOperator {
+  public interface ISingleObjectiveImprovementOperator : IImprovementOperator, ISingleObjectiveOperator {
     IValueLookupParameter<IItem> SolutionParameter { get; }
   }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveMoveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveMoveEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveMoveEvaluator.cs	(revision 12005)
@@ -24,5 +24,5 @@
 
 namespace HeuristicLab.Optimization {
-  public interface ISingleObjectiveMoveEvaluator : IOperator {
+  public interface ISingleObjectiveMoveEvaluator : IOperator, ISingleObjectiveOperator {
     ILookupParameter<DoubleValue> QualityParameter { get; }
     ILookupParameter<DoubleValue> MoveQualityParameter { get; }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveOperator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveOperator.cs	(revision 12005)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveOperator.cs	(revision 12005)
@@ -0,0 +1,52 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimization {
+  /// <summary>
+  /// This is only a marker interface to prevent operators that expect to work with a single quality value
+  /// and/or a single maximization flag to appear in multi-objective algorithms.
+  /// </summary>
+  /// <remarks>
+  /// Marker interfaces are typically not a good design, however specifying a reasonable non-empty common
+  /// interface for all single-objective operators is difficult. There are many different variants of
+  /// single-ojective operators with specific needs that can currently only be abstracted by an empty interface.
+  /// In the following, please find a list of different kinds of single-objective operators.
+  /// <list type="bullet">
+  ///   <item>
+  ///     <term>Evaluators</term>
+  ///     <description>These only need a quality parameter, but not a maximization parameter.</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Population-based operators</term>
+  ///     <description>These require the quality parameter to be a scope-tree lookup, e.g. analyzers, crossovers, single-objective replacers and selectors.</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Problem-specific operators</term>
+  ///     <description>They may perform multiple operations on a solution, evaluate and select without taking into account maximization or the evaluator, e.g. many improvement operators.</description>
+  ///   </item>
+  ///   <item>
+  ///     <term>Other single-objective operators</term>
+  ///     <description>They would need both a quality, and a maximization parameter, and may be population-based or not.</description>
+  ///   </item>
+  /// </list>
+  /// </remarks>
+  public interface ISingleObjectiveOperator { }
+}
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectivePathRelinker.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectivePathRelinker.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectivePathRelinker.cs	(revision 12005)
@@ -26,5 +26,5 @@
   /// An interface which represents an operator for path relinking between single objective solutions.
   /// </summary>
-  public interface ISingleObjectivePathRelinker : IPathRelinker {
+  public interface ISingleObjectivePathRelinker : IPathRelinker, ISingleObjectiveOperator {
     ILookupParameter<ItemArray<IItem>> ParentsParameter { get; }
   }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveReplacer.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveReplacer.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveReplacer.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents a replacement operator for replacing solutions of single-objective optimization problems.
   /// </summary>
-  public interface ISingleObjectiveReplacer : IReplacer {
+  public interface ISingleObjectiveReplacer : IReplacer, ISingleObjectiveOperator {
     IValueLookupParameter<BoolValue> MaximizationParameter { get; }
     ILookupParameter<ItemArray<DoubleValue>> QualityParameter { get; }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSelector.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents a selection operator for selecting solutions of single-objective optimization problems.
   /// </summary>
-  public interface ISingleObjectiveSelector : ISelector {
+  public interface ISingleObjectiveSelector : ISelector, ISingleObjectiveOperator {
     IValueLookupParameter<BoolValue> MaximizationParameter { get; }
     ILookupParameter<ItemArray<DoubleValue>> QualityParameter { get; }
Index: stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Interfaces/ISingleObjectiveSolutionSimilarityCalculator.cs	(revision 12005)
@@ -24,5 +24,5 @@
   /// An interface which represents an operator for similarity calculation between single objective solutions.
   /// </summary>
-  public interface ISingleObjectiveSolutionSimilarityCalculator : ISolutionSimilarityCalculator {
+  public interface ISingleObjectiveSolutionSimilarityCalculator : ISolutionSimilarityCalculator, ISingleObjectiveOperator {
     string SolutionVariableName { get; set; }
     string QualityVariableName { get; set; }
Index: stable/HeuristicLab.Optimization/3.3/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Plugin.cs.frame	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Plugin.cs.frame	(revision 12005)
@@ -33,4 +33,5 @@
   [PluginDependency("HeuristicLab.Core", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Parameters", "3.3")]
   [PluginDependency("HeuristicLab.Persistence", "3.3")]
Index: stable/HeuristicLab.Optimization/3.3/Problems/HeuristicOptimizationProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Problems/HeuristicOptimizationProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Problems/HeuristicOptimizationProblem.cs	(revision 12005)
@@ -78,9 +78,9 @@
 
     public U SolutionCreator {
-      get { return SolutionCreatorParameter.Value; }
+      get { return (U)SolutionCreatorParameter.Value; }
       protected set { SolutionCreatorParameter.Value = value; }
     }
-    public ValueParameter<U> SolutionCreatorParameter {
-      get { return (ValueParameter<U>)Parameters[SolutionCreateParameterName]; }
+    public IValueParameter SolutionCreatorParameter {
+      get { return (IValueParameter)Parameters[SolutionCreateParameterName]; }
     }
     ISolutionCreator IHeuristicOptimizationProblem.SolutionCreator { get { return SolutionCreator; } }
@@ -99,5 +99,5 @@
     }
 
-    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
+    protected virtual void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
       OnSolutionCreatorChanged();
     }
Index: stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Problems/Problem.cs	(revision 12005)
@@ -114,5 +114,13 @@
       }
     }
-    IEnumerable<IItem> IProblem.Operators { get { return Operators; } }
+    IEnumerable<IItem> IProblem.Operators { get { return GetOperators(); } }
+
+    protected virtual IEnumerable<IItem> GetOperators() {
+      return Operators;
+    }
+
+    public virtual IEnumerable<IParameterizedItem> ExecutionContextItems {
+      get { yield return this; }
+    }
     #endregion
 
Index: stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs
===================================================================
--- stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Optimization/3.3/Problems/UserDefinedProblem.cs	(revision 12005)
@@ -115,4 +115,8 @@
       get { return OperatorsParameter.Value; }
     }
+
+    public IEnumerable<IParameterizedItem> ExecutionContextItems {
+      get { yield return this; }
+    }
     #endregion
 
Index: stable/HeuristicLab.Problems.ArtificialAnt/3.4/Analyzers/BestAntTrailAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.ArtificialAnt/3.4/Analyzers/BestAntTrailAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.ArtificialAnt/3.4/Analyzers/BestAntTrailAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestAntTrailAnalyzer", "An operator for analyzing the best ant trail of an artificial ant problem.")]
   [StorableClass]
-  public sealed class BestAntTrailAnalyzer : SingleSuccessorOperator, IAntTrailAnalyzer {
+  public sealed class BestAntTrailAnalyzer : SingleSuccessorOperator, IAntTrailAnalyzer, ISingleObjectiveOperator {
     public bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.Binary/3.3/BinaryProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/BinaryProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/BinaryProblem.cs	(revision 12005)
@@ -0,0 +1,98 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Binary {
+  [StorableClass]
+  public abstract class BinaryProblem : SingleObjectiveBasicProblem<BinaryVectorEncoding> {
+    public virtual int Length {
+      get { return Encoding.Length; }
+      set { Encoding.Length = value; }
+    }
+
+    private IFixedValueParameter<IntValue> LengthParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters["Length"]; }
+    }
+
+    [StorableConstructor]
+    protected BinaryProblem(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected BinaryProblem(BinaryProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEventHandlers();
+    }
+
+    protected BinaryProblem()
+      : base() {
+      var lengthParameter = new FixedValueParameter<IntValue>("Length", "The length of the BinaryVector.", new IntValue(10));
+      Parameters.Add(lengthParameter);
+      Encoding.LengthParameter = lengthParameter;
+      RegisterEventHandlers();
+    }
+
+    public virtual bool IsBetter(double quality, double bestQuality) {
+      return (Maximization && quality > bestQuality || !Maximization && quality < bestQuality);
+    }
+
+    public abstract double Evaluate(BinaryVector vector, IRandom random);
+    public sealed override double Evaluate(Individual individual, IRandom random) {
+      return Evaluate(individual.BinaryVector(), random);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      base.Analyze(individuals, qualities, results, random);
+      var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+      var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
+
+      if (!results.ContainsKey("Best Solution")) {
+        results.Add(new Result("Best Solution", typeof(BinaryVector)));
+      }
+      results["Best Solution"].Value = (IItem)best.BinaryVector().Clone();
+    }
+
+    protected override void OnEncodingChanged() {
+      base.OnEncodingChanged();
+      Encoding.LengthParameter = LengthParameter;
+    }
+
+
+    private void RegisterEventHandlers() {
+      LengthParameter.Value.ValueChanged += LengthParameter_ValueChanged;
+    }
+
+    protected virtual void LengthParameter_ValueChanged(object sender, EventArgs e) { }
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/DeceptiveStepTrapProblem.cs	(revision 12005)
@@ -0,0 +1,92 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Binary {
+  [Item("Deceptive Step Trap Problem", "Genome encodes completely separable blocks, where each block deceptive with fitness plateaus.")]
+  [StorableClass]
+  [Creatable("Problems")]
+  public class DeceptiveStepTrapProblem : DeceptiveTrapProblem {
+    [StorableConstructor]
+    protected DeceptiveStepTrapProblem(bool deserializing) : base(deserializing) { }
+    protected DeceptiveStepTrapProblem(DeceptiveStepTrapProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterParameterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeceptiveStepTrapProblem(this, cloner);
+    }
+
+    private const string StepSizeParameterName = "Step Size";
+
+    public IFixedValueParameter<IntValue> StepSizeParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[StepSizeParameterName]; }
+    }
+
+    public int StepSize {
+      get { return StepSizeParameter.Value.Value; }
+      set { StepSizeParameter.Value.Value = value; }
+    }
+
+    public DeceptiveStepTrapProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>(StepSizeParameterName, "", new IntValue(2)));
+      RegisterParameterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterParameterEvents();
+    }
+
+    private void RegisterParameterEvents() {
+      TrapSizeParameter.Value.ValueChanged += (o, e) => { offset = -1; };
+      StepSizeParameter.Value.ValueChanged += (o, e) => { offset = -1; };
+    }
+
+
+    private int offset = -1;
+    private int Offset {
+      get {
+        if (offset == -1) offset = (TrapSize - StepSize) % StepSize;
+        return offset;
+      }
+    }
+
+    protected override int TrapMaximum {
+      get { return (Offset + TrapSize) / StepSize; }
+    }
+
+    protected override int Score(BinaryVector individual, int trapIndex, int trapSize) {
+      int partial = base.Score(individual, trapIndex, trapSize);
+      // introduce plateaus using integer division
+      return (Offset + partial) / StepSize;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/DeceptiveTrapProblem.cs	(revision 12005)
@@ -0,0 +1,96 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Binary {
+  [Item("Deceptive Trap Problem", "Genome encodes completely separable blocks, where each block is fully deceptive.")]
+  [StorableClass]
+  [Creatable("Problems")]
+  public class DeceptiveTrapProblem : BinaryProblem {
+    [StorableConstructor]
+    protected DeceptiveTrapProblem(bool deserializing) : base(deserializing) { }
+    protected DeceptiveTrapProblem(DeceptiveTrapProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DeceptiveTrapProblem(this, cloner);
+    }
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    private const string TrapSizeParameterName = "Trap Size";
+
+    public IFixedValueParameter<IntValue> TrapSizeParameter {
+      get { return (IFixedValueParameter<IntValue>)Parameters[TrapSizeParameterName]; }
+    }
+
+    public int TrapSize {
+      get { return TrapSizeParameter.Value.Value; }
+      set { TrapSizeParameter.Value.Value = value; }
+    }
+
+    protected virtual int TrapMaximum {
+      get { return TrapSize; }
+    }
+
+    public DeceptiveTrapProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<IntValue>(TrapSizeParameterName, "", new IntValue(7)));
+      Encoding.Length = 49;
+    }
+
+    // In the GECCO paper, calculates Equation 3
+    protected virtual int Score(BinaryVector individual, int trapIndex, int trapSize) {
+      int result = 0;
+      // count number of bits in trap set to 1
+      for (int index = trapIndex; index < trapIndex + trapSize; index++) {
+        if (individual[index]) result++;
+      }
+
+      // Make it deceptive
+      if (result < trapSize) {
+        result = trapSize - result - 1;
+      }
+      return result;
+    }
+
+    public override double Evaluate(BinaryVector individual, IRandom random) {
+      if (individual.Length != Length) throw new ArgumentException("The individual has not the correct length.");
+      int total = 0;
+      var trapSize = TrapSize;
+      for (int i = 0; i < individual.Length; i += trapSize) {
+        total += Score(individual, i, trapSize);
+      }
+      return (double)(total * trapSize) / (TrapMaximum * individual.Length);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/HIFFProblem.cs	(revision 12005)
@@ -0,0 +1,91 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Binary {
+  [Item("Hierararchical If and only If problem", "Genome evaluated in nested subsets to see if each subset contains either all 0s or all 1s.")]
+  [StorableClass]
+  [Creatable("Problems")]
+  public class HIFFProblem : BinaryProblem {
+    [StorableConstructor]
+    protected HIFFProblem(bool deserializing) : base(deserializing) { }
+    protected HIFFProblem(HIFFProblem original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HIFFProblem(this, cloner);
+    }
+
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    public HIFFProblem()
+      : base() {
+        Encoding.Length = 64;
+    }
+    // In the GECCO paper, Section 4.1
+    public override double Evaluate(BinaryVector individual, IRandom random) {
+      int[] level = new int[individual.Length];
+      int levelLength = individual.Length;
+
+      // Initialize the level to the current solution
+      for (int i = 0; i < levelLength; i++) {
+        level[i] = Convert.ToInt32(individual[i]);
+      }
+      int power = 1;
+      int nextLength = levelLength / 2;
+      int total = 0;
+      int maximum = 0;
+
+      // Keep going while the next level actual has bits in it
+      while (nextLength > 0) {
+        int[] nextLevel = new int[nextLength];
+        // Construct the next level using the current level
+        for (int i = 0; i + 1 < levelLength; i += 2) {
+          if (level[i] == level[i + 1] && level[i] != -1) {
+            // Score points for a correct setting at this level
+            total += power;
+            nextLevel[i / 2] = level[i];
+          } else {
+            nextLevel[i / 2] = -1;
+          }
+          // Keep track of the maximum possible score
+          maximum += power;
+        }
+        level = nextLevel;
+        levelLength = nextLength;
+        nextLength = levelLength / 2;
+        power *= 2;
+      }
+
+      // Convert to percentage of total
+      return (double)total / maximum;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/HeuristicLab.Problems.Binary-3.3.csproj
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/HeuristicLab.Problems.Binary-3.3.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/HeuristicLab.Problems.Binary-3.3.csproj	(revision 12005)
@@ -0,0 +1,173 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{FC627BE5-0F93-47D8-BD2E-530EA2B8AA5F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Binary</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Binary-3.3</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </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>
+  </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>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="BinaryProblem.cs" />
+    <Compile Include="DeceptiveStepTrapProblem.cs" />
+    <Compile Include="DeceptiveTrapProblem.cs" />
+    <Compile Include="HIFFProblem.cs" />
+    <Compile Include="OneMaxProblem.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.BinaryVectorEncoding\3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj">
+      <Project>{66d249c3-a01d-42a8-82a2-919bc8ec3d83}</Project>
+      <Name>HeuristicLab.Encodings.BinaryVectorEncoding-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>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">
+      set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+      set ProjectDir=$(ProjectDir)
+      set SolutionDir=$(SolutionDir)
+      set Outdir=$(Outdir)
+
+      call PreBuildEvent.cmd
+    </PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+      export ProjectDir=$(ProjectDir)
+      export SolutionDir=$(SolutionDir)
+
+      $SolutionDir/PreBuildEvent.sh
+    </PreBuildEvent>
+  </PropertyGroup>  
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/OneMaxProblem.cs	(revision 12005)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Binary {
+  [Item("One Max Problem", "Represents a problem whose objective is to maximize the number of true values.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public class OneMaxProblem : BinaryProblem {
+    public override bool Maximization {
+      get { return true; }
+    }
+
+    public OneMaxProblem()
+      : base() {
+      Encoding.Length = 10;
+      BestKnownQuality = Encoding.Length;
+    }
+
+    [StorableConstructor]
+    protected OneMaxProblem(bool deserializing) : base(deserializing) { }
+
+    protected OneMaxProblem(OneMaxProblem original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OneMaxProblem(this, cloner);
+    }
+
+    public override double Evaluate(BinaryVector vector, IRandom random) {
+      return vector.Count(b => b);
+    }
+
+    protected override void LengthParameter_ValueChanged(object sender, EventArgs e) {
+      base.LengthParameter_ValueChanged(sender, e);
+      BestKnownQuality = Length;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,40 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Problems.Binary {
+  [Plugin("HeuristicLab.Problems.Binary","Provides binary benchmark problems.", "3.3.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Binary-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.BinaryVectorEncoding", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  public class HeuristicLabProblemsBinaryPlugin : PluginBase {
+  }
+}
Index: stable/HeuristicLab.Problems.Binary/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Binary/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Binary/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -0,0 +1,55 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Binary")]
+[assembly: AssemblyDescription("Provides binary benchmark problems.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("74CF50B5-F690-42FC-AFB4-03E9F72D5226")]
+
+// 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.10.$WCREV$")]
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationExpressionGrammar.cs	(revision 12005)
@@ -0,0 +1,105 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [StorableClass]
+  [Item("ExternalEvaluationExpressionGrammar", "Represents a grammar for functional expressions using all available functions.")]
+  public class ExternalEvaluationExpressionGrammar : SymbolicExpressionGrammar, ISymbolicDataAnalysisGrammar {
+    [Storable]
+    private HeuristicLab.Problems.DataAnalysis.Symbolic.Variable variableSymbol;
+    [StorableConstructor]
+    protected ExternalEvaluationExpressionGrammar(bool deserializing) : base(deserializing) { }
+    protected ExternalEvaluationExpressionGrammar(ExternalEvaluationExpressionGrammar original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationExpressionGrammar(this, cloner);
+    }
+
+    public ExternalEvaluationExpressionGrammar()
+      : base("ExternalEvaluationExpressionGrammar", "Represents a grammar for functional expressions using all available functions.") {
+      Initialize();
+    }
+
+    private void Initialize() {      
+      var add = new Addition();
+      var sub = new Subtraction();
+      var mul = new Multiplication();
+      var div = new Division();
+      var mean = new Average();
+      var sin = new Sine();
+      var cos = new Cosine();
+      var tan = new Tangent();
+      var log = new Logarithm();
+      var exp = new Exponential();
+      var @if = new IfThenElse();
+      var gt = new GreaterThan();
+      var lt = new LessThan();
+      var and = new And();
+      var or = new Or();
+      var not = new Not();
+      var constant = new Constant();
+      constant.MinValue = -20;
+      constant.MaxValue = 20;
+      variableSymbol = new HeuristicLab.Problems.DataAnalysis.Symbolic.Variable();
+
+      var allSymbols = new List<Symbol>() { add, sub, mul, div, mean, sin, cos, tan, log, exp, @if, gt, lt, and, or, not, constant, variableSymbol };
+      var unaryFunctionSymbols = new List<Symbol>() { sin, cos, tan, log, exp, not };
+      var binaryFunctionSymbols = new List<Symbol>() { gt, lt };
+      var functionSymbols = new List<Symbol>() { add, sub, mul, div, mean, and, or };
+
+      foreach (var symb in allSymbols)
+        AddSymbol(symb);
+
+      foreach (var funSymb in functionSymbols) {
+        SetSubtreeCount(funSymb, 1, 3);
+      }
+      foreach (var funSymb in unaryFunctionSymbols) {
+        SetSubtreeCount(funSymb, 1, 1);
+      }
+      foreach (var funSymb in binaryFunctionSymbols) {
+        SetSubtreeCount(funSymb, 2, 2);
+      }
+
+      SetSubtreeCount(@if, 3, 3);
+      SetSubtreeCount(constant, 0, 0);
+      SetSubtreeCount(variableSymbol, 0, 0);
+
+      // allow each symbol as child of the start symbol
+      foreach (var symb in allSymbols) {
+        AddAllowedChildSymbol(StartSymbol, symb, 0);
+      }
+
+      // allow each symbol as child of every other symbol (except for terminals that have maxSubtreeCount == 0)
+      foreach (var parent in allSymbols) {
+        for (int i = 0; i < GetMaximumSubtreeCount(parent); i++)
+          foreach (var child in allSymbols) {
+            AddAllowedChildSymbol(parent, child, i);
+          }
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationGrammar.txt	(revision 12005)
@@ -0,0 +1,17 @@
+﻿Node           = "(", Terminal | Function, ")" ;
+Function       = ArithmeticFunc | LogicalFunc, Node, { Node } ;
+ArithmeticFunc = "+" | "avg" | "cos" | "/" | "exp" | "ln" | "*" | "sin" | "-" | "tan" ;
+LogicalFunc    = "&&" | ">" | "if" | "<" | "!" | "||" ;
+Terminal       = Variable | Constant ;
+Variable       = ";", VariableName, Constant ;
+VariableName   = Alpha, { Alpha | Digit | "_" } ;
+Alpha          = "A" | "B" | "C" | "D" | "E" | "F" | "G"
+               | "H" | "I" | "J" | "K" | "L" | "M" | "N"
+               | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
+               | "V" | "W" | "X" | "Y" | "Z" | "a" | "b"
+               | "c" | "d" | "e" | "f" | "g" | "h" | "i"
+               | "j" | "k" | "l" | "m" | "n" | "o" | "p"
+               | "q" | "r" | "s" | "t" | "u" | "v" | "w"
+               | "x" | "y" | "z" ;
+Digit          = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
+Constant       = ";", [ "-" ], Digit, { Digit }, [ ".", Digit, { Digit } ], "E", [ "+" | "-" ], Digit, { Digit } ;
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs	(revision 12005)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeBinaryConverter", "Converts a symbolic expression tree into a binary representation by iterating over all nodes in a prefix way. The binary format is defined in HeuristicLab.Persistence.")]
+  [StorableClass]
+  public class SymbolicExpressionTreeBinaryConverter : SymbolicExpressionTreeConverter {
+    [StorableConstructor]
+    protected SymbolicExpressionTreeBinaryConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeBinaryConverter(SymbolicExpressionTreeBinaryConverter original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeBinaryConverter(this, cloner);
+    }
+    public SymbolicExpressionTreeBinaryConverter() : base() { }
+
+    protected override void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder) {
+      using (MemoryStream memoryStream = new MemoryStream()) {
+        Persistence.Default.Xml.XmlGenerator.Serialize(tree, memoryStream);
+        byte[] byteRep = memoryStream.ToArray();
+        SolutionMessage.Types.RawVariable.Builder rawVariable = SolutionMessage.Types.RawVariable.CreateBuilder();
+        rawVariable.SetName(name).SetData(ByteString.CopyFrom(byteRep));
+        builder.AddRawVars(rawVariable.Build());
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeConverter.cs	(revision 12005)
@@ -0,0 +1,58 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeStringConverter", "Abstract base class for symbolic expression tree converters.")]
+  [StorableClass]
+  public abstract class SymbolicExpressionTreeConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(SymbolicExpressionTree) };
+
+    [StorableConstructor]
+    protected SymbolicExpressionTreeConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeConverter(SymbolicExpressionTreeConverter original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public SymbolicExpressionTreeConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      SymbolicExpressionTree tree = (item as SymbolicExpressionTree);
+      if (tree != null) {
+        ConvertSymbolicExpressionTree(tree, name, builder);
+      }
+    }
+
+    protected abstract void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder);
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringConverter.cs	(revision 12005)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+  [Item("SymbolicExpressionTreeStringConverter", "Converts a symbolic expression tree into a string representation by iterating over all nodes in a prefix way. The string is added to the SolutionMessage's StringVars.")]
+  [StorableClass]
+  public class SymbolicExpressionTreeStringConverter : SymbolicExpressionTreeConverter {
+    private ExternalEvaluationSymbolicExpressionTreeStringFormatter formatter;
+
+    [StorableConstructor]
+    protected SymbolicExpressionTreeStringConverter(bool deserializing) : base(deserializing) { }
+    protected SymbolicExpressionTreeStringConverter(SymbolicExpressionTreeStringConverter original, Cloner cloner)
+      : base(original, cloner) {
+      formatter = new ExternalEvaluationSymbolicExpressionTreeStringFormatter();
+      formatter.Indent = original.formatter.Indent;
+    }
+    public SymbolicExpressionTreeStringConverter()
+      : base() {
+      Initialize();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SymbolicExpressionTreeStringConverter(this, cloner);
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      Initialize();
+    }
+
+    private void Initialize() {
+      formatter = new ExternalEvaluationSymbolicExpressionTreeStringFormatter();
+      formatter.Indent = false;
+    }
+
+    protected override void ConvertSymbolicExpressionTree(SymbolicExpressionTree tree, string name, SolutionMessage.Builder builder) {
+      string stringRep = formatter.Format(tree);
+      stringRep.Replace(Environment.NewLine, "");
+      SolutionMessage.Types.StringVariable.Builder stringVariable = SolutionMessage.Types.StringVariable.CreateBuilder();
+      stringVariable.SetName(name).SetData(stringRep);
+      builder.AddStringVars(stringVariable.Build());
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs	(revision 12005)
@@ -0,0 +1,122 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Text;
+using System.Linq;
+using HeuristicLab.Core;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Problems.DataAnalysis.Symbolic;
+using System;
+using System.Globalization;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.GP {
+
+  [Item("ExternalEvaluationSymbolicExpressionTreeStringFormatter", "A string formatter for symbolic expression trees for external evaluation.")]
+  [StorableClass]
+  public class ExternalEvaluationSymbolicExpressionTreeStringFormatter : NamedItem, ISymbolicExpressionTreeStringFormatter {
+
+    public bool Indent { get; set; }
+
+    [StorableConstructor]
+    protected ExternalEvaluationSymbolicExpressionTreeStringFormatter(bool deserializing) : base(deserializing) { }
+    protected ExternalEvaluationSymbolicExpressionTreeStringFormatter(ExternalEvaluationSymbolicExpressionTreeStringFormatter original, Cloner cloner)
+      : base(original, cloner) {
+      Indent = original.Indent;
+    }
+    public ExternalEvaluationSymbolicExpressionTreeStringFormatter()
+      : base() {
+      Name = "External Evaluation Symbolic Expression Tree Formatter";
+      Indent = true;
+    }
+
+    public string Format(ISymbolicExpressionTree symbolicExpressionTree) {
+      // skip root and start symbols
+      return FormatRecursively(symbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0), 0);
+    }
+
+    private string FormatRecursively(ISymbolicExpressionTreeNode node, int indentLength) {
+      StringBuilder strBuilder = new StringBuilder();
+      if (Indent) strBuilder.Append(' ', indentLength);
+      if (node.Subtrees.Count() > 0) { // internal node
+        strBuilder.Append("(");
+        if (node.Symbol is Addition) {
+          strBuilder.AppendLine("+");
+        } else if (node.Symbol is And) {
+          strBuilder.AppendLine("&&");
+        } else if (node.Symbol is Average) {
+          strBuilder.AppendLine("avg");
+        } else if (node.Symbol is Cosine) {
+          strBuilder.AppendLine("cos");
+        } else if (node.Symbol is Division) {
+          strBuilder.AppendLine("/");
+        } else if (node.Symbol is Exponential) {
+          strBuilder.AppendLine("exp");
+        } else if (node.Symbol is GreaterThan) {
+          strBuilder.AppendLine(">");
+        } else if (node.Symbol is IfThenElse) {
+          strBuilder.AppendLine("if");
+        } else if (node.Symbol is LessThan) {
+          strBuilder.AppendLine("<");
+        } else if (node.Symbol is Logarithm) {
+          strBuilder.AppendLine("ln");
+        } else if (node.Symbol is Multiplication) {
+          strBuilder.AppendLine("*");
+        } else if (node.Symbol is Not) {
+          strBuilder.AppendLine("!");
+        } else if (node.Symbol is Or) {
+          strBuilder.AppendLine("||");
+        } else if (node.Symbol is Sine) {
+          strBuilder.AppendLine("sin");
+        } else if (node.Symbol is Subtraction) {
+          strBuilder.AppendLine("-");
+        } else if (node.Symbol is Tangent) {
+          strBuilder.AppendLine("tan");
+        } else {
+          throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " not supported for external evaluation.");
+        }
+        // each subtree expression on a new line
+        // and closing ')' also on new line
+        foreach (var subtree in node.Subtrees) {
+          strBuilder.AppendLine(FormatRecursively(subtree, indentLength + 2));
+        }
+        if (Indent) strBuilder.Append(' ', indentLength);
+        strBuilder.Append(")");
+      } else {
+        if (node is VariableTreeNode) {
+          var varNode = node as VariableTreeNode;
+          strBuilder.AppendFormat("(* {0} {1})", varNode.VariableName, varNode.Weight.ToString("g17", CultureInfo.InvariantCulture));
+        } else if (node is ConstantTreeNode) {
+          var constNode = node as ConstantTreeNode;
+          strBuilder.Append(constNode.Value.ToString("g17", CultureInfo.InvariantCulture));
+        } else {
+          throw new NotSupportedException("Formatting of symbol: " + node.Symbol + " not supported for external evaluation.");
+        }
+      }
+      return strBuilder.ToString();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationSymbolicExpressionTreeStringFormatter(this, cloner);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/HeuristicLab.Problems.ExternalEvaluation.GP-3.5.csproj	(revision 12005)
@@ -0,0 +1,214 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{64CC53AC-156B-4D8A-8DB0-B68990BEA4D3}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.GP</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.GP-3.5</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473, Version=2.4.1.473, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48, processorArchitecture=MSIL">
+      <HintPath>..\..\bin\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="ExternalEvaluationExpressionGrammar.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeBinaryConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeStringConverter.cs" />
+    <Compile Include="ExternalEvaluationSymbolicExpressionTreeStringFormatter.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="ExternalEvaluationGrammar.txt" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
+      <Project>{06d4a186-9319-48a0-bade-a2058d462eea}</Project>
+      <Name>HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.DataAnalysis.Symbolic\3.4\HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj">
+      <Project>{3d28463f-ec96-4d82-afee-38be91a0ca00}</Project>
+      <Name>HeuristicLab.Problems.DataAnalysis.Symbolic-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.ExternalEvaluation\3.4\HeuristicLab.Problems.ExternalEvaluation-3.4.csproj">
+      <Project>{8a0b2a2b-47a7-410d-97a0-4296293bb00d}</Project>
+      <Name>HeuristicLab.Problems.ExternalEvaluation-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,36 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.GP {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation.GP", "Provides a symbolic expression tree grammar and formatters for external evaluation problems.", "3.5.6.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation.GP-3.5.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.DataAnalysis.Symbolic", "3.4")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.4")]
+  [PluginDependency("HeuristicLab.ProtobufCS", "2.4.1.473")]
+  public class HeuristicLabProblemsExternalEvaluationGPPlugin : PluginBase {
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.GP/3.5/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -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.ExternalEvaluation.GP")]
+[assembly: AssemblyDescription("Provides a symbolic expression tree grammar and formatters for external evaluation problems.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab.Problems.ExternalEvaluation.GP")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("9DCFFA77-344D-4A3A-A444-75FF7B242583")]
+
+// 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.5.0.0")]
+[assembly: AssemblyFileVersion("3.5.6.$WCREV$")]
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.Designer.cs	(revision 12005)
@@ -0,0 +1,145 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  partial class EvaluationCacheView {
+    /// <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.hits_sizeLabel = new System.Windows.Forms.Label();
+      this.hits_sizeTextBox = new System.Windows.Forms.TextBox();
+      this.clearButton = new System.Windows.Forms.Button();
+      this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+      this.saveButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Location = new System.Drawing.Point(0, 52);
+      this.parameterCollectionView.Size = new System.Drawing.Size(490, 301);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // hits_sizeLabel
+      // 
+      this.hits_sizeLabel.AutoSize = true;
+      this.hits_sizeLabel.Location = new System.Drawing.Point(3, 29);
+      this.hits_sizeLabel.Name = "hits_sizeLabel";
+      this.hits_sizeLabel.Size = new System.Drawing.Size(53, 13);
+      this.hits_sizeLabel.TabIndex = 4;
+      this.hits_sizeLabel.Text = "Hits/Size:";
+      // 
+      // hits_sizeTextBox
+      // 
+      this.hits_sizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+      this.hits_sizeTextBox.Location = new System.Drawing.Point(59, 26);
+      this.hits_sizeTextBox.Name = "hits_sizeTextBox";
+      this.hits_sizeTextBox.ReadOnly = true;
+      this.hits_sizeTextBox.Size = new System.Drawing.Size(319, 20);
+      this.hits_sizeTextBox.TabIndex = 5;
+      // 
+      // clearButton
+      // 
+      this.clearButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.clearButton.Location = new System.Drawing.Point(444, 24);
+      this.clearButton.Name = "clearButton";
+      this.clearButton.Size = new System.Drawing.Size(43, 23);
+      this.clearButton.TabIndex = 6;
+      this.clearButton.Text = "Clear";
+      this.toolTip.SetToolTip(this.clearButton, "Clear");
+      this.clearButton.UseVisualStyleBackColor = true;
+      this.clearButton.Click += new System.EventHandler(this.clearButton_Click);
+      // 
+      // saveFileDialog
+      // 
+      this.saveFileDialog.DefaultExt = "csv";
+      this.saveFileDialog.Filter = "CSV Files|*.csv|All Files|*.*";
+      this.saveFileDialog.RestoreDirectory = true;
+      this.saveFileDialog.Title = "Save Cache";
+      // 
+      // saveButton
+      // 
+      this.saveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.saveButton.Location = new System.Drawing.Point(384, 23);
+      this.saveButton.Name = "saveButton";
+      this.saveButton.Size = new System.Drawing.Size(54, 23);
+      this.saveButton.TabIndex = 8;
+      this.saveButton.Text = "Save...";
+      this.saveButton.UseVisualStyleBackColor = true;
+      this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
+      // 
+      // EvaluationCacheView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.hits_sizeTextBox);
+      this.Controls.Add(this.hits_sizeLabel);
+      this.Controls.Add(this.clearButton);
+      this.Controls.Add(this.saveButton);
+      this.Name = "EvaluationCacheView";
+      this.Controls.SetChildIndex(this.saveButton, 0);
+      this.Controls.SetChildIndex(this.clearButton, 0);
+      this.Controls.SetChildIndex(this.hits_sizeLabel, 0);
+      this.Controls.SetChildIndex(this.hits_sizeTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label hits_sizeLabel;
+    private System.Windows.Forms.TextBox hits_sizeTextBox;
+    private System.Windows.Forms.Button clearButton;
+    private System.Windows.Forms.SaveFileDialog saveFileDialog;
+    private System.Windows.Forms.Button saveButton;
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationCacheView.cs	(revision 12005)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+
+  [View("EvaluationCacheView")]
+  [Content(typeof(EvaluationCache), IsDefaultView = true)]
+  public sealed partial class EvaluationCacheView : ParameterizedNamedItemView {
+
+    public new EvaluationCache Content {
+      get { return (EvaluationCache)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationCacheView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Changed -= new System.EventHandler(Content_StatusChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Changed += new System.EventHandler(Content_StatusChanged);
+    }
+
+    #region Event Handlers (Content)
+    void Content_StatusChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_StatusChanged), sender, e);
+      else
+        hits_sizeTextBox.Text = string.Format("{0}/{1} ({2} active)", Content.Hits, Content.Size, Content.ActiveEvaluations);
+    }
+
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        hits_sizeTextBox.Text = "#/#";
+      } else {
+        Content_StatusChanged(this, EventArgs.Empty);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      clearButton.Enabled = !ReadOnly && Content != null;
+      saveButton.Enabled = !ReadOnly && Content != null;
+    }
+
+    #region Event Handlers (child controls)
+    private void clearButton_Click(object sender, EventArgs e) {
+      Content.Reset();
+    }
+    #endregion
+
+    private void saveButton_Click(object sender, EventArgs e) {
+      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
+        saveButton.Enabled = false;
+        BackgroundWorker worker = new BackgroundWorker();
+        worker.DoWork += (s, a) => {
+          Content.Save((string)a.Argument);
+        };
+        worker.RunWorkerCompleted += (s, a) => {
+          SetEnabledStateOfControls();
+        };
+        worker.RunWorkerAsync(saveFileDialog.FileName);
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.Designer.cs	(revision 12005)
@@ -0,0 +1,184 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  partial class EvaluationProcessChannelView {
+    /// <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.executableTextBox = new System.Windows.Forms.TextBox();
+      this.browseExecutableButton = new System.Windows.Forms.Button();
+      this.argumentsTextBox = new System.Windows.Forms.TextBox();
+      this.executableLabel = new System.Windows.Forms.Label();
+      this.argumentsLabel = new System.Windows.Forms.Label();
+      this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+      this.startButton = new System.Windows.Forms.Button();
+      this.terminateButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(72, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(287, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(370, 3);
+      // 
+      // executableTextBox
+      // 
+      this.executableTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executableTextBox.Location = new System.Drawing.Point(72, 26);
+      this.executableTextBox.Name = "executableTextBox";
+      this.executableTextBox.ReadOnly = true;
+      this.executableTextBox.Size = new System.Drawing.Size(287, 20);
+      this.executableTextBox.TabIndex = 4;
+      // 
+      // browseExecutableButton
+      // 
+      this.browseExecutableButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.browseExecutableButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Open;
+      this.browseExecutableButton.Location = new System.Drawing.Point(365, 24);
+      this.browseExecutableButton.Name = "browseExecutableButton";
+      this.browseExecutableButton.Size = new System.Drawing.Size(26, 23);
+      this.browseExecutableButton.TabIndex = 5;
+      this.browseExecutableButton.UseVisualStyleBackColor = true;
+      this.browseExecutableButton.Click += new System.EventHandler(this.browseExecutableButton_Click);
+      // 
+      // argumentsTextBox
+      // 
+      this.argumentsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.argumentsTextBox.Location = new System.Drawing.Point(72, 52);
+      this.argumentsTextBox.Name = "argumentsTextBox";
+      this.argumentsTextBox.Size = new System.Drawing.Size(287, 20);
+      this.argumentsTextBox.TabIndex = 6;
+      this.argumentsTextBox.Validated += new System.EventHandler(this.argumentsTextBox_Validated);
+      // 
+      // executableLabel
+      // 
+      this.executableLabel.AutoSize = true;
+      this.executableLabel.Location = new System.Drawing.Point(3, 29);
+      this.executableLabel.Name = "executableLabel";
+      this.executableLabel.Size = new System.Drawing.Size(63, 13);
+      this.executableLabel.TabIndex = 7;
+      this.executableLabel.Text = "Executable:";
+      // 
+      // argumentsLabel
+      // 
+      this.argumentsLabel.AutoSize = true;
+      this.argumentsLabel.Location = new System.Drawing.Point(3, 55);
+      this.argumentsLabel.Name = "argumentsLabel";
+      this.argumentsLabel.Size = new System.Drawing.Size(60, 13);
+      this.argumentsLabel.TabIndex = 7;
+      this.argumentsLabel.Text = "Arguments:";
+      // 
+      // openFileDialog
+      // 
+      this.openFileDialog.Filter = "Executables|*.exe|All files|*.*";
+      this.openFileDialog.Title = "Select the executable of the external process";
+      // 
+      // startButton
+      // 
+      this.startButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.startButton.Location = new System.Drawing.Point(72, 78);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(26, 23);
+      this.startButton.TabIndex = 8;
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // terminateButton
+      // 
+      this.terminateButton.Enabled = false;
+      this.terminateButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.terminateButton.Location = new System.Drawing.Point(104, 78);
+      this.terminateButton.Name = "terminateButton";
+      this.terminateButton.Size = new System.Drawing.Size(26, 23);
+      this.terminateButton.TabIndex = 8;
+      this.terminateButton.UseVisualStyleBackColor = true;
+      this.terminateButton.Click += new System.EventHandler(this.terminateButton_Click);
+      // 
+      // EvaluationProcessChannelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.executableTextBox);
+      this.Controls.Add(this.argumentsLabel);
+      this.Controls.Add(this.argumentsTextBox);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.executableLabel);
+      this.Controls.Add(this.browseExecutableButton);
+      this.Controls.Add(this.terminateButton);
+      this.Name = "EvaluationProcessChannelView";
+      this.Size = new System.Drawing.Size(391, 106);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.terminateButton, 0);
+      this.Controls.SetChildIndex(this.browseExecutableButton, 0);
+      this.Controls.SetChildIndex(this.executableLabel, 0);
+      this.Controls.SetChildIndex(this.startButton, 0);
+      this.Controls.SetChildIndex(this.argumentsTextBox, 0);
+      this.Controls.SetChildIndex(this.argumentsLabel, 0);
+      this.Controls.SetChildIndex(this.executableTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox executableTextBox;
+    private System.Windows.Forms.Button browseExecutableButton;
+    private System.Windows.Forms.TextBox argumentsTextBox;
+    private System.Windows.Forms.Label executableLabel;
+    private System.Windows.Forms.Label argumentsLabel;
+    private System.Windows.Forms.OpenFileDialog openFileDialog;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button terminateButton;
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationProcessChannelView.cs	(revision 12005)
@@ -0,0 +1,127 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Process-Channel View")]
+  [Content(typeof(EvaluationProcessChannel), IsDefaultView = true)]
+  public sealed partial class EvaluationProcessChannelView : NamedItemView {
+    public new EvaluationProcessChannel Content {
+      get { return (EvaluationProcessChannel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationProcessChannelView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ExecutableChanged -= new EventHandler(Content_ExecutableChanged);
+      Content.ArgumentsChanged -= new EventHandler(Content_ArgumentsChanged);
+      Content.ProcessStarted -= new EventHandler(Content_ProcessStarted);
+      Content.ProcessExited -= new EventHandler(Content_ProcessExited);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ExecutableChanged += new EventHandler(Content_ExecutableChanged);
+      Content.ArgumentsChanged += new EventHandler(Content_ArgumentsChanged);
+      Content.ProcessStarted += new EventHandler(Content_ProcessStarted);
+      Content.ProcessExited += new EventHandler(Content_ProcessExited);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_ExecutableChanged(object sender, EventArgs e) {
+      executableTextBox.Text = Content.Executable;
+    }
+    private void Content_ArgumentsChanged(object sender, EventArgs e) {
+      argumentsTextBox.Text = Content.Arguments;
+    }
+    private void Content_ProcessStarted(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke(new Action<object, EventArgs>(Content_ProcessStarted), sender, e);
+      else SetEnabledStateOfControls();
+    }
+    private void Content_ProcessExited(object sender, EventArgs e) {
+      if (InvokeRequired) Invoke(new Action<object, EventArgs>(Content_ProcessExited), sender, e);
+      else SetEnabledStateOfControls();
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        executableTextBox.Text = String.Empty;
+        argumentsTextBox.Text = String.Empty;
+      } else {
+        executableTextBox.Text = Content.Executable;
+        argumentsTextBox.Text = Content.Arguments;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool readOnlyDriverNullOrStarted = ReadOnly || Content == null || Content.IsInitialized;
+      browseExecutableButton.Enabled = !readOnlyDriverNullOrStarted;
+      startButton.Enabled = !readOnlyDriverNullOrStarted;
+      terminateButton.Enabled = !ReadOnly && Content != null && Content.IsInitialized;
+      executableTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      argumentsTextBox.Enabled = !readOnlyDriverNullOrStarted;
+    }
+
+    #region Event Handlers (child controls)
+    private void browseExecutableButton_Click(object sender, EventArgs e) {
+      if (openFileDialog.ShowDialog() == DialogResult.OK) {
+        try {
+          Content.Executable = openFileDialog.FileName;
+        } catch (InvalidOperationException ex) {
+          MessageBox.Show(ex.Message);
+        }
+      }
+    }
+    private void argumentsTextBox_Validated(object sender, EventArgs e) {
+      if (Content != null) {
+        Content.Arguments = argumentsTextBox.Text;
+      }
+    }
+    #endregion
+
+    private void startButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Open();
+      } catch (InvalidOperationException ex) {
+        MessageBox.Show(ex.Message);
+      }
+    }
+
+    private void terminateButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Close();
+      } catch (InvalidOperationException ex) {
+        MessageBox.Show(ex.Message);
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.Designer.cs	(revision 12005)
@@ -0,0 +1,79 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  partial class EvaluationServiceClientView {
+    /// <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() {
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Size = new System.Drawing.Size(528, 334);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(58, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(445, 20);
+      // 
+      // infoLabel
+      // 
+      this.infoLabel.Location = new System.Drawing.Point(509, 3);
+      // 
+      // EvaluationServiceClientView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Name = "EvaluationServiceClientView";
+      this.Size = new System.Drawing.Size(528, 360);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationServiceClientView.cs	(revision 12005)
@@ -0,0 +1,71 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Evaluation Service-Client View")]
+  [Content(typeof(EvaluationServiceClient), IsDefaultView = true)]
+  public sealed partial class EvaluationServiceClientView : ParameterizedNamedItemView {
+    public new EvaluationServiceClient Content {
+      get { return (EvaluationServiceClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationServiceClientView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Add code when content has been changed and is null
+      } else {
+        // TODO: Add code when content has been changed and is not null
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.Designer.cs	(revision 12005)
@@ -0,0 +1,154 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  partial class EvaluationTCPChannelView {
+    /// <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.ipAddressLabel = new System.Windows.Forms.Label();
+      this.portLabel = new System.Windows.Forms.Label();
+      this.ipAddressTextBox = new System.Windows.Forms.TextBox();
+      this.portTextBox = new System.Windows.Forms.TextBox();
+      this.connectButton = new System.Windows.Forms.Button();
+      this.disconnectButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Location = new System.Drawing.Point(70, 0);
+      this.nameTextBox.Size = new System.Drawing.Size(256, 20);
+      // 
+      // ipAddressLabel
+      // 
+      this.ipAddressLabel.AutoSize = true;
+      this.ipAddressLabel.Location = new System.Drawing.Point(3, 29);
+      this.ipAddressLabel.Name = "ipAddressLabel";
+      this.ipAddressLabel.Size = new System.Drawing.Size(61, 13);
+      this.ipAddressLabel.TabIndex = 3;
+      this.ipAddressLabel.Text = "IP Address:";
+      // 
+      // portLabel
+      // 
+      this.portLabel.AutoSize = true;
+      this.portLabel.Location = new System.Drawing.Point(3, 55);
+      this.portLabel.Name = "portLabel";
+      this.portLabel.Size = new System.Drawing.Size(29, 13);
+      this.portLabel.TabIndex = 5;
+      this.portLabel.Text = "Port:";
+      // 
+      // ipAddressTextBox
+      // 
+      this.ipAddressTextBox.Location = new System.Drawing.Point(70, 26);
+      this.ipAddressTextBox.Name = "ipAddressTextBox";
+      this.ipAddressTextBox.Size = new System.Drawing.Size(281, 20);
+      this.ipAddressTextBox.TabIndex = 4;
+      this.ipAddressTextBox.Text = "127.0.0.1";
+      this.ipAddressTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.ipAddressTextBox_Validating);
+      // 
+      // portTextBox
+      // 
+      this.portTextBox.Location = new System.Drawing.Point(70, 52);
+      this.portTextBox.Name = "portTextBox";
+      this.portTextBox.Size = new System.Drawing.Size(281, 20);
+      this.portTextBox.TabIndex = 6;
+      this.portTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.portTextBox_Validating);
+      // 
+      // connectButton
+      // 
+      this.connectButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Play;
+      this.connectButton.Location = new System.Drawing.Point(70, 78);
+      this.connectButton.Name = "connectButton";
+      this.connectButton.Size = new System.Drawing.Size(26, 23);
+      this.connectButton.TabIndex = 7;
+      this.connectButton.UseVisualStyleBackColor = true;
+      this.connectButton.Click += new System.EventHandler(this.connectButton_Click);
+      // 
+      // disconnectButton
+      // 
+      this.disconnectButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.Stop;
+      this.disconnectButton.Location = new System.Drawing.Point(102, 78);
+      this.disconnectButton.Name = "disconnectButton";
+      this.disconnectButton.Size = new System.Drawing.Size(26, 23);
+      this.disconnectButton.TabIndex = 8;
+      this.disconnectButton.UseVisualStyleBackColor = true;
+      this.disconnectButton.Click += new System.EventHandler(this.disconnectButton_Click);
+      // 
+      // EvaluationTCPChannelView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.ipAddressLabel);
+      this.Controls.Add(this.portTextBox);
+      this.Controls.Add(this.portLabel);
+      this.Controls.Add(this.connectButton);
+      this.Controls.Add(this.ipAddressTextBox);
+      this.Controls.Add(this.disconnectButton);
+      this.Name = "EvaluationTCPChannelView";
+      this.Size = new System.Drawing.Size(351, 105);
+      this.Controls.SetChildIndex(this.disconnectButton, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.ipAddressTextBox, 0);
+      this.Controls.SetChildIndex(this.connectButton, 0);
+      this.Controls.SetChildIndex(this.portLabel, 0);
+      this.Controls.SetChildIndex(this.portTextBox, 0);
+      this.Controls.SetChildIndex(this.ipAddressLabel, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label ipAddressLabel;
+    private System.Windows.Forms.Label portLabel;
+    private System.Windows.Forms.TextBox ipAddressTextBox;
+    private System.Windows.Forms.TextBox portTextBox;
+    private System.Windows.Forms.Button connectButton;
+    private System.Windows.Forms.Button disconnectButton;
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/EvaluationTCPChannelView.cs	(revision 12005)
@@ -0,0 +1,129 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("TCP Channel View")]
+  [Content(typeof(EvaluationTCPChannel), IsDefaultView = true)]
+  public sealed partial class EvaluationTCPChannelView : NamedItemView {
+    public new EvaluationTCPChannel Content {
+      get { return (EvaluationTCPChannel)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public EvaluationTCPChannelView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Connected -= new EventHandler(Content_Connected);
+      Content.Disconnected -= new EventHandler(Content_Disconnected);
+      Content.IpAddressChanged -= new EventHandler(Content_IpAddressChanged);
+      Content.PortChanged -= new EventHandler(Content_PortChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Connected += new EventHandler(Content_Connected);
+      Content.Disconnected += new EventHandler(Content_Disconnected);
+      Content.IpAddressChanged += new EventHandler(Content_IpAddressChanged);
+      Content.PortChanged += new EventHandler(Content_PortChanged);
+    }
+
+    #region Event Handlers (Content)
+    private void Content_Connected(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
+    }
+    private void Content_Disconnected(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
+    }
+    private void Content_IpAddressChanged(object sender, EventArgs e) {
+      ipAddressTextBox.Text = Content.IpAddress;
+    }
+    private void Content_PortChanged(object sender, EventArgs e) {
+      portTextBox.Text = Content.Port.ToString();
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ipAddressTextBox.Text = String.Empty;
+        portTextBox.Text = String.Empty;
+      } else {
+        ipAddressTextBox.Text = Content.IpAddress;
+        portTextBox.Text = Content.Port.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      bool readOnlyDriverNullOrStarted = ReadOnly || Content == null || Content.IsInitialized;
+      ipAddressTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      portTextBox.Enabled = !readOnlyDriverNullOrStarted;
+      connectButton.Enabled = !readOnlyDriverNullOrStarted;
+      disconnectButton.Enabled = !ReadOnly && Content != null && Content.IsInitialized;
+    }
+
+    #region Event Handlers (child controls)
+    private void ipAddressTextBox_Validating(object sender, CancelEventArgs e) {
+      if (Content != null) {
+        try {
+          System.Net.IPAddress.Parse(ipAddressTextBox.Text);
+        }
+        catch (FormatException) {
+          e.Cancel = true;
+        }
+        if (!e.Cancel) Content.IpAddress = ipAddressTextBox.Text;
+      }
+    }
+    private void portTextBox_Validating(object sender, CancelEventArgs e) {
+      if (Content != null) {
+        int port;
+        e.Cancel = !int.TryParse(portTextBox.Text, out port);
+        if (!e.Cancel) Content.Port = port;
+      }
+    }
+    private void connectButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Open();
+      }
+      catch (Exception ex) {
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(ex);
+      }
+    }
+    private void disconnectButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Close();
+      }
+      catch (Exception ex) {
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(ex);
+      }
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/HeuristicLab.Problems.ExternalEvaluation.Views-3.4.csproj	(revision 12005)
@@ -0,0 +1,259 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{F7E5B975-FDF2-45A4-91CB-FF6D3C33D65E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation.Views-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="EvaluationCacheView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationCacheView.Designer.cs">
+      <DependentUpon>EvaluationCacheView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationServiceClientView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationServiceClientView.Designer.cs">
+      <DependentUpon>EvaluationServiceClientView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationProcessChannelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationProcessChannelView.Designer.cs">
+      <DependentUpon>EvaluationProcessChannelView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="EvaluationTCPChannelView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="EvaluationTCPChannelView.Designer.cs">
+      <DependentUpon>EvaluationTCPChannelView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="SolutionMessageBuilderView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SolutionMessageBuilderView.Designer.cs">
+      <DependentUpon>SolutionMessageBuilderView.cs</DependentUpon>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.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.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104a0b-90e7-42f3-9abe-9bbbadd4b943}</Project>
+      <Name>HeuristicLab.Data.Views-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.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.ExternalEvaluation\3.3\HeuristicLab.Problems.ExternalEvaluation-3.3.csproj">
+      <Project>{25735db4-8e54-4a2c-83e3-a60c76565e55}</Project>
+      <Name>HeuristicLab.Problems.ExternalEvaluation-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation.Views", "3.4.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation.Views-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.ExternalEvaluation", "3.4")]
+  public class HeuristicLabProblemsExternalEvaluationViewsPlugin : PluginBase {
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -0,0 +1,35 @@
+﻿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.ExternalEvaluation.Views")]
+[assembly: AssemblyDescription("View-Plugin for Problems that are evaluated outside of HeuristicLab.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("85213817-34ce-4629-8019-92b448234f8b")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.10.$WCREV$")]
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.Designer.cs	(revision 12005)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation.Views {
+  partial class SolutionMessageBuilderView {
+    /// <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.convertersGroupBox = new System.Windows.Forms.GroupBox();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // convertersGroupBox
+      // 
+      this.convertersGroupBox.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.convertersGroupBox.Location = new System.Drawing.Point(0, 26);
+      this.convertersGroupBox.Name = "convertersGroupBox";
+      this.convertersGroupBox.Size = new System.Drawing.Size(351, 225);
+      this.convertersGroupBox.TabIndex = 3;
+      this.convertersGroupBox.TabStop = false;
+      this.convertersGroupBox.Text = "Converters";
+      // 
+      // SolutionMessageBuilderView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
+      this.Controls.Add(this.convertersGroupBox);
+      this.Name = "SolutionMessageBuilderView";
+      this.Size = new System.Drawing.Size(351, 251);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.Controls.SetChildIndex(this.convertersGroupBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox convertersGroupBox;
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation.Views/3.4/SolutionMessageBuilderView.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Views {
+  [View("Solution Message Builder View")]
+  [Content(typeof(SolutionMessageBuilder), IsDefaultView = true)]
+  public sealed partial class SolutionMessageBuilderView : NamedItemView {
+    CheckedItemListView<IItemToSolutionMessageConverter> converterView;
+
+    public new SolutionMessageBuilder Content {
+      get { return (SolutionMessageBuilder)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SolutionMessageBuilderView() {
+      InitializeComponent();
+      converterView = new CheckedItemListView<IItemToSolutionMessageConverter>();
+      converterView.Dock = DockStyle.Fill;
+      convertersGroupBox.Controls.Add(converterView);
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        converterView.Content = null;
+      } else {
+        converterView.Content = Content.Converters;
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    #region Event Handlers (child controls)
+    // TODO: Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.3/ExternalEvaluationProblem.cs	(revision 12005)
@@ -33,9 +33,10 @@
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Problems.ExternalEvaluation {
   [Item("External Evaluation Problem", "A problem that is evaluated in a different process.")]
-  [Creatable("Problems")]
   [StorableClass]
+  [NonDiscoverableType]
   public sealed class ExternalEvaluationProblem : ParameterizedNamedItem, ISingleObjectiveHeuristicOptimizationProblem, IStorableContent {
     public string Filename { get; set; }
@@ -120,4 +121,7 @@
       get { return OperatorsParameter.Value; }
     }
+
+    public IEnumerable<IParameterizedItem> ExecutionContextItems { get { return new[] { this }; } }
+
     private BestScopeSolutionAnalyzer BestScopeSolutionAnalyzer {
       get { return OperatorsParameter.Value.OfType<BestScopeSolutionAnalyzer>().FirstOrDefault(); }
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/BoolConverter.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("BoolConverter", "Converts a ValueTypeValue<bool>, ValueTypeArray<bool>, or ValueTypeMatrix<bool> and adds it to the SolutionMessage's BoolVars or BoolArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class BoolConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<bool>), typeof(ValueTypeArray<bool>), typeof(ValueTypeMatrix<bool>) };
+    [StorableConstructor]
+    protected BoolConverter(bool deserializing) : base(deserializing) { }
+    protected BoolConverter(BoolConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new BoolConverter(this, cloner);
+    }
+    public BoolConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<bool> value = (item as ValueTypeValue<bool>);
+      if (value != null) {
+        SolutionMessage.Types.BoolVariable.Builder var = SolutionMessage.Types.BoolVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddBoolVars(var.Build());
+      } else {
+        ValueTypeArray<bool> array = (item as ValueTypeArray<bool>);
+        if (array != null) {
+          SolutionMessage.Types.BoolArrayVariable.Builder var = SolutionMessage.Types.BoolArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddBoolArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<bool> matrix = (item as ValueTypeMatrix<bool>);
+          if (matrix != null) {
+            SolutionMessage.Types.BoolArrayVariable.Builder var = SolutionMessage.Types.BoolArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddBoolArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DateTimeValueConverter.cs	(revision 12005)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("DateTimeValueConverter", "Converts a DateTimeValue and adds it to the SolutionMessage's StringVars. The format is yyyy-MM-dd HH:mm:sszzz, e.g. 2010-05-31 19:15:33+01:00.")]
+  [StorableClass]
+  public class DateTimeValueConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(DateTimeValue) };
+    [StorableConstructor]
+    protected DateTimeValueConverter(bool deserializing) : base(deserializing) { }
+    protected DateTimeValueConverter(DateTimeValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DateTimeValueConverter(this, cloner);
+    }
+    public DateTimeValueConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      DateTimeValue date = (item as DateTimeValue);
+      if (date != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(date.Value.ToString("yyyy-MM-dd HH:mm:sszzz"));
+        builder.AddStringVars(var.Build());
+      } else {
+        throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+      }
+    }
+
+    #endregion
+
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/DoubleConverter.cs	(revision 12005)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("DoubleConverter", "Converts a ValueTypeValue<double>, ValueTypeArray<double>, or ValueTypeMatrix<double> and adds it to the SolutionMessage's DoubleVars or DoubleArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class DoubleConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<double>), typeof(ValueTypeArray<double>), typeof(ValueTypeMatrix<double>) };
+
+    [StorableConstructor]
+    protected DoubleConverter(bool deserializing) : base(deserializing) { }
+    protected DoubleConverter(DoubleConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DoubleConverter(this, cloner);
+    }
+    public DoubleConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<double> value = (item as ValueTypeValue<double>);
+      if (value != null) {
+        SolutionMessage.Types.DoubleVariable.Builder var = SolutionMessage.Types.DoubleVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddDoubleVars(var.Build());
+      } else {
+        ValueTypeArray<double> array = (item as ValueTypeArray<double>);
+        if (array != null) {
+          SolutionMessage.Types.DoubleArrayVariable.Builder var = SolutionMessage.Types.DoubleArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddDoubleArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<double> matrix = (item as ValueTypeMatrix<double>);
+          if (matrix != null) {
+            SolutionMessage.Types.DoubleArrayVariable.Builder var = SolutionMessage.Types.DoubleArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddDoubleArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/IntegerConverter.cs	(revision 12005)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("IntegerConverter", "Converts a ValueTypeValue<int>, ValueTypeArray<int>, or ValueTypeMatrix<int> and adds it to the SolutionMessage's IntegerVars or IntegerArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class IntegerConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(ValueTypeValue<int>), typeof(ValueTypeArray<int>), typeof(ValueTypeMatrix<int>) };
+
+    [StorableConstructor]
+    protected IntegerConverter(bool deserializing) : base(deserializing) { }
+    protected IntegerConverter(IntegerConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new IntegerConverter(this, cloner);
+    }
+    public IntegerConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      ValueTypeValue<int> value = (item as ValueTypeValue<int>);
+      if (value != null) {
+        SolutionMessage.Types.IntegerVariable.Builder var = SolutionMessage.Types.IntegerVariable.CreateBuilder();
+        var.SetName(name).SetData(value.Value);
+        builder.AddIntegerVars(var.Build());
+      } else {
+        ValueTypeArray<int> array = (item as ValueTypeArray<int>);
+        if (array != null) {
+          SolutionMessage.Types.IntegerArrayVariable.Builder var = SolutionMessage.Types.IntegerArrayVariable.CreateBuilder();
+          var.SetName(name).AddRangeData(array).SetLength(array.Length);
+          builder.AddIntegerArrayVars(var.Build());
+        } else {
+          ValueTypeMatrix<int> matrix = (item as ValueTypeMatrix<int>);
+          if (matrix != null) {
+            SolutionMessage.Types.IntegerArrayVariable.Builder var = SolutionMessage.Types.IntegerArrayVariable.CreateBuilder();
+            var.SetName(name).AddRangeData(matrix.AsEnumerable()).SetLength(matrix.Columns);
+            builder.AddIntegerArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/StringConverter.cs	(revision 12005)
@@ -0,0 +1,80 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("StringConverter", "Converts a StringValue, StringArray, StringMatrix, IStringConvertibleValue, IStringConvertibleArray, or IStringConvertibleMatrix and adds it to the SolutionMessage's StringVars or StringArrayVars. A matrix is encoded as array by concatenating all rows and setting length as the length of a row.")]
+  [StorableClass]
+  public class StringConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(StringValue), typeof(StringArray), typeof(StringMatrix), typeof(IStringConvertibleValue), typeof(IStringConvertibleArray), typeof(IStringConvertibleMatrix) };
+
+    [StorableConstructor]
+    protected StringConverter(bool deserializing) : base(deserializing) { }
+    protected StringConverter(StringConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StringConverter(this, cloner);
+    }
+    public StringConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      IStringConvertibleValue value = (item as IStringConvertibleValue);
+      if (value != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(value.GetValue());
+        builder.AddStringVars(var.Build());
+      } else {
+        IStringConvertibleArray array = (item as IStringConvertibleArray);
+        if (array != null) {
+          SolutionMessage.Types.StringArrayVariable.Builder var = SolutionMessage.Types.StringArrayVariable.CreateBuilder();
+          var.SetName(name).SetLength(array.Length);
+          for (int i = 0; i < array.Length; i++)
+            var.AddData(array.GetValue(i));
+          builder.AddStringArrayVars(var.Build());
+        } else {
+          IStringConvertibleMatrix matrix = (item as IStringConvertibleMatrix);
+          if (matrix != null) {
+            SolutionMessage.Types.StringArrayVariable.Builder var = SolutionMessage.Types.StringArrayVariable.CreateBuilder();
+            var.SetName(name).SetLength(matrix.Columns);
+            for (int i = 0; i < matrix.Rows; i++)
+              for (int j = 0; j < matrix.Columns; j++)
+                var.AddData(matrix.GetValue(i, j));
+            builder.AddStringArrayVars(var.Build());
+          } else {
+            throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+          }
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Converters/TimeSpanValueConverter.cs	(revision 12005)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("TimeSpanValueConverter", "Converts a TimeSpanValue and adds it to the SolutionMessage's StringVars. The format is d.hh:mm:ss, e.g. 1113.10:55:00 (1113 days 10 hours, 55 minutes, 0 seconds).")]
+  [StorableClass]
+  public class TimeSpanValueConverter : Item, IItemToSolutionMessageConverter {
+    private static readonly Type[] itemTypes = new Type[] { typeof(TimeSpanValue) };
+
+    [StorableConstructor]
+    protected TimeSpanValueConverter(bool deserializing) : base(deserializing) { }
+    protected TimeSpanValueConverter(TimeSpanValueConverter original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new TimeSpanValueConverter(this, cloner);
+    }
+    public TimeSpanValueConverter() : base() { }
+
+    #region IItemToSolutionMessageConverter Members
+
+    public Type[] ItemTypes {
+      get { return itemTypes; }
+    }
+
+    public void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder) {
+      DateTimeValue date = (item as DateTimeValue);
+      if (date != null) {
+        SolutionMessage.Types.StringVariable.Builder var = SolutionMessage.Types.StringVariable.CreateBuilder();
+        var.SetName(name).SetData(date.Value.ToString(@"d\.hh\:mm\:ss"));
+        builder.AddStringVars(var.Build());
+      } else {
+        throw new ArgumentException(ItemName + ": Item is not of a supported type.", "item");
+      }
+    }
+
+    #endregion
+
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationChannel.cs	(revision 12005)
@@ -0,0 +1,61 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationChannel", "Abstract base class for channels to be used in an external evaluation problem.")]
+  [StorableClass]
+  public abstract class EvaluationChannel : NamedItem, IEvaluationChannel {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
+    [StorableConstructor]
+    protected EvaluationChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationChannel(EvaluationChannel original, Cloner cloner) : base(original, cloner) { }
+    protected EvaluationChannel()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
+    #region IExternalEvaluationChannel Members
+    // will not be serialized, since it will always be false after deserialization
+    public bool IsInitialized { get; protected set; }
+
+    public virtual void Open() {
+      IsInitialized = true;
+    }
+
+    public abstract void Send(IMessage message);
+
+    public abstract IMessage Receive(IBuilder builder, ExtensionRegistry extensions);
+
+    public virtual void Close() {
+      IsInitialized = false;
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationProcessChannel.cs	(revision 12005)
@@ -0,0 +1,193 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Diagnostics;
+using System.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationProcessChannel", "A channel that launches an external application in a new process and communicates with that process via stdin and stdout.")]
+  [StorableClass]
+  public class EvaluationProcessChannel : EvaluationChannel {
+
+    #region Fields & Properties
+    private Process process;
+    [Storable]
+    private string executable;
+    public string Executable {
+      get { return executable; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException(Name + ": Cannot change the executable path as the process has already been started.");
+        if (value == executable) return;
+        executable = value;
+        UpdateName();
+        OnExecutableChanged();
+      }
+    }
+    [Storable]
+    private string arguments;
+    public string Arguments {
+      get { return arguments; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException(Name + ": Cannot change the arguments as the process has already been started.");
+        if (value == arguments) return;
+        arguments = value;
+        UpdateName();
+        OnArgumentsChanged();
+      }
+    }
+    private EvaluationStreamChannel streamingChannel;
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationProcessChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationProcessChannel(EvaluationProcessChannel original, Cloner cloner)
+      : base(original, cloner) {
+      executable = original.executable;
+      arguments = original.arguments;
+      UpdateName();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationProcessChannel(this, cloner);
+    }
+
+    public EvaluationProcessChannel() : this(String.Empty, String.Empty) { }
+    public EvaluationProcessChannel(string executable, string arguments)
+      : base() {
+      this.executable = executable;
+      this.arguments = arguments;
+      UpdateName();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      UpdateName();
+    }
+    #endregion
+
+    #region IExternalEvaluationChannel Members
+    public override void Open() {
+      if (!String.IsNullOrEmpty(executable.Trim())) {
+        base.Open();
+        process = new Process();
+        process.StartInfo = new ProcessStartInfo(executable, arguments);
+        process.StartInfo.UseShellExecute = false;
+        process.StartInfo.RedirectStandardInput = true;
+        process.StartInfo.RedirectStandardOutput = true;
+        process.EnableRaisingEvents = true; // required to be notified of exit
+        process.Start();
+        Stream processStdOut = process.StandardOutput.BaseStream;
+        Stream processStdIn = process.StandardInput.BaseStream;
+        OnProcessStarted();
+        process.Exited += new EventHandler(process_Exited);
+        streamingChannel = new EvaluationStreamChannel(processStdOut, processStdIn);
+        streamingChannel.Open();
+      } else throw new InvalidOperationException(Name + ": Cannot open the process channel because the executable is not defined.");
+    }
+
+    public override void Send(IMessage message) {
+      try {
+        streamingChannel.Send(message);
+      } catch {
+        Close();
+        throw;
+      }
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      try {
+        return streamingChannel.Receive(builder, extensions);
+      } catch {
+        Close();
+        throw;
+      }
+    }
+
+    public override void Close() {
+      base.Close();
+      if (process != null) {
+        if (!process.HasExited) {
+          streamingChannel.Close();
+          if (!process.HasExited) {
+            try {
+              process.CloseMainWindow();
+              process.WaitForExit(1000);
+              process.Close();
+            } catch { }
+          }
+          // for some reasons the event process_Exited does not fire
+          OnProcessExited();
+        }
+        process = null;
+      }
+    }
+
+    #endregion
+
+    #region Event handlers (process)
+    private void process_Exited(object sender, EventArgs e) {
+      if (IsInitialized) {
+        if (streamingChannel.IsInitialized) streamingChannel.Close();
+        IsInitialized = false;
+        process = null;
+      }
+      OnProcessExited();
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler ExecutableChanged;
+    protected void OnExecutableChanged() {
+      EventHandler handler = ExecutableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ArgumentsChanged;
+    protected void OnArgumentsChanged() {
+      EventHandler handler = ArgumentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessStarted;
+    private void OnProcessStarted() {
+      EventHandler handler = ProcessStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessExited;
+    private void OnProcessExited() {
+      EventHandler handler = ProcessExited;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Auxiliary Methods
+    private void UpdateName() {
+      name = string.Format("ProcessChannel {0} {1}", Path.GetFileNameWithoutExtension(executable), arguments);
+      OnNameChanged();
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationServiceClient.cs	(revision 12005)
@@ -0,0 +1,165 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationServiceClient", "An RPC client that evaluates a solution.")]
+  [StorableClass]
+  public class EvaluationServiceClient : ParameterizedNamedItem, IEvaluationServiceClient {
+
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
+    #region Parameters
+    public IValueParameter<IEvaluationChannel> ChannelParameter {
+      get { return (IValueParameter<IEvaluationChannel>)Parameters["Channel"]; }
+    }
+    public IValueParameter<IntValue> RetryParameter {
+      get { return (IValueParameter<IntValue>)Parameters["Retry"]; }
+    }
+
+    private IEvaluationChannel Channel {
+      get { return ChannelParameter.Value; }
+    }
+    #endregion
+
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationServiceClient(bool deserializing) : base(deserializing) { }
+    protected EvaluationServiceClient(EvaluationServiceClient original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public EvaluationServiceClient()
+      : base() {
+      Parameters.Add(new ValueParameter<IEvaluationChannel>("Channel", "The channel over which to call the remote function."));
+      Parameters.Add(new ValueParameter<IntValue>("Retry", "How many times the client should retry obtaining a quality in case there is an exception. Note that it immediately aborts when the channel cannot be opened.", new IntValue(10)));
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationServiceClient(this, cloner);
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      ChannelParameter_ValueChanged(this, EventArgs.Empty);
+      RegisterEvents();
+    }
+    #endregion
+
+    #region IEvaluationServiceClient Members
+    public QualityMessage Evaluate(SolutionMessage solution, ExtensionRegistry qualityExtensions) {
+      int tries = 0, maxTries = RetryParameter.Value.Value;
+      bool success = false;
+      QualityMessage result = null;
+      while (!success) {
+        try {
+          tries++;
+          CheckAndOpenChannel();
+          Channel.Send(solution);
+          result = (QualityMessage)Channel.Receive(QualityMessage.CreateBuilder(), qualityExtensions);
+          success = true;
+        } catch (InvalidOperationException) {
+          throw;
+        } catch {
+          if (tries >= maxTries)
+            throw;
+        }
+      }
+      if (result != null && result.SolutionId != solution.SolutionId) throw new InvalidDataException(Name + ": Received a quality for a different solution.");
+      return result;
+    }
+
+    public void EvaluateAsync(SolutionMessage solution, ExtensionRegistry qualityExtensions, Action<QualityMessage> callback) {
+      int tries = 0, maxTries = RetryParameter.Value.Value;
+      bool success = false;
+      while (!success) {
+        try {
+          tries++;
+          CheckAndOpenChannel();
+          Channel.Send(solution);
+          success = true;
+        } catch (InvalidOperationException) {
+          throw;
+        } catch {
+          if (tries >= maxTries)
+            throw;
+        }
+      }
+      System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ReceiveAsync), new ReceiveAsyncInfo(solution, callback, qualityExtensions));
+    }
+    #endregion
+
+    #region Auxiliary Methods
+    private void CheckAndOpenChannel() {
+      if (Channel == null) throw new InvalidOperationException(Name + ": The channel is not defined.");
+      if (!Channel.IsInitialized) {
+        try {
+          Channel.Open();
+        } catch (Exception e) {
+          throw new InvalidOperationException(Name + ": The channel could not be opened.", e);
+        }
+      }
+    }
+
+    private void ReceiveAsync(object callbackInfo) {
+      var info = (ReceiveAsyncInfo)callbackInfo;
+      QualityMessage message = null;
+      try {
+        message = (QualityMessage)Channel.Receive(QualityMessage.CreateBuilder(), info.QualityExtensions);
+      } catch { }
+      if (message != null && message.SolutionId != info.SolutionMessage.SolutionId) throw new InvalidDataException(Name + ": Received a quality for a different solution.");
+      info.CallbackDelegate.Invoke(message);
+    }
+
+    private void RegisterEvents() {
+      ChannelParameter.ValueChanged += new EventHandler(ChannelParameter_ValueChanged);
+    }
+
+    void ChannelParameter_ValueChanged(object sender, EventArgs e) {
+      if (ChannelParameter.Value == null)
+        name = "Empty EvaluationServiceClient";
+      else
+        name = String.Format("{0} ServiceClient", ChannelParameter.Value.Name);
+      OnNameChanged();
+    }
+    #endregion
+
+    private class ReceiveAsyncInfo {
+      public SolutionMessage SolutionMessage { get; set; }
+      public Action<QualityMessage> CallbackDelegate { get; set; }
+      public ExtensionRegistry QualityExtensions { get; set; }
+      public ReceiveAsyncInfo(SolutionMessage solutionMessage, Action<QualityMessage> callbackDelegate, ExtensionRegistry qualityExtensions) {
+        SolutionMessage = solutionMessage;
+        CallbackDelegate = callbackDelegate;
+        QualityExtensions = qualityExtensions;
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationStreamChannel.cs	(revision 12005)
@@ -0,0 +1,78 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.IO;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationStreamChannel", "A channel that communicates via an input and an output stream.")]
+  [StorableClass]
+  public class EvaluationStreamChannel : EvaluationChannel {
+
+    private Stream input;
+    private Stream output;
+
+    [StorableConstructor]
+    protected EvaluationStreamChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationStreamChannel(EvaluationStreamChannel original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationStreamChannel(this, cloner);
+    }
+
+    public EvaluationStreamChannel() : base() { }
+    public EvaluationStreamChannel(Stream input, Stream output)
+      : base() {
+      if (!input.CanRead) throw new ArgumentException("Input stream cannot be read", "input");
+      this.input = input;
+      if (!output.CanWrite) throw new ArgumentException("Output stream cannot be written", "output");
+      this.output = output;
+    }
+
+    #region IExternalEvaluationChannel Members
+
+    public override void Send(IMessage solution) {
+      lock (output) {
+        solution.WriteDelimitedTo(output);
+        output.Flush();
+      }
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      QualityMessage message;
+      lock (input) { // only one thread can read from the stream at one time
+        message = QualityMessage.ParseDelimitedFrom(input, extensions);
+      }
+      return message;
+    }
+
+    public override void Close() {
+      base.Close();
+      input.Close();
+      output.Close();
+    }
+
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Drivers/EvaluationTCPChannel.cs	(revision 12005)
@@ -0,0 +1,224 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Net;
+using System.Net.Sockets;
+using Google.ProtocolBuffers;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("EvaluationTCPChannel", "A channel that creates a TCP connection over a network.")]
+  [StorableClass]
+  public class EvaluationTCPChannel : EvaluationChannel {
+
+    public const int MAX_VARINT32_SIZE = 5;
+
+    #region Fields & Properties
+    [Storable]
+    private string ipAddress;
+    public string IpAddress {
+      get { return ipAddress; }
+      set {
+        if (value == ipAddress) return;
+        ipAddress = value;
+        UpdateName();
+        OnIpAddressChanged();
+      }
+    }
+    [Storable]
+    private int port;
+    public int Port {
+      get { return port; }
+      set {
+        if (value == port) return;
+        port = value;
+        UpdateName();
+        OnPortChanged();
+      }
+    }
+    private Socket socket;
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationTCPChannel(bool deserializing) : base(deserializing) { }
+    protected EvaluationTCPChannel(EvaluationTCPChannel original, Cloner cloner)
+      : base(original, cloner) {
+      ipAddress = original.ipAddress;
+      port = original.port;
+      UpdateName();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationTCPChannel(this, cloner);
+    }
+
+    public EvaluationTCPChannel() : this(String.Empty, 0) { }
+    public EvaluationTCPChannel(string ip, int port)
+      : base() {
+      this.ipAddress = ip;
+      this.port = port;
+      UpdateName();
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      UpdateName();
+    }
+    #endregion
+
+
+
+    #region IExternalEvaluationChannel Members
+
+    public override void Open() {
+      socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+      socket.Connect(IPAddress.Parse(ipAddress), port);
+      if (socket.Connected) {
+        base.Open();
+        OnConnected();
+      }
+    }
+
+    public override void Send(IMessage message) {
+      try {
+        byte[] buffer = EncodeDelimited(message);
+        socket.Send(buffer);
+      } catch (SocketException) {
+        Close();
+        throw;
+      } catch (ObjectDisposedException) {
+        socket = null;
+        Close();
+        throw;
+      }
+    }
+
+    private byte[] EncodeDelimited(IMessage message) {
+      int messageSize = message.SerializedSize;
+      int headerSize = GetVarint32EncodedSize(messageSize);
+      byte[] buffer = new byte[headerSize + messageSize];
+      CodedOutputStream tmp = CodedOutputStream.CreateInstance(buffer);
+      tmp.WriteRawVarint32((uint)messageSize);
+      message.WriteTo(tmp);
+      return buffer;
+    }
+
+    private int GetVarint32EncodedSize(int size) {
+      // Varints in Protocol Buffers are encoded using the 7 lower order bits (the MSB indicates continuation (=1) or termination (=0))
+      int sizeByteCount = 1;
+      int limit = 128;
+      while (size >= limit) {
+        sizeByteCount++;
+        limit *= 128;
+      }
+      return sizeByteCount;
+    }
+
+    public override IMessage Receive(IBuilder builder, ExtensionRegistry extensions) {
+      try {
+        byte[] buffer = GetMessageBuffer();
+        return builder.WeakMergeFrom(ByteString.CopyFrom(buffer), extensions).WeakBuild();
+      } catch (SocketException) {
+        Close();
+        throw;
+      } catch (ObjectDisposedException) {
+        socket = null;
+        Close();
+        throw;
+      }
+    }
+
+    private byte[] GetMessageBuffer() {
+      byte[] buffer;
+      int messageSize = GetReceivedMessageSize(out buffer);
+      int headerSize = GetVarint32EncodedSize(messageSize);
+      int messageBytesInHeader = Math.Min(messageSize, buffer.Length - headerSize);
+      byte[] messageBuffer = new byte[messageSize];
+      Array.Copy(buffer, headerSize, messageBuffer, 0, messageBytesInHeader);
+      ReceiveMessage(messageBuffer, messageBytesInHeader, messageSize - messageBytesInHeader);
+      return messageBuffer;
+    }
+
+    private int GetReceivedMessageSize(out byte[] buffer) {
+      buffer = new byte[MAX_VARINT32_SIZE];
+      socket.Receive(buffer);
+      CodedInputStream tmp = CodedInputStream.CreateInstance(buffer);
+      return (int)tmp.ReadRawVarint32();
+    }
+
+    private void ReceiveMessage(byte[] buffer, int offset, int size) {
+      while (size > 0) {
+        int received = socket.Receive(buffer, offset, size, SocketFlags.None);
+        offset += received;
+        size -= received;
+      }
+    }
+
+    public override void Close() {
+      if (socket != null) {
+        try {
+          if (socket.Connected)
+            socket.Disconnect(false);
+          socket.Close();
+        } catch { }
+        socket = null;
+      }
+      bool wasInitialized = IsInitialized;
+      base.Close();
+      if (wasInitialized) OnDiconnected();
+    }
+
+    #endregion
+
+    #region Auxiliary Methods
+    private void UpdateName() {
+      name = string.Format("TCPChannel {0}:{1}", ipAddress, port);
+      OnNameChanged();
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler IpAddressChanged;
+    protected void OnIpAddressChanged() {
+      EventHandler handler = IpAddressChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PortChanged;
+    protected void OnPortChanged() {
+      EventHandler handler = PortChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Connected;
+    protected void OnConnected() {
+      EventHandler handler = Connected;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Disconnected;
+    protected void OnDiconnected() {
+      EventHandler handler = Disconnected;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/EvaluationCache.cs	(revision 12005)
@@ -0,0 +1,284 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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/>.
+ * 
+ * The LRU cache is based on an idea by Robert Rossney see 
+ * <http://csharp-lru-cache.googlecode.com>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+
+  [Item("EvaluationCache", "Cache for external evaluation values")]
+  [StorableClass]
+  public class EvaluationCache : ParameterizedNamedItem {
+
+    #region Types
+    private sealed class CacheEntry {
+
+      public readonly string Key;
+      public double Value;
+
+      public CacheEntry(string key, double value) {
+        Key = key;
+        Value = value;
+      }
+
+      public CacheEntry(string key) {
+        Key = key;
+      }
+
+      public override bool Equals(object obj) {
+        CacheEntry other = obj as CacheEntry;
+        if (other == null)
+          return false;
+        return Key.Equals(other.Key);
+      }
+
+      public override int GetHashCode() {
+        return Key.GetHashCode();
+      }
+
+      public override string ToString() {
+        return string.Format("{{{0} : {1}}}", Key, Value);
+      }
+    }
+
+    public delegate double Evaluator(SolutionMessage message);
+    #endregion
+
+    #region Fields
+    private LinkedList<CacheEntry> list;
+    private Dictionary<CacheEntry, LinkedListNode<CacheEntry>> index;
+
+    private HashSet<string> activeEvaluations = new HashSet<string>();
+    private object cacheLock = new object();
+    #endregion
+
+    #region Properties
+    public static new System.Drawing.Image StaticItemImage {
+      get { return VSImageLibrary.Database; }
+    }
+    public int Size { get { lock (cacheLock) return index.Count; } }
+    public int ActiveEvaluations { get { lock (cacheLock) return activeEvaluations.Count; } }
+
+    [Storable]
+    public int Hits { get; private set; }
+    #endregion
+
+    #region events
+    public event EventHandler Changed;
+
+    protected virtual void OnChanged() {
+      EventHandler handler = Changed;
+      if (handler != null)
+        handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    #region Parameters
+    public FixedValueParameter<IntValue> CapacityParameter {
+      get { return (FixedValueParameter<IntValue>)Parameters["Capacity"]; }
+    }
+    public FixedValueParameter<BoolValue> PersistentCacheParameter {
+      get { return (FixedValueParameter<BoolValue>)Parameters["PersistentCache"]; }
+    }
+    #endregion
+
+    #region Parameter Values
+    public int Capacity {
+      get { return CapacityParameter.Value.Value; }
+      set { CapacityParameter.Value.Value = value; }
+    }
+    public bool IsPersistent {
+      get { return PersistentCacheParameter.Value.Value; }
+    }
+    #endregion
+
+    #region Persistence
+    [Storable(Name = "Cache")]
+    private IEnumerable<KeyValuePair<string, double>> Cache_Persistence {
+      get {
+        if (IsPersistent) {
+          return GetCacheValues();
+        } else {
+          return Enumerable.Empty<KeyValuePair<string, double>>();
+        }
+      }
+      set {
+        SetCacheValues(value);
+      }
+    }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected EvaluationCache(bool deserializing) : base(deserializing) { }
+    protected EvaluationCache(EvaluationCache original, Cloner cloner)
+      : base(original, cloner) {
+      SetCacheValues(original.GetCacheValues());
+      Hits = original.Hits;
+      RegisterEvents();
+    }
+    public EvaluationCache() {
+      list = new LinkedList<CacheEntry>();
+      index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+      Parameters.Add(new FixedValueParameter<IntValue>("Capacity", "Maximum number of cache entries.", new IntValue(10000)));
+      Parameters.Add(new FixedValueParameter<BoolValue>("PersistentCache", "Save cache when serializing object graph?", new BoolValue(false)));
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EvaluationCache(this, cloner);
+    }
+    #endregion
+
+    #region Event Handling
+    private void RegisterEvents() {
+      CapacityParameter.Value.ValueChanged += new EventHandler(CapacityChanged);
+    }
+
+    void CapacityChanged(object sender, EventArgs e) {
+      if (Capacity < 0)
+        throw new ArgumentOutOfRangeException("Cache capacity cannot be less than zero");
+      lock (cacheLock)
+        Trim();
+      OnChanged();
+    }
+    #endregion
+
+    #region Methods
+    public void Reset() {
+      lock (cacheLock) {
+        list = new LinkedList<CacheEntry>();
+        index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+        Hits = 0;
+      }
+      OnChanged();
+    }
+
+    public double GetValue(SolutionMessage message, Evaluator evaluate) {
+      var entry = new CacheEntry(message.ToString());
+      bool lockTaken = false;
+      bool waited = false;
+      try {
+        Monitor.Enter(cacheLock, ref lockTaken);
+        while (true) {
+          LinkedListNode<CacheEntry> node;
+          if (index.TryGetValue(entry, out node)) {
+            list.Remove(node);
+            list.AddLast(node);
+            Hits++;
+            lockTaken = false;
+            Monitor.Exit(cacheLock);
+            OnChanged();
+            return node.Value.Value;
+          } else {
+            if (!waited && activeEvaluations.Contains(entry.Key)) {
+              while (activeEvaluations.Contains(entry.Key))
+                Monitor.Wait(cacheLock);
+              waited = true;
+            } else {
+              activeEvaluations.Add(entry.Key);
+              lockTaken = false;
+              Monitor.Exit(cacheLock);
+              OnChanged();
+              try {
+                entry.Value = evaluate(message);
+                Monitor.Enter(cacheLock, ref lockTaken);
+                index[entry] = list.AddLast(entry);
+                Trim();
+              }
+              finally {
+                if (!lockTaken)
+                  Monitor.Enter(cacheLock, ref lockTaken);
+                activeEvaluations.Remove(entry.Key);
+                Monitor.PulseAll(cacheLock);
+                lockTaken = false;
+                Monitor.Exit(cacheLock);
+              }
+              OnChanged();
+              return entry.Value;
+            }
+          }
+        }
+      }
+      finally {
+        if (lockTaken)
+          Monitor.Exit(cacheLock);
+      }
+    }
+
+    private void Trim() {
+      while (list.Count > Capacity) {
+        var item = list.First;
+        list.Remove(item);
+        index.Remove(item.Value);
+      }
+    }
+
+    private IEnumerable<KeyValuePair<string, double>> GetCacheValues() {
+      lock (cacheLock) {
+        return index.ToDictionary(kvp => kvp.Key.Key, kvp => kvp.Key.Value);
+      }
+    }
+
+    private void SetCacheValues(IEnumerable<KeyValuePair<string, double>> value) {
+      lock (cacheLock) {
+        list = new LinkedList<CacheEntry>();
+        index = new Dictionary<CacheEntry, LinkedListNode<CacheEntry>>();
+        foreach (var kvp in value) {
+          var entry = new CacheEntry(kvp.Key) { Value = kvp.Value };
+          index[entry] = list.AddLast(entry);
+        }
+      }
+    }
+
+    public void Save(string filename) {
+      using (var writer = new StreamWriter(filename)) {
+        lock (cacheLock) {
+          foreach (var entry in list) {
+            writer.WriteLine(string.Format(CultureInfo.InvariantCulture,
+              "\"{0}\", {1}",
+              Regex.Replace(entry.Key, "\\s", "").Replace("\"", "\"\""),
+              entry.Value));
+          }
+        }
+        writer.Close();
+      }
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationCD.cd	(revision 12005)
@@ -0,0 +1,209 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.BoolConverter" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\BoolConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.DateTimeValueConverter" BaseTypeListCollapsed="true">
+    <Position X="2.25" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\DateTimeValueConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.DoubleConverter" BaseTypeListCollapsed="true">
+    <Position X="4" Y="9.75" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\DoubleConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.IntegerConverter" BaseTypeListCollapsed="true">
+    <Position X="4" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\IntegerConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.StringConverter" BaseTypeListCollapsed="true">
+    <Position X="2.25" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\StringConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.TimeSpanValueConverter" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="12" Width="1.5" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACAAAAAgA=</HashCode>
+      <FileName>Converters\TimeSpanValueConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationChannel" Collapsed="true">
+    <Position X="3" Y="0.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAEAAAAAAAAAAgAAQAAAABACABAA=</HashCode>
+      <FileName>Drivers\EvaluationChannel.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationProcessChannel">
+    <Position X="2.75" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>BAAAAAAAAAAAIAAAAEEgAgIAgAIgIgAQIAAAAACAEBg=</HashCode>
+      <FileName>Drivers\EvaluationProcessChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationServiceClient" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="14.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAhAAAAAACAAAQAAgAAAAAAgAAAAhAAAAAABAA=</HashCode>
+      <FileName>Drivers\EvaluationServiceClient.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationStreamChannel">
+    <Position X="5" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAEAAAAAACAAAABAQAAAAAACAAAA=</HashCode>
+      <FileName>Drivers\EvaluationStreamChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.EvaluationTCPChannel">
+    <Position X="0.5" Y="3.5" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAQCAAQcIAEAGCAAAAAaCgAAAoQAQEAAgCAABA=</HashCode>
+      <FileName>Drivers\EvaluationTCPChannel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluationProblem" BaseTypeListCollapsed="true">
+    <Position X="0.5" Y="18.25" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>AAARAACGAwgABbAGCJCAQIEMAAGKAAAACIQAESAgpVA=</HashCode>
+      <FileName>ExternalEvaluationProblem.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.ExternalEvaluator" BaseTypeListCollapsed="true">
+    <Position X="5.75" Y="14.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAQAAAgABAAAAAAAAAAAAAAAAAAAAEAAAAAAAgAAAA=</HashCode>
+      <FileName>ExternalEvaluator.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage">
+    <Position X="5.25" Y="18.25" Width="2.25" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Types" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessage.Builder" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>XGEAApEgkUOSJEQREEkgQAFBQRQHASKyAQ0CDCQAoAA=</HashCode>
+      <FileName>Protos\ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.QualityMessage">
+    <Position X="3" Y="18.25" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <NestedTypes>
+      <Class Name="HeuristicLab.Problems.ExternalEvaluation.QualityMessage.Builder" Collapsed="true">
+        <TypeIdentifier>
+          <NewMemberFileName>Protos\ExternalEvaluationMessages.cs</NewMemberFileName>
+        </TypeIdentifier>
+      </Class>
+    </NestedTypes>
+    <TypeIdentifier>
+      <HashCode>VGAAgAAgAMEAIABAAAggAAEAAIABAgIwAAgADAAAgAA=</HashCode>
+      <FileName>Protos\ExternalEvaluationMessages.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="HeuristicLab.Problems.ExternalEvaluation.SolutionMessageBuilder">
+    <Position X="5.75" Y="9.75" Width="2" />
+    <Compartments>
+      <Compartment Name="Fields" Collapsed="true" />
+    </Compartments>
+    <TypeIdentifier>
+      <HashCode>AASAAAACAAAAAAAAIAAAAMAkAAAAgRAAAAAAAAAAhAA=</HashCode>
+      <FileName>SolutionMessageBuilder.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IEvaluationChannel">
+    <Position X="0.5" Y="0.5" Width="1.75" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAIAAAAEAAAAAAAAAAAAAQAAAABACAAAA=</HashCode>
+      <FileName>Interfaces\IEvaluationChannel.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IEvaluationServiceClient">
+    <Position X="3" Y="14.5" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAQAAgAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IEvaluationServiceClient.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IExternalEvaluationProblemEvaluator">
+    <Position X="2.75" Y="16.25" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IExternalEvaluationProblemEvaluator.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.ExternalEvaluation.IItemToSolutionMessageConverter">
+    <Position X="5.25" Y="7.5" Width="2.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAgA=</HashCode>
+      <FileName>Interfaces\IItemToSolutionMessageConverter.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/ExternalEvaluationProblem.cs	(revision 12005)
@@ -0,0 +1,162 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Threading;
+using Google.ProtocolBuffers;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("External Evaluation Problem", "A problem that is evaluated in a different process.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class ExternalEvaluationProblem : SingleObjectiveBasicProblem<IEncoding> {
+
+    public static new Image StaticItemImage {
+      get { return HeuristicLab.Common.Resources.VSImageLibrary.Type; }
+    }
+
+    #region Parameters
+    public OptionalValueParameter<EvaluationCache> CacheParameter {
+      get { return (OptionalValueParameter<EvaluationCache>)Parameters["Cache"]; }
+    }
+    public IValueParameter<CheckedItemCollection<IEvaluationServiceClient>> ClientsParameter {
+      get { return (IValueParameter<CheckedItemCollection<IEvaluationServiceClient>>)Parameters["Clients"]; }
+    }
+    public IValueParameter<SolutionMessageBuilder> MessageBuilderParameter {
+      get { return (IValueParameter<SolutionMessageBuilder>)Parameters["MessageBuilder"]; }
+    }
+    public IFixedValueParameter<SingleObjectiveOptimizationSupportScript> SupportScriptParameter {
+      get { return (IFixedValueParameter<SingleObjectiveOptimizationSupportScript>)Parameters["SupportScript"]; }
+    }
+    #endregion
+
+    #region Properties
+    public EvaluationCache Cache {
+      get { return CacheParameter.Value; }
+    }
+    public CheckedItemCollection<IEvaluationServiceClient> Clients {
+      get { return ClientsParameter.Value; }
+    }
+    public SolutionMessageBuilder MessageBuilder {
+      get { return MessageBuilderParameter.Value; }
+    }
+    public SingleObjectiveOptimizationSupportScript OptimizationSupportScript {
+      get { return SupportScriptParameter.Value; }
+    }
+    private ISingleObjectiveOptimizationSupport OptimizationSupport {
+      get { return SupportScriptParameter.Value; }
+    }
+    #endregion
+
+    [StorableConstructor]
+    private ExternalEvaluationProblem(bool deserializing) : base(deserializing) { }
+    private ExternalEvaluationProblem(ExternalEvaluationProblem original, Cloner cloner) : base(original, cloner) { }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ExternalEvaluationProblem(this, cloner);
+    }
+    public ExternalEvaluationProblem()
+      : base() {
+      Parameters.Remove("Maximization"); // readonly in base class
+      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", new BoolValue()));
+      Parameters.Add(new OptionalValueParameter<EvaluationCache>("Cache", "Cache of previously evaluated solutions."));
+      Parameters.Add(new ValueParameter<CheckedItemCollection<IEvaluationServiceClient>>("Clients", "The clients that are used to communicate with the external application.", new CheckedItemCollection<IEvaluationServiceClient>() { new EvaluationServiceClient() }));
+      Parameters.Add(new ValueParameter<SolutionMessageBuilder>("MessageBuilder", "The message builder that converts from HeuristicLab objects to SolutionMessage representation.", new SolutionMessageBuilder()));
+      Parameters.Add(new FixedValueParameter<SingleObjectiveOptimizationSupportScript>("SupportScript", "A script that can provide neighborhood and analyze the results of the optimization.", new SingleObjectiveOptimizationSupportScript()));
+
+      Operators.Add(new BestScopeSolutionAnalyzer());
+    }
+
+    #region Single Objective Problem Overrides
+    public override bool Maximization {
+      get { return Parameters.ContainsKey("Maximization") && ((IValueParameter<BoolValue>)Parameters["Maximization"]).Value.Value; }
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      return Cache == null ? EvaluateOnNextAvailableClient(BuildSolutionMessage(individual)).Quality
+        : Cache.GetValue(BuildSolutionMessage(individual), m => EvaluateOnNextAvailableClient(m).Quality);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      OptimizationSupport.Analyze(individuals, qualities, results, random);
+    }
+
+    public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      return OptimizationSupport.GetNeighbors(individual, random);
+    }
+    #endregion
+
+    #region Evaluation Helpers
+    private HashSet<IEvaluationServiceClient> activeClients = new HashSet<IEvaluationServiceClient>();
+    private object clientLock = new object();
+    private QualityMessage EvaluateOnNextAvailableClient(SolutionMessage message) {
+      IEvaluationServiceClient client = null;
+      lock (clientLock) {
+        client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        while (client == null && Clients.CheckedItems.Any()) {
+          Monitor.Wait(clientLock);
+          client = Clients.CheckedItems.FirstOrDefault(c => !activeClients.Contains(c));
+        }
+        if (client != null)
+          activeClients.Add(client);
+      }
+      try {
+        return client.Evaluate(message, GetQualityMessageExtensions());
+      } finally {
+        lock (clientLock) {
+          activeClients.Remove(client);
+          Monitor.PulseAll(clientLock);
+        }
+      }
+    }
+
+    private ExtensionRegistry GetQualityMessageExtensions() {
+      return ExtensionRegistry.CreateInstance();
+    }
+
+    private SolutionMessage BuildSolutionMessage(Individual individual) {
+      lock (clientLock) {
+        SolutionMessage.Builder protobufBuilder = SolutionMessage.CreateBuilder();
+        protobufBuilder.SolutionId = 0;
+        var scope = new Scope();
+        individual.CopyToScope(scope);
+        foreach (var variable in scope.Variables) {
+          try {
+            MessageBuilder.AddToMessage(variable.Value, variable.Name, protobufBuilder);
+          } catch (ArgumentException ex) {
+            throw new InvalidOperationException(string.Format("ERROR while building solution message: Parameter {0} cannot be added to the message", name), ex);
+          }
+        }
+        return protobufBuilder.Build();
+      }
+    }
+    #endregion
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/HeuristicLab.Problems.ExternalEvaluation-3.4.csproj	(revision 12005)
@@ -0,0 +1,275 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{8A0B2A2B-47A7-410D-97A0-4296293BB00D}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.ExternalEvaluation</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.ExternalEvaluation-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <UpgradeBackupLocation />
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <DocumentationFile>
+    </DocumentationFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <Prefer32Bit>false</Prefer32Bit>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Google.ProtocolBuffers-2.4.1.473, Version=2.4.1.473">
+      <HintPath>..\..\bin\Google.ProtocolBuffers-2.4.1.473.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data.DataSetExtensions">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Converters\BoolConverter.cs" />
+    <Compile Include="Converters\TimeSpanValueConverter.cs" />
+    <Compile Include="Converters\DateTimeValueConverter.cs" />
+    <Compile Include="Converters\DoubleConverter.cs" />
+    <Compile Include="Converters\IntegerConverter.cs" />
+    <Compile Include="Converters\StringConverter.cs" />
+    <Compile Include="EvaluationCache.cs" />
+    <Compile Include="Drivers\EvaluationServiceClient.cs" />
+    <Compile Include="Drivers\EvaluationChannel.cs" />
+    <Compile Include="Drivers\EvaluationProcessChannel.cs" />
+    <Compile Include="Drivers\EvaluationStreamChannel.cs" />
+    <Compile Include="Drivers\EvaluationTCPChannel.cs" />
+    <Compile Include="ExternalEvaluationProblem.cs" />
+    <Compile Include="Interfaces\IEvaluationServiceClient.cs" />
+    <Compile Include="Interfaces\IEvaluationChannel.cs" />
+    <Compile Include="Interfaces\IItemToSolutionMessageConverter.cs" />
+    <Compile Include="Interfaces\ISingleObjectiveOptimizationSupport.cs" />
+    <Compile Include="Plugin.cs" />
+    <Compile Include="Programmable\CompiledOptimizationSupport.cs" />
+    <Compile Include="Programmable\CompiledSingleObjectiveOptimizationSupport.cs" />
+    <Compile Include="Programmable\SingleObjectiveOptimizationSupportScript.cs" />
+    <Compile Include="Programmable\SingleObjectiveOptimizationSupportScriptException.cs" />
+    <Compile Include="Programmable\Templates.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Templates.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Protos\ExternalEvaluationMessages.cs" />
+    <Compile Include="SolutionMessageBuilder.cs" />
+    <None Include="Protos\ProcessProtos.cmd" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ExternalEvaluationCD.cd" />
+    <None Include="HeuristicLab.snk" />
+    <None Include="Protos\ExternalEvaluationMessages.proto" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Programmable\Templates.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Templates.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Operators\3.3\HeuristicLab.Operators-3.3.csproj">
+      <Project>{23da7ff4-d5b8-41b6-aa96-f0561d24f3ee}</Project>
+      <Name>HeuristicLab.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Operators\3.3\HeuristicLab.Optimization.Operators-3.3.csproj">
+      <Project>{25087811-f74c-4128-bc86-8324271da13e}</Project>
+      <Name>HeuristicLab.Optimization.Operators-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Scripting\3.3\HeuristicLab.Scripting-3.3.csproj">
+      <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
+      <Name>HeuristicLab.Scripting-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+  <PropertyGroup>
+    <PreBuildEvent Condition=" '$(OS)' == 'Windows_NT' ">set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+
+call "$(ProjectDir)\Protos\ProcessProtos.cmd"
+call PreBuildEvent.cmd
+</PreBuildEvent>
+    <PreBuildEvent Condition=" '$(OS)' != 'Windows_NT' ">
+export ProjectDir=$(ProjectDir)
+export SolutionDir=$(SolutionDir)
+
+$SolutionDir/PreBuildEvent.sh
+</PreBuildEvent>
+  </PropertyGroup>
+</Project>
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationChannel.cs	(revision 12005)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 Google.ProtocolBuffers;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IEvaluationChannel : INamedItem {
+    /// <summary>
+    /// A flag that describes whether the channel has been initialized or not.
+    /// </summary>
+    bool IsInitialized { get; }
+    /// <summary>
+    /// Opens the channel for communication.
+    /// </summary>
+    /// <remarks>
+    /// Must be called before calling <seealso cref="Send"/> or <seealso cref="Receive"/>.
+    /// The concrete implementation of the channel may require additional information on how to start a connection,
+    /// which should be passed into the concrete channel's constructor.
+    /// </remarks>
+    void Open();
+    /// <summary>
+    /// Sends a message over the channel.
+    /// </summary>
+    /// <param name="solution">The message to send.</param>
+    void Send(IMessage solution);
+    /// <summary>
+    /// Receives a message from the channel and merges the message with the given builder.
+    /// </summary>
+    /// <param name="builder">The builder that must match the message type that is to be received.</param>
+    /// <returns>The received message.</returns>
+    IMessage Receive(IBuilder builder, ExtensionRegistry extensions);
+    /// <summary>
+    /// Tells the channel to close down and terminate open connections.
+    /// </summary>
+    void Close();
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IEvaluationServiceClient.cs	(revision 12005)
@@ -0,0 +1,43 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 Google.ProtocolBuffers;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IEvaluationServiceClient : IItem {
+    /// <summary>
+    /// Evaluates a given solution in a blocking manner.
+    /// </summary>
+    /// <param name="solution">The solution message that should be evaluated.</param>
+    /// <param name="qualityExtensions">An extension registry for the quality message that specifies additional custom fields.</param>
+    /// <returns>The resulting quality message from the external process.</returns>
+    QualityMessage Evaluate(SolutionMessage solution, ExtensionRegistry qualityExtensions);
+    /// <summary>
+    /// Evaluates a given solution in a non-blocking manner.
+    /// </summary>
+    /// <param name="solution">The solution message that should be evaluated.</param>
+    /// <param name="qualityExtensions">An extension registry for the quality message that specifies additional custom fields.</param>
+    /// <param name="callback">The callback method that is invoked when evaluation is finished.</param>
+    void EvaluateAsync(SolutionMessage solution, ExtensionRegistry qualityExtensions, Action<QualityMessage> callback);
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/IItemToSolutionMessageConverter.cs	(revision 12005)
@@ -0,0 +1,30 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Core;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface IItemToSolutionMessageConverter : IItem {
+    Type[] ItemTypes { get; }
+    void AddItemToBuilder(IItem item, string name, SolutionMessage.Builder builder);
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/ISingleObjectiveOptimizationSupport.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/ISingleObjectiveOptimizationSupport.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Interfaces/ISingleObjectiveOptimizationSupport.cs	(revision 12005)
@@ -0,0 +1,31 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public interface ISingleObjectiveOptimizationSupport {
+    void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random);
+    IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random);
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,40 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation {
+  [Plugin("HeuristicLab.Problems.ExternalEvaluation", "3.4.10.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.ExternalEvaluation-3.4.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.ProtobufCS", "2.4.1.473")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  public class HeuristicLabProblemsExternalEvaluationPlugin : PluginBase {
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledOptimizationSupport.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledOptimizationSupport.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledOptimizationSupport.cs	(revision 12005)
@@ -0,0 +1,27 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.ExternalEvaluation {
+  public abstract class CompiledOptimizationSupport {
+
+    public dynamic vars { get; set; }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledSingleObjectiveOptimizationSupport.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledSingleObjectiveOptimizationSupport.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/CompiledSingleObjectiveOptimizationSupport.cs	(revision 12005)
@@ -0,0 +1,40 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  public class CompiledSingleObjectiveOptimizationSupport : CompiledOptimizationSupport, ISingleObjectiveOptimizationSupport {
+
+    public void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+      // Uncomment the following lines if you want to retrieve the best individual
+      //var bestIndex = Maximization ?
+      //         qualities.Select((v, i) => Tuple.Create(i, v)).OrderByDescending(x => x.Item2).First().Item1
+      //       : qualities.Select((v, i) => Tuple.Create(i, v)).OrderBy(x => x.Item2).First().Item1;
+      //var best = individuals[bestIndex];
+    }
+
+    public IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = individual.Copy();
+        // For instance, perform a single bit-flip in a binary parameter
+        //var bIndex = random.Next(neighbor.BinaryVector("b").Length);
+        //neighbor.BinaryVector("b")[bIndex] = !neighbor.BinaryVector("b")[bIndex];
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScript.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScript.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScript.cs	(revision 12005)
@@ -0,0 +1,118 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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 System.Reflection;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.ExternalEvaluation.Programmable;
+using HeuristicLab.Scripting;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("ProblemDefinitionScript", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
+  [StorableClass]
+  public sealed class SingleObjectiveOptimizationSupportScript : Script, ISingleObjectiveOptimizationSupport {
+
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+
+    protected override string CodeTemplate {
+      get { return Templates.CompiledSingleObjectiveOptimizationSupport; }
+    }
+
+    [StorableConstructor]
+    private SingleObjectiveOptimizationSupportScript(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveOptimizationSupportScript(SingleObjectiveOptimizationSupportScript original, Cloner cloner)
+      : base(original, cloner) {
+      variableStore = cloner.Clone(original.variableStore);
+    }
+    public SingleObjectiveOptimizationSupportScript()
+      : base() {
+      variableStore = new VariableStore();
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveOptimizationSupportScript(this, cloner);
+    }
+
+    private readonly object compileLock = new object();
+    private volatile ISingleObjectiveOptimizationSupport compiledInstance;
+    private ISingleObjectiveOptimizationSupport CompiledInstance {
+      get {
+        if (compiledInstance == null) {
+          lock (compileLock) {
+            if (compiledInstance == null) {
+              Compile();
+            }
+          }
+        }
+        return compiledInstance;
+      }
+      set { compiledInstance = value; }
+    }
+
+    public override Assembly Compile() {
+      var assembly = base.Compile();
+      var types = assembly.GetTypes();
+      if (!types.Any(x => typeof(CompiledOptimizationSupport).IsAssignableFrom(x)))
+        throw new SingleObjectiveOptimizationSupportException("The compiled code doesn't contain an optimization support." + Environment.NewLine + "The support class must be a subclass of CompiledOptimizationSupport.");
+      if (types.Count(x => typeof(CompiledOptimizationSupport).IsAssignableFrom(x)) > 1)
+        throw new SingleObjectiveOptimizationSupportException("The compiled code contains multiple support classes." + Environment.NewLine + "Only one subclass of CompiledOptimizationSupport is allowed.");
+
+      CompiledOptimizationSupport inst;
+      try {
+        inst = (CompiledOptimizationSupport)Activator.CreateInstance(types.Single(x => typeof(CompiledOptimizationSupport).IsAssignableFrom(x)));
+        inst.vars = new Variables(VariableStore);
+      } catch (Exception e) {
+        compiledInstance = null;
+        throw new SingleObjectiveOptimizationSupportException("Instantiating the optimization support class failed." + Environment.NewLine + "Check your default constructor.", e);
+      }
+
+      var soInst = inst as ISingleObjectiveOptimizationSupport;
+      if (soInst == null)
+        throw new SingleObjectiveOptimizationSupportException("The optimization support class does not implement ISingleObjectiveOptimizationSupport." + Environment.NewLine + "Please implement that interface in the subclass of CompiledOptimizationSupport.");
+
+      CompiledInstance = soInst;
+
+      return assembly;
+    }
+
+    protected override void OnCodeChanged() {
+      base.OnCodeChanged();
+      compiledInstance = null;
+    }
+
+    void ISingleObjectiveOptimizationSupport.Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      CompiledInstance.Analyze(individuals, qualities, results, random);
+    }
+
+    IEnumerable<Individual> ISingleObjectiveOptimizationSupport.GetNeighbors(Individual individual, IRandom random) {
+      return CompiledInstance.GetNeighbors(individual, random);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScriptException.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScriptException.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/SingleObjectiveOptimizationSupportScriptException.cs	(revision 12005)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Serializable]
+  public class SingleObjectiveOptimizationSupportException : Exception {
+    public SingleObjectiveOptimizationSupportException() { }
+    public SingleObjectiveOptimizationSupportException(string message) : base(message) { }
+    public SingleObjectiveOptimizationSupportException(string message, Exception inner) : base(message, inner) { }
+
+    protected SingleObjectiveOptimizationSupportException(SerializationInfo info, StreamingContext context)
+      : base(info, context) { }
+  }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.Designer.cs	(revision 12005)
@@ -0,0 +1,86 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.34209
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Problems.ExternalEvaluation.Programmable {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Templates {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Templates() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Problems.ExternalEvaluation.Programmable.Templates", typeof(Templates).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///using System.Collections.Generic;
+        ///using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Encodings.PermutationEncoding;
+        ///using HeuristicLab.Optimization;
+        ///using HeuristicLab.Problems.Programmable;
+        ///
+        ///namespace HeuristicLab.Problems.Programmable {
+        ///  public class CompiledSingleObjectiveProblemDefinition : CompiledProblemDefinition, ISingleObjectiveProblemDefinition {
+        ///    public bool Maximization { get { return false; } }
+        ///
+        ///     [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string CompiledSingleObjectiveOptimizationSupport {
+            get {
+                return ResourceManager.GetString("CompiledSingleObjectiveOptimizationSupport", resourceCulture);
+            }
+        }
+    }
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.resx
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.resx	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Programmable/Templates.resx	(revision 12005)
@@ -0,0 +1,124 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CompiledSingleObjectiveOptimizationSupport" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>CompiledSingleObjectiveOptimizationSupport.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+</root>
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -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.ExternalEvaluation")]
+[assembly: AssemblyDescription("Plugin for Problems that are evaluated outside of HeuristicLab.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2014 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("3f1d3642-717c-4c35-93e6-fccd57030267")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.4.0.0")]
+[assembly: AssemblyFileVersion("3.4.10.$WCREV$")]
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ExternalEvaluationMessages.proto	(revision 12005)
@@ -0,0 +1,75 @@
+package HeuristicLab.Problems.ExternalEvaluation;
+option java_package = "com.heuristiclab.problems.externalevaluation";
+
+message SolutionMessage {
+  required int32 solutionId = 1;
+  
+  message IntegerVariable {
+    required string name = 1;
+    optional int32 data = 2;
+  }
+  repeated IntegerVariable integerVars = 2;
+  
+  message IntegerArrayVariable {
+    required string name = 1;
+    repeated int32 data = 2;
+    optional int32 length = 3;
+  }
+  repeated IntegerArrayVariable integerArrayVars = 3;
+  
+  message DoubleVariable {
+    required string name = 1;
+    optional double data = 2;
+  }
+  repeated DoubleVariable doubleVars = 4;
+  
+  message DoubleArrayVariable {
+    required string name = 1;
+    repeated double data = 2;
+    optional int32 length = 3;
+  }
+  repeated DoubleArrayVariable doubleArrayVars = 5;
+  
+  message BoolVariable {
+    required string name = 1;
+    optional bool data = 2;
+  }
+  repeated BoolVariable boolVars = 6;
+  
+  message BoolArrayVariable {
+    required string name = 1;
+    repeated bool data = 2;
+    optional int32 length = 3;
+  }
+  repeated BoolArrayVariable boolArrayVars = 7;
+  
+  message StringVariable {
+    required string name = 1;
+    optional string data = 2;
+  }
+  repeated StringVariable stringVars = 8;
+  
+  message StringArrayVariable {
+    required string name = 1;
+    repeated string data = 2;
+    optional int32 length = 3;
+  }
+  repeated StringArrayVariable stringArrayVars = 9;
+  
+  message RawVariable {
+    required string name = 1;
+    optional bytes data = 2;
+  }
+  repeated RawVariable rawVars = 10;
+}
+
+message QualityMessage {
+  required int32 solutionId = 1;
+  required double quality = 2;
+
+  extensions 1000 to max;
+}
+  
+service EvaluationService {
+  rpc Evaluate (SolutionMessage) returns (QualityMessage);
+}
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/Protos/ProcessProtos.cmd	(revision 12005)
@@ -0,0 +1,4 @@
+for %%i in ("%ProjectDir%Protos\*.proto") do (
+  echo Processing %%i
+  ProtoGen --proto_path="%ProjectDir%\Protos" "%%i" --include_imports -output_directory="%ProjectDir%Protos"
+)
Index: stable/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs
===================================================================
--- stable/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.ExternalEvaluation/3.4/SolutionMessageBuilder.cs	(revision 12005)
@@ -0,0 +1,112 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.ExternalEvaluation {
+  [Item("SolutionMessageBuilder", "Holds and uses a number of converters to translate HeuristicLab objects into appropriate fields of a solution message.")]
+  [StorableClass]
+  public class SolutionMessageBuilder : NamedItem {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+    private Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>> dispatcher;
+
+    [Storable]
+    private CheckedItemList<IItemToSolutionMessageConverter> convertersList;
+    public CheckedItemList<IItemToSolutionMessageConverter> Converters {
+      get { return convertersList; }
+    }
+
+    [StorableConstructor]
+    protected SolutionMessageBuilder(bool deserializing) : base(deserializing) { }
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEventHandlers();
+    }
+
+    protected SolutionMessageBuilder(SolutionMessageBuilder original, Cloner cloner)
+      : base(original, cloner) {
+      convertersList = cloner.Clone(original.convertersList);
+      RegisterEventHandlers();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SolutionMessageBuilder(this, cloner);
+    }
+    public SolutionMessageBuilder()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+      convertersList = new CheckedItemList<IItemToSolutionMessageConverter>();
+      convertersList.Add(new BoolConverter());
+      convertersList.Add(new DateTimeValueConverter());
+      convertersList.Add(new DoubleConverter());
+      convertersList.Add(new IntegerConverter());
+      convertersList.Add(new StringConverter());
+      convertersList.Add(new TimeSpanValueConverter());
+
+      RegisterEventHandlers();
+    }
+
+    public void AddToMessage(IItem item, string name, SolutionMessage.Builder builder) {
+      if (dispatcher == null) BuildDispatcher();
+      Type itemType = item.GetType();
+      while (!dispatcher.ContainsKey(itemType)) {
+        if (itemType.BaseType != null) itemType = itemType.BaseType;
+        else break;
+      }
+      if (itemType.BaseType == null && !dispatcher.ContainsKey(itemType)) {
+        IEnumerable<Type> interfaces = item.GetType().GetInterfaces().Where(x => dispatcher.ContainsKey(x));
+        if (interfaces.Count() != 1) throw new ArgumentException(Name + ": No converter for type " + itemType.FullName + " defined.", "item");
+        else itemType = interfaces.Single();
+      }
+      dispatcher[itemType](item, name, builder);
+    }
+
+    private void RegisterEventHandlers() {
+      convertersList.ItemsAdded += convertersList_Changed;
+      convertersList.ItemsRemoved += convertersList_Changed;
+      convertersList.CheckedItemsChanged += convertersList_Changed;
+      convertersList.ItemsMoved += convertersList_Changed;
+      convertersList.ItemsReplaced += convertersList_Changed;
+    }
+
+    private void convertersList_Changed(object sender, CollectionItemsChangedEventArgs<IndexedItem<IItemToSolutionMessageConverter>> e) {
+      BuildDispatcher();
+    }
+
+    private void BuildDispatcher() {
+      dispatcher = new Dictionary<Type, Action<IItem, string, SolutionMessage.Builder>>();
+      foreach (var c in convertersList.CheckedItems.OrderBy(x => x.Index).Select(x => x.Value)) {
+        var types = c.ItemTypes;
+        foreach (var t in types) {
+          if (!dispatcher.ContainsKey(t))
+            dispatcher.Add(t, c.AddItemToBuilder);
+        }
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.Knapsack/3.3/Analyzers/BestKnapsackSolutionAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestKnapsackSolutionAnalyzer", "An operator for analyzing the best solution for a Knapsack problem.")]
   [StorableClass]
-  public class BestKnapsackSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class BestKnapsackSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.Knapsack/3.3/MoveEvaluators/KnapsackMoveEvaluator.cs	(revision 12005)
@@ -35,5 +35,5 @@
   [Item("KnapsackMoveEvaluator", "A base class for operators which evaluate Knapsack moves.")]
   [StorableClass]
-  public abstract class KnapsackMoveEvaluator : SingleSuccessorOperator, IKnapsackMoveEvaluator, IMoveOperator, IBinaryVectorMoveOperator {
+  public abstract class KnapsackMoveEvaluator : SingleSuccessorOperator, IKnapsackMoveEvaluator, IBinaryVectorMoveOperator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
Index: stable/HeuristicLab.Problems.LinearAssignment/3.3/Analyzers/BestLAPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.LinearAssignment/3.3/Analyzers/BestLAPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.LinearAssignment/3.3/Analyzers/BestLAPSolutionAnalyzer.cs	(revision 12005)
@@ -33,5 +33,5 @@
   [Item("BestLAPSolutionAnalyzer", "Analyzes the best solution found.")]
   [StorableClass]
-  public class BestLAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class BestLAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public bool EnabledByDefault { get { return true; } }
 
@@ -101,5 +101,5 @@
       bool max = MaximizationParameter.ActualValue.Value;
       DoubleValue bestKnownQuality = BestKnownQualityParameter.ActualValue;
-      
+
       var sorted = qualities.Select((x, index) => new { index, x.Value }).OrderBy(x => x.Value).ToArray();
       if (max) sorted = sorted.Reverse().ToArray();
Index: stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs
===================================================================
--- stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.LinearAssignment/3.3/LinearAssignmentProblemSolver.cs	(revision 12005)
@@ -25,4 +25,5 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -31,5 +32,5 @@
   [Item("LinearAssignmentProblemSolver", "Uses the hungarian algorithm to solve linear assignment problems.")]
   [StorableClass]
-  public sealed class LinearAssignmentProblemSolver : SingleSuccessorOperator {
+  public sealed class LinearAssignmentProblemSolver : SingleSuccessorOperator, ISingleObjectiveOperator {
     private const int UNASSIGNED = -1;
 
Index: stable/HeuristicLab.Problems.OneMax/3.3/Analyzers/BestOneMaxSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.OneMax/3.3/Analyzers/BestOneMaxSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.OneMax/3.3/Analyzers/BestOneMaxSolutionAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestOneMaxSolutionAnalyzer", "An operator for analyzing the best solution for a OneMax problem.")]
   [StorableClass]
-  public class BestOneMaxSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public class BestOneMaxSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.OneMax/3.3/MoveEvaluators/OneMaxMoveEvaluator.cs
===================================================================
--- stable/HeuristicLab.Problems.OneMax/3.3/MoveEvaluators/OneMaxMoveEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.OneMax/3.3/MoveEvaluators/OneMaxMoveEvaluator.cs	(revision 12005)
@@ -35,5 +35,5 @@
   [Item("OneMaxMoveEvaluator", "A base class for operators which evaluate OneMax moves.")]
   [StorableClass]
-  public abstract class OneMaxMoveEvaluator : SingleSuccessorOperator, IOneMaxMoveEvaluator, IMoveOperator, IBinaryVectorMoveOperator {
+  public abstract class OneMaxMoveEvaluator : SingleSuccessorOperator, IOneMaxMoveEvaluator, IBinaryVectorMoveOperator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
Index: stable/HeuristicLab.Problems.OneMax/3.3/OneMaxProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.OneMax/3.3/OneMaxProblem.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.OneMax/3.3/OneMaxProblem.cs	(revision 12005)
@@ -34,6 +34,6 @@
 namespace HeuristicLab.Problems.OneMax {
   [Item("OneMax Problem", "Represents a OneMax Problem.")]
-  [Creatable("Problems")]
   [StorableClass]
+  [NonDiscoverableType]
   public sealed class OneMaxProblem : SingleObjectiveHeuristicOptimizationProblem<IOneMaxEvaluator, IBinaryVectorCreator>, IStorableContent {
     public string Filename { get; set; }
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/HeuristicLab.Problems.Programmable.Views-3.3.csproj	(revision 12005)
@@ -0,0 +1,203 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{6F023B90-2091-40A9-8AC0-B0338DFF8E5F}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Programmable.Views</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Programmable.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>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Plugin.cs" />
+    <Compile Include="ProblemDefinitionScriptView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProblemDefinitionScriptView.Designer.cs">
+      <DependentUpon>ProblemDefinitionScriptView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MultiObjectiveProgrammableProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MultiObjectiveProgrammableProblemView.Designer.cs">
+      <DependentUpon>MultiObjectiveProgrammableProblemView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="SingleObjectiveProgrammableProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="SingleObjectiveProgrammableProblemView.Designer.cs">
+      <DependentUpon>SingleObjectiveProgrammableProblemView.cs</DependentUpon>
+    </Compile>
+    <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.CodeEditor\3.4\HeuristicLab.CodeEditor-3.4.csproj">
+      <Project>{c38691ae-ecb4-489a-a05d-b035554e0168}</Project>
+      <Name>HeuristicLab.CodeEditor-3.4</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core.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.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104a0b-90e7-42f3-9abe-9bbbadd4b943}</Project>
+      <Name>HeuristicLab.Data.Views-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.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.Programmable\3.3\HeuristicLab.Problems.Programmable-3.3.csproj">
+      <Project>{ee07bff8-b23d-41f5-8ad7-ac9598d7a2c9}</Project>
+      <Name>HeuristicLab.Problems.Programmable-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Scripting.Views\3.3\HeuristicLab.Scripting.Views-3.3.csproj">
+      <Project>{0c2917c8-7aa8-4e18-800a-c4d064f992ed}</Project>
+      <Name>HeuristicLab.Scripting.Views-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Scripting\3.3\HeuristicLab.Scripting-3.3.csproj">
+      <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
+      <Name>HeuristicLab.Scripting-3.3</Name>
+      <Private>False</Private>
+    </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: stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.Designer.cs	(revision 12005)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable.Views {
+  partial class MultiObjectiveProgrammableProblemView {
+    /// <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.SuspendLayout();
+      // 
+      // ProgrammableProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "ProgrammableProblemView";
+      this.Size = new System.Drawing.Size(626, 413);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/MultiObjectiveProgrammableProblemView.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  [View("Multi-Objective Programmable Problem View")]
+  [Content(typeof(MultiObjectiveProgrammableProblem), true)]
+  public partial class MultiObjectiveProgrammableProblemView : ItemView {
+    protected ViewHost ScriptView;
+
+    public new MultiObjectiveProgrammableProblem Content {
+      get { return (MultiObjectiveProgrammableProblem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MultiObjectiveProgrammableProblemView() {
+      InitializeComponent();
+      ScriptView = new ViewHost() { ViewsLabelVisible = false, Dock = DockStyle.Fill };
+      Controls.Add(ScriptView);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ScriptView.Content = null;
+      } else {
+        ScriptView.Content = Content.ProblemScript;
+        Caption = Content.Name;
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      //Content.ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged;
+      Content.NameChanged += ContentOnNameChanged;
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      //Content.ProblemDefinitionParameter.ValueChanged -= ProblemDefinitionParameterOnValueChanged;
+      Content.NameChanged -= ContentOnNameChanged;
+    }
+
+    //private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) {
+    //  DefinitionView.Content = Content.ProblemDefinitionParameter.Value;
+    //}
+
+    private void ContentOnNameChanged(object sender, EventArgs eventArgs) {
+      Caption = Content.Name;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,37 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable.Views {
+  [Plugin("HeuristicLab.Problems.Programmable.Views", "Views for programmable problem for defining custom representation and evaluation function.", "3.3.9.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Programmable.Views-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.CodeEditor", "3.4")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Core.Views", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm", "3.3")]
+  [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.Programmable", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting.Views", "3.3")]
+  public class HeuristicLabProblemsProgrammableViewsPlugin : PluginBase { }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.Designer.cs	(revision 12005)
@@ -0,0 +1,173 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable.Views {
+  partial class ProblemDefinitionScriptView {
+    /// <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() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ProblemDefinitionScriptView));
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.variableStoreView = new HeuristicLab.Scripting.Views.VariableStoreView();
+      this.infoTabControl.SuspendLayout();
+      this.outputTabPage.SuspendLayout();
+      this.errorListTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // compileButton
+      // 
+      this.toolTip.SetToolTip(this.compileButton, "Compile (F6)");
+      // 
+      // infoTabControl
+      // 
+      this.infoTabControl.Size = new System.Drawing.Size(593, 113);
+      // 
+      // outputTabPage
+      // 
+      this.outputTabPage.Size = new System.Drawing.Size(585, 87);
+      // 
+      // outputTextBox
+      // 
+      this.outputTextBox.Size = new System.Drawing.Size(579, 81);
+      // 
+      // errorListTabPage
+      // 
+      this.errorListTabPage.Size = new System.Drawing.Size(621, 86);
+      // 
+      // errorListView
+      // 
+      this.errorListView.Size = new System.Drawing.Size(615, 80);
+      // 
+      // codeEditor
+      // 
+      this.codeEditor.Size = new System.Drawing.Size(593, 429);
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)));
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Size = new System.Drawing.Size(593, 546);
+      this.splitContainer1.SplitterDistance = 429;
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.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.splitContainer2.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
+      this.splitContainer2.Location = new System.Drawing.Point(6, 56);
+      this.splitContainer2.Name = "splitContainer2";
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.splitContainer1);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.variableStoreView);
+      this.splitContainer2.Size = new System.Drawing.Size(826, 546);
+      this.splitContainer2.SplitterDistance = 593;
+      this.splitContainer2.TabIndex = 10;
+      // 
+      // variableStoreView
+      // 
+      this.variableStoreView.Caption = "ItemCollection View";
+      this.variableStoreView.Content = null;
+      this.variableStoreView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.variableStoreView.Location = new System.Drawing.Point(0, 0);
+      this.variableStoreView.Name = "variableStoreView";
+      this.variableStoreView.ReadOnly = false;
+      this.variableStoreView.Size = new System.Drawing.Size(229, 546);
+      this.variableStoreView.TabIndex = 10;
+      // 
+      // ProblemDefinitionScriptView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer2);
+      this.Name = "ProblemDefinitionScriptView";
+      this.Controls.SetChildIndex(this.infoTextLabel, 0);
+      this.Controls.SetChildIndex(this.compileButton, 0);
+      this.Controls.SetChildIndex(this.splitContainer2, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.infoLabel, 0);
+      this.infoTabControl.ResumeLayout(false);
+      this.outputTabPage.ResumeLayout(false);
+      this.outputTabPage.PerformLayout();
+      this.errorListTabPage.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
+      this.splitContainer2.ResumeLayout(false);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private Scripting.Views.VariableStoreView variableStoreView;
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/ProblemDefinitionScriptView.cs	(revision 12005)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using HeuristicLab.MainForm;
+using HeuristicLab.Scripting.Views;
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  [View("ProblemDefinitionScriptView")]
+  [Content(typeof(ProblemDefinitionScript), IsDefaultView = true)]
+  public partial class ProblemDefinitionScriptView : ScriptView {
+
+    public new ProblemDefinitionScript Content {
+      get { return (ProblemDefinitionScript)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ProblemDefinitionScriptView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      variableStoreView.Content = Content == null ? null : Content.VariableStore;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      variableStoreView.Enabled = Content != null && !Locked && !ReadOnly;
+    }
+
+    public override bool Compile() {
+      try {
+        base.Compile();
+      } catch (ProblemDefinitionScriptException e) {
+        PluginInfrastructure.ErrorHandling.ShowErrorDialog(e);
+        return false;
+      }
+      return true;
+    }
+
+    protected override void Content_CodeChanged(object sender, EventArgs e) {
+      base.Content_CodeChanged(sender, e);
+      UpdateInfoTextLabel("Code changed, compilation necessary!", Color.Red);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable.Views")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002 - 2014 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("04b67c2a-b8ad-461f-ad4f-4587f96fda45")]
+
+// 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.9.$WCREV$")]
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.Designer.cs	(revision 12005)
@@ -0,0 +1,62 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable.Views {
+  partial class SingleObjectiveProgrammableProblemView {
+    /// <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.SuspendLayout();
+      // 
+      // ProgrammableProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "ProgrammableProblemView";
+      this.Size = new System.Drawing.Size(626, 413);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable.Views/3.3/SingleObjectiveProgrammableProblemView.cs	(revision 12005)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Problems.Programmable.Views {
+  [View("Single-Objective Scriptable Problem View")]
+  [Content(typeof(SingleObjectiveProgrammableProblem), true)]
+  public partial class SingleObjectiveProgrammableProblemView : ItemView {
+    protected ViewHost ScriptView;
+
+    public new SingleObjectiveProgrammableProblem Content {
+      get { return (SingleObjectiveProgrammableProblem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SingleObjectiveProgrammableProblemView() {
+      InitializeComponent();
+      ScriptView = new ViewHost() { ViewsLabelVisible = false, Dock = DockStyle.Fill };
+      Controls.Add(ScriptView);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ScriptView.Content = null;
+      } else {
+        ScriptView.Content = Content.ProblemScript;
+        Caption = Content.Name;
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      //Content.ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged;
+      Content.NameChanged += ContentOnNameChanged;
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      //Content.ProblemDefinitionParameter.ValueChanged -= ProblemDefinitionParameterOnValueChanged;
+      Content.NameChanged -= ContentOnNameChanged;
+    }
+
+    //private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) {
+    //  DefinitionView.Content = Content.ProblemDefinitionParameter.Value;
+    //}
+
+    private void ContentOnNameChanged(object sender, EventArgs eventArgs) {
+      Caption = Content.Name;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/CompiledProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,45 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Optimization;
+
+namespace HeuristicLab.Problems.Programmable {
+  public abstract class CompiledProblemDefinition : IProblemDefinition {
+    private IEncoding encoding;
+    public IEncoding Encoding {
+      get { return encoding; }
+      protected set {
+        if (value == null) throw new ArgumentNullException("The encoding must not be null.");
+        encoding = value;
+      }
+    }
+
+    public dynamic vars { get; set; }
+    public abstract void Initialize();
+
+    protected CompiledProblemDefinition() { }
+    protected CompiledProblemDefinition(IEncoding encoding)
+      : base() {
+      Encoding = encoding;
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/HeuristicLab.Problems.Programmable-3.3.csproj	(revision 12005)
@@ -0,0 +1,206 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.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>{EE07BFF8-B23D-41F5-8AD7-AC9598D7A2C9}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Problems.Programmable</RootNamespace>
+    <AssemblyName>HeuristicLab.Problems.Programmable-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>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>$(SolutionDir)\bin\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+  </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.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MultiObjectiveProgrammableProblem.cs" />
+    <Compile Include="ProblemDefinitionScriptException.cs" />
+    <Compile Include="Templates\CompiledMultiObjectiveProblemDefinition.cs" />
+    <Compile Include="Templates\CompiledSingleObjectiveProblemDefinition.cs" />
+    <Compile Include="Templates\ScriptTemplates.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>ScriptTemplates.resx</DependentUpon>
+    </Compile>
+    <Compile Include="CompiledProblemDefinition.cs" />
+    <Compile Include="ProblemDefinitionScript.cs" />
+    <Compile Include="SingleObjectiveProgrammableProblem.cs" />
+    <Compile Include="MultiObjectiveProblemDefinitionScript.cs" />
+    <Compile Include="SingleObjectiveProblemDefinitionScript.cs" />
+    <EmbeddedResource Include="Templates\ScriptTemplates.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>ScriptTemplates.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <None Include="HeuristicLab.snk" />
+    <None Include="Plugin.cs.frame" />
+    <Compile Include="Plugin.cs" />
+    <None Include="Properties\AssemblyInfo.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj">
+      <Project>{887425b4-4348-49ed-a457-b7d2c26ddbf9}</Project>
+      <Name>HeuristicLab.Analysis-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj">
+      <Project>{958b43bc-cc5c-4fa2-8628-2b3b01d890b6}</Project>
+      <Name>HeuristicLab.Collections-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj">
+      <Project>{0e27a536-1c4a-4624-a65e-dc4f4f23e3e1}</Project>
+      <Name>HeuristicLab.Common.Resources-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj">
+      <Project>{a9ad58b9-3ef9-4cc1-97e5-8d909039ff5c}</Project>
+      <Name>HeuristicLab.Common-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Core\3.3\HeuristicLab.Core-3.3.csproj">
+      <Project>{c36bd924-a541-4a00-afa8-41701378ddc5}</Project>
+      <Name>HeuristicLab.Core-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
+      <Project>{bbab9df5-5ef3-4ba8-ade9-b36e82114937}</Project>
+      <Name>HeuristicLab.Data-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.BinaryVectorEncoding\3.3\HeuristicLab.Encodings.BinaryVectorEncoding-3.3.csproj">
+      <Project>{66d249c3-a01d-42a8-82a2-919bc8ec3d83}</Project>
+      <Name>HeuristicLab.Encodings.BinaryVectorEncoding-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.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj">
+      <Project>{bb6d334a-4bb6-4674-9883-31a6ebb32cab}</Project>
+      <Name>HeuristicLab.Encodings.RealVectorEncoding-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>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
+      <Project>{14ab8d24-25bc-400c-a846-4627aa945192}</Project>
+      <Name>HeuristicLab.Optimization-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Parameters\3.3\HeuristicLab.Parameters-3.3.csproj">
+      <Project>{56f9106a-079f-4c61-92f6-86a84c2d84b7}</Project>
+      <Name>HeuristicLab.Parameters-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
+      <Project>{102bc7d3-0ef9-439c-8f6d-96ff0fdb8e1b}</Project>
+      <Name>HeuristicLab.Persistence-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj">
+      <Project>{94186a6a-5176-4402-ae83-886557b53cca}</Project>
+      <Name>HeuristicLab.PluginInfrastructure-3.3</Name>
+      <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Scripting\3.3\HeuristicLab.Scripting-3.3.csproj">
+      <Project>{21977cc3-1757-4b3b-87bd-ff817aaa900f}</Project>
+      <Name>HeuristicLab.Scripting-3.3</Name>
+      <Private>False</Private>
+    </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: stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProblemDefinitionScript.cs	(revision 12005)
@@ -0,0 +1,66 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("Multi-objective Problem Definition Script", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
+  [StorableClass]
+  public class MultiObjectiveProblemDefinitionScript : ProblemDefinitionScript, IMultiObjectiveProblemDefinition, IStorableContent {
+    public string Filename { get; set; }
+
+    protected override string CodeTemplate {
+      get { return ScriptTemplates.CompiledMultiObjectiveProblemDefinition; }
+    }
+
+    private new IMultiObjectiveProblemDefinition CompiledProblemDefinition {
+      get { return (IMultiObjectiveProblemDefinition)base.CompiledProblemDefinition; }
+    }
+
+    [StorableConstructor]
+    protected MultiObjectiveProblemDefinitionScript(bool deserializing) : base(deserializing) { }
+    protected MultiObjectiveProblemDefinitionScript(MultiObjectiveProblemDefinitionScript original, Cloner cloner)
+      : base(original, cloner) { }
+
+    public MultiObjectiveProblemDefinitionScript() {
+      Code = CodeTemplate;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new MultiObjectiveProblemDefinitionScript(this, cloner);
+    }
+
+    bool[] IMultiObjectiveProblemDefinition.Maximization {
+      get { return CompiledProblemDefinition.Maximization; }
+    }
+
+    double[] IMultiObjectiveProblemDefinition.Evaluate(Individual individual, IRandom random) {
+      return CompiledProblemDefinition.Evaluate(individual, random);
+    }
+
+    void IMultiObjectiveProblemDefinition.Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      CompiledProblemDefinition.Analyze(individuals, qualities, results, random);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/MultiObjectiveProgrammableProblem.cs	(revision 12005)
@@ -0,0 +1,96 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("Programmable Problem (multi-objective)", "Represents a multi-objective problem that can be programmed with a script.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class MultiObjectiveProgrammableProblem : MultiObjectiveBasicProblem<IEncoding> {
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.Script; }
+    }
+
+    private FixedValueParameter<MultiObjectiveProblemDefinitionScript> MultiObjectiveProblemScriptParameter {
+      get { return (FixedValueParameter<MultiObjectiveProblemDefinitionScript>)Parameters["ProblemScript"]; }
+    }
+
+    public MultiObjectiveProblemDefinitionScript ProblemScript {
+      get { return MultiObjectiveProblemScriptParameter.Value; }
+    }
+
+    public IMultiObjectiveProblemDefinition ProblemDefinition {
+      get { return MultiObjectiveProblemScriptParameter.Value; }
+    }
+
+    private MultiObjectiveProgrammableProblem(MultiObjectiveProgrammableProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new MultiObjectiveProgrammableProblem(this, cloner); }
+
+    [StorableConstructor]
+    private MultiObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
+    public MultiObjectiveProgrammableProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<MultiObjectiveProblemDefinitionScript>("ProblemScript", "Defines the problem.", new MultiObjectiveProblemDefinitionScript() { Name = Name }));
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      ProblemScript.ProblemDefinitionChanged += (o, e) => OnProblemDefinitionChanged();
+    }
+
+    private void OnProblemDefinitionChanged() {
+      Parameters.Remove("Maximization");
+      Parameters.Add(new ValueParameter<BoolArray>("Maximization", "Set to false if the problem should be minimized.", (BoolArray)new BoolArray(Maximization).AsReadOnly()) { Hidden = true });
+
+      Encoding = ProblemDefinition.Encoding;
+      OnOperatorsChanged();
+      OnReset();
+    }
+
+    public override bool[] Maximization {
+      get { return Parameters.ContainsKey("ProblemScript") ? ProblemDefinition.Maximization : new[] { false }; }
+    }
+
+    public override double[] Evaluate(Individual individual, IRandom random) {
+      return ProblemDefinition.Evaluate(individual, random);
+    }
+
+    public override void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      ProblemDefinition.Analyze(individuals, qualities, results, random);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/Plugin.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Plugin.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Plugin.cs.frame	(revision 12005)
@@ -0,0 +1,38 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable {
+  [Plugin("HeuristicLab.Problems.Programmable", "Programmable problem for defining custom representation and evaluation function.", "3.3.9.$WCREV$")]
+  [PluginFile("HeuristicLab.Problems.Programmable-3.3.dll", PluginFileType.Assembly)]
+  [PluginDependency("HeuristicLab.Analysis", "3.3")]
+  [PluginDependency("HeuristicLab.Collections", "3.3")]
+  [PluginDependency("HeuristicLab.Common", "3.3")]
+  [PluginDependency("HeuristicLab.Common.Resources", "3.3")]
+  [PluginDependency("HeuristicLab.Core", "3.3")]
+  [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Optimization", "3.3")]
+  [PluginDependency("HeuristicLab.Parameters", "3.3")]
+  [PluginDependency("HeuristicLab.Persistence", "3.3")]
+  [PluginDependency("HeuristicLab.Scripting", "3.3")]
+  public class HeuristicLabProblemsProgrammablePlugin : PluginBase { }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScript.cs	(revision 12005)
@@ -0,0 +1,131 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Reflection;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Scripting;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("ProblemDefinitionScript", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
+  [StorableClass]
+  public abstract class ProblemDefinitionScript : Script, IProblemDefinition {
+    protected bool SuppressEvents { get; set; }
+
+    [Storable]
+    private VariableStore variableStore;
+    public VariableStore VariableStore {
+      get { return variableStore; }
+    }
+
+    [Storable]
+    private bool codeChanged;
+
+    [StorableConstructor]
+    protected ProblemDefinitionScript(bool deserializing) : base(deserializing) { }
+    protected ProblemDefinitionScript(ProblemDefinitionScript original, Cloner cloner)
+      : base(original, cloner) {
+      variableStore = cloner.Clone(original.variableStore);
+      codeChanged = original.codeChanged;
+    }
+    protected ProblemDefinitionScript()
+      : base() {
+      variableStore = new VariableStore();
+    }
+
+    IEncoding IProblemDefinition.Encoding {
+      get { return CompiledProblemDefinition.Encoding; }
+    }
+
+    private readonly object compileLock = new object();
+    private volatile IProblemDefinition compiledProblemDefinition;
+    protected IProblemDefinition CompiledProblemDefinition {
+      get {
+        // double checked locking pattern
+        if (compiledProblemDefinition == null) {
+          lock (compileLock) {
+            if (compiledProblemDefinition == null) {
+              if (codeChanged) throw new ProblemDefinitionScriptException("The code has been changed, but was not recompiled.");
+              Compile(false);
+            }
+          }
+        }
+        return compiledProblemDefinition;
+      }
+    }
+
+    public sealed override Assembly Compile() {
+      return Compile(true);
+    }
+
+    private Assembly Compile(bool fireChanged) {
+      var assembly = base.Compile();
+      var types = assembly.GetTypes();
+      if (!types.Any(x => typeof(CompiledProblemDefinition).IsAssignableFrom(x)))
+        throw new ProblemDefinitionScriptException("The compiled code doesn't contain a problem definition." + Environment.NewLine + "The problem definition must be a subclass of CompiledProblemDefinition.");
+      if (types.Count(x => typeof(CompiledProblemDefinition).IsAssignableFrom(x)) > 1)
+        throw new ProblemDefinitionScriptException("The compiled code contains multiple problem definitions." + Environment.NewLine + "Only one subclass of CompiledProblemDefinition is allowed.");
+
+      CompiledProblemDefinition inst;
+      try {
+        inst = (CompiledProblemDefinition)Activator.CreateInstance(types.Single(x => typeof(CompiledProblemDefinition).IsAssignableFrom(x)));
+      } catch (Exception e) {
+        compiledProblemDefinition = null;
+        throw new ProblemDefinitionScriptException("Instantiating the problem definition failed." + Environment.NewLine + "Check your default constructor.", e);
+      }
+
+      try {
+        inst.vars = new Variables(VariableStore);
+        inst.Initialize();
+      } catch (Exception e) {
+        compiledProblemDefinition = null;
+        throw new ProblemDefinitionScriptException("Initializing the problem definition failed." + Environment.NewLine + "Check your Initialize() method.", e);
+      }
+
+      try {
+        compiledProblemDefinition = inst;
+        if (fireChanged) OnProblemDefinitionChanged();
+      } catch (Exception e) {
+        compiledProblemDefinition = null;
+        throw new ProblemDefinitionScriptException("Using the problem definition in the problem failed." + Environment.NewLine + "Examine this error message carefully (often there is an issue with the defined encoding).", e);
+      }
+
+      codeChanged = false;
+      return assembly;
+    }
+
+    protected override void OnCodeChanged() {
+      base.OnCodeChanged();
+      compiledProblemDefinition = null;
+      codeChanged = true;
+    }
+
+    public event EventHandler ProblemDefinitionChanged;
+    protected virtual void OnProblemDefinitionChanged() {
+      var handler = ProblemDefinitionChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScriptException.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScriptException.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/ProblemDefinitionScriptException.cs	(revision 12005)
@@ -0,0 +1,35 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Runtime.Serialization;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Serializable]
+  public class ProblemDefinitionScriptException : Exception {
+    public ProblemDefinitionScriptException() { }
+    public ProblemDefinitionScriptException(string message) : base(message) { }
+    public ProblemDefinitionScriptException(string message, Exception inner) : base(message, inner) { }
+
+    protected ProblemDefinitionScriptException(SerializationInfo info, StreamingContext context)
+      : base(info, context) { }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/Properties/AssemblyInfo.cs.frame
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Properties/AssemblyInfo.cs.frame	(revision 12005)
@@ -0,0 +1,56 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Programmable")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002 - 2014 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("c45d2b76-5386-4f21-8d2b-ecf5c9ddaf0d")]
+
+// 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.9.$WCREV$")]
Index: stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProblemDefinitionScript.cs	(revision 12005)
@@ -0,0 +1,69 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("Single-objective Problem Definition Script", "Script that defines the parameter vector and evaluates the solution for a programmable problem.")]
+  [StorableClass]
+  public sealed class SingleObjectiveProblemDefinitionScript : ProblemDefinitionScript, ISingleObjectiveProblemDefinition, IStorableContent {
+    public string Filename { get; set; }
+
+    protected override string CodeTemplate {
+      get { return ScriptTemplates.CompiledSingleObjectiveProblemDefinition; }
+    }
+
+    private new ISingleObjectiveProblemDefinition CompiledProblemDefinition {
+      get { return (ISingleObjectiveProblemDefinition)base.CompiledProblemDefinition; }
+    }
+
+    [StorableConstructor]
+    private SingleObjectiveProblemDefinitionScript(bool deserializing) : base(deserializing) { }
+    private SingleObjectiveProblemDefinitionScript(SingleObjectiveProblemDefinitionScript original, Cloner cloner) : base(original, cloner) { }
+    public SingleObjectiveProblemDefinitionScript()
+      : base() {
+      Code = CodeTemplate;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new SingleObjectiveProblemDefinitionScript(this, cloner);
+    }
+
+    bool ISingleObjectiveProblemDefinition.Maximization {
+      get { return CompiledProblemDefinition.Maximization; }
+    }
+
+    double ISingleObjectiveProblemDefinition.Evaluate(Individual individual, IRandom random) {
+      return CompiledProblemDefinition.Evaluate(individual, random);
+    }
+
+    void ISingleObjectiveProblemDefinition.Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      CompiledProblemDefinition.Analyze(individuals, qualities, results, random);
+    }
+    IEnumerable<Individual> ISingleObjectiveProblemDefinition.GetNeighbors(Individual individual, IRandom random) {
+      return CompiledProblemDefinition.GetNeighbors(individual, random);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/SingleObjectiveProgrammableProblem.cs	(revision 12005)
@@ -0,0 +1,102 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Drawing;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Problems.Programmable {
+  [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed with a script.")]
+  [Creatable("Problems")]
+  [StorableClass]
+  public sealed class SingleObjectiveProgrammableProblem : SingleObjectiveBasicProblem<IEncoding> {
+    public static new Image StaticItemImage {
+      get { return VSImageLibrary.Script; }
+    }
+
+    private FixedValueParameter<SingleObjectiveProblemDefinitionScript> SingleObjectiveProblemScriptParameter {
+      get { return (FixedValueParameter<SingleObjectiveProblemDefinitionScript>)Parameters["ProblemScript"]; }
+    }
+
+    public SingleObjectiveProblemDefinitionScript ProblemScript {
+      get { return SingleObjectiveProblemScriptParameter.Value; }
+    }
+
+    public ISingleObjectiveProblemDefinition ProblemDefinition {
+      get { return SingleObjectiveProblemScriptParameter.Value; }
+    }
+
+    private SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)
+      : base(original, cloner) {
+      RegisterEvents();
+    }
+    public override IDeepCloneable Clone(Cloner cloner) { return new SingleObjectiveProgrammableProblem(this, cloner); }
+
+    [StorableConstructor]
+    private SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
+    public SingleObjectiveProgrammableProblem()
+      : base() {
+      Parameters.Add(new FixedValueParameter<SingleObjectiveProblemDefinitionScript>("ProblemScript", "Defines the problem.", new SingleObjectiveProblemDefinitionScript() { Name = Name }));
+      Operators.Add(new BestScopeSolutionAnalyzer());
+      RegisterEvents();
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    private void RegisterEvents() {
+      ProblemScript.ProblemDefinitionChanged += (o, e) => OnProblemDefinitionChanged();
+    }
+
+    private void OnProblemDefinitionChanged() {
+      Parameters.Remove("Maximization");
+      Parameters.Add(new FixedValueParameter<BoolValue>("Maximization", "Set to false if the problem should be minimized.", (BoolValue)new BoolValue(Maximization).AsReadOnly()) { Hidden = true });
+
+      Encoding = ProblemDefinition.Encoding;
+      OnOperatorsChanged();
+      OnReset();
+    }
+
+    public override bool Maximization {
+      get { return Parameters.ContainsKey("ProblemScript") ? ProblemDefinition.Maximization : false; }
+    }
+
+    public override double Evaluate(Individual individual, IRandom random) {
+      return ProblemDefinition.Evaluate(individual, random);
+    }
+
+    public override void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      ProblemDefinition.Analyze(individuals, qualities, results, random);
+    }
+    public override IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      return ProblemDefinition.GetNeighbors(individual, random);
+    }
+  }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledMultiObjectiveProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledMultiObjectiveProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledMultiObjectiveProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,49 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledMultiObjectiveProblemDefinition : CompiledProblemDefinition, IMultiObjectiveProblemDefinition {
+    public bool[] Maximization { get { return new[] { false, false }; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define the solution encoding which can also consist of multiple vectors, examples below
+      //Encoding = new BinaryVectorEncoding("b", length: 5);
+      //Encoding = new IntegerVectorEncoding("i", length: 5, min: 2, max: 14, step: 4);
+      //Encoding = new RealVectorEncoding("r", length: 5, min: -1.0, max: 1.0);
+      //Encoding = new PermutationEncoding("p", length: 5, type: PermutationTypes.Absolute);
+      // The encoding can also be a combination
+      //Encoding = new MultiEncoding()
+      //.Add(new BinaryVectorEncoding("b", length: 5))
+      //.Add(new IntegerVectorEncoding("i", length: 5, min: 2, max: 14, step: 4))
+      //.Add(new RealVectorEncoding("r", length: 5, min: -1.0, max: 1.0))
+      //.Add(new PermutationEncoding("p", length: 5, type: PermutationTypes.Absolute))
+      ;
+      // Add additional initialization code e.g. private variables that you need for evaluating
+    }
+
+    public double[] Evaluate(Individual individual, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var qualities = new[] { 0.0, 0.0 };
+      //qualities = new [] { individual.RealVector("r").Sum(x => x * x), individual.RealVector("r").Sum(x => x * x * x) };
+      return qualities;
+    }
+
+    public void Analyze(Individual[] individuals, double[][] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+    }
+    // Implement further classes and methods
+  }
+}
+
Index: stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledSingleObjectiveProblemDefinition.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledSingleObjectiveProblemDefinition.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Templates/CompiledSingleObjectiveProblemDefinition.cs	(revision 12005)
@@ -0,0 +1,74 @@
+﻿using System;
+using System.Linq;
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Encodings.PermutationEncoding;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Optimization;
+using HeuristicLab.Problems.Programmable;
+
+namespace HeuristicLab.Problems.Programmable {
+  public class CompiledSingleObjectiveProblemDefinition : CompiledProblemDefinition, ISingleObjectiveProblemDefinition {
+    public bool Maximization { get { return false; } }
+
+    public override void Initialize() {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Define the solution encoding which can also consist of multiple vectors, examples below
+      //Encoding = new BinaryVectorEncoding("b", length: 5);
+      //Encoding = new IntegerVectorEncoding("i", length: 5, min: 2, max: 14, step: 2);
+      //Encoding = new RealVectorEncoding("r", length: 5, min: -1.0, max: 1.0);
+      //Encoding = new PermutationEncoding("p", length: 5, type: PermutationTypes.Absolute);
+      // The encoding can also be a combination
+      //Encoding = new MultiEncoding()
+      //.Add(new BinaryVectorEncoding("b", length: 5))
+      //.Add(new IntegerVectorEncoding("i", length: 5, min: 2, max: 14, step: 4))
+      //.Add(new RealVectorEncoding("r", length: 5, min: -1.0, max: 1.0))
+      //.Add(new PermutationEncoding("p", length: 5, type: PermutationTypes.Absolute))
+      ;
+      // Add additional initialization code e.g. private variables that you need for evaluating
+    }
+
+    public double Evaluate(Individual individual, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      var quality = 0.0;
+      //quality = individual.RealVector("r").Sum(x => x * x);
+      return quality;
+    }
+
+    public void Analyze(Individual[] individuals, double[] qualities, ResultCollection results, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Write or update results given the range of vectors and resulting qualities
+      // Uncomment the following lines if you want to retrieve the best individual
+
+      //var orderedIndividuals = individuals.Zip(qualities, (i, q) => new { Individual = i, Quality = q }).OrderBy(z => z.Quality);
+      //var best = Maximization ? orderedIndividuals.Last().Individual : orderedIndividuals.First().Individual;
+
+      //if (!results.ContainsKey("Best Solution")) {
+      //  results.Add(new Result("Best Solution", typeof(RealVector)));
+      //}
+      //results["Best Solution"].Value = (IItem)best.RealVector("r").Clone();
+    }
+
+    public IEnumerable<Individual> GetNeighbors(Individual individual, IRandom random) {
+      // Use vars.yourVariable to access variables in the variable store i.e. yourVariable
+      // Create new vectors, based on the given one that represent small changes
+      // This method is only called from move-based algorithms (Local Search, Simulated Annealing, etc.)
+      while (true) {
+        // Algorithm will draw only a finite amount of samples
+        // Change to a for-loop to return a concrete amount of neighbors
+        var neighbor = individual.Copy();
+        // For instance, perform a single bit-flip in a binary parameter
+        //var bIndex = random.Next(neighbor.BinaryVector("b").Length);
+        //neighbor.BinaryVector("b")[bIndex] = !neighbor.BinaryVector("b")[bIndex];
+        yield return neighbor;
+      }
+    }
+
+    // Implement further classes and methods
+  }
+}
+
Index: stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.Designer.cs	(revision 12005)
@@ -0,0 +1,107 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.18444
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Problems.Programmable {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class ScriptTemplates {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal ScriptTemplates() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeuristicLab.Problems.Programmable.Templates.ScriptTemplates", typeof(ScriptTemplates).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///using System.Collections.Generic;
+        ///using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Encodings.PermutationEncoding;
+        ///using HeuristicLab.Optimization;
+        ///using HeuristicLab.Problems.Programmable;
+        ///
+        ///namespace HeuristicLab.Problems.Programmable {
+        ///  public class CompiledMultiObjectiveProblemDefinition : CompiledProblemDefinition, IMultiObjectiveProblemDefinition {
+        ///    public bool[] Maximization { get { return new[] { false, fal [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string CompiledMultiObjectiveProblemDefinition {
+            get {
+                return ResourceManager.GetString("CompiledMultiObjectiveProblemDefinition", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to using System;
+        ///using System.Linq;
+        ///using System.Collections.Generic;
+        ///using HeuristicLab.Common;
+        ///using HeuristicLab.Core;
+        ///using HeuristicLab.Data;
+        ///using HeuristicLab.Encodings.PermutationEncoding;
+        ///using HeuristicLab.Optimization;
+        ///using HeuristicLab.Problems.Programmable;
+        ///
+        ///namespace HeuristicLab.Problems.Programmable {
+        ///  public class CompiledSingleObjectiveProblemDefinition : CompiledProblemDefinition, ISingleObjectiveProblemDefinition {
+        ///    public bool Maximization { get { return false; } }
+        ///
+        ///     [rest of string was truncated]&quot;;.
+        /// </summary>
+        internal static string CompiledSingleObjectiveProblemDefinition {
+            get {
+                return ResourceManager.GetString("CompiledSingleObjectiveProblemDefinition", resourceCulture);
+            }
+        }
+    }
+}
Index: stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx
===================================================================
--- stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx	(revision 12005)
+++ stable/HeuristicLab.Problems.Programmable/3.3/Templates/ScriptTemplates.resx	(revision 12005)
@@ -0,0 +1,127 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="CompiledMultiObjectiveProblemDefinition" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>CompiledMultiObjectiveProblemDefinition.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+  <data name="CompiledSingleObjectiveProblemDefinition" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>CompiledSingleObjectiveProblemDefinition.cs;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
+  </data>
+</root>
Index: stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSeachOperator.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSeachOperator.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment.Algorithms/3.3/RobustTabooSeachOperator.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("RobustTabooSearchOperator", "Performs an iteration of the robust taboo search algorithm as descrbied in Taillard 1991.")]
   [StorableClass]
-  public sealed class RobustTabooSeachOperator : SingleSuccessorOperator, IIterationBasedOperator, IStochasticOperator {
+  public sealed class RobustTabooSeachOperator : SingleSuccessorOperator, IIterationBasedOperator, IStochasticOperator, ISingleObjectiveOperator {
 
     #region Parameter Properties
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/Analyzers/BestQAPSolutionAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestQAPSolutionAnalyzer", "An operator for analyzing the best solution of Quadratic Assignment Problems.")]
   [StorableClass]
-  public sealed class BestQAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public sealed class BestQAPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInsertionLocalImprovement.cs	(revision 12005)
@@ -34,5 +34,5 @@
   [Item("QAPExhaustiveInsertionLocalImprovement", "Takes a solution and finds the local optimum with respect to the insertion neighborhood by decending along the steepest gradient.")]
   [StorableClass]
-  public class QAPExhaustiveInsertionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
+  public class QAPExhaustiveInsertionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, ISingleObjectiveOperator {
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveInversionLocalImprovement.cs	(revision 12005)
@@ -34,5 +34,5 @@
   [Item("QAPExhaustiveInversionLocalImprovement", "Takes a solution and finds the local optimum with respect to the inversion neighborhood by decending along the steepest gradient.")]
   [StorableClass]
-  public class QAPExhaustiveInversionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
+  public class QAPExhaustiveInversionLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, ISingleObjectiveOperator {
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPExhaustiveSwap2LocalImprovement.cs	(revision 12005)
@@ -34,5 +34,5 @@
   [Item("QAPExhaustiveSwap2LocalImprovement", "Takes a solution and finds the local optimum with respect to the swap2 neighborhood by decending along the steepest gradient.")]
   [StorableClass]
-  public class QAPExhaustiveSwap2LocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator {
+  public class QAPExhaustiveSwap2LocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, ISingleObjectiveOperator {
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
Index: stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs
===================================================================
--- stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.QuadraticAssignment/3.3/LocalImprovement/QAPStochasticScrambleLocalImprovement.cs	(revision 12005)
@@ -34,5 +34,5 @@
   [Item("QAPStochasticScrambleLocalImprovement", "Takes a solution and finds the local optimum with respect to the scramble neighborhood by decending along the steepest gradient.")]
   [StorableClass]
-  public class QAPStochasticScrambleLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, IStochasticOperator {
+  public class QAPStochasticScrambleLocalImprovement : SingleSuccessorOperator, ILocalImprovementOperator, IStochasticOperator, ISingleObjectiveOperator {
 
     public ILookupParameter<IntValue> LocalIterationsParameter {
Index: stable/HeuristicLab.Problems.Scheduling/3.3/Analyzers/SchedulingAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.Scheduling/3.3/Analyzers/SchedulingAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.Scheduling/3.3/Analyzers/SchedulingAnalyzer.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("SchedulingAnalyzer", "Represents the generalized form of Analyzers for Scheduling Problems.")]
   [StorableClass]
-  public abstract class SchedulingAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public abstract class SchedulingAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs
===================================================================
--- stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.Scheduling/3.3/Evaluators/ScheduleEvaluator.cs	(revision 12005)
@@ -25,4 +25,5 @@
 using HeuristicLab.Encodings.ScheduleEncoding;
 using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
Index: stable/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.TestFunctions/3.3/Analyzers/BestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestSingleObjectiveTestFunctionSolutionAnalyzer", "An operator for analyzing the best solution for a SingleObjectiveTestFunction problem.")]
   [StorableClass]
-  public class BestSingleObjectiveTestFunctionSolutionAnalyzer : SingleSuccessorOperator, IBestSingleObjectiveTestFunctionSolutionAnalyzer, IAnalyzer {
+  public class BestSingleObjectiveTestFunctionSolutionAnalyzer : SingleSuccessorOperator, IBestSingleObjectiveTestFunctionSolutionAnalyzer {
     public virtual bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.TestFunctions/3.3/Interfaces/IBestSingleObjectiveTestFunctionSolutionAnalyzer.cs	(revision 12005)
@@ -27,5 +27,5 @@
   /// An interface which represents operators for analyzing the best solution of single objective TestFunction Problems given in real vector representation.
   /// </summary>
-  public interface IBestSingleObjectiveTestFunctionSolutionAnalyzer : IAnalyzer {
+  public interface IBestSingleObjectiveTestFunctionSolutionAnalyzer : IAnalyzer, ISingleObjectiveOperator {
     ILookupParameter RealVectorParameter { get; }
     ILookupParameter QualityParameter { get; }
Index: stable/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.TravelingSalesman/3.3/Analyzers/BestTSPSolutionAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("BestTSPSolutionAnalyzer", "An operator for analyzing the best solution of Traveling Salesman Problems given in path representation using city coordinates.")]
   [StorableClass]
-  public sealed class BestTSPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer {
+  public sealed class BestTSPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ISingleObjectiveOperator {
     public bool EnabledByDefault {
       get { return true; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/BestVRPSolutionAnalyzer.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("BestVRPSolutionAnalyzer", "An operator for analyzing the best solution of Vehicle Routing Problems.")]
   [StorableClass]
-  public sealed class BestVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IGeneralVRPOperator {
+  public sealed class BestVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IGeneralVRPOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/Capacitated/BestCapacitatedVRPSolutionAnalyzer.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("BestCapacitatedVRPSolutionAnalyzer", "An operator for analyzing the best solution of capacitated Vehicle Routing Problems.")]
   [StorableClass]
-  public sealed class BestCapacitatedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator {
+  public sealed class BestCapacitatedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/PickupAndDelivery/BestPickupAndDeliveryVRPSolutionAnalyzer.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("BestPickupAndDeliveryVRPSolutionAnalyzer", "An operator for analyzing the best solution of Pickup and Delivery Routing Problems.")]
   [StorableClass]
-  public sealed class BestPickupAndDeliveryVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator {
+  public sealed class BestPickupAndDeliveryVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/BestSolution/TimeWindowed/BestTimeWindowedVRPSolutionAnalyzer.cs	(revision 12005)
@@ -38,5 +38,5 @@
   [Item("BestTimeWindowedVRPSolutionAnalyzer", "An operator for analyzing the best solution of time windowed Vehicle Routing Problems.")]
   [StorableClass]
-  public sealed class BestTimeWindowedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator {
+  public sealed class BestTimeWindowedVRPSolutionAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("CapacityRelaxationVRPAnalyzer", "An operator for adaptively relaxing the capacity constraints.")]
   [StorableClass]
-  public class CapacityRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator {
+  public class CapacityRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/PickupAndDelivery/PickupViolationsRelaxationVRPAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("PickupViolationsRelaxationVRPAnalyzer", "An operator for adaptively relaxing the pickup constraints.")]
   [StorableClass]
-  public class PickupViolationsRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator {
+  public class PickupViolationsRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, IPickupAndDeliveryOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/TimeWindowed/TimeWindowRelaxationVRPAnalyzer.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("TimeWindowRelaxationVRPAnalyzer", "An operator for adaptively relaxing the time window constraints.")]
   [StorableClass]
-  public class TimeWindowRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator {
+  public class TimeWindowRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ITimeWindowedOperator, ISingleObjectiveOperator {
     public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
       get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/AlbaEncoding.cs	(revision 12005)
@@ -26,5 +26,4 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
@@ -32,5 +31,5 @@
   [Item("AlbaEncoding", "Represents an Alba encoding of VRP solutions. It is implemented as described in Alba, E. and Dorronsoro, B. (2004). Solving the Vehicle Routing Problem by Using Cellular Genetic Algorithms.")]
   [StorableClass]
-  public class AlbaEncoding : PermutationEncoding {
+  public class AlbaEncoding : General.PermutationEncoding {
     #region IVRPEncoding Members
     public override List<Tour> GetTours() {
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Alba/LocalImprovement/AlbaLambdaInterchangeLocalImprovementOperator.cs	(revision 12005)
@@ -36,5 +36,5 @@
   [Item("AlbaLambdaInterchangeLocalImprovementOperator", "Takes a solution and finds the local optimum with respect to the lambda interchange neighborhood by decending along the steepest gradient.")]
   [StorableClass]
-  public class AlbaLambdaInterchangeLocalImprovementOperator : VRPOperator, IStochasticOperator, ILocalImprovementOperator {
+  public class AlbaLambdaInterchangeLocalImprovementOperator : VRPOperator, IStochasticOperator, ILocalImprovementOperator, ISingleObjectiveOperator {
 
     public IValueLookupParameter<IntValue> MaximumIterationsParameter {
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/MultiVRPMoveOperator/MultiVRPMoveTabuMaker.cs	(revision 12005)
@@ -33,5 +33,5 @@
   [Item("MultiVRPMoveTabuMaker", "A multi VRP move tabu maker.")]
   [StorableClass]
-  public class MultiVRPMoveTabuMaker : SingleSuccessorOperator, IMultiVRPMoveOperator, ITabuMaker, IGeneralVRPOperator {
+  public class MultiVRPMoveTabuMaker : SingleSuccessorOperator, IMultiVRPMoveOperator, ITabuMaker, IGeneralVRPOperator, ISingleObjectiveOperator {
     public ILookupParameter VRPMoveParameter {
       get { return (ILookupParameter)Parameters["VRPMove"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/General/Moves/VRPMoveMaker.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("VRPMoveMaker", "Performs a VRP move.")]
   [StorableClass]
-  public abstract class VRPMoveMaker : VRPMoveOperator, IMoveMaker {
+  public abstract class VRPMoveMaker : VRPMoveOperator, IMoveMaker, ISingleObjectiveOperator {
     public ILookupParameter<DoubleValue> QualityParameter {
       get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
@@ -91,6 +91,5 @@
           }
         }
-      }
-      finally {
+      } finally {
         foreach (IParameter parameter in addedParameters) {
           this.Parameters.Remove(parameter);
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/PickupDelivery/PDExchange/PotvinPDExchangeMoveTabuMaker.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("PotvinPDExchangeMoveTabuMaker", "Declares a given exchange move as tabu.")]
   [StorableClass]
-  public class PotvinPDExchangeMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinPDExchangeMoveOperator, IPotvinOperator, IVRPMoveOperator {
+  public class PotvinPDExchangeMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinPDExchangeMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
     public LookupParameter<ItemList<IItem>> TabuListParameter {
       get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/TwoOptStar/PotvinTwoOptStarMoveTabuMaker.cs	(revision 12005)
@@ -33,5 +33,5 @@
   [Item("PotvinTwoOptStarMoveTabuMaker", "Declares a given two opt star move as tabu.")]
   [StorableClass]
-  public class PotvinTwoOptStarMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinTwoOptStarMoveOperator, IPotvinOperator, IVRPMoveOperator {
+  public class PotvinTwoOptStarMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinTwoOptStarMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
     public LookupParameter<ItemList<IItem>> TabuListParameter {
       get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Moves/VehicleAssignment/PotvinVehicleAssignmentMoveTabuMaker.cs	(revision 12005)
@@ -32,5 +32,5 @@
   [Item("PotvinVehicleAssignmentMoveTabuMaker", "Declares a given vehicle assignment move as tabu.")]
   [StorableClass]
-  public class PotvinVehicleAssignmentMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinVehicleAssignmentMoveOperator, IPotvinOperator, IVRPMoveOperator {
+  public class PotvinVehicleAssignmentMoveTabuMaker : SingleSuccessorOperator, ITabuMaker, IPotvinVehicleAssignmentMoveOperator, IPotvinOperator, ISingleObjectiveOperator {
     public LookupParameter<ItemList<IItem>> TabuListParameter {
       get { return (LookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Prins/PrinsEncoding.cs	(revision 12005)
@@ -26,5 +26,4 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 using HeuristicLab.Problems.VehicleRouting.ProblemInstances;
@@ -33,5 +32,5 @@
   [Item("PrinsEncoding", "Represents an Prins encoding of VRP solutions. It is implemented as described in Prins, C. (2004). A simple and effective evolutionary algorithm for the vehicle routing problem. Computers & Operations Research, 12:1985-2002.")]
   [StorableClass]
-  public class PrinsEncoding : PermutationEncoding {
+  public class PrinsEncoding : General.PermutationEncoding {
     #region IVRPEncoding Members
     public override int GetTourIndex(Tour tour) {
Index: stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs
===================================================================
--- stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs	(revision 11995)
+++ stable/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Zhu/ZhuEncoding.cs	(revision 12005)
@@ -26,5 +26,4 @@
 using HeuristicLab.Encodings.PermutationEncoding;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.VehicleRouting.Encodings.General;
 using HeuristicLab.Problems.VehicleRouting.Interfaces;
 
@@ -32,5 +31,5 @@
   [Item("ZhuEncoding", "Represents a Zhu encoding of VRP solutions. It is implemented as described in Zhu, K.Q. (2000). A New Genetic Algorithm For VRPTW. Proceedings of the International Conference on Artificial Intelligence.")]
   [StorableClass]
-  public class ZhuEncoding : PermutationEncoding {
+  public class ZhuEncoding : General.PermutationEncoding {
     #region IVRPEncoding Members
     public override int GetTourIndex(Tour tour) {
Index: stable/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj
===================================================================
--- stable/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj	(revision 11995)
+++ stable/HeuristicLab.Random/3.3/HeuristicLab.Random-3.3.csproj	(revision 12005)
@@ -118,4 +118,5 @@
   <ItemGroup>
     <None Include="Plugin.cs.frame" />
+    <Compile Include="ListExtensions.cs" />
     <Compile Include="UniformDistributedRandom.cs" />
     <Compile Include="FastRandom.cs" />
Index: stable/HeuristicLab.Random/3.3/ListExtensions.cs
===================================================================
--- stable/HeuristicLab.Random/3.3/ListExtensions.cs	(revision 12005)
+++ stable/HeuristicLab.Random/3.3/ListExtensions.cs	(revision 12005)
@@ -0,0 +1,60 @@
+﻿#region License Information
+
+/* HeuristicLab
+ * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Random {
+  public static class ListExtensions {
+    public static IList<T> Swap<T>(this IList<T> list, int indexA, int indexB) {
+      T tmp = list[indexA];
+      list[indexA] = list[indexB];
+      list[indexB] = tmp;
+      return list;
+    }
+
+    public static IList<T> ShuffleInPlace<T>(this IList<T> list, IRandom random) {
+      return list.ShuffleInPlace(random, 0, list.Count - 1);
+    }
+    public static IList<T> ShuffleInPlace<T>(this IList<T> list, IRandom random, int maxIndex) {
+      return list.ShuffleInPlace(random, 0, maxIndex);
+    }
+    public static IList<T> ShuffleInPlace<T>(this IList<T> list, IRandom random, int minIndex, int maxIndex) {
+      for (int i = maxIndex; i > minIndex; i--) {
+        int swapIndex = random.Next(minIndex, i + 1);
+        list.Swap(i, swapIndex);
+      }
+      return list;
+    }
+
+    public static IEnumerable<T> ShuffleList<T>(this IList<T> source, IRandom random) {
+      for (int i = source.Count - 1; i > 0; i--) {
+        // Swap element "i" with a random earlier element (including itself)
+        int swapIndex = random.Next(i + 1);
+        source.Swap(i, swapIndex);
+        yield return source[i];
+      }
+      yield return source[0];
+    }
+  }
+}
Index: stable/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs
===================================================================
--- stable/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs	(revision 11995)
+++ stable/HeuristicLab.Selection/3.3/SingleObjectiveSelector.cs	(revision 12005)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.Parameters;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -32,5 +33,5 @@
   [Item("SingleObjectiveSelector", "A base class for selection operators which consider a single double quality value for selection.")]
   [StorableClass]
-  public abstract class SingleObjectiveSelector : Selector {
+  public abstract class SingleObjectiveSelector : Selector, ISingleObjectiveOperator {
     protected IValueParameter<BoolValue> CopySelectedParameter {
       get { return (IValueParameter<BoolValue>)Parameters["CopySelected"]; }
Index: stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/EnumerableBoolEqualityComparerTest.cs
===================================================================
--- stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/EnumerableBoolEqualityComparerTest.cs	(revision 12005)
+++ stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/EnumerableBoolEqualityComparerTest.cs	(revision 12005)
@@ -0,0 +1,141 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Algorithms.ParameterlessPopulationPyramid;
+using HeuristicLab.Random;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ParameterlessPopulationPyramid.Test {
+  [TestClass]
+  public class EnumerableBoolEqualityComparerTest {
+    private static EnumerableBoolEqualityComparer compare = new EnumerableBoolEqualityComparer();
+    MersenneTwister rand = new MersenneTwister();
+
+    private void randFill(IList<bool> data, MersenneTwister rand) {
+      for (int i = 0; i < data.Count; i++) {
+        data[i] = rand.Next(2) == 1;
+      }
+    }
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void EnumerableBoolEqualsTest() {
+      bool[] array = new bool[10];
+      // Referencially equal
+      randFill(array, rand);
+      Assert.IsTrue(compare.Equals(array, array));
+
+      // Clones equal
+      var another = (bool[])array.Clone();
+      Assert.IsTrue(compare.Equals(array, another));
+
+      // Flipping a bit makes unequal
+      int flip = rand.Next(array.Length - 1);
+      another[flip] = !another[flip];
+      Assert.IsFalse(compare.Equals(array, another));
+
+      // Equality doesn't depend on container
+      List<bool> list = new List<bool>(array);
+      Assert.IsTrue(compare.Equals(list, array));
+      Assert.IsFalse(compare.Equals(list, another));
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void EnumerableBoolHashCollisionTest() {
+      int collisions = 0;
+
+      bool[] array = new bool[100];
+      randFill(array, rand);
+      int original = compare.GetHashCode(array);
+
+      bool[] another = (bool[])array.Clone();
+      // Perform random walk around string checking for hash collisions
+      for (int i = 0; i < array.Length * array.Length; i++) {
+        int flip = rand.Next(array.Length - 1);
+        another[flip] = !another[flip];
+        int hash = compare.GetHashCode(another);
+        if (hash == original) {
+          // unequal sequences with same hash value
+          if (!array.SequenceEqual(another)) collisions++;
+        } else {
+          // unequal hash should mean unequal sequence
+          Assert.IsFalse(array.SequenceEqual(another));
+        }
+        // Keep the walk from getting too far afield
+        if (i % array.Length == 0) {
+          another = (bool[])array.Clone();
+        }
+      }
+      // A very lose upper bound, this only fails if you get more than sqrt(N) collisions per attempt 
+      Assert.IsTrue(collisions < array.Length);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void EnumerableBoolHashSetTest() {
+      HashSet<bool[]> set = new HashSet<bool[]>(compare);
+      bool[] array = new bool[40];
+      randFill(array, rand);
+      set.Add(array);
+
+      // Same object not added
+      set.Add(array);
+      Assert.AreEqual(1, set.Count);
+
+      // Copy of object not allowed
+      var another = (bool[])array.Clone();
+      set.Add(another);
+      Assert.AreEqual(1, set.Count);
+
+      // Flipping a bit makes unequal
+      int flip = rand.Next(array.Length - 1);
+      another[flip] = !another[flip];
+      set.Add(another);
+      Assert.AreEqual(2, set.Count);
+
+      // Add random solutions which are 1 bit different from array to the set
+      set.Clear();
+      List<bool[]> added = new List<bool[]>();
+      for (int i = 0; i < array.Length * 10; i++) {
+        // flip a bit at random
+        another = (bool[])array.Clone();
+        flip = rand.Next(array.Length - 1);
+        another[flip] = !another[flip];
+        bool unique = set.Add(another);
+        bool actuallyUnique = true;
+        foreach (var previous in added) {
+          if (previous.SequenceEqual(another)) {
+            actuallyUnique = false;
+          }
+        }
+        Assert.AreEqual(actuallyUnique, unique);
+        if (actuallyUnique) {
+          added.Add(another);
+        }
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/LinkageTreeTest.cs
===================================================================
--- stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/LinkageTreeTest.cs	(revision 12005)
+++ stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/LinkageTreeTest.cs	(revision 12005)
@@ -0,0 +1,110 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Algorithms.ParameterlessPopulationPyramid;
+using HeuristicLab.Encodings.BinaryVectorEncoding;
+using HeuristicLab.Random;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ParameterlessPopulationPyramid.Test {
+  [TestClass]
+  public class LinkageTreeTest {
+    private static int Length = 9;
+    private static BinaryVector[] solutions = {
+    new BinaryVector(new [] { true, true, false, false, false, false, false, false, false }), // 110000000
+    new BinaryVector(new [] { false, false, true, true, false, false, false, false, false }), // 001100000
+    new BinaryVector(new [] { false, false, false, false, true, true, false, false, false }), // 000011000
+    new BinaryVector(new [] { false, false, false, false, false, false, true, true, true }),  // 000000111
+    new BinaryVector(new [] { true, true, true, true, false, false, false, false, false }),   // 111100000
+    new BinaryVector(new [] { true, true, true, true, true, true, true, true, true }),        // 111111111
+    };
+
+    // These are the clusters that should be built using "solutions" and the seed 123
+    private static int[][] correctClusters = {
+      new int[] { 4, 5 },
+      new int[] { 2, 3 },
+      new int[] { 0, 1 },
+      new int[] { 6, 7, 8 },
+      new int[] { 0, 1, 2, 3},
+      new int[] { 4, 5, 6, 7, 8},
+    };
+
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void LinkageTreeTestAdd() {
+      MersenneTwister rand = new MersenneTwister();
+      LinkageTree tree = new LinkageTree(Length, rand);
+      tree.Add(solutions[0]);
+      tree.Add(solutions[1]);
+      PrivateObject hidden = new PrivateObject(tree);
+      int[][][] result = (int[][][])hidden.GetField("occurances");
+      Assert.AreEqual(1, result[1][0][0]); // Positions 0 and 1 had value 00 exactly once
+      Assert.AreEqual(2, result[Length - 1][Length - 2][0]); // Positions 0 and 1 had value 00 exactly once
+      Assert.AreEqual(0, result[Length - 1][Length - 2][1]); // Positions 7 and 8 never had value 10
+      Assert.AreEqual(1, result[1][0][3]); // Positions 0 and 1 had value 11 exactly once
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void LinkageTreeTestEntropyDistance() {
+      MersenneTwister rand = new MersenneTwister();
+      LinkageTree tree = new LinkageTree(Length, rand);
+      PrivateObject hidden = new PrivateObject(tree);
+      // No information should result in a distance of 0
+      Assert.AreEqual((double)0, hidden.Invoke("EntropyDistance", new object[] { 0, 1 }));
+      foreach (var solution in solutions) {
+        tree.Add(solution);
+      }
+      // Check that 0 and 1 are closer than 0 and 2
+      var linked = (double)hidden.Invoke("EntropyDistance", new object[] { 0, 1 });
+      var unlinked = (double)hidden.Invoke("EntropyDistance", new object[] { 0, 2 });
+      Assert.IsTrue(linked < unlinked);
+
+      // Reversing the arguments should not change the result
+      var forward = hidden.Invoke("EntropyDistance", new object[] { Length - 1, Length - 2 });
+      var backward = hidden.Invoke("EntropyDistance", new object[] { Length - 2, Length - 1 });
+      Assert.AreEqual(forward, backward);
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "short")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void LinkageTreeTestRebuild() {
+      // The seed matters as equal sized clusters can appear in any order
+      MersenneTwister rand = new MersenneTwister(123);
+      LinkageTree tree = new LinkageTree(Length, rand);
+      foreach (var solution in solutions) {
+        tree.Add(solution);
+      }
+
+      // Check if the clusters created contain the expected variables.
+      var found = tree.Clusters.ToArray();
+      Assert.AreEqual(correctClusters.Length, found.Length);
+      for (int i = 0; i < found.Length; i++) {
+        found[i].Sort();
+        Assert.IsTrue(found[i].SequenceEqual(correctClusters[i]), string.Format("Failed On Cluster {0}", i));
+      }
+    }
+  }
+}
Index: stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/ParameterlessPopulationPyramidTest.cs
===================================================================
--- stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/ParameterlessPopulationPyramidTest.cs	(revision 12005)
+++ stable/HeuristicLab.Tests/HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3/ParameterlessPopulationPyramidTest.cs	(revision 12005)
@@ -0,0 +1,98 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 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.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Problems.Binary;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ParameterlessPopulationPyramid.Test {
+  [TestClass]
+  public class ParameterlessPopulationPyramidTest {
+
+    // Utility function that sets up and executes the run, then asserts the results
+    private PrivateObject DoRun(BinaryProblem problem, int maximumEvaluations, int seed, double bestQuality, int foundOn) {
+      var solver = new HeuristicLab.Algorithms.ParameterlessPopulationPyramid.ParameterlessPopulationPyramid();
+      solver.Problem = problem;
+      solver.MaximumEvaluations = maximumEvaluations;
+      solver.Seed = seed;
+      solver.SetSeedRandomly = false;
+      PrivateObject hidden = new PrivateObject(solver);
+      try {
+        hidden.Invoke("Run", new CancellationToken());
+      } catch (OperationCanceledException) {
+        // Ignore
+      }
+
+      Assert.AreEqual(maximumEvaluations, hidden.GetProperty("ResultsEvaluations"), "Total Evaluations");
+      double foundQuality = (double)hidden.GetProperty("ResultsBestQuality");
+      Assert.IsTrue(foundQuality.IsAlmost(bestQuality), string.Format("Expected <{0}> Actual <{1}>", bestQuality, foundQuality));
+      Assert.AreEqual(foundOn, hidden.GetProperty("ResultsBestFoundOnEvaluation"), "Found On");
+
+      return hidden;
+    }
+
+    [TestMethod]
+    [TestProperty("Time", "medium")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void P3DeceptiveTrap() {
+      var problem = new DeceptiveTrapProblem();
+      problem.Length = 49;
+      problem.TrapSize = 7;
+      DoRun(problem, 100, 123, 0.857142857142857, 50);
+      DoRun(problem, 9876, 123, 0.918367346938776, 981);
+      DoRun(problem, 20000, 987, 1, 19977);
+      problem.Length = 700;
+      DoRun(problem, 100000, 987, 0.941428571428571, 96901);
+    }
+
+    // Unlike DeceptiveTrap, DeceptiveStepTrap likely contains neutral (fitness equal) modifications.
+    [TestMethod]
+    [TestProperty("Time", "medium")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void P3DeceptiveStepTrap() {
+      var problem = new DeceptiveStepTrapProblem();
+      problem.Length = 49;
+      problem.TrapSize = 7;
+      problem.StepSize = 2;
+      DoRun(problem, 100, 123, 0.5, 6);
+      DoRun(problem, 9876, 123, 0.785714285714286, 3489);
+      DoRun(problem, 70000, 987, 1, 68292);
+      problem.Length = 700;
+      DoRun(problem, 100000, 987, 0.76, 58711);
+    }
+
+    // Unlike the Trap tests, HIFF uses higher order linkage learning.
+    [TestMethod]
+    [TestProperty("Time", "medium")]
+    [TestCategory("Algorithms.ParameterlessPopulationPyramid")]
+    public void P3HIFF() {
+      var problem = new HIFFProblem();
+      problem.Length = 32;
+      DoRun(problem, 50, 12345, 0.375, 26);
+      DoRun(problem, 1000, 12345, 1, 976);
+      problem.Length = 512;
+      DoRun(problem, 1000, 54321, 0.17361111111111, 440);
+      DoRun(problem, 130000, 54321, 1, 89214);
+    }
+  }
+}
Index: stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj
===================================================================
--- stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 11995)
+++ stable/HeuristicLab.Tests/HeuristicLab.Tests.csproj	(revision 12005)
@@ -133,4 +133,9 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3">
       <HintPath>..\bin\HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.dll</HintPath>
@@ -249,4 +254,9 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.Binary-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.Binary-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.DataAnalysis-3.4">
       <HintPath>..\bin\HeuristicLab.Problems.DataAnalysis-3.4.dll</HintPath>
@@ -269,4 +279,19 @@
       <Private>False</Private>
     </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.ExternalEvaluation-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation.GP-3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.ExternalEvaluation.GP-3.5.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.ExternalEvaluation.Views-3.4, Version=3.4.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.ExternalEvaluation.Views-3.4.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
     <Reference Include="HeuristicLab.Problems.GrammaticalEvolution-3.3">
       <HintPath>..\bin\HeuristicLab.Problems.GrammaticalEvolution-3.3.dll</HintPath>
@@ -311,4 +336,14 @@
     <Reference Include="HeuristicLab.Problems.LinearAssignment-3.3">
       <HintPath>..\bin\HeuristicLab.Problems.LinearAssignment-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Programmable-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.Programmable-3.3.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.Programmable.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\bin\HeuristicLab.Problems.Programmable.Views-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -411,4 +446,7 @@
     <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessFunctionsTest.cs" />
     <Compile Include="HeuristicLab.Algorithms.DataAnalysis-3.4\GaussianProcessRegressionTest.cs" />
+    <Compile Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3\EnumerableBoolEqualityComparerTest.cs" />
+    <Compile Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3\LinkageTreeTest.cs" />
+    <Compile Include="HeuristicLab.Algorithms.ParameterlessPopulationPyramid-3.3\ParameterlessPopulationPyramidTest.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\BonferroniHolmUnitTests.cs" />
     <Compile Include="HeuristicLab.Analysis-3.3\ConfidenceIntervalsTests.cs" />
