Index: /branches/OaaS/HeuristicLab 3.3 Services.sln
===================================================================
--- /branches/OaaS/HeuristicLab 3.3 Services.sln	(revision 8544)
+++ /branches/OaaS/HeuristicLab 3.3 Services.sln	(revision 8545)
@@ -39,5 +39,5 @@
 		Release.AspNetCompiler.FixedNames = "false"
 		Release.AspNetCompiler.Debug = "False"
-		VWDPort = "1512"
+		VWDPort = "48545"
 		VWDVirtualPath = "/Hive-3.3"
 		DefaultWebSiteLanguage = "Visual C#"
@@ -65,4 +65,6 @@
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Optimization.ControllerService", "HeuristicLab.Services.Optimization.Controller\HeuristicLab.Services.Optimization.ControllerService.csproj", "{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Services.Optimization.ControllerService.Tests", "HeuristicLab.Services.Optimization.ControllerService.Tests\HeuristicLab.Services.Optimization.ControllerService.Tests.csproj", "{D6DD768C-707C-415A-B9F8-C1F7668F8560}"
 EndProject
 Global
@@ -72,7 +74,9 @@
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
 		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
 		Release|x64 = Release|x64
 		Release|x86 = Release|x86
@@ -81,4 +85,6 @@
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|x64.ActiveCfg = Debug|x64
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Debug|x64.Build.0 = Debug|x64
@@ -87,4 +93,6 @@
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|Mixed Platforms.Build.0 = Release|x64
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|x64.ActiveCfg = Release|x64
 		{30D8C5F1-CD3A-4EC1-907F-430177A03FBE}.Release|x64.Build.0 = Release|x64
@@ -93,4 +101,6 @@
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|x64.ActiveCfg = Debug|x64
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Debug|x64.Build.0 = Debug|x64
@@ -99,4 +109,6 @@
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|Mixed Platforms.Build.0 = Release|x64
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|x64.ActiveCfg = Release|x64
 		{EBEBA863-DD05-4331-BE25-5758B15F7407}.Release|x64.Build.0 = Release|x64
@@ -105,4 +117,6 @@
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|Mixed Platforms.Build.0 = Debug|x86
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|x64.ActiveCfg = Debug|x64
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Debug|x64.Build.0 = Debug|x64
@@ -111,4 +125,6 @@
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|Any CPU.Build.0 = Release|Any CPU
+		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|Mixed Platforms.Build.0 = Release|x86
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|x64.ActiveCfg = Release|x64
 		{421D9CCA-5A48-4813-AB9C-ED7025F9CC35}.Release|x64.Build.0 = Release|x64
@@ -117,4 +133,6 @@
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|x64.ActiveCfg = Debug|x64
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Debug|x64.Build.0 = Debug|x64
@@ -123,4 +141,6 @@
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|Mixed Platforms.Build.0 = Release|x64
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|x64.ActiveCfg = Release|x64
 		{EC2C8109-6E1E-4C88-9A2B-908CFF2EF4AC}.Release|x64.Build.0 = Release|x64
@@ -129,4 +149,6 @@
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|x64.ActiveCfg = Debug|x64
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Debug|x64.Build.0 = Debug|x64
@@ -135,4 +157,6 @@
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|Mixed Platforms.Build.0 = Release|x64
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|x64.ActiveCfg = Release|x64
 		{CF9DA321-AC1B-4FD3-9EC3-67BC6B861BDE}.Release|x64.Build.0 = Release|x64
@@ -141,11 +165,17 @@
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Any CPU.ActiveCfg = Debug|Any CPU
+		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|x64.ActiveCfg = Debug|Any CPU
 		{0CA6706D-A569-45DE-A85C-4158891CC1BC}.Release|x86.ActiveCfg = Debug|Any CPU
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|x64.ActiveCfg = Debug|x64
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Debug|x64.Build.0 = Debug|x64
@@ -154,4 +184,6 @@
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|Mixed Platforms.Build.0 = Release|x64
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|x64.ActiveCfg = Release|x64
 		{F685556B-F6EB-4143-8E7E-662D00FDD299}.Release|x64.Build.0 = Release|x64
@@ -160,4 +192,6 @@
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|Any CPU.ActiveCfg = Debug
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|Any CPU.Build.0 = Debug
+		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|Mixed Platforms.ActiveCfg = Debug
+		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|Mixed Platforms.Build.0 = Debug
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|x64.ActiveCfg = Debug
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Debug|x64.Build.0 = Debug
@@ -166,4 +200,6 @@
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|Any CPU.ActiveCfg = Release
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|Any CPU.Build.0 = Release
+		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|Mixed Platforms.ActiveCfg = Release
+		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|Mixed Platforms.Build.0 = Release
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|x64.ActiveCfg = Release
 		{034C2EE4-E303-4E45-98AB-F0074EC83B81}.Release|x64.Build.0 = Release
@@ -172,4 +208,6 @@
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|x64.ActiveCfg = Debug|x64
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Debug|x64.Build.0 = Debug|x64
@@ -178,4 +216,6 @@
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|Mixed Platforms.Build.0 = Release|x64
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|x64.ActiveCfg = Release|x64
 		{BE9B0229-9150-49A4-AEA6-BB58E055992F}.Release|x64.Build.0 = Release|x64
@@ -184,4 +224,6 @@
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|x64.ActiveCfg = Debug|x64
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Debug|x64.Build.0 = Debug|x64
@@ -190,4 +232,6 @@
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|Mixed Platforms.Build.0 = Release|x64
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|x64.ActiveCfg = Release|x64
 		{0F652437-998A-4EAB-8BF1-444B5FE8CE97}.Release|x64.Build.0 = Release|x64
@@ -196,4 +240,6 @@
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|x64.ActiveCfg = Debug|x64
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Debug|x64.Build.0 = Debug|x64
@@ -202,4 +248,6 @@
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|Mixed Platforms.Build.0 = Release|x64
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|x64.ActiveCfg = Release|x64
 		{9FAC0B23-2730-452A-9BA0-D7CA1746C541}.Release|x64.Build.0 = Release|x64
@@ -208,4 +256,6 @@
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.ActiveCfg = Debug|x64
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Debug|x64.Build.0 = Debug|x64
@@ -214,4 +264,6 @@
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|Mixed Platforms.Build.0 = Release|x64
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.ActiveCfg = Release|x64
 		{E36BE58F-F3CE-40BB-9AB3-9F9E30AD5CCF}.Release|x64.Build.0 = Release|x64
@@ -220,4 +272,6 @@
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|Mixed Platforms.Build.0 = Debug|x64
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.ActiveCfg = Debug|x64
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Debug|x64.Build.0 = Debug|x64
@@ -226,4 +280,6 @@
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|Mixed Platforms.Build.0 = Release|x64
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.ActiveCfg = Release|x64
 		{766DA4B7-2A0E-4CDE-8F90-93D8B1AD62CF}.Release|x64.Build.0 = Release|x64
@@ -232,34 +288,62 @@
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|x64.ActiveCfg = Release|Any CPU
 		{E64DB8C8-3197-4A80-BD94-2EAC8FD81B29}.Release|x86.ActiveCfg = Release|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|x64.ActiveCfg = Release|Any CPU
 		{5BC9293E-A17C-462F-A946-4781CC763553}.Release|x86.ActiveCfg = Release|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|x64.ActiveCfg = Release|Any CPU
 		{6C07848B-B75F-4A0F-9292-066A636E9A5F}.Release|x86.ActiveCfg = Release|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|x64.ActiveCfg = Release|Any CPU
 		{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}.Release|x86.ActiveCfg = Release|Any CPU
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|Any CPU.ActiveCfg = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|x64.ActiveCfg = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|x86.ActiveCfg = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Debug|x86.Build.0 = Debug|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|Any CPU.ActiveCfg = Release|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|Mixed Platforms.Build.0 = Release|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|x64.ActiveCfg = Release|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|x86.ActiveCfg = Release|x86
+		{D6DD768C-707C-415A-B9F8-C1F7668F8560}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HeuristicLab.Services.Optimization.ControllerService.csproj
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HeuristicLab.Services.Optimization.ControllerService.csproj	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HeuristicLab.Services.Optimization.ControllerService.csproj	(revision 8545)
@@ -95,4 +95,7 @@
       <HintPath>..\bin\HeuristicLab.Optimization.Operators-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.ParallelEngine-3.3">
+      <HintPath>..\bin\HeuristicLab.ParallelEngine-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Parameters-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -108,4 +111,10 @@
     <Reference Include="HeuristicLab.Problems.TravelingSalesman-3.3">
       <HintPath>..\bin\HeuristicLab.Problems.TravelingSalesman-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.VehicleRouting-3.3">
+      <HintPath>..\bin\HeuristicLab.Problems.VehicleRouting-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.VehicleRouting-3.4">
+      <HintPath>..\bin\HeuristicLab.Problems.VehicleRouting-3.4.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.Random-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HiveScenarioManager.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HiveScenarioManager.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/HiveScenarioManager.cs	(revision 8545)
@@ -14,4 +14,5 @@
 using HeuristicLab.Clients.Hive;
 using System.Threading;
+using HeuristicLab.Data;
 
 namespace HeuristicLab.Services.Optimization.ControllerService {
@@ -110,5 +111,5 @@
     }
 
-    public void DispatchScenario(Model.OptimizationScenario scenario) {
+    public void DispatchScenario(Model.User user, Model.OptimizationScenario scenario) {
       Experiment experiment = new Experiment();
       var problem = new TravelingSalesmanProblem();
@@ -124,8 +125,8 @@
 
       experiment.Optimizers.Add(algo);
-      SendExperimentToHive(experiment);
-    }
-
-    private void SendExperimentToHive(Experiment exp) {
+      SendExperimentToHive(user, experiment);
+    }
+
+    private void SendExperimentToHive(Model.User user, Experiment exp) {
       var job = new RefreshableJob();
       job.IsAllowedPrivileged = true;      
@@ -134,6 +135,6 @@
       job.RefreshAutomatically = false;
       job.HiveTasks.Add(new OptimizerHiveTask(exp));
-      HiveServiceLocator.Instance.Username = "fschoeppl";
-      HiveServiceLocator.Instance.Password = "fschoeppl";
+      HiveServiceLocator.Instance.Username = user.Username;
+      HiveServiceLocator.Instance.Password = user.Password;
       HiveServiceLocator.Instance.EndpointConfigurationName = "WSHttpBinding_IHiveService";
       
@@ -144,4 +145,158 @@
       job.StopResultPolling();
     }
+
+
+    public IList<Model.Job> GetJobs(User user) {
+      HiveServiceLocator.Instance.Username = user.Username;
+      HiveServiceLocator.Instance.Password = user.Password;
+      HiveServiceLocator.Instance.EndpointConfigurationName = "WSHttpBinding_IHiveService";
+      var jobsLoaded = HiveServiceLocator.Instance.CallHiveService<IEnumerable<HeuristicLab.Clients.Hive.Job>>(s => s.GetJobs());
+      IList<Model.Job> jobs = new List<Model.Job>();
+      
+      foreach (var job in jobsLoaded) {
+        jobs.Add(ConvertJob(user, job));
+      }
+      return jobs;
+    }
+
+    private Model.Job ConvertJob(User user, HeuristicLab.Clients.Hive.Job job) 
+    {
+      var waitingJobs = job.JobCount - job.CalculatingCount - job.FinishedCount;
+      Model.JobState? state = null;
+      var jobTasks = HiveServiceLocator.Instance.CallHiveService<IEnumerable<HeuristicLab.Clients.Hive.LightweightTask>>(s => s.GetLightweightJobTasks(job.Id));
+      
+      foreach (var task in jobTasks) {        
+        switch (task.State) {
+          case TaskState.Aborted:
+            state = JobState.Aborted;
+            break;
+          case TaskState.Failed:
+            state = JobState.Failed;
+            break;
+        }
+      }
+      if (!state.HasValue) {
+        if (job.CalculatingCount > 0)
+          state = JobState.Calculating;
+        else if (waitingJobs > 0)
+          state = JobState.Waiting;
+        else
+          state = JobState.Finished;
+      }
+      return new Model.Job() { Id = job.Id.ToString(), Name = job.Name, Resource = job.ResourceNames, State = state.Value };
+    }
+
+
+    public Model.Job GetJob(User user, string id) {
+      HiveServiceLocator.Instance.Username = user.Username;
+      HiveServiceLocator.Instance.Password = user.Password;
+      HiveServiceLocator.Instance.EndpointConfigurationName = "WSHttpBinding_IHiveService";
+      var guid = Guid.Parse(id);
+      return ConvertJob(user, HiveServiceLocator.Instance.CallHiveService<HeuristicLab.Clients.Hive.Job>(s => s.GetJob(guid)));
+    }
+
+
+    public void DeleteJob(User user, string id) {
+      HiveServiceLocator.Instance.Username = user.Username;
+      HiveServiceLocator.Instance.Password = user.Password;
+      HiveServiceLocator.Instance.EndpointConfigurationName = "WSHttpBinding_IHiveService";
+      var guid = Guid.Parse(id);
+      HiveServiceLocator.Instance.CallHiveService(s => s.DeleteJob(guid));      
+    }
+
+    public IList<Model.Run> GetJobResults(User user, string id) {
+      HiveServiceLocator.Instance.Username = user.Username;
+      HiveServiceLocator.Instance.Password = user.Password;
+      HiveServiceLocator.Instance.EndpointConfigurationName = "WSHttpBinding_IHiveService";
+      var guid = Guid.Parse(id);
+      var jobTasks = HiveServiceLocator.Instance.CallHiveService<IEnumerable<HeuristicLab.Clients.Hive.LightweightTask>>(s => s.GetLightweightJobTasks(guid));
+
+      IList<Guid> taskIds = new List<Guid>();
+      foreach (var task in jobTasks) {
+        taskIds.Add(task.Id);
+      }
+      TaskDownloader downloader = new TaskDownloader(taskIds);
+      downloader.StartAsync();
+      while (!downloader.IsFinished) {        
+        Thread.Sleep(500);
+
+        if (downloader.IsFaulted) {
+          throw downloader.Exception;
+        }
+      }
+      IDictionary<Guid, HiveTask> hiveTasks = downloader.Results;
+      IList<Model.Run> runs = new List<Model.Run>();
+      foreach (var keyTask in hiveTasks.Keys) {
+        var oht = hiveTasks[keyTask] as OptimizerHiveTask;
+        if (oht != null) {
+          foreach (var run in oht.ItemTask.Item.Runs) {
+            Model.Run taskRun = new Model.Run();
+            taskRun.Id = taskRun.Name = run.Name;
+            IList<Parameter> resultValues = new List<Model.Parameter>();
+            foreach (var key in run.Results.Keys) {
+              var value = run.Results[key];              
+              Parameter result = MapHiveDataType(key, value);
+              resultValues.Add(result);
+            }
+            taskRun.Results = resultValues;
+            runs.Add(taskRun);
+          }
+        }
+      }
+      return runs;
+    }
+    private Parameter MapHiveDataType(string name, IItem item) {
+      Parameter result = new Parameter();
+      result.Type = ParameterType.String;
+      if (item is IStringConvertibleValue) {
+        var value = (item as IStringConvertibleValue).GetValue();
+        result.Value = new HeuristicLab.Services.Optimization.ControllerService.Model.StringValue() { Name = name, Value = value };
+      }
+      else if (item is IStringConvertibleValueTuple) {
+        var value1 = (item as IStringConvertibleValueTuple).Item1.GetValue();
+        var value2 = (item as IStringConvertibleValueTuple).Item2.GetValue();
+        result.Value = new HeuristicLab.Services.Optimization.ControllerService.Model.StringValue() { Name = name, Value = "{" + value1 + ", " + value2 + "}" };
+      }
+      else if (item is IStringConvertibleArray) {
+        StringBuilder sb = new StringBuilder();
+        var array = item as IStringConvertibleArray;
+        if (array.Length == 0) {
+          sb.Append("[ ]");
+        } else {
+          sb.Append("[");
+          for (int i=0; i < array.Length - 1; i++) {
+            sb.Append(array.GetValue(i)).Append(", ");          
+          }
+          sb.Append(array.GetValue(array.Length - 1));
+          sb.Append(" ]");
+        }
+        var value = sb.ToString();
+        result.Value = new HeuristicLab.Services.Optimization.ControllerService.Model.StringValue() { Name = name, Value = value };
+      }
+      else if (item is IStringConvertibleMatrix) {
+        StringBuilder sb = new StringBuilder();
+        var matrix = item as IStringConvertibleMatrix;
+        if (matrix.Rows == 0 || matrix.Columns == 0) {
+          sb.Append("[ ]");
+        }
+        else {
+          sb.Append("[ ");
+          for (int r = 0; r < matrix.Rows; r++) {
+            sb.Append("( ");
+            for (int c = 0; c < matrix.Columns - 1; c++) {
+              sb.Append(matrix.GetValue(r, c)).Append(", ");
+            }
+            sb.Append(matrix.GetValue(r, matrix.Columns - 1)).Append(r < matrix.Rows - 1 ? " ), " : " )");
+          }
+          sb.Append(" ]");
+        }
+        var value = sb.ToString();
+        result.Value = new HeuristicLab.Services.Optimization.ControllerService.Model.StringValue() { Name = name, Value = value };
+      }
+      else {
+        result.Value = new HeuristicLab.Services.Optimization.ControllerService.Model.StringValue() { Name = name, Value = "Cannot be displayed as string" };
+      }
+      return result;
+    }
   }
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IControllerService.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IControllerService.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IControllerService.cs	(revision 8545)
@@ -17,5 +17,17 @@
 
     [OperationContract]
-    void ScheduleOptimizationScenario(OptimizationScenario scenario);
+    void ScheduleOptimizationScenario(User user, OptimizationScenario scenario);
+
+    [OperationContract]
+    IEnumerable<Job> GetJobs(User user);
+
+    [OperationContract]
+    Job GetJob(User user, string id);
+
+    [OperationContract]
+    void DeleteJob(User user, string id);
+
+    [OperationContract]
+    IList<Model.Run> GetJobResults(User user, string id);
   }
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IScenarioManager.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IScenarioManager.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Interfaces/IScenarioManager.cs	(revision 8545)
@@ -7,5 +7,9 @@
 namespace HeuristicLab.Services.Optimization.ControllerService.Interfaces {
   public interface IScenarioManager {
-    void DispatchScenario(OptimizationScenario scenario);
+    void DispatchScenario(User user, OptimizationScenario scenario);
+    IList<Job> GetJobs(User user);
+    Job GetJob(User user, string id);
+    void DeleteJob(User user, string id);
+    IList<Model.Run> GetJobResults(User user, string id);
   }
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Model/ControllerModel.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Model/ControllerModel.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/Model/ControllerModel.cs	(revision 8545)
@@ -23,5 +23,7 @@
     DecimalVector,
     [EnumMember]
-    Percent
+    Percent,
+    [EnumMember]
+    String
   }
 
@@ -151,4 +153,15 @@
 
   [DataContract]
+  public class StringValue : Value {
+    [DataMember]
+    public string Value { get; set; }
+
+    public override bool TrySetFromString(string input) {
+      Value = input;
+      return true;
+    }
+  }
+
+  [DataContract]
   [KnownType(typeof(BoolValue))]
   [KnownType(typeof(DecimalValue))]
@@ -156,4 +169,5 @@
   [KnownType(typeof(DecimalVector))]
   [KnownType(typeof(DecimalMatrix))]
+  [KnownType(typeof(StringValue))]
   public class Parameter {        
     // some kind of value type
@@ -211,5 +225,53 @@
       set { algorithmParameters = value; }
     }
-
+  }
+
+  [DataContract]
+  public enum JobState {
+    [EnumMember]
+    Waiting,
+    [EnumMember]
+    Calculating,
+    [EnumMember]
+    Aborted,
+    [EnumMember]
+    Failed,
+    [EnumMember]
+    Finished
+  }
+
+  [DataContract]
+  public class Job {
+    [DataMember]
+    public string Id { get; set; }
+
+    [DataMember]
+    public JobState State { get; set; }
+
+    [DataMember]
+    public string Name { get; set; }
+
+    [DataMember]
+    public string Resource { get; set; }    
+  }
+
+  [DataContract]
+  public class Run {
+    [DataMember]
+    public string Id { get; set; }
+
+    [DataMember]
+    public string Name { get; set; }
+
+    [DataMember]
+    public IList<Parameter> Results { get; set; }
+  }
+
+  [DataContract]
+  public class User {
+    [DataMember]
+    public string Username { get; set; }
+    [DataMember]
+    public string Password { get; set; }
   }
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Controller/PlaceholderControllerService.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Controller/PlaceholderControllerService.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Controller/PlaceholderControllerService.cs	(revision 8545)
@@ -61,9 +61,26 @@
     }
 
-    public void ScheduleOptimizationScenario(Model.OptimizationScenario scenario) {
-      hiveManager.DispatchScenario(scenario);
+    public void ScheduleOptimizationScenario(Model.User user, Model.OptimizationScenario scenario) {
+      hiveManager.DispatchScenario(user, scenario);
     }
 
-    
+    public IEnumerable<Model.Job> GetJobs(Model.User user) {
+      return hiveManager.GetJobs(user);
+    }
+
+
+    public Model.Job GetJob(Model.User user, string id) {
+      return hiveManager.GetJob(user, id);
+    }
+
+
+    public void DeleteJob(Model.User user, string id) {
+      hiveManager.DeleteJob(user, id);
+    }
+
+
+    public IList<Model.Run> GetJobResults(Model.User user, string id) {
+      return hiveManager.GetJobResults(user, id);
+    }
   }
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/HeuristicLab.Services.Optimization.ControllerService.Tests.csproj
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/HeuristicLab.Services.Optimization.ControllerService.Tests.csproj	(revision 8545)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/HeuristicLab.Services.Optimization.ControllerService.Tests.csproj	(revision 8545)
@@ -0,0 +1,67 @@
+﻿<?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)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{D6DD768C-707C-415A-B9F8-C1F7668F8560}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Services.Optimization.ControllerService.Tests</RootNamespace>
+    <AssemblyName>HeuristicLab.Services.Optimization.ControllerService.Tests</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </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="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\HeuristicLab.Services.Optimization.Controller\HeuristicLab.Services.Optimization.ControllerService.csproj">
+      <Project>{E0095F29-604B-4EE8-9EE8-8187DA3B24F1}</Project>
+      <Name>HeuristicLab.Services.Optimization.ControllerService</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app.config" />
+  </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>
+  -->
+</Project>
Index: /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/Program.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/Program.cs	(revision 8545)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/Program.cs	(revision 8545)
@@ -0,0 +1,19 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Services.Optimization.ControllerService.Interfaces;
+
+namespace HeuristicLab.Services.Optimization.ControllerService.Tests {
+  class Program {
+    static void Main(string[] args) {
+      IScenarioManager manager = new HiveScenarioManager();
+      Console.WriteLine("Press key to continue");
+      Console.ReadKey();
+      IList<Model.Run> results = manager.GetJobResults(new Model.User() { Password = "fschoeppl", Username = "fschoeppl" }, "cfd0cd8d-76a5-4bf6-bfcb-53fbfe3efe24");
+      foreach (var run in results) {
+        Console.WriteLine(run);
+      }
+    }
+  }
+}
Index: /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/app.config
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/app.config	(revision 8545)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.ControllerService.Tests/app.config	(revision 8545)
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
+  <system.serviceModel>
+    <diagnostics>
+      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000" />
+    </diagnostics>
+    <bindings>
+      <wsHttpBinding>
+        <binding name="WSHttpBinding_IControllerService" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security mode="Message">
+            <transport clientCredentialType="Certificate" />
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+        <binding name="WSHttpBinding_IHiveService" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security mode="Message">
+            <transport clientCredentialType="Certificate" />
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+    </bindings>
+    <behaviors>
+      <serviceBehaviors>
+        <behavior name="ServiceBehaviour_IControllerService">
+          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
+          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
+          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
+          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
+          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
+          <serviceCredentials>
+            <serviceCertificate findValue="localhost" x509FindType="FindBySubjectName" />
+            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider" />
+          </serviceCredentials>
+          <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false" messageAuthenticationAuditLevel="SuccessOrFailure" />
+          <serviceThrottling maxConcurrentCalls="100" />
+          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
+        </behavior>
+      </serviceBehaviors>
+      <endpointBehaviors>
+        <behavior name="LocalCertValidation">
+          <clientCredentials>
+            <serviceCertificate>
+              <authentication certificateValidationMode="None" />
+            </serviceCertificate>
+          </clientCredentials>
+          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
+        </behavior>
+      </endpointBehaviors>
+    </behaviors>    
+    <client>
+      <endpoint address="http://127.0.0.1:8080/ControllerService.svc" behaviorConfiguration="LocalCertValidation" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IControllerService" contract="HeuristicLab.Services.Optimization.ControllerService.IControllerService" name="WSHttpBinding_IControllerService">
+        <identity>
+          <certificate encodedValue="ADJUST_ME" />
+        </identity>
+      </endpoint>
+      <endpoint address="http://127.0.0.1:81/HiveService.svc" behaviorConfiguration="LocalCertValidation" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" contract="HeuristicLab.Clients.Hive.IHiveService" name="WSHttpBinding_IHiveService">
+        <identity>
+          <certificate encodedValue="ADJUST_ME" />
+        </identity>
+      </endpoint>
+      <!--
+      <endpoint address="http://optimization.cloudapp.net/HiveService.svc" behaviorConfiguration="LocalCertValidation"
+         binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" contract="HeuristicLab.Clients.Hive.IHiveService" name="WSHttpBinding_IHiveService">
+        <identity>
+          <certificate encodedValue="ADJUST_ME" />
+        </identity>
+      </endpoint>
+      -->
+    </client>
+  </system.serviceModel>
+</configuration>
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Web/Controllers/OptimizationController.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Web/Controllers/OptimizationController.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Web/Controllers/OptimizationController.cs	(revision 8545)
@@ -9,4 +9,5 @@
 using System.ServiceModel.Description;
 using System.Web.Security;
+using HeuristicLab.Services.Optimization.Web.Models;
 
 namespace HeuristicLab.Services.Optimization.Web.Controllers
@@ -16,4 +17,27 @@
     {
       public const string DEFAULT_CONTROLLER_ENDPOINT = "WSHttpBinding_IControllerService";
+
+      public delegate T ControllerServiceDelegate<T>(IControllerService service);
+      public delegate void ControllerServiceDelegate(IControllerService service);
+
+      public T withControllerService<T>(ControllerServiceDelegate<T> del) {
+        using (var cf = new ChannelFactory<IControllerService>(OptimizationController.DEFAULT_CONTROLLER_ENDPOINT)) {
+          var credentialBehaviour = cf.Endpoint.Behaviors.Find<ClientCredentials>();
+          credentialBehaviour.UserName.UserName = Membership.GetUser().UserName;
+          credentialBehaviour.UserName.Password = Session["pw"] as string;
+          var controllerProxy = cf.CreateChannel();
+          return del(controllerProxy);
+        }
+      }
+
+      public void withControllerService(ControllerServiceDelegate del) {
+        using (var cf = new ChannelFactory<IControllerService>(OptimizationController.DEFAULT_CONTROLLER_ENDPOINT)) {
+          var credentialBehaviour = cf.Endpoint.Behaviors.Find<ClientCredentials>();
+          credentialBehaviour.UserName.UserName = Membership.GetUser().UserName;
+          credentialBehaviour.UserName.Password = Session["pw"] as string;
+          var controllerProxy = cf.CreateChannel();
+          del(controllerProxy);
+        }
+      }
         //
         // GET: /Optimization/        
@@ -21,26 +45,42 @@
         public ActionResult Index()
         {
-          IEnumerable<OptimizationScenario> scenarios;
-          using (var cf = new ChannelFactory<IControllerService>(OptimizationController.DEFAULT_CONTROLLER_ENDPOINT)) {
-            var credentialBehaviour = cf.Endpoint.Behaviors.Find<ClientCredentials>();
-            credentialBehaviour.UserName.UserName = Membership.GetUser().UserName;
-            credentialBehaviour.UserName.Password = Session["pw"] as string;
-            var controllerProxy = cf.CreateChannel();
-            scenarios = controllerProxy.GetOptimizationScenarios();
-          }
-          return View(scenarios);
+          var optModel = withControllerService<OptimizationModel>((service) => {
+            OptimizationModel model = new OptimizationModel();
+            model.Scenarios = service.GetOptimizationScenarios();
+            User u = new User() { Username = Membership.GetUser().UserName, Password = Session["pw"] as string };
+            model.Jobs = service.GetJobs(u);
+            return model;
+          });
+          return View(optModel);
         }
 
         public ActionResult ProblemParameters(string scenario) {
-          OptimizationScenario optScenario;          
-          using (var cf = new ChannelFactory<IControllerService>(OptimizationController.DEFAULT_CONTROLLER_ENDPOINT)) {
-            var credentialBehaviour = cf.Endpoint.Behaviors.Find<ClientCredentials>();
-            credentialBehaviour.UserName.UserName = Membership.GetUser().UserName;
-            credentialBehaviour.UserName.Password = Session["pw"] as string;
-            var controllerProxy = cf.CreateChannel();
-            optScenario = controllerProxy.GetOptimizationScenarioByName(scenario);
-            Session["scenario"] = optScenario;
-          }
+          var optScenario = withControllerService<OptimizationScenario>((service) => {
+            return service.GetOptimizationScenarioByName(scenario);
+          });
+          Session["scenario"] = optScenario;
           return View(optScenario.InputParameters);
+        }
+
+        public ActionResult JobDetails(string jobId) {
+          Job job = withControllerService<Job>((service) => {
+            User u = new User() { Username = Membership.GetUser().UserName, Password = Session["pw"] as string };
+            return service.GetJob(u, jobId);
+          });
+          var runs = withControllerService<IList<Run>>((service) => {
+            User u = new User() { Username = Membership.GetUser().UserName, Password = Session["pw"] as string };
+            return service.GetJobResults(u, jobId);
+          });
+          JobDetailsModel jdm = new JobDetailsModel() { Job = job, Runs = runs };
+          return View(jdm);
+        }
+
+        [HttpPost]
+        public ActionResult JobDetails(Job job) {
+          withControllerService((service) => {
+            User u = new User() { Username = Membership.GetUser().UserName, Password = Session["pw"] as string };
+            service.DeleteJob(u, job.Id);
+          });
+          return RedirectToAction("Index");
         }
 
@@ -76,5 +116,6 @@
             credentialBehaviour.UserName.Password = Session["pw"] as string;
             var controllerProxy = cf.CreateChannel();
-            controllerProxy.ScheduleOptimizationScenario(Session["scenario"] as OptimizationScenario);
+            User u = new User() { Username = Membership.GetUser().UserName, Password = Session["pw"] as string };
+            controllerProxy.ScheduleOptimizationScenario(u, Session["scenario"] as OptimizationScenario);
           }
           return RedirectToAction("Index");
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Web/HeuristicLab.Services.Optimization.Web.csproj
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Web/HeuristicLab.Services.Optimization.Web.csproj	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Web/HeuristicLab.Services.Optimization.Web.csproj	(revision 8545)
@@ -245,4 +245,7 @@
     <Content Include="HeuristicLab 3.3.exe.config" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Optimization\JobDetails.cshtml" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Web/Models/OptimizationModels.cs
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Web/Models/OptimizationModels.cs	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Web/Models/OptimizationModels.cs	(revision 8545)
@@ -7,4 +7,19 @@
 
 namespace HeuristicLab.Services.Optimization.Web.Models {
+
+  public class OptimizationModel {
+    public IEnumerable<OptimizationScenario> Scenarios { get; set; }
+    public IEnumerable<Job> Jobs { get; set; }
+    public Operation Operation { get; set; }
+  }
+
+  public class JobDetailsModel {
+    public IList<Run> Runs { get; set; }
+    public Job Job { get; set; }
+  }
+
+  public enum Operation {
+    DeleteJob
+  }
 
   public class ProblemParametersModelBinder : IModelBinder {
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/Index.cshtml
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/Index.cshtml	(revision 8544)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/Index.cshtml	(revision 8545)
@@ -1,3 +1,3 @@
-﻿@model IEnumerable<HeuristicLab.Services.Optimization.ControllerService.Model.OptimizationScenario>
+﻿@model HeuristicLab.Services.Optimization.Web.Models.OptimizationModel
 
 @{
@@ -5,8 +5,28 @@
 }
 
+<h2>Your jobs:</h2>
+<table>
+  <thead>
+    <tr>
+      <td>Name</td>
+      <td>Resource</td>
+      <td>State</td>   
+    </tr>
+  </thead>
+  <tbody>
+    @foreach(var itm in Model.Jobs) {
+        <tr>
+            <td>@Html.ActionLink(itm.Name, "JobDetails", new { jobId = itm.Id })</td>
+            <td>@itm.Resource</td>
+            <td>@itm.State</td>            
+        </tr>
+    }
+  </tbody>
+</table>
+
 <h2>Choose your scenario</h2>
 
 <ul>
-@foreach (var itm in Model) {
+@foreach (var itm in Model.Scenarios) {
     <li>@Html.ActionLink(itm.Name, "ProblemParameters", new { scenario=itm.Name })</li>
 }
Index: /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/JobDetails.cshtml
===================================================================
--- /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/JobDetails.cshtml	(revision 8545)
+++ /branches/OaaS/HeuristicLab.Services.Optimization.Web/Views/Optimization/JobDetails.cshtml	(revision 8545)
@@ -0,0 +1,48 @@
+﻿@model HeuristicLab.Services.Optimization.Web.Models.JobDetailsModel
+
+<h2>Job details:</h2>
+<h3>Summary:</h3>
+
+    <table>
+      <thead>
+        <tr>
+          <td>Name</td>
+          <td>Resource</td>
+          <td>State</td>   
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>@Model.Job.Name</td>
+          <td>@Model.Job.Resource</td>
+          <td>@Model.Job.State</td>            
+       </tr>
+      </tbody>
+    </table>
+@using (Html.BeginForm()) {    
+    <fieldset>
+        <input type="hidden" value="@Model.Job.Id" name="id" />
+        <input type="submit" value="Delete job" />    
+    </fieldset>
+}
+
+<h3>Run details:</h3>
+@foreach (var run in Model.Runs) {
+    <p>@run.Name:</p>
+    <table>
+      <thead>
+        <tr>
+          <td>Key</td>
+          <td>Value</td>
+        </tr>
+      </thead>
+      <tbody>
+      @foreach (var result in run.Results) {
+        <tr>
+          <td>@result.Value.Name</td>
+          <td>@((result.Value as HeuristicLab.Services.Optimization.ControllerService.Model.StringValue).Value)</td>
+       </tr>
+      }
+      </tbody>
+    </table>
+}
