Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/HeuristicLab.Calendar-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/HeuristicLab.Calendar-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/HeuristicLab.Calendar-3.3.csproj	(revision 4368)
@@ -53,4 +53,5 @@
     <WarningLevel>4</WarningLevel>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -70,4 +71,12 @@
     <PlatformTarget>x86</PlatformTarget>
     <OutputPath>bin\x86\Release\</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <PlatformTarget>x64</PlatformTarget>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <PlatformTarget>x64</PlatformTarget>
+    <OutputPath>bin\x64\Release\</OutputPath>
   </PropertyGroup>
   <ItemGroup>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs	(revision 4368)
@@ -58,3 +58,3 @@
 // [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.0.4342")]
+[assembly: AssemblyFileVersion("3.3.0.4343")]
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln	(revision 4368)
@@ -31,4 +31,6 @@
 		HeuristicLab 3.3.vsmdi = HeuristicLab 3.3.vsmdi
 		LocalTestRun.testrunconfig = LocalTestRun.testrunconfig
+		Performance1.psess = Performance1.psess
+		Performance3.psess = Performance3.psess
 		PreBuildEvent.cmd = PreBuildEvent.cmd
 	EndProjectSection
@@ -117,5 +119,6 @@
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
-		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x64.ActiveCfg = Debug|x64
+		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x64.Build.0 = Debug|x64
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x86.ActiveCfg = Debug|x86
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x86.Build.0 = Debug|x86
@@ -256,5 +259,6 @@
 		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
 		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
-		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|x64.ActiveCfg = Debug|x64
+		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|x64.Build.0 = Debug|x64
 		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|x86.ActiveCfg = Debug|x86
 		{D17A4D6A-4CAA-4470-8A19-F42463C021FD}.Debug|x86.Build.0 = Debug|x86
@@ -269,5 +273,6 @@
 		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
 		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|Mixed Platforms.Build.0 = Debug|x86
-		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|x64.ActiveCfg = Debug|x86
+		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|x64.ActiveCfg = Debug|x64
+		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|x64.Build.0 = Debug|x64
 		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|x86.ActiveCfg = Debug|x86
 		{A84C0A25-13D0-40A6-924F-53556D9691DC}.Debug|x86.Build.0 = Debug|x86
@@ -282,5 +287,6 @@
 		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
 		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|Mixed Platforms.Build.0 = Debug|x86
-		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|x64.ActiveCfg = Debug|x86
+		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|x64.ActiveCfg = Debug|x64
+		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|x64.Build.0 = Debug|x64
 		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|x86.ActiveCfg = Debug|x86
 		{4F15BEA2-F494-4584-A0E5-6BA85377B313}.Debug|x86.Build.0 = Debug|x86
@@ -295,6 +301,8 @@
 		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
 		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
-		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x64.ActiveCfg = Debug|x64
+		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x64.Build.0 = Debug|x64
+		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x86.ActiveCfg = Debug|x86
+		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Debug|x86.Build.0 = Debug|x86
 		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{CDAD2510-299C-4FA2-B351-9D71A5AF20B7}.Release|Any CPU.Build.0 = Release|Any CPU
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/HivePluginInfoDto.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/HivePluginInfoDto.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/HivePluginInfoDto.cs	(revision 4368)
@@ -28,4 +28,5 @@
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Contracts.BusinessObjects {
@@ -71,4 +72,12 @@
     }
 
+    public static List<HivePluginInfoDto> FindPluginsNeeded(Type type) {
+      return (
+        from p in PluginUtil.GetDeclaringPlugins(type)
+        select new HivePluginInfoDto() {
+          Name = p.Name,
+          Version = p.Version
+        }).ToList();
+    }
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobDto.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobDto.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobDto.cs	(revision 4368)
@@ -41,5 +41,5 @@
     [Storable]
     [DataMember]
-    public string UserId { get; set; }
+    public Guid? UserId { get; set; }
     [Storable]
     [DataMember]
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobResult.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobResult.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobResult.cs	(revision 4368)
@@ -38,7 +38,4 @@
     [Storable]
     [DataMember]
-    public Guid JobId { get; set; }
-    [Storable]
-    [DataMember]
     public Guid SlaveId { get; set; }
     [Storable]
@@ -53,18 +50,25 @@
     [Storable]
     [DataMember]
+    public DateTime? DateCreated { get; set; }
+    [Storable]
+    [DataMember]
     public DateTime? DateCalculated { get; set; }
     [Storable]
     [DataMember]
     public DateTime? DateFinished { get; set; }
+    [Storable]
+    [DataMember]
+    public Guid? ParentJobId { get; set; }
 
     public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
       JobResult clone = (JobResult) base.Clone(cloner);
       clone.SlaveId = this.SlaveId;
+      clone.DateCreated = this.DateCreated;
       clone.DateCalculated = this.DateCalculated;
       clone.DateFinished = this.DateFinished;
       clone.Exception = this.Exception;
-      clone.JobId = this.JobId;
       clone.Percentage = this.Percentage;
       clone.State = this.State;
+      clone.ParentJobId = this.ParentJobId;
       return clone;
     }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobState.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobState.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/JobState.cs	(revision 4368)
@@ -13,5 +13,6 @@
     SnapshotSent,
     Pending,
-    Failed
+    Failed,
+    WaitForChildJobs
   };
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/SerializedJobList.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/SerializedJobList.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/BusinessObjects/SerializedJobList.cs	(revision 4368)
@@ -0,0 +1,54 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using System.Runtime.Serialization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Collections;
+
+namespace HeuristicLab.Hive.Contracts.BusinessObjects {
+  [StorableClass]
+  [Serializable]
+  public class SerializedJobList : ObservableList<SerializedJob>, IDeepCloneable {
+    public SerializedJobList() { }
+    public SerializedJobList(IEnumerable<SerializedJob> collection) {
+      this.list = new List<SerializedJob>(collection);
+    }
+
+    [StorableConstructor]
+    protected SerializedJobList(bool deserializing) : base(deserializing) { }
+
+    public object Clone() {
+      return Clone(new Cloner());
+    }
+
+    public virtual IDeepCloneable Clone(Cloner cloner) {
+      SerializedJobList clone = (SerializedJobList)Activator.CreateInstance(this.GetType());
+      cloner.RegisterClonedObject(this, clone);
+      clone.list = (this.Select(x => (SerializedJob)cloner.Clone(x))).ToList();
+      return clone;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Disposable.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Disposable.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Disposable.cs	(revision 4368)
@@ -0,0 +1,21 @@
+﻿using System;
+
+namespace HeuristicLab.Hive.Contracts {
+  public class Disposable<T> : IDisposable {
+    private T obj;
+    public T Obj {
+      get { return obj; }
+    }
+
+    public Disposable(T obj) {
+      this.obj = obj;
+    }
+
+    public void Dispose() {
+      if (OnDisposing != null)
+        OnDisposing(this, new EventArgs());
+    }
+
+    public event EventHandler OnDisposing;
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/HeuristicLab.Hive.Contracts-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/HeuristicLab.Hive.Contracts-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/HeuristicLab.Hive.Contracts-3.3.csproj	(revision 4368)
@@ -119,4 +119,5 @@
     <Compile Include="BusinessObjects\CachedHivePluginInfoDto.cs" />
     <Compile Include="BusinessObjects\CalendarState.cs" />
+    <Compile Include="BusinessObjects\SerializedJobList.cs" />
     <Compile Include="BusinessObjects\SlaveGroupDto.cs" />
     <Compile Include="BusinessObjects\HivePluginFile.cs" />
@@ -130,5 +131,4 @@
     <Compile Include="BusinessObjects\JobDto.cs" />
     <Compile Include="BusinessObjects\JobResult.cs" />
-    <Compile Include="BusinessObjects\SerializedJobResult.cs" />
     <Compile Include="BusinessObjects\SlaveState.cs" />
     <Compile Include="BusinessObjects\UpTimeStatisticsDto.cs" />
@@ -136,4 +136,7 @@
     <Compile Include="BusinessObjects\SlaveConfigDto.cs" />
     <Compile Include="BusinessObjects\SlaveGroupDtoList.cs" />
+    <Compile Include="Disposable.cs" />
+    <Compile Include="MessageContainerWithCallback.cs" />
+    <Compile Include="MessageContainerWithJob.cs" />
     <Compile Include="RecurrentEvent.cs" />
     <Compile Include="ResponseObjects\ResponseCalendar.cs" />
@@ -157,4 +160,6 @@
     <Compile Include="HiveRoles.cs" />
     <Compile Include="StreamedObject.cs" />
+    <Compile Include="WcfServicePool.cs" />
+    <Compile Include="WcfServicePoolException.cs" />
     <Compile Include="WcfSettings.cs" />
   </ItemGroup>
@@ -167,4 +172,8 @@
       <Project>{9076697B-C151-46CD-95BC-1D059492B478}</Project>
       <Name>HeuristicLab.DataAccess-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive.JobBase\3.3\HeuristicLab.Hive.JobBase-3.3.csproj">
+      <Project>{21187322-52DD-4243-80A4-A85F0263E63B}</Project>
+      <Name>HeuristicLab.Hive.JobBase-3.3</Name>
     </ProjectReference>
   </ItemGroup>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IClientFacade.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IClientFacade.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IClientFacade.cs	(revision 4368)
@@ -38,5 +38,7 @@
     Response RequestSnapshot(Guid jobId);
     [OperationContract]
-    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot);
+    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId);
+    [OperationContract]
+    ResponseObject<SerializedJob> GetSnapshotResult(Guid jobId);
     [OperationContract]
     Response AbortJob(Guid jobId);
@@ -45,4 +47,6 @@
     [OperationContract]
     ResponseObject<JobResultList> GetJobResults(IEnumerable<Guid> jobIds);
+    [OperationContract]
+    ResponseObject<JobResultList> GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent);
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IJobManager.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IJobManager.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/IJobManager.cs	(revision 4368)
@@ -57,5 +57,8 @@
 
     [OperationContract]
-    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot);
+    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId);
+
+    [OperationContract]
+    ResponseObject<SerializedJob> GetSnapshotResult(Guid jobId);
 
     [OperationContract]
@@ -85,4 +88,13 @@
     [OperationContract]
     ResponseObject<JobDto> AddJobWithGroupStrings(SerializedJob job, IEnumerable<string> resources);
+
+    [OperationContract]
+    ResponseObject<JobResultList> GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent);
+
+    [OperationContract]
+    ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob);
+
+    [OperationContract]
+    ResponseObject<JobDto> PauseJob(SerializedJob serializedJob);
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveCommunicator.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveCommunicator.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveCommunicator.cs	(revision 4368)
@@ -28,4 +28,5 @@
 using HeuristicLab.PluginInfrastructure;
 using HeuristicLab.Hive.Contracts.ResponseObjects;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Contracts.Interfaces {
@@ -68,5 +69,4 @@
     [OperationContract]
     Response SetCalendarStatus(Guid clientId, CalendarState state);
-
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveFacade.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveFacade.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/Interfaces/ISlaveFacade.cs	(revision 4368)
@@ -28,4 +28,5 @@
 using HeuristicLab.Hive.Contracts.BusinessObjects;
 using HeuristicLab.Hive.Contracts.ResponseObjects;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Contracts.Interfaces {
@@ -43,4 +44,16 @@
     [OperationContract]
     ResponseResultReceived ProcessSnapshotStreamed(Stream stream);
+
+    [OperationContract]
+    ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob);
+
+    [OperationContract]
+    ResponseObject<JobDto> PauseJob(SerializedJob serializedJob);
+
+    [OperationContract]
+    JobResultList GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent);
+
+    [OperationContract]
+    SerializedJob GetLastSerializedResult(Guid jobId);
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainer.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainer.cs	(revision 4368)
@@ -36,6 +36,9 @@
   public class MessageContainer : IDeepCloneable {
 
-    public enum MessageType { FetchJob, AbortJob, JobAborted, RequestSnapshot, FinishedJob, NoMessage, SnapshotReady, Shutdown, JobFailed, UptimeLimitDisconnect,
-      FetchOrForceFetchCalendar
+    public enum MessageType {
+      FetchJob, AbortJob, JobAborted, RequestSnapshot, FinishedJob, NoMessage, SnapshotReady, Shutdown, JobFailed, UptimeLimitDisconnect,
+      FetchOrForceFetchCalendar, AddChildJob,
+      PauseJob,
+      GetChildJobs
     };
 
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithCallback.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithCallback.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithCallback.cs	(revision 4368)
@@ -0,0 +1,26 @@
+﻿using System;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.JobBase;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Hive.Contracts {
+  [StorableClass]
+  [Serializable]
+  public class MessageContainerWithCallback<CallbackParameterType> : MessageContainer {
+
+    [Storable]
+    public Action<CallbackParameterType> Callback;
+
+    public MessageContainerWithCallback(MessageType message, Guid parentJobId, Action<CallbackParameterType> callback)
+      : base(message, parentJobId) {
+        this.Callback = callback;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      MessageContainerWithJob clone = (MessageContainerWithJob)base.Clone(cloner);
+
+      return clone;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithJob.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/MessageContainerWithJob.cs	(revision 4368)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Text;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Hive.Contracts;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+
+namespace HeuristicLab.Hive.Contracts {
+  [StorableClass]
+  [Serializable]
+  public class MessageContainerWithJob : MessageContainer {
+
+    [Storable]
+    public SerializedJob SerializedJob { get; set; }
+    
+    public MessageContainerWithJob(MessageType message, Guid parentJobId, SerializedJob serializedJob)
+      : base(message, parentJobId) {
+        this.SerializedJob = serializedJob;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      MessageContainerWithJob clone = (MessageContainerWithJob)base.Clone(cloner);
+      clone.SerializedJob = (SerializedJob)cloner.Clone(this.SerializedJob);
+      return clone;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/ResponseStatus.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/ResponseStatus.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/ResponseStatus.cs	(revision 4368)
@@ -24,5 +24,5 @@
     RemoveJob_JobDoesNotExist, // ApplicationConstants.RESPONSE_JOB_JOB_DOESNT_EXIST
 
-    GetLastSerializedResult_JobResultNotYetThere, // ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE
+    GetSnapshotResult_JobResultNotYetThere, // ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE
 
     AbortJob_JobDoesNotExist, // ApplicationConstants.RESPONSE_JOB_JOB_DOESNT_EXIST
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePool.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePool.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePool.cs	(revision 4368)
@@ -0,0 +1,82 @@
+﻿using System;
+using System.ServiceModel;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Hive.Contracts {
+  public class WcfServicePool<T> {
+    private static object locker = new object();
+    private string hostAddress;
+    private string username;
+    private string password;
+    private string endpointName;
+    private ChannelFactory<T> factory = null;
+    private Disposable<T> disposableService = null;
+    private int requestCount = 0;
+
+    public WcfServicePool(string hostAddress, string username, string password, string endpointName) {
+      this.hostAddress = hostAddress;
+      this.username = username;
+      this.password = password;
+      this.endpointName = endpointName;
+    }
+
+    private T CreateFacade(string endpointName) {
+      lock (locker) {
+        try {
+          return CreateChannel(endpointName);
+        }
+        catch (EndpointNotFoundException ex) {
+          OnExceptionOccured(ex);
+        }
+        return default(T);
+      }
+    }
+
+    protected virtual T CreateChannel(string endpointName) {
+      if (factory == null) {
+        factory = new ChannelFactory<T>(endpointName);
+        WcfSettings.SetEndpointAddress(factory.Endpoint, hostAddress);
+
+        factory.Credentials.UserName.UserName = username;
+        factory.Credentials.UserName.Password = password;
+      }
+
+      return factory.CreateChannel();
+    }
+
+    public Disposable<T> GetService() {
+      lock (locker) {
+        requestCount++;
+        if (disposableService == null) {
+          disposableService = new Disposable<T>(CreateFacade(endpointName));
+          disposableService.OnDisposing += new EventHandler(disposableService_OnDisposing);
+        }
+        return disposableService;
+      }
+    }
+
+    private void disposableService_OnDisposing(object sender, EventArgs e) {
+      DisposeService();
+    }
+
+    public void DisposeService() {
+      lock (locker) {
+        requestCount--;
+        if (requestCount == 0) {
+          WcfSettings.DisposeWcfClient((ICommunicationObject)disposableService.Obj);
+          disposableService = null;
+        } else if (requestCount < 0) {
+          throw new WcfServicePoolException("requestCount cannot be less than 0.");
+        }
+      }
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
+    private void OnExceptionOccured(Exception e) {
+      lock (locker) {
+        var handler = ExceptionOccured;
+        if (handler != null) handler(this, new EventArgs<Exception>(e));
+      }
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePoolException.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePoolException.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfServicePoolException.cs	(revision 4368)
@@ -0,0 +1,7 @@
+﻿using System;
+
+namespace HeuristicLab.Hive.Contracts {
+  public class WcfServicePoolException : Exception {
+    public WcfServicePoolException(string message) : base(message) { }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfSettings.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfSettings.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Contracts/3.3/WcfSettings.cs	(revision 4368)
@@ -9,4 +9,5 @@
 using System.Net;
 using System.ServiceModel.Description;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Contracts {
@@ -111,7 +112,7 @@
           catch (CommunicationObjectFaultedException) { obj.Abort(); }
           catch (TimeoutException) { obj.Abort(); }
-          catch (Exception) {
+          catch (Exception e) {
             obj.Abort();
-            throw;
+            Logger.Error(e);
           }
         } else
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ControlExtensions.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ControlExtensions.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ControlExtensions.cs	(revision 4368)
@@ -3,9 +3,8 @@
 using System.Linq;
 using System.Text;
-using System.Windows.Forms;
 
 namespace HeuristicLab.Hive.Experiment.Views {
   public static class ControlExtensions {
-    public static void InvokeIfRequired(this Control c, Action<Control> action) {
+    public static void InvokeIfRequired(this System.Windows.Forms.Control c, Action<System.Windows.Forms.Control> action) {
       if (c.InvokeRequired) {
         c.Invoke((Action)(() => action(c)));
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj	(revision 4368)
@@ -17,5 +17,5 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
+    <PlatformTarget>x64</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
@@ -54,4 +54,29 @@
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Hive.Experiment.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Hive.Experiment.Views-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
   <ItemGroup>
     <Reference Include="HeuristicLab.Collections-3.3">
@@ -72,4 +97,7 @@
     <Reference Include="HeuristicLab.Data-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Hive.Server.Console-3.3">
+      <HintPath>..\..\HeuristicLab.Hive.Server.Console\3.3\obj\Debug\HeuristicLab.Hive.Server.Console-3.3.dll</HintPath>
     </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3">
@@ -114,4 +142,35 @@
     </Compile>
     <Compile Include="ControlExtensions.cs" />
+    <Compile Include="Form1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Form1.Designer.cs">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TestApp.cs" />
+    <Compile Include="JobConfigListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobConfigListView.Designer.cs">
+      <DependentUpon>JobConfigListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="JobConfigView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobConfigView.Designer.cs">
+      <DependentUpon>JobConfigView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HiveExperimentListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveExperimentListView.Designer.cs">
+      <DependentUpon>HiveExperimentListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HiveClientView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveClientView.Designer.cs">
+      <DependentUpon>HiveClientView.cs</DependentUpon>
+    </Compile>
     <Compile Include="HeuristicLabHiveExperimentViewsPlugin.cs" />
     <Compile Include="HiveExperimentView.cs">
@@ -134,4 +193,10 @@
     </Compile>
     <Compile Include="MenuItems\ConnectionSetupMenuItem.cs" />
+    <Compile Include="ProgressView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ProgressView.Designer.cs">
+      <DependentUpon>ProgressView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Properties\Resources.Designer.cs">
@@ -167,4 +232,13 @@
       <DependentUpon>ConnectionSetupView.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Form1.resx">
+      <DependentUpon>Form1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="JobConfigView.resx">
+      <DependentUpon>JobConfigView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="HiveClientView.resx">
+      <DependentUpon>HiveClientView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="HiveExperimentView.resx">
       <DependentUpon>HiveExperimentView.cs</DependentUpon>
@@ -172,4 +246,7 @@
     <EmbeddedResource Include="JobItemView.resx">
       <DependentUpon>JobItemView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ProgressView.resx">
+      <DependentUpon>ProgressView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="Properties\Resources.resx">
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.Designer.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.Designer.cs	(revision 4368)
@@ -0,0 +1,137 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Hive.Experiment.Views {
+  partial class HiveClientView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.experimentsTabPage = new System.Windows.Forms.TabPage();
+      this.hiveExperimentListView = new HeuristicLab.Hive.Experiment.Views.HiveExperimentListView();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.updateExperimentsButton = new System.Windows.Forms.Button();
+      this.tabControl.SuspendLayout();
+      this.experimentsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // 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.experimentsTabPage);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(729, 489);
+      this.tabControl.TabIndex = 4;
+      // 
+      // experimentsTabPage
+      // 
+      this.experimentsTabPage.Controls.Add(this.hiveExperimentListView);
+      this.experimentsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.experimentsTabPage.Name = "experimentsTabPage";
+      this.experimentsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.experimentsTabPage.Size = new System.Drawing.Size(721, 463);
+      this.experimentsTabPage.TabIndex = 0;
+      this.experimentsTabPage.Text = "Experiments";
+      this.experimentsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // hiveExperimentListView
+      // 
+      this.hiveExperimentListView.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.hiveExperimentListView.Caption = "HiveExperimentList View";
+      this.hiveExperimentListView.Content = null;
+      this.hiveExperimentListView.Location = new System.Drawing.Point(6, 6);
+      this.hiveExperimentListView.Name = "hiveExperimentListView";
+      this.hiveExperimentListView.ReadOnly = false;
+      this.hiveExperimentListView.Size = new System.Drawing.Size(712, 437);
+      this.hiveExperimentListView.TabIndex = 0;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.logTabPage.Size = new System.Drawing.Size(721, 463);
+      this.logTabPage.TabIndex = 1;
+      this.logTabPage.Text = "Log";
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // updateExperimentsButton
+      // 
+      this.updateExperimentsButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.updateExperimentsButton.Location = new System.Drawing.Point(3, 498);
+      this.updateExperimentsButton.Name = "updateExperimentsButton";
+      this.updateExperimentsButton.Size = new System.Drawing.Size(144, 23);
+      this.updateExperimentsButton.TabIndex = 5;
+      this.updateExperimentsButton.Text = "Update Experiment List";
+      this.updateExperimentsButton.UseVisualStyleBackColor = true;
+      this.updateExperimentsButton.Click += new System.EventHandler(this.updateExperimentsButton_Click);
+      // 
+      // HiveClientView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.updateExperimentsButton);
+      this.Name = "HiveClientView";
+      this.Size = new System.Drawing.Size(735, 524);
+      this.tabControl.ResumeLayout(false);
+      this.experimentsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage experimentsTabPage;
+    private System.Windows.Forms.TabPage logTabPage;
+    private System.Windows.Forms.Button updateExperimentsButton;
+    private HiveExperimentListView hiveExperimentListView;
+
+
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.cs	(revision 4368)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Optimization;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.Hive.Experiment.Properties;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("Hive Client View")]
+  [Content(typeof(HiveClient), true)]
+  public sealed partial class HiveClientView : ItemView {
+    public new HiveClient Content {
+      get { return (HiveClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public HiveClientView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        this.hiveExperimentListView.Content = null;
+      } else {
+        this.hiveExperimentListView.Content = Content.HiveExperiments;
+      }
+    }
+
+    private void updateExperimentsButton_Click(object sender, EventArgs e) {
+      ProgressView progressView = new ProgressView(this, "Loading Experiments from server...", true);
+
+      MethodInvoker invoker = new MethodInvoker(Content.UpdateExperimentList);
+      invoker.BeginInvoke((ar) => {
+        try {
+          invoker.EndInvoke(ar);
+        }
+        finally {
+          progressView.Finish();
+        }
+      }, null);
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.resx
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.resx	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveClientView.resx	(revision 4368)
@@ -0,0 +1,123 @@
+﻿<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>57</value>
+  </metadata>
+</root>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.Designer.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.Designer.cs	(revision 4368)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Hive.Experiment.Views {
+  partial class HiveExperimentListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentListView.cs	(revision 4368)
@@ -0,0 +1,34 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  [View("HiveExperimentList View")]
+  [Content(typeof(HiveExperimentList), true)]
+  [Content(typeof(IItemList<HiveExperiment>), false)]
+  public partial class HiveExperimentListView : ItemListView<HiveExperiment> {
+
+    public HiveExperimentListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Hive Experiments";
+    }
+
+    protected override HiveExperiment CreateItem() {
+      return new HiveExperiment();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs	(revision 4368)
@@ -52,6 +52,7 @@
       this.experimentNamedItemView = new HeuristicLab.Core.Views.NamedItemView();
       this.viewExperimentButton = new System.Windows.Forms.Button();
-      this.hiveStatusTabPage = new System.Windows.Forms.TabPage();
-      this.jobListView = new HeuristicLab.Hive.Experiment.Views.JobItemListView();
+      this.configurationTabPage = new System.Windows.Forms.TabPage();
+      this.updateJobConfigTreeButton = new System.Windows.Forms.Button();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
       this.runsTabPage = new System.Windows.Forms.TabPage();
       this.runCollectionView = new HeuristicLab.Optimization.Views.RunCollectionView();
@@ -68,8 +69,12 @@
       this.disconnectButton = new System.Windows.Forms.Button();
       this.reconnectButton = new System.Windows.Forms.Button();
+      this.downloadExperimentButton = new System.Windows.Forms.Button();
+      this.jobConfigView = new HeuristicLab.Hive.Experiment.Views.JobConfigView();
+      this.jobItemView = new HeuristicLab.Hive.Experiment.Views.JobItemView();
       ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
       this.tabControl.SuspendLayout();
       this.experimentTabPage.SuspendLayout();
-      this.hiveStatusTabPage.SuspendLayout();
+      this.configurationTabPage.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
       this.runsTabPage.SuspendLayout();
       this.logTabPage.SuspendLayout();
@@ -92,5 +97,6 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.experimentTabPage);
-      this.tabControl.Controls.Add(this.hiveStatusTabPage);
+      this.tabControl.Controls.Add(this.configurationTabPage);
+      this.tabControl.Controls.Add(this.jobsTabPage);
       this.tabControl.Controls.Add(this.runsTabPage);
       this.tabControl.Controls.Add(this.logTabPage);
@@ -103,4 +109,5 @@
       // experimentTabPage
       // 
+      this.experimentTabPage.Controls.Add(this.downloadExperimentButton);
       this.experimentTabPage.Controls.Add(this.openExperimentButton);
       this.experimentTabPage.Controls.Add(this.newExperimentButton);
@@ -161,27 +168,35 @@
       this.viewExperimentButton.Click += new System.EventHandler(this.showExperimentButton_Click);
       // 
-      // hiveStatusTabPage
-      // 
-      this.hiveStatusTabPage.Controls.Add(this.jobListView);
-      this.hiveStatusTabPage.Location = new System.Drawing.Point(4, 22);
-      this.hiveStatusTabPage.Name = "hiveStatusTabPage";
-      this.hiveStatusTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.hiveStatusTabPage.Size = new System.Drawing.Size(727, 369);
-      this.hiveStatusTabPage.TabIndex = 2;
-      this.hiveStatusTabPage.Text = "HiveStatus";
-      this.hiveStatusTabPage.UseVisualStyleBackColor = true;
-      // 
-      // jobListView
-      // 
-      this.jobListView.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.jobListView.Caption = "JobList View";
-      this.jobListView.Content = null;
-      this.jobListView.Location = new System.Drawing.Point(3, 6);
-      this.jobListView.Name = "jobListView";
-      this.jobListView.ReadOnly = false;
-      this.jobListView.Size = new System.Drawing.Size(721, 360);
-      this.jobListView.TabIndex = 0;
+      // configurationTabPage
+      // 
+      this.configurationTabPage.Controls.Add(this.jobConfigView);
+      this.configurationTabPage.Controls.Add(this.updateJobConfigTreeButton);
+      this.configurationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.configurationTabPage.Name = "configurationTabPage";
+      this.configurationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.configurationTabPage.Size = new System.Drawing.Size(727, 390);
+      this.configurationTabPage.TabIndex = 2;
+      this.configurationTabPage.Text = "Configuration";
+      this.configurationTabPage.UseVisualStyleBackColor = true;
+      // 
+      // updateJobConfigTreeButton
+      // 
+      this.updateJobConfigTreeButton.Location = new System.Drawing.Point(6, 6);
+      this.updateJobConfigTreeButton.Name = "updateJobConfigTreeButton";
+      this.updateJobConfigTreeButton.Size = new System.Drawing.Size(199, 23);
+      this.updateJobConfigTreeButton.TabIndex = 1;
+      this.updateJobConfigTreeButton.Text = "Update Config Tree from Experiment";
+      this.updateJobConfigTreeButton.UseVisualStyleBackColor = true;
+      this.updateJobConfigTreeButton.Click += new System.EventHandler(this.updateJobConfigTreeButton_Click);
+      // 
+      // jobsTabPage
+      // 
+      this.jobsTabPage.Controls.Add(this.jobItemView);
+      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.jobsTabPage.Name = "jobsTabPage";
+      this.jobsTabPage.Size = new System.Drawing.Size(727, 390);
+      this.jobsTabPage.TabIndex = 5;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
       // 
       // runsTabPage
@@ -190,5 +205,5 @@
       this.runsTabPage.Location = new System.Drawing.Point(4, 22);
       this.runsTabPage.Name = "runsTabPage";
-      this.runsTabPage.Size = new System.Drawing.Size(727, 369);
+      this.runsTabPage.Size = new System.Drawing.Size(727, 390);
       this.runsTabPage.TabIndex = 4;
       this.runsTabPage.Text = "Runs";
@@ -213,5 +228,5 @@
       this.logTabPage.Location = new System.Drawing.Point(4, 22);
       this.logTabPage.Name = "logTabPage";
-      this.logTabPage.Size = new System.Drawing.Size(727, 369);
+      this.logTabPage.Size = new System.Drawing.Size(727, 390);
       this.logTabPage.TabIndex = 3;
       this.logTabPage.Text = "Log";
@@ -344,4 +359,44 @@
       this.reconnectButton.UseVisualStyleBackColor = true;
       this.reconnectButton.Click += new System.EventHandler(this.reconnectButton_Click);
+      // 
+      // downloadExperimentButton
+      // 
+      this.downloadExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.downloadExperimentButton.Enabled = false;
+      this.downloadExperimentButton.Location = new System.Drawing.Point(2, 123);
+      this.downloadExperimentButton.Name = "downloadExperimentButton";
+      this.downloadExperimentButton.Size = new System.Drawing.Size(725, 24);
+      this.downloadExperimentButton.TabIndex = 17;
+      this.downloadExperimentButton.Text = "Download Experiment";
+      this.toolTip.SetToolTip(this.downloadExperimentButton, "Reconnect to Hive");
+      this.downloadExperimentButton.UseVisualStyleBackColor = true;
+      this.downloadExperimentButton.Click += new System.EventHandler(this.downloadExperimentButton_Click);
+      // 
+      // jobConfigView
+      // 
+      this.jobConfigView.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.jobConfigView.Caption = "JobConfigView";
+      this.jobConfigView.Content = null;
+      this.jobConfigView.Location = new System.Drawing.Point(3, 35);
+      this.jobConfigView.Name = "jobConfigView";
+      this.jobConfigView.ReadOnly = false;
+      this.jobConfigView.Size = new System.Drawing.Size(721, 352);
+      this.jobConfigView.TabIndex = 2;
+      // 
+      // jobItemView
+      // 
+      this.jobItemView.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.jobItemView.Caption = "JobItem View";
+      this.jobItemView.Content = null;
+      this.jobItemView.Location = new System.Drawing.Point(2, 3);
+      this.jobItemView.Name = "jobItemView";
+      this.jobItemView.ReadOnly = true;
+      this.jobItemView.Size = new System.Drawing.Size(722, 384);
+      this.jobItemView.TabIndex = 0;
       // 
       // HiveExperimentView
@@ -380,5 +435,6 @@
       this.tabControl.ResumeLayout(false);
       this.experimentTabPage.ResumeLayout(false);
-      this.hiveStatusTabPage.ResumeLayout(false);
+      this.configurationTabPage.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
       this.runsTabPage.ResumeLayout(false);
       this.logTabPage.ResumeLayout(false);
@@ -397,5 +453,5 @@
     private System.Windows.Forms.TextBox executionTimeTextBox;
     private System.Windows.Forms.Button pauseButton;
-    private System.Windows.Forms.TabPage hiveStatusTabPage;
+    private System.Windows.Forms.TabPage configurationTabPage;
     private System.Windows.Forms.Label resourceIdsLabel;
     private System.Windows.Forms.TextBox resourceIdsTextBox;
@@ -404,5 +460,4 @@
     private System.Windows.Forms.TabPage logTabPage;
     private Core.Views.LogView logView;
-    private JobItemListView jobListView;
     private System.Windows.Forms.Button disconnectButton;
     private System.Windows.Forms.Button reconnectButton;
@@ -411,4 +466,9 @@
     private System.Windows.Forms.TabPage runsTabPage;
     private Optimization.Views.RunCollectionView runCollectionView;
+    private System.Windows.Forms.Button updateJobConfigTreeButton;
+    private System.Windows.Forms.TabPage jobsTabPage;
+    private JobItemView jobItemView;
+    private JobConfigView jobConfigView;
+    private System.Windows.Forms.Button downloadExperimentButton;
 
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs	(revision 4368)
@@ -60,4 +60,5 @@
       Content.ExperimentChanged -= new EventHandler(Content_ExperimentChanged);
       Content.IsResultsPollingChanged -= new EventHandler(Content_IsResultsPollingChanged);
+      Content.RootJobItemChanged -= new EventHandler(Content_RootJobItemChanged);
       base.DeregisterContentEvents();
     }
@@ -74,4 +75,6 @@
       Content.IsResultsPollingChanged += new EventHandler(Content_IsResultsPollingChanged);
       Content.ExperimentChanged += new EventHandler(Content_ExperimentChanged);
+      Content.RootJobChanged += new EventHandler(Content_RootJobChanged);
+      Content.RootJobItemChanged += new EventHandler(Content_RootJobItemChanged);
     }
 
@@ -85,6 +88,7 @@
         experimentNamedItemView.Content = Content.Experiment;
         logView.Content = Content.Log;
-        jobListView.Content = Content.JobItems;
         Content_ExperimentChanged(this, EventArgs.Empty);
+        Content_RootJobChanged(this, EventArgs.Empty);
+        Content_RootJobItemChanged(this, EventArgs.Empty);
       }
     }
@@ -101,17 +105,25 @@
 
     protected override void OnClosed(FormClosedEventArgs e) {
-      if ((Content != null) && (Content.ExecutionState == ExecutionState.Started)) Content.Stop();
+      if (Content != null) {
+        if (Content.IsPollingResults) Content.StopResultPolling();
+      }
       base.OnClosed(e);
     }
 
     private void Content_ExperimentChanged(object sender, EventArgs e) {
-      experimentNamedItemView.Content = Content.Experiment;
-      if (Content.Experiment != null) {
-        runCollectionView.Content = Content.Experiment.Runs;
-        if (Content.ExecutionState == ExecutionState.Stopped) {
-          Content.Prepare();
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExperimentChanged), sender, e);
+      else {
+        experimentNamedItemView.Content = Content.Experiment;
+        if (Content.Experiment != null) {
+          runCollectionView.Content = Content.Experiment.Runs;
+          if (Content.ExecutionState == ExecutionState.Stopped) {
+            Content.Prepare();
+          }
+          Content_RootJobChanged(sender, e);
+          Content_RootJobItemChanged(sender, e);
         }
-      }
-      SetEnabledStateOfControls();
+        SetEnabledStateOfControls();
+      }
     }
 
@@ -173,4 +185,20 @@
         Invoke(new EventHandler(Content_IsResultsPollingChanged), sender, e);
       else {
+        SetEnabledStateOfControls();
+      }
+    }
+    void Content_RootJobChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RootJobChanged), sender, e);
+      else {
+        jobConfigView.Content = Content.RootJob;
+        SetEnabledStateOfControls();
+      }
+    }
+    void Content_RootJobItemChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RootJobItemChanged), sender, e);
+      else {
+        jobItemView.Content = Content.RootJobItem;
         SetEnabledStateOfControls();
       }
@@ -237,5 +265,5 @@
         startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = reconnectButton.Enabled = disconnectButton.Enabled = false;
       } else {
-        startButton.Enabled = Content.ExecutionState == ExecutionState.Prepared;
+        startButton.Enabled = Content.Experiment != null && Content.ExecutionState == ExecutionState.Prepared;
         pauseButton.Enabled = false; // disabled for now
         stopButton.Enabled = Content.ExecutionState == ExecutionState.Started && Content.IsPollingResults;
@@ -245,7 +273,28 @@
 
         this.Locked = Content.ExecutionState == ExecutionState.Started && Content.IsPollingResults;
+        downloadExperimentButton.Enabled = Content.Experiment == null;
       }
     }
     #endregion
+
+    private void updateJobConfigTreeButton_Click(object sender, EventArgs e) {
+      Content.RefreshJobTree();
+    }
+
+    private void downloadExperimentButton_Click(object sender, EventArgs e) {
+      ProgressView progressView = new ProgressView(this, "Downloading Experiment...", true);
+      var invoker = new MethodInvoker(Content.LoadExperimentFromHive);
+      invoker.BeginInvoke((ar) => {
+        try {
+          invoker.EndInvoke(ar); // todo: das hier wird mehrfach aufgerufen... warum?
+        }
+        catch (Exception ex) {
+          throw ex;
+        }
+        finally {
+          progressView.Finish();
+        }
+      }, null);
+    }
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx	(revision 4368)
@@ -160,6 +160,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAAAA
-        CwAB5DetvwAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
         /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
         1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
@@ -170,6 +170,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAAAA
-        CwAB5DetvwAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
         YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
         685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
@@ -183,6 +183,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAAAA
-        CwAB5DetvwAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
         MP3x/9JZj4EWI7yN4oKuDb/+bzr57f/KQ1/+L9jz6f/lBz//965997956RuwIXnTX/zXDV2F2wCQrSsO
         fvk/b9en/7ee/AIp/N+w5M3/0rkv/+dMff4/qffZf1W/RbgNADl5zo5P/x++/AHWDAIls1/+z5ry/H9C
@@ -196,6 +196,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALAAAA
-        CwAB5DetvwAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
         Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
         JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
@@ -203,3 +203,6 @@
 </value>
   </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>25</value>
+  </metadata>
 </root>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.Designer.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.Designer.cs	(revision 4368)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Hive.Experiment.Views {
+  partial class JobConfigListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigListView.cs	(revision 4368)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Hive.JobBase;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  [View("JobConfigListView")]
+  [Content(typeof(IItemList<IJob>), true)]
+  public partial class JobConfigListView : ItemListView<IJob> {
+
+    public JobConfigListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Child Job Configuration";
+    }
+
+    protected override IJob CreateItem() {
+      return null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.addButton.Enabled = false;
+      this.moveDownButton.Enabled = false;
+      this.moveUpButton.Enabled = false;
+      this.removeButton.Enabled = false;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.Designer.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.Designer.cs	(revision 4368)
@@ -0,0 +1,206 @@
+﻿namespace HeuristicLab.Hive.Experiment.Views {
+  partial class JobConfigView {
+    /// <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.coresNeededLabel = new System.Windows.Forms.Label();
+      this.memoryNeededLabel = new System.Windows.Forms.Label();
+      this.memoryNeededTextBox = new System.Windows.Forms.TextBox();
+      this.coresNeededTextBox = new System.Windows.Forms.TextBox();
+      this.optimizerTypeLabel = new System.Windows.Forms.Label();
+      this.optimizerTypeTextBox = new System.Windows.Forms.TextBox();
+      this.computeInParallelCheckBox = new System.Windows.Forms.CheckBox();
+      this.computeInParallelLabel = new System.Windows.Forms.Label();
+      this.jobConfigListView = new HeuristicLab.Hive.Experiment.Views.JobConfigListView();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.configurationTabPage = new System.Windows.Forms.TabPage();
+      this.childJobsTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl.SuspendLayout();
+      this.configurationTabPage.SuspendLayout();
+      this.childJobsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // coresNeededLabel
+      // 
+      this.coresNeededLabel.AutoSize = true;
+      this.coresNeededLabel.Location = new System.Drawing.Point(6, 25);
+      this.coresNeededLabel.Name = "coresNeededLabel";
+      this.coresNeededLabel.Size = new System.Drawing.Size(75, 13);
+      this.coresNeededLabel.TabIndex = 17;
+      this.coresNeededLabel.Text = "CoresNeeded:";
+      // 
+      // memoryNeededLabel
+      // 
+      this.memoryNeededLabel.AutoSize = true;
+      this.memoryNeededLabel.Location = new System.Drawing.Point(6, 47);
+      this.memoryNeededLabel.Name = "memoryNeededLabel";
+      this.memoryNeededLabel.Size = new System.Drawing.Size(85, 13);
+      this.memoryNeededLabel.TabIndex = 18;
+      this.memoryNeededLabel.Text = "MemoryNeeded:";
+      // 
+      // memoryNeededTextBox
+      // 
+      this.memoryNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.memoryNeededTextBox.Location = new System.Drawing.Point(107, 47);
+      this.memoryNeededTextBox.Name = "memoryNeededTextBox";
+      this.memoryNeededTextBox.Size = new System.Drawing.Size(658, 20);
+      this.memoryNeededTextBox.TabIndex = 9;
+      this.memoryNeededTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.memoryNeededTextBox_Validating);
+      this.memoryNeededTextBox.Validated += new System.EventHandler(this.memoryNeededTextBox_Validated);
+      // 
+      // coresNeededTextBox
+      // 
+      this.coresNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.coresNeededTextBox.Location = new System.Drawing.Point(107, 25);
+      this.coresNeededTextBox.Name = "coresNeededTextBox";
+      this.coresNeededTextBox.Size = new System.Drawing.Size(658, 20);
+      this.coresNeededTextBox.TabIndex = 8;
+      this.coresNeededTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.coresNeededTextBox_Validating);
+      this.coresNeededTextBox.Validated += new System.EventHandler(this.coresNeededTextBox_Validated);
+      // 
+      // optimizerTypeLabel
+      // 
+      this.optimizerTypeLabel.AutoSize = true;
+      this.optimizerTypeLabel.Location = new System.Drawing.Point(6, 3);
+      this.optimizerTypeLabel.Name = "optimizerTypeLabel";
+      this.optimizerTypeLabel.Size = new System.Drawing.Size(77, 13);
+      this.optimizerTypeLabel.TabIndex = 19;
+      this.optimizerTypeLabel.Text = "OptimizerType:";
+      // 
+      // optimizerTypeTextBox
+      // 
+      this.optimizerTypeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerTypeTextBox.Location = new System.Drawing.Point(107, 3);
+      this.optimizerTypeTextBox.Name = "optimizerTypeTextBox";
+      this.optimizerTypeTextBox.Size = new System.Drawing.Size(658, 20);
+      this.optimizerTypeTextBox.TabIndex = 20;
+      // 
+      // computeInParallelCheckBox
+      // 
+      this.computeInParallelCheckBox.AutoSize = true;
+      this.computeInParallelCheckBox.Location = new System.Drawing.Point(107, 74);
+      this.computeInParallelCheckBox.Name = "computeInParallelCheckBox";
+      this.computeInParallelCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.computeInParallelCheckBox.TabIndex = 21;
+      this.computeInParallelCheckBox.UseVisualStyleBackColor = true;
+      this.computeInParallelCheckBox.CheckedChanged += new System.EventHandler(this.computeInParallelCheckBox_CheckedChanged);
+      // 
+      // computeInParallelLabel
+      // 
+      this.computeInParallelLabel.AutoSize = true;
+      this.computeInParallelLabel.Location = new System.Drawing.Point(6, 74);
+      this.computeInParallelLabel.Name = "computeInParallelLabel";
+      this.computeInParallelLabel.Size = new System.Drawing.Size(95, 13);
+      this.computeInParallelLabel.TabIndex = 22;
+      this.computeInParallelLabel.Text = "ComputeInParallel:";
+      // 
+      // jobConfigListView
+      // 
+      this.jobConfigListView.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.jobConfigListView.Caption = "JobConfigListView";
+      this.jobConfigListView.Content = null;
+      this.jobConfigListView.Location = new System.Drawing.Point(3, 3);
+      this.jobConfigListView.Name = "jobConfigListView";
+      this.jobConfigListView.ReadOnly = false;
+      this.jobConfigListView.Size = new System.Drawing.Size(762, 387);
+      this.jobConfigListView.TabIndex = 23;
+      // 
+      // 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.configurationTabPage);
+      this.tabControl.Controls.Add(this.childJobsTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(776, 419);
+      this.tabControl.TabIndex = 24;
+      // 
+      // configurationTabPage
+      // 
+      this.configurationTabPage.Controls.Add(this.optimizerTypeLabel);
+      this.configurationTabPage.Controls.Add(this.coresNeededLabel);
+      this.configurationTabPage.Controls.Add(this.computeInParallelLabel);
+      this.configurationTabPage.Controls.Add(this.memoryNeededLabel);
+      this.configurationTabPage.Controls.Add(this.computeInParallelCheckBox);
+      this.configurationTabPage.Controls.Add(this.memoryNeededTextBox);
+      this.configurationTabPage.Controls.Add(this.optimizerTypeTextBox);
+      this.configurationTabPage.Controls.Add(this.coresNeededTextBox);
+      this.configurationTabPage.Location = new System.Drawing.Point(4, 22);
+      this.configurationTabPage.Name = "configurationTabPage";
+      this.configurationTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.configurationTabPage.Size = new System.Drawing.Size(768, 393);
+      this.configurationTabPage.TabIndex = 0;
+      this.configurationTabPage.Text = "Configuration";
+      this.configurationTabPage.UseVisualStyleBackColor = true;
+      // 
+      // childJobsTabPage
+      // 
+      this.childJobsTabPage.Controls.Add(this.jobConfigListView);
+      this.childJobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.childJobsTabPage.Name = "childJobsTabPage";
+      this.childJobsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.childJobsTabPage.Size = new System.Drawing.Size(768, 393);
+      this.childJobsTabPage.TabIndex = 1;
+      this.childJobsTabPage.Text = "Child Jobs";
+      this.childJobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // JobConfigView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "JobConfigView";
+      this.Size = new System.Drawing.Size(782, 425);
+      this.tabControl.ResumeLayout(false);
+      this.configurationTabPage.ResumeLayout(false);
+      this.configurationTabPage.PerformLayout();
+      this.childJobsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label coresNeededLabel;
+    private System.Windows.Forms.Label memoryNeededLabel;
+    private System.Windows.Forms.TextBox memoryNeededTextBox;
+    private System.Windows.Forms.TextBox coresNeededTextBox;
+    private System.Windows.Forms.Label optimizerTypeLabel;
+    private System.Windows.Forms.TextBox optimizerTypeTextBox;
+    private System.Windows.Forms.CheckBox computeInParallelCheckBox;
+    private System.Windows.Forms.Label computeInParallelLabel;
+    private JobConfigListView jobConfigListView;
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.TabPage configurationTabPage;
+    private System.Windows.Forms.TabPage childJobsTabPage;
+
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.cs	(revision 4368)
@@ -0,0 +1,116 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Persistence.Default.Xml;
+using System.IO;
+using HeuristicLab.Hive.Experiment.Jobs;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  [View("JobConfigView")]
+  [Content(typeof(IJob), true)]
+  public partial class JobConfigView : ItemView {
+    public new IJob Content {
+      get { return (IJob)base.Content; }
+      set {
+        if (base.Content != value) {
+          base.Content = value;
+        }
+      }
+    }
+
+    public JobConfigView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        this.optimizerTypeTextBox.Text = Content.Name;
+        this.memoryNeededTextBox.Text = Content.MemoryNeeded.ToString();
+        this.coresNeededTextBox.Text = Content.CoresNeeded.ToString();
+        this.computeInParallelCheckBox.Checked = Content.ComputeInParallel;
+        this.jobConfigListView.Content = new JobList(Content.ChildJobs);
+        SetEnabledStateOfControls();
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      if (InvokeRequired) {
+        this.InvokeIfRequired(c => { SetEnabledStateOfControls(); });
+      } else {
+        base.SetEnabledStateOfControls();
+        this.optimizerTypeTextBox.ReadOnly = true;
+        this.computeInParallelCheckBox.Enabled = this.ReadOnly;
+        this.coresNeededTextBox.ReadOnly = this.ReadOnly;
+        this.memoryNeededTextBox.ReadOnly = this.ReadOnly;
+
+        if (Content != null) {
+          if (Content.IsParallelizable) {
+            this.computeInParallelCheckBox.Enabled = true;
+          } else {
+            this.computeInParallelCheckBox.Enabled = false;
+            this.computeInParallelCheckBox.Checked = false;
+          }
+        }
+
+        if (this.computeInParallelCheckBox.Checked) {
+          if (!tabControl.TabPages.ContainsKey(childJobsTabPage.Name)) {
+            tabControl.TabPages.Add(childJobsTabPage);
+          }
+        } else {
+          if (tabControl.TabPages.ContainsKey(childJobsTabPage.Name)) {
+            tabControl.TabPages.Remove(childJobsTabPage);
+          }
+        }
+      }
+    }
+
+    private void UpdateContent(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(UpdateContent), sender, e);
+      else {
+        if (Content != null) {
+          Content.CoresNeeded = int.Parse(this.coresNeededTextBox.Text);
+          Content.MemoryNeeded = int.Parse(this.memoryNeededTextBox.Text);
+          Content.ComputeInParallel = computeInParallelCheckBox.Checked;
+        }
+      }
+    }
+    
+    private void coresNeededTextBox_Validated(object sender, EventArgs e) {
+      UpdateContent(sender, e);
+    }
+
+    private void coresNeededTextBox_Validating(object sender, CancelEventArgs e) {
+    }
+
+    private void memoryNeededTextBox_Validated(object sender, EventArgs e) {
+      UpdateContent(sender, e);
+    }
+
+    private void memoryNeededTextBox_Validating(object sender, CancelEventArgs e) {
+    }
+
+    void computeInParallelCheckBox_CheckedChanged(object sender, System.EventArgs e) {
+      UpdateContent(sender, e);
+      SetEnabledStateOfControls();
+    }
+
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.resx
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.resx	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobConfigView.resx	(revision 4368)
@@ -0,0 +1,120 @@
+﻿<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs	(revision 4368)
@@ -44,11 +44,4 @@
       this.exceptionLabel = new System.Windows.Forms.Label();
       this.projectLabel = new System.Windows.Forms.Label();
-      this.snapshotGroupBox = new System.Windows.Forms.GroupBox();
-      this.requestSnapshotButton = new System.Windows.Forms.Button();
-      this.openSnapshotButton = new System.Windows.Forms.Button();
-      this.snapshotTimeText = new System.Windows.Forms.TextBox();
-      this.snapshotStatusText = new System.Windows.Forms.TextBox();
-      this.snapshotTimeLabel = new System.Windows.Forms.Label();
-      this.snapshotStatusLabel = new System.Windows.Forms.Label();
       this.dateCalculatedText = new System.Windows.Forms.TextBox();
       this.dateCalculatedLabel = new System.Windows.Forms.Label();
@@ -59,11 +52,16 @@
       this.jobIdLabel = new System.Windows.Forms.Label();
       this.jobIdTextBox = new System.Windows.Forms.TextBox();
+      this.childJobsTabPage = new System.Windows.Forms.TabPage();
+      this.childJobItemListView = new HeuristicLab.Hive.Experiment.Views.JobItemListView();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
-      this.snapshotGroupBox.SuspendLayout();
+      this.resultTabPage = new System.Windows.Forms.TabPage();
+      this.getLatestResultButton = new System.Windows.Forms.Button();
       this.jobStatusGroupBox.SuspendLayout();
       this.tabControl.SuspendLayout();
       this.detailsTabPage.SuspendLayout();
+      this.childJobsTabPage.SuspendLayout();
       this.logTabPage.SuspendLayout();
+      this.resultTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -245,80 +243,4 @@
       this.projectLabel.TabIndex = 20;
       this.projectLabel.Text = "Project:";
-      // 
-      // snapshotGroupBox
-      // 
-      this.snapshotGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.snapshotGroupBox.Controls.Add(this.requestSnapshotButton);
-      this.snapshotGroupBox.Controls.Add(this.openSnapshotButton);
-      this.snapshotGroupBox.Controls.Add(this.snapshotTimeText);
-      this.snapshotGroupBox.Controls.Add(this.snapshotStatusText);
-      this.snapshotGroupBox.Controls.Add(this.snapshotTimeLabel);
-      this.snapshotGroupBox.Controls.Add(this.snapshotStatusLabel);
-      this.snapshotGroupBox.Location = new System.Drawing.Point(6, 310);
-      this.snapshotGroupBox.Name = "snapshotGroupBox";
-      this.snapshotGroupBox.Size = new System.Drawing.Size(610, 100);
-      this.snapshotGroupBox.TabIndex = 21;
-      this.snapshotGroupBox.TabStop = false;
-      this.snapshotGroupBox.Text = "Latest Snapshot";
-      this.snapshotGroupBox.Visible = false;
-      // 
-      // requestSnapshotButton
-      // 
-      this.requestSnapshotButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.requestSnapshotButton.Location = new System.Drawing.Point(384, 67);
-      this.requestSnapshotButton.Name = "requestSnapshotButton";
-      this.requestSnapshotButton.Size = new System.Drawing.Size(107, 26);
-      this.requestSnapshotButton.TabIndex = 26;
-      this.requestSnapshotButton.Text = "Request Snapshot";
-      this.requestSnapshotButton.UseVisualStyleBackColor = true;
-      this.requestSnapshotButton.Click += new System.EventHandler(this.requestSnapshotButton_Click);
-      // 
-      // openSnapshotButton
-      // 
-      this.openSnapshotButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
-      this.openSnapshotButton.Location = new System.Drawing.Point(497, 67);
-      this.openSnapshotButton.Name = "openSnapshotButton";
-      this.openSnapshotButton.Size = new System.Drawing.Size(107, 26);
-      this.openSnapshotButton.TabIndex = 25;
-      this.openSnapshotButton.Text = "Open Snapshot";
-      this.openSnapshotButton.UseVisualStyleBackColor = true;
-      this.openSnapshotButton.Click += new System.EventHandler(this.openSnapshotButton_Click);
-      // 
-      // snapshotTimeText
-      // 
-      this.snapshotTimeText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.snapshotTimeText.Location = new System.Drawing.Point(45, 41);
-      this.snapshotTimeText.Name = "snapshotTimeText";
-      this.snapshotTimeText.Size = new System.Drawing.Size(559, 20);
-      this.snapshotTimeText.TabIndex = 24;
-      // 
-      // snapshotStatusText
-      // 
-      this.snapshotStatusText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.snapshotStatusText.Location = new System.Drawing.Point(45, 19);
-      this.snapshotStatusText.Name = "snapshotStatusText";
-      this.snapshotStatusText.Size = new System.Drawing.Size(559, 20);
-      this.snapshotStatusText.TabIndex = 23;
-      // 
-      // snapshotTimeLabel
-      // 
-      this.snapshotTimeLabel.AutoSize = true;
-      this.snapshotTimeLabel.Location = new System.Drawing.Point(6, 41);
-      this.snapshotTimeLabel.Name = "snapshotTimeLabel";
-      this.snapshotTimeLabel.Size = new System.Drawing.Size(33, 13);
-      this.snapshotTimeLabel.TabIndex = 22;
-      this.snapshotTimeLabel.Text = "Time:";
-      // 
-      // snapshotStatusLabel
-      // 
-      this.snapshotStatusLabel.AutoSize = true;
-      this.snapshotStatusLabel.Location = new System.Drawing.Point(6, 19);
-      this.snapshotStatusLabel.Name = "snapshotStatusLabel";
-      this.snapshotStatusLabel.Size = new System.Drawing.Size(40, 13);
-      this.snapshotStatusLabel.TabIndex = 21;
-      this.snapshotStatusLabel.Text = "Status:";
       // 
       // dateCalculatedText
@@ -379,5 +301,7 @@
                   | System.Windows.Forms.AnchorStyles.Right)));
       this.tabControl.Controls.Add(this.detailsTabPage);
+      this.tabControl.Controls.Add(this.childJobsTabPage);
       this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Controls.Add(this.resultTabPage);
       this.tabControl.Location = new System.Drawing.Point(3, 3);
       this.tabControl.Name = "tabControl";
@@ -393,5 +317,4 @@
       this.detailsTabPage.Controls.Add(this.jobStatusGroupBox);
       this.detailsTabPage.Controls.Add(this.userIdTextBox);
-      this.detailsTabPage.Controls.Add(this.snapshotGroupBox);
       this.detailsTabPage.Controls.Add(this.priorityTextBox);
       this.detailsTabPage.Controls.Add(this.projectLabel);
@@ -428,4 +351,27 @@
       this.jobIdTextBox.TabIndex = 26;
       // 
+      // childJobsTabPage
+      // 
+      this.childJobsTabPage.Controls.Add(this.childJobItemListView);
+      this.childJobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.childJobsTabPage.Name = "childJobsTabPage";
+      this.childJobsTabPage.Size = new System.Drawing.Size(619, 492);
+      this.childJobsTabPage.TabIndex = 2;
+      this.childJobsTabPage.Text = "Child Jobs";
+      this.childJobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // childJobItemListView
+      // 
+      this.childJobItemListView.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.childJobItemListView.Caption = "JobItemList View";
+      this.childJobItemListView.Content = null;
+      this.childJobItemListView.Location = new System.Drawing.Point(3, 3);
+      this.childJobItemListView.Name = "childJobItemListView";
+      this.childJobItemListView.ReadOnly = false;
+      this.childJobItemListView.Size = new System.Drawing.Size(613, 486);
+      this.childJobItemListView.TabIndex = 0;
+      // 
       // logTabPage
       // 
@@ -449,6 +395,25 @@
       this.logView.Name = "logView";
       this.logView.ReadOnly = false;
-      this.logView.Size = new System.Drawing.Size(536, 447);
+      this.logView.Size = new System.Drawing.Size(613, 486);
       this.logView.TabIndex = 0;
+      // 
+      // resultTabPage
+      // 
+      this.resultTabPage.Controls.Add(this.getLatestResultButton);
+      this.resultTabPage.Location = new System.Drawing.Point(4, 22);
+      this.resultTabPage.Name = "resultTabPage";
+      this.resultTabPage.Size = new System.Drawing.Size(619, 492);
+      this.resultTabPage.TabIndex = 3;
+      this.resultTabPage.Text = "Result";
+      this.resultTabPage.UseVisualStyleBackColor = true;
+      // 
+      // getLatestResultButton
+      // 
+      this.getLatestResultButton.Location = new System.Drawing.Point(4, 4);
+      this.getLatestResultButton.Name = "getLatestResultButton";
+      this.getLatestResultButton.Size = new System.Drawing.Size(112, 23);
+      this.getLatestResultButton.TabIndex = 0;
+      this.getLatestResultButton.Text = "Get latest result";
+      this.getLatestResultButton.UseVisualStyleBackColor = true;
       // 
       // JobItemView
@@ -459,6 +424,4 @@
       this.Name = "JobItemView";
       this.Size = new System.Drawing.Size(633, 524);
-      this.snapshotGroupBox.ResumeLayout(false);
-      this.snapshotGroupBox.PerformLayout();
       this.jobStatusGroupBox.ResumeLayout(false);
       this.jobStatusGroupBox.PerformLayout();
@@ -466,5 +429,7 @@
       this.detailsTabPage.ResumeLayout(false);
       this.detailsTabPage.PerformLayout();
+      this.childJobsTabPage.ResumeLayout(false);
       this.logTabPage.ResumeLayout(false);
+      this.resultTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -493,10 +458,4 @@
     private System.Windows.Forms.Label exceptionLabel;
     private System.Windows.Forms.Label projectLabel;
-    private System.Windows.Forms.GroupBox snapshotGroupBox;
-    private System.Windows.Forms.Button openSnapshotButton;
-    private System.Windows.Forms.TextBox snapshotTimeText;
-    private System.Windows.Forms.TextBox snapshotStatusText;
-    private System.Windows.Forms.Label snapshotTimeLabel;
-    private System.Windows.Forms.Label snapshotStatusLabel;
     private System.Windows.Forms.TextBox dateCalculatedText;
     private System.Windows.Forms.Label dateCalculatedLabel;
@@ -507,7 +466,10 @@
     private System.Windows.Forms.TabPage logTabPage;
     private Core.Views.LogView logView;
-    private System.Windows.Forms.Button requestSnapshotButton;
     private System.Windows.Forms.Label jobIdLabel;
     private System.Windows.Forms.TextBox jobIdTextBox;
+    private System.Windows.Forms.TabPage childJobsTabPage;
+    private JobItemListView childJobItemListView;
+    private System.Windows.Forms.TabPage resultTabPage;
+    private System.Windows.Forms.Button getLatestResultButton;
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs	(revision 4368)
@@ -12,4 +12,5 @@
 using HeuristicLab.Persistence.Default.Xml;
 using System.IO;
+using HeuristicLab.Hive.Experiment.Jobs;
 
 namespace HeuristicLab.Hive.Experiment.Views {
@@ -28,5 +29,4 @@
     public JobItemView() {
       InitializeComponent();
-      this.ReadOnly = true;
     }
 
@@ -34,11 +34,14 @@
       base.OnContentChanged();
       if (Content != null) {
-        logView.Content = Content.Log;
+        Content_JobChanged(this, EventArgs.Empty);
+        Content_ChildJobAdded(this, EventArgs.Empty);
+      }
+    }
+
+    void Content_JobChanged(object sender, EventArgs e) {
+      if (Content.Job != null) {
+        logView.Content = Content.Job.Log;
         Content_JobDtoChanged(this, EventArgs.Empty);
         Content_JobStateChanged(this, EventArgs.Empty);
-        if (Content.LatestSnapshot != null) {
-          snapshotStatusText.InvokeIfRequired(c => c.Text = Content.LatestSnapshot.StatusMessage.ToString());
-          snapshotTimeText.InvokeIfRequired(c => { c.Text = Content.LatestSnapshotTime.ToString(); });
-        }
       }
     }
@@ -46,15 +49,15 @@
     protected override void RegisterContentEvents() {
       base.RegisterContentEvents();
-      Content.LatestSnapshotChanged += new EventHandler(Content_LatestSnapshotChanged);
+      Content.JobChanged += new EventHandler(Content_JobChanged);
       Content.JobDtoChanged += new EventHandler(Content_JobDtoChanged);
       Content.JobStateChanged += new EventHandler(Content_JobStateChanged);
-      Content.SnapshotRequestedStateChanged += new EventHandler(Content_SnapshotRequestedStateChanged);
+      Content.ChildJobAdded += new EventHandler(Content_ChildJobAdded);
     }
 
     protected override void DeregisterContentEvents() {
-      Content.LatestSnapshotChanged -= new EventHandler(Content_LatestSnapshotChanged);
+      Content.JobChanged -= new EventHandler(Content_JobChanged);
       Content.JobDtoChanged -= new EventHandler(Content_JobDtoChanged);
       Content.JobStateChanged -= new EventHandler(Content_JobStateChanged);
-      Content.SnapshotRequestedStateChanged -= new EventHandler(Content_SnapshotRequestedStateChanged);
+      Content.ChildJobAdded -= new EventHandler(Content_ChildJobAdded);
       base.DeregisterContentEvents();
     }
@@ -77,25 +80,18 @@
         Invoke(new EventHandler(Content_JobStateChanged), sender, e);
       } else {
-        this.stateTextBox.Text = Content.State.ToString();
-        this.percentageTextBox.Text = (Content.Percentage * 100).ToString() + "%";
-        this.percentageProgressBar.Value = Convert.ToInt32(Content.Percentage * percentageProgressBar.Maximum);
-        this.dateCalculatedText.Text = Content.DateCalculated.ToString();
-        this.dateFinishedTextBox.Text = Content.DateFinished.ToString();
-        this.exceptionTextBox.Text = Content.Exception;
+        this.stateTextBox.Text = Content.JobDto.State.ToString();
+        this.percentageTextBox.Text = (Content.JobDto.Percentage * 100).ToString() + "%";
+        this.percentageProgressBar.Value = Convert.ToInt32(Content.JobDto.Percentage * percentageProgressBar.Maximum);
+        this.dateCalculatedText.Text = Content.JobDto.DateCalculated.ToString();
+        this.dateFinishedTextBox.Text = Content.JobDto.DateFinished.ToString();
+        this.exceptionTextBox.Text = Content.JobDto.Exception;
       }
     }
 
-    void Content_LatestSnapshotChanged(object sender, EventArgs e) {
+    void Content_ChildJobAdded(object sender, EventArgs e) {
       if (InvokeRequired) {
-        Invoke(new EventHandler(Content_LatestSnapshotChanged), sender, e);
+        Invoke(new EventHandler(Content_ChildJobAdded), sender, e);
       } else {
-        if (Content.LatestSnapshot != null) {
-          snapshotStatusText.Text = Content.LatestSnapshot.StatusMessage.ToString();
-          snapshotTimeText.Text = Content.LatestSnapshotTime.ToString();
-        } else {
-          snapshotStatusText.Text = "";
-          snapshotTimeText.Text = "";
-        }
-        SetEnabledStateOfControls();
+        childJobItemListView.Content = new JobItemList(Content.ChildJobItems);
       }
     }
@@ -106,8 +102,4 @@
       } else {
         base.SetEnabledStateOfControls();
-        if (Content != null) {
-          openSnapshotButton.Enabled = Content.LatestSnapshot != null && Content.SnapshotRequestedState == SnapshotRequestedState.Idle;
-          requestSnapshotButton.Enabled = Content.SnapshotRequestedState == SnapshotRequestedState.Idle;
-        }
         this.jobIdTextBox.ReadOnly = this.ReadOnly;
         this.stateTextBox.ReadOnly = this.ReadOnly;
@@ -122,20 +114,5 @@
         this.exceptionTextBox.ReadOnly = this.ReadOnly;
         this.projectTextBox.ReadOnly = this.ReadOnly;
-        this.snapshotStatusText.ReadOnly = this.ReadOnly;
-        this.snapshotTimeText.ReadOnly = this.ReadOnly;
       }
-    }
-
-    private void openSnapshotButton_Click(object sender, EventArgs e) {
-      OptimizerJob job = XmlParser.Deserialize<OptimizerJob>(new MemoryStream(Content.LatestSnapshot.Obj.SerializedJobData));
-      MainFormManager.MainForm.ShowContent(job.Optimizer);
-    }
-
-    private void requestSnapshotButton_Click(object sender, EventArgs e) {
-      this.Content.RequestSnapshot();
-    }
-
-    private void Content_SnapshotRequestedStateChanged(object sender, EventArgs e) {
-      SetEnabledStateOfControls();
     }
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.Designer.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.Designer.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.Designer.cs	(revision 4368)
@@ -0,0 +1,96 @@
+﻿using HeuristicLab.MainForm.WindowsForms;
+namespace HeuristicLab.Hive.Experiment.Views {
+  partial class ProgressView : View {
+    /// <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.progressBar = new System.Windows.Forms.ProgressBar();
+      this.statusLabel = new System.Windows.Forms.Label();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.panel = new System.Windows.Forms.Panel();
+      this.panel.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // progressBar
+      // 
+      this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.progressBar.Location = new System.Drawing.Point(3, 3);
+      this.progressBar.Name = "progressBar";
+      this.progressBar.Size = new System.Drawing.Size(352, 23);
+      this.progressBar.Style = System.Windows.Forms.ProgressBarStyle.Continuous;
+      this.progressBar.TabIndex = 0;
+      // 
+      // statusLabel
+      // 
+      this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statusLabel.Location = new System.Drawing.Point(3, 33);
+      this.statusLabel.Name = "statusLabel";
+      this.statusLabel.Size = new System.Drawing.Size(352, 17);
+      this.statusLabel.TabIndex = 1;
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.Location = new System.Drawing.Point(280, 53);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 2;
+      this.cancelButton.Text = "Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      this.cancelButton.Click += new System.EventHandler(this.cancelButton_Click);
+      // 
+      // panel
+      // 
+      this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+      this.panel.Controls.Add(this.progressBar);
+      this.panel.Controls.Add(this.cancelButton);
+      this.panel.Controls.Add(this.statusLabel);
+      this.panel.Location = new System.Drawing.Point(0, 0);
+      this.panel.Name = "panel";
+      this.panel.Size = new System.Drawing.Size(360, 88);
+      this.panel.TabIndex = 3;
+      // 
+      // ProgressView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.panel);
+      this.Name = "ProgressView";
+      this.Size = new System.Drawing.Size(360, 88);
+      this.panel.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ProgressBar progressBar;
+    private System.Windows.Forms.Label statusLabel;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Panel panel;
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.cs	(revision 4368)
@@ -0,0 +1,130 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using HeuristicLab.MainForm.WindowsForms;
+using System.Windows.Forms;
+using System.Diagnostics;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  public partial class ProgressView : HeuristicLab.MainForm.WindowsForms.View {
+    private ContentView parentView = null;
+    private bool simulateProgress = false;
+
+    public bool CancelEnabled {
+      get {
+        return cancelButton.Visible;
+      }
+      set {
+        if (InvokeRequired) {
+          Invoke(new Action<bool>((ce) => { CancelEnabled = ce; }), value);
+        } else {
+          cancelButton.Visible = value;
+        }
+      }
+    }
+
+    private string status;
+    public string Status {
+      get { return status; }
+      set {
+        if (InvokeRequired) {
+          Invoke(new Action<string>((s) => { Status = s;}), value);
+        } else {
+          status = value;
+          statusLabel.Text = status;
+        }
+        
+      }
+    }
+
+    public ProgressView(ContentView parentView)
+      : this(parentView, "", false, true) {
+    }
+
+    public ProgressView(ContentView parentView, string initialStatus)
+      : this(parentView, initialStatus, false, true) {
+    }
+
+    public ProgressView(ContentView parentView, string initialStatus, bool simulateProgress)
+      : this(parentView, initialStatus, simulateProgress, true) {
+    }
+
+    /// <param name="parentView">This is the View which will be locked if lockParentView is true</param>
+    /// <param name="initialStatus">Status message</param>
+    /// <param name="simulateProgress">If true, the progress will be simulated by a timer which addes some progress every second</param>
+    /// <param name="lockParentView">if true parentView will be locked</param>
+    public ProgressView(ContentView parentView, string initialStatus, bool simulateProgress, bool lockParentView) {
+      InitializeComponent();
+      this.parentView = parentView;
+      this.CancelEnabled = false;
+      this.Status = initialStatus;
+      this.simulateProgress = simulateProgress;
+
+      if (simulateProgress) {
+        Timer progressSimulator = new Timer();
+        progressSimulator.Interval = 2000;
+        progressSimulator.Tick += new EventHandler(progressSimulator_Tick);
+        progressSimulator.Start();
+      }
+
+      this.Left = (parentView.ClientRectangle.Width / 2) - (this.Width / 2);
+      this.Top = (parentView.ClientRectangle.Height / 2) - (this.Height / 2);
+      this.Anchor = AnchorStyles.Left | AnchorStyles.Top;
+
+      if (lockParentView)
+        LockBackground();
+
+      parentView.Controls.Add(this);
+      this.BringToFront();
+    }
+
+    private void progressSimulator_Tick(object sender, EventArgs e) {
+      progressBar.Value = Math.Min(progressBar.Value + (progressBar.Maximum - progressBar.Value) / 10 + 1, progressBar.Maximum - 1);
+    }
+
+    private void LockBackground() {
+      this.parentView.Locked = true;
+      foreach (Control c in this.parentView.Controls) {
+        c.Enabled = false;
+      }
+      this.Enabled = true;
+      this.ReadOnly = false;
+    }
+
+    public void SetProgress(double progress) {
+      if (InvokeRequired) {
+        Invoke(new Action<double>(SetProgress), progress);
+      } else {
+        this.progressBar.Value = Math.Max(this.progressBar.Value, (int)(progress * progressBar.Maximum));
+      }
+    }
+
+    public void Finish() {
+      if (InvokeRequired) {
+        Invoke(new Action(Finish));
+      } else {
+        progressBar.Value = progressBar.Maximum;
+        parentView.Locked = false;
+        foreach (Control c in this.parentView.Controls) {
+          c.Enabled = true;
+        }
+        parentView.Controls.Remove(this);
+        this.Dispose();
+      }
+    }
+
+    private void cancelButton_Click(object sender, EventArgs e) {
+      Finish();
+    }
+
+    public event EventHandler Canceled;
+    protected virtual void OnCanceled() {
+      var handler = Canceled;
+      if (handler != null) Canceled(this, EventArgs.Empty);
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.resx
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.resx	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/ProgressView.resx	(revision 4368)
@@ -0,0 +1,120 @@
+﻿<?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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj	(revision 4368)
@@ -17,5 +17,5 @@
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <PlatformTarget>AnyCPU</PlatformTarget>
+    <PlatformTarget>x64</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugType>full</DebugType>
@@ -53,4 +53,29 @@
   <PropertyGroup>
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Hive.Experiment-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Hive.Experiment-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
   </PropertyGroup>
   <ItemGroup>
@@ -93,7 +118,12 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="JobItem.cs" />
     <Compile Include="JobItemList.cs" />
-    <Compile Include="JobItem.cs" />
-    <Compile Include="OptimizerJob.cs" />
+    <Compile Include="Jobs\BachRunJob.cs" />
+    <Compile Include="Jobs\JobList.cs" />
+    <Compile Include="Jobs\ExperimentJob.cs" />
+    <Compile Include="HiveClient.cs" />
+    <Compile Include="HiveExperimentList.cs" />
+    <Compile Include="Jobs\OptimizerJob.cs" />
     <Compile Include="HeuristicLabHiveExperimentPlugin.cs" />
     <Compile Include="HiveExperiment.cs" />
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveClient.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveClient.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveClient.cs	(revision 4368)
@@ -0,0 +1,136 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.Contracts.Interfaces;
+using HeuristicLab.Hive.Contracts.ResponseObjects;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Experiment.Properties;
+using System.ServiceModel;
+using HeuristicLab.Hive.Contracts;
+
+namespace HeuristicLab.Hive.Experiment {
+  [Item("Hive Client", "Connects to Hive and lists all submitted experiments by the current user.")]
+  [Creatable("Hive")]
+  public class HiveClient : Item {
+    private static object locker = new object();
+
+    private ILog log;
+    public ILog Log {
+      get { return log; }
+    }
+
+    private HiveExperimentList hiveExperiments;
+    public HiveExperimentList HiveExperiments {
+      get { return hiveExperiments; }
+      set {
+        if (hiveExperiments != value) {
+          if (hiveExperiments != null) {
+            DeRegisterHiveExperimentsEvents();
+          }
+          hiveExperiments = value;
+          RegisterHiveExperimentsEvent();
+          OnHiveExperimentsChanged();
+        }
+      }
+    }
+
+    private void RegisterHiveExperimentsEvent() {
+      hiveExperiments.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsAdded);
+      hiveExperiments.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsRemoved);
+      hiveExperiments.ItemsMoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsMoved);
+    }
+
+    private void DeRegisterHiveExperimentsEvents() {
+      hiveExperiments.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsAdded);
+      hiveExperiments.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsRemoved);
+      hiveExperiments.ItemsMoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<HiveExperiment>>(hiveExperiments_ItemsMoved);
+
+    }
+
+    public HiveClient() {
+      this.log = new Log();
+      this.HiveExperiments = new HiveExperimentList();
+    }
+
+
+    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      HiveClient clone = (HiveClient)base.Clone(cloner);
+      clone.log = (ILog)cloner.Clone(this.log);
+      clone.hiveExperiments = (HiveExperimentList)cloner.Clone(this.hiveExperiments);
+      return clone;
+    }
+
+    public void UpdateExperimentList() {
+      //IClientFacade client = CreateClientFacade();
+      using (Disposable<IClientFacade> service = ServiceLocator.Instance.ClientFacadePool.GetService()) {
+        ResponseObject<JobResultList> response = service.Obj.GetChildJobResults(null, false, false);
+        RefreshExperimentList(response.Obj);
+      }
+      //ServiceLocator.DisposeClientFacade(client);
+    }
+
+    private void RefreshExperimentList(JobResultList jobResultList) {
+      foreach (JobResult jobResult in jobResultList) {
+        HiveExperiment hiveExperiment = GetHiveExperiment(jobResult);
+        if (hiveExperiment == null) {
+          // create new
+          hiveExperiment = new HiveExperiment() { RootJobItem = new JobItem(jobResult) };
+          this.hiveExperiments.Add(hiveExperiment);
+        } else {
+          // update
+          //hiveExperiment.RootJob.UpdateJob(jobResult);
+        }
+      }
+    }
+
+    private HiveExperiment GetHiveExperiment(JobResult jobResult) {
+      //var matches = this.hiveExperiments.Where(exp => exp.RootJob != null && exp.RootJob.JobDto.Id == jobResult.JobId);
+      //if (matches.Count() == 0) {
+      //  return null;
+      //} else {
+      //  return matches.First();
+      //}
+      return null;
+    }
+
+    //private IClientFacade CreateClientFacade() {
+    //  IClientFacade clientFacade = null;
+    //  try {
+    //    clientFacade = ServiceLocator.CreateClientFacade(Settings.Default.HiveServerIp);
+    //  }
+    //  catch (EndpointNotFoundException exception) {
+    //    LogMessage("Could not connect to Server: " + exception.Message);
+    //  }
+    //  return clientFacade;
+    //}
+
+    private void LogMessage(string message) {
+      // HeuristicLab.Log is not Thread-Safe, so lock on every call
+      lock (locker) {
+        log.LogMessage(message);
+      }
+    }
+
+    public event EventHandler HiveExperimentsChanged;
+    private void OnHiveExperimentsChanged() {
+      var handler = HiveExperimentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    void hiveExperiments_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<HiveExperiment>> e) {
+      
+    }
+
+    void hiveExperiments_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<HiveExperiment>> e) {
+      
+    }
+
+    void hiveExperiments_ItemsMoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<HiveExperiment>> e) {
+      
+    }
+
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs	(revision 4368)
@@ -45,4 +45,5 @@
 using HeuristicLab.Hive.Experiment.Properties;
 using System.ComponentModel;
+using HeuristicLab.Hive.Experiment.Jobs;
 
 namespace HeuristicLab.Hive.Experiment {
@@ -51,5 +52,4 @@
   /// </summary>
   [Item(itemName, itemDescription)]
-  [Creatable("Testing & Analysis")]
   [StorableClass]
   public class HiveExperiment : NamedItem, IExecutable {
@@ -63,5 +63,4 @@
     private System.Timers.Timer timer;
     private bool pausePending, stopPending;
-    private bool sendingJobsFinished = false;
 
     // ensure that only 2 threads can fetch jobresults simultaniously
@@ -98,26 +97,5 @@
     [Storable]
     private DateTime lastUpdateTime;
-
-    /// <summary>
-    /// Mapping from JobId to an optimizer.
-    /// Stores all pending optimizers. If an optimizer is finished it is removed from this collection
-    /// </summary>
-    [Storable]
-    private IDictionary<Guid, IOptimizer> pendingOptimizersByJobId = new Dictionary<Guid, IOptimizer>();
-
-    /// <summary>
-    /// Stores a mapping from the child-optimizer to the parent optimizer.
-    /// Needed to replace a finished optimizer in the optimizer-tree.
-    /// Only pending optmizers are stored.
-    /// </summary>
-    [Storable]
-    private IDictionary<IOptimizer, IOptimizer> parentOptimizersByPendingOptimizer = new Dictionary<IOptimizer, IOptimizer>();
-
-    [Storable]
-    private JobItemList jobItems;
-    public JobItemList JobItems {
-      get { return jobItems; }
-    }
-
+    
     [Storable]
     private string resourceIds;
@@ -173,4 +151,40 @@
       }
     }
+
+    [Storable]
+    private IJob rootJob;
+    public IJob RootJob {
+      get { return rootJob; }
+      set {
+        if (rootJob != value) {
+          rootJob = value;
+          OnRootJobChanged();
+        }
+      }
+    }
+
+    private JobItem rootJobItem;
+    public JobItem RootJobItem {
+      get { return rootJobItem; }
+      set {
+        if (rootJobItem != null) {
+          DeregisterRootJobItemEvents();
+        }
+        if (rootJobItem != value) {
+          rootJobItem = value;
+          RegisterRootJobItemEvents();
+          OnRootJobItemChanged();
+        }
+      }
+    }
+
+    private void RegisterRootJobItemEvents() {
+      rootJobItem.FinalResultAvailable += new EventHandler(rootJobItem_FinalResultAvailable);
+    }
+
+    private void DeregisterRootJobItemEvents() {
+      rootJobItem.FinalResultAvailable -= new EventHandler(rootJobItem_FinalResultAvailable);
+    }
+
     #endregion
 
@@ -185,7 +199,5 @@
       this.log = new Log();
       pausePending = stopPending = false;
-      jobItems = new JobItemList();
       isPollingResults = false;
-      RegisterJobItemListEvents();
       InitTimer();
     }
@@ -198,19 +210,10 @@
       clone.executionState = this.executionState;
       clone.executionTime = this.executionTime;
-      clone.pendingOptimizersByJobId = new Dictionary<Guid, IOptimizer>();
-
-      lock (pendingOptimizerMappingsLocker) {
-        foreach (var pair in this.pendingOptimizersByJobId)
-          clone.pendingOptimizersByJobId[pair.Key] = (IOptimizer)cloner.Clone(pair.Value);
-
-        foreach (var pair in this.parentOptimizersByPendingOptimizer)
-          clone.parentOptimizersByPendingOptimizer[(IOptimizer)cloner.Clone(pair.Key)] = (IOptimizer)cloner.Clone(pair.Value);
-      }
       clone.log = (ILog)cloner.Clone(log);
       clone.stopPending = this.stopPending;
       clone.pausePending = this.pausePending;
-      clone.jobItems.AddRange((JobItemList)cloner.Clone(jobItems));
       clone.lastUpdateTime = this.lastUpdateTime;
       clone.isPollingResults = this.isPollingResults;
+      clone.rootJob = (IJob)cloner.Clone(this.rootJob);
       return clone;
     }
@@ -221,6 +224,14 @@
       this.IsPollingResults = false;
       this.stopResultsPollingPending = false;
-      RegisterJobItemListEvents();
+      RegisterEvents();
       LogMessage("I was deserialized.");
+    }
+
+    private void RegisterEvents() {
+      RootJobChanged += new EventHandler(HiveExperiment_RootJobChanged);
+    }
+
+    private void DeRegisterEvents() {
+      RootJobChanged -= new EventHandler(HiveExperiment_RootJobChanged);
     }
 
@@ -247,11 +258,4 @@
       if (experiment != null) {
         StopResultPolling();
-        lock (pendingOptimizerMappingsLocker) {
-          pendingOptimizersByJobId.Clear();
-          parentOptimizersByPendingOptimizer.Clear();
-        }
-        lock (jobItems) {
-          jobItems.Clear();
-        }
         experiment.Prepare();
         this.ExecutionState = Core.ExecutionState.Prepared;
@@ -261,49 +265,33 @@
 
     public void Start() {
-      sendingJobsFinished = false;
       OnStarted();
       ExecutionTime = new TimeSpan();
       lastUpdateTime = DateTime.Now;
       this.ExecutionState = Core.ExecutionState.Started;
-      StartResultPolling();
 
       Thread t = new Thread(() => {
-        IClientFacade clientFacade = CreateStreamedClientFacade();
-
-        try {
-          pendingOptimizersByJobId = new Dictionary<Guid, IOptimizer>();
-
-          LogMessage("Extracting jobs from Experiment");
-          parentOptimizersByPendingOptimizer = GetOptimizers(true);
-          LogMessage("Extraction of jobs from Experiment finished");
-
-          IEnumerable<string> groups = ResourceGroups;
-          lock (pendingOptimizerMappingsLocker) {
-            foreach (IOptimizer optimizer in parentOptimizersByPendingOptimizer.Keys) {
-              SerializedJob serializedJob = CreateSerializedJob(optimizer);
-              ResponseObject<JobDto> response = clientFacade.AddJobWithGroupStrings(serializedJob, groups);
-              pendingOptimizersByJobId.Add(response.Obj.Id, optimizer);
-
-              JobItem jobItem = new JobItem() {
-                JobDto = response.Obj,
-                LatestSnapshot = null,
-                Optimizer = optimizer
-              };
-              lock (jobItems) {
-                jobItems.Add(jobItem);
-              }
-              LogMessage(jobItem.JobDto.Id, "Job sent to Hive");
+        using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
+          try {
+            RootJobItem = ToJobItem(RootJob);
+
+            IEnumerable<string> groups = ResourceGroups;
+            SerializedJob serializedJob = RootJobItem.ToSerializedJob();
+            ResponseObject<JobDto> response = service.Obj.AddJobWithGroupStrings(serializedJob, groups);
+
+            if (response.StatusMessage != ResponseStatus.Ok) {
+              throw new Exception(response.StatusMessage.ToString());
+            } else {
+              RootJobItem.JobDto = response.Obj;
+              LogMessage(RootJobItem.JobDto.Id, "Job sent to Hive");
+
+              StartResultPolling();
             }
           }
-        }
-        catch (Exception e) {
-          LogMessage("Error: Starting HiveExperiment failed: " + e.Message);
-          this.ExecutionState = Core.ExecutionState.Stopped;
-          OnStopped();
-        }
-        finally {
-          ServiceLocator.DisposeClientFacade(clientFacade);
-        }
-        sendingJobsFinished = true;
+          catch (Exception e) {
+            LogMessage("Error: Starting HiveExperiment failed: " + e.Message);
+            this.ExecutionState = Core.ExecutionState.Stopped;
+            OnStopped();
+          }
+        }
       });
       t.Start();
@@ -311,127 +299,122 @@
 
     public void Stop() {
+      if (IsPollingResults)
+        StopResultPolling();
       this.ExecutionState = Core.ExecutionState.Stopped;
-      foreach (JobItem jobItem in jobItems) {
-        AbortJob(jobItem.JobDto.Id);
-      }
       OnStopped();
     }
     #endregion
-
-    #region Optimizier Management
-    /// <summary>
-    /// Returns all optimizers in the current Experiment
-    /// </summary>
-    /// <param name="flatout">if false only top level optimizers are returned, if true the optimizer-tree is flatted</param>
-    /// <returns></returns>
-    private IDictionary<IOptimizer, IOptimizer> GetOptimizers(bool flatout) {
-      if (!flatout) {
-        var optimizers = new Dictionary<IOptimizer, IOptimizer>();
-        foreach (IOptimizer opt in experiment.Optimizers) {
-          optimizers.Add(experiment, opt);
-        }
-        return optimizers;
+    
+    #region Job Management
+    public void RefreshJobTree() {
+      this.RootJob = CreateJobTree(this.Experiment);
+    }
+    
+    private IJob CreateJobTree(IOptimizer optimizer) {
+      IJob job = null;
+      if (optimizer is HeuristicLab.Optimization.Experiment) {
+        HeuristicLab.Optimization.Experiment exp = (HeuristicLab.Optimization.Experiment)optimizer;
+        ExperimentJob expJob = new ExperimentJob(exp);
+        foreach (IOptimizer opt in exp.Optimizers) {
+          expJob.AddChildJob(CreateJobTree(opt));
+        }
+        job = expJob;
+      } else if (optimizer is BatchRun) {
+        job = new BatchRunJob(optimizer);
       } else {
-        return FlatOptimizerTree(null, experiment, "");
-      }
-    }
-
-    /// <summary>
-    /// Recursively iterates all IOptimizers in the optimizer-tree and returns them.
-    /// 
-    /// [chn] this could be implemented more cleanly if Experiment and BatchRun would implement an interface like:
-    /// interface IParallelizable {
-    ///   IEnumerable&lt;IOptimizer&gt; GetOptimizers();
-    /// }
-    /// </summary>
-    /// <returns>a dictionary mapping from the parent optimizer to the child optimizer</returns>
-    private IDictionary<IOptimizer, IOptimizer> FlatOptimizerTree(IOptimizer parent, IOptimizer optimizer, string prepend) {
-      IDictionary<IOptimizer, IOptimizer> optimizers = new Dictionary<IOptimizer, IOptimizer>();
-      if (optimizer is HeuristicLab.Optimization.Experiment) {
-        HeuristicLab.Optimization.Experiment experiment = optimizer as HeuristicLab.Optimization.Experiment;
-        if (this.experiment != experiment) {
-          prepend += experiment.Name + "/"; // don't prepend for top-level optimizers
-        }
-        foreach (IOptimizer opt in experiment.Optimizers) {
-          AddRange(optimizers, FlatOptimizerTree(experiment, opt, prepend));
-        }
-      } else if (optimizer is BatchRun) {
-        BatchRun batchRun = optimizer as BatchRun;
-        prepend += batchRun.Name + "/";
-        for (int i = 0; i < batchRun.Repetitions; i++) {
-          IOptimizer opt = (IOptimizer)batchRun.Algorithm.Clone();
-          opt.Name += " [" + i + "]";
-          IDictionary<IOptimizer, IOptimizer> batchOptimizers = FlatOptimizerTree(batchRun, opt, prepend);
-          AddRange(optimizers, batchOptimizers);
-        }
-      } else if (optimizer is EngineAlgorithm) {
-        optimizer.Name = prepend + optimizer.Name;
-        optimizers.Add(optimizer, parent);
-        LogMessage("Optimizer extracted: " + optimizer.Name);
-      } else {
-        Logger.Warn("Optimizer of type " + optimizers.GetType().ToString() + " unknown");
-        optimizer.Name = prepend + optimizer.Name;
-        optimizers.Add(optimizer, parent);
-        LogMessage("Optimizer extracted: " + optimizer.Name);
-      }
-      return optimizers;
-    }
-
-    private void ReplaceOptimizer(IOptimizer parentOptimizer, IOptimizer originalOptimizer, IOptimizer newOptimizer) {
-      lock (locker) {
-        if (parentOptimizer is HeuristicLab.Optimization.Experiment) {
-          HeuristicLab.Optimization.Experiment exp = (HeuristicLab.Optimization.Experiment)parentOptimizer;
-          int originalOptimizerIndex = exp.Optimizers.IndexOf(originalOptimizer);
-          exp.Optimizers[originalOptimizerIndex] = newOptimizer;
-        } else if (parentOptimizer is BatchRun) {
-          BatchRun batchRun = (BatchRun)parentOptimizer;
-          if (newOptimizer is IAlgorithm) {
-            batchRun.Runs.Add(new Run(newOptimizer.Name, (IAlgorithm)newOptimizer));
-          } else {
-            throw new NotSupportedException("Only IAlgorithm types supported");
-          }
-        } else {
-          throw new NotSupportedException("Invalid parentOptimizer");
-        }
-      }
-    }
-
-    private bool NoMorePendingOptimizers() {
-      lock (pendingOptimizerMappingsLocker) {
-        return pendingOptimizersByJobId.Count == 0;
-      }
-    }
-
-    /// <summary>
-    /// Removes optimizers from
-    ///  - parentOptimizersByPendingOptimizer
-    ///  - pendingOptimizersByJobId
-    /// </summary>
-    /// <param name="jobId"></param>
-    private void DisposeOptimizerMappings(Guid jobId) {
-      LogMessage(jobId, "Disposing Optimizer Mappings");
-      lock (pendingOptimizerMappingsLocker) {
-        parentOptimizersByPendingOptimizer.Remove(pendingOptimizersByJobId[jobId]);
-        pendingOptimizersByJobId.Remove(jobId);
-      }
-    }
-
-    #endregion
-
-    #region Job Management
+        job = new OptimizerJob(optimizer);
+      }
+      return job;
+    }
+
+    private JobItem ToJobItem(IJob j) {
+      return new JobItem() {
+        Job = j,
+        JobDto = new JobDto() {
+          State = JobState.Offline,
+          PluginsNeeded = HivePluginInfoDto.FindPluginsNeeded(j.GetType())
+        }
+      };
+    }
+
     /// <summary>
     /// Updates all JobItems with the results
+    /// if one is finished, the serialized job is downloaded and updated
     /// </summary>
     /// <param name="jobResultList"></param>
     private void UpdateJobItems(JobResultList jobResultList) {
-      // use a Dict to avoid quadratic runtime complexity
-      IDictionary<Guid, JobResult> jobResultDict = jobResultList.ToDictionary(job => job.JobId);
-      lock (jobItems) {
-        foreach (JobItem jobItem in JobItems) {
-          if (jobResultDict.ContainsKey(jobItem.JobDto.Id)) {
-            jobItem.JobResult = jobResultDict[jobItem.JobDto.Id];
+      if (RootJobItem == null) {
+        var rootResults = jobResultList.Where(res => !res.ParentJobId.HasValue);
+        if (rootResults.Count() > 0) {
+          RootJobItem = new JobItem(rootResults.First());
+        } else {
+          LogMessage("Error: Could not find JobResult for RootJobItem");
+          return;
+        }
+      }
+
+      using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
+        foreach (JobResult jobResult in jobResultList) {
+          JobItem jobItem = FindJobItem(RootJobItem, jobResult.Id);
+          if (jobItem != null) {
+            jobItem.UpdateJob(jobResult);
+            if (jobItem.JobDto.State == JobState.Finished && !jobItem.IsFinalResultAvailable) {
+              // job is finished but the final result was not yet downloaded
+              SerializedJob serializedJob = service.Obj.GetLastSerializedResult(jobResult.Id).Obj;
+              jobItem.Job = XmlParser.Deserialize<IJob>(new MemoryStream(serializedJob.SerializedJobData));
+              UpdateChildJobs(jobItem);
+              this.Experiment.Runs.AddRange(((OptimizerJob)jobItem.Job).Optimizer.Runs);
+              //ReplaceOptimizerInExperiment(jobItem.JobDto.Id, jobItem.Job);
+            }
+          } else {
+            // job does not yet exist locally
+            JobItem parentJobItem = FindJobItem(RootJobItem, jobResult.ParentJobId.Value);
+            if (parentJobItem != null) {
+              LogMessage(jobResult.Id, "Creating JobItem");
+              SerializedJob serializedJob = service.Obj.GetLastSerializedResult(jobResult.Id).Obj;
+              JobItem newJobItem = new JobItem();
+              newJobItem.JobDto = serializedJob.JobInfo;
+              newJobItem.Job = XmlParser.Deserialize<IJob>(new MemoryStream(serializedJob.SerializedJobData));
+              parentJobItem.AddChildJob(newJobItem);
+              if (newJobItem.JobDto.State == JobState.Finished && newJobItem.IsFinalResultAvailable) {
+                this.Experiment.Runs.AddRange(((OptimizerJob)newJobItem.Job).Optimizer.Runs);
+                UpdateChildJobs(newJobItem);
+                //ReplaceOptimizerInExperiment(jobItem.JobDto.Id, jobItem.Job);
+              }
+            } else {
+              LogMessage("Error: Could not update JobResult for " + jobResult.Id);
+            }
           }
         }
       }
+    }
+
+    /// <summary>
+    /// Updates the ChildJobItems of a JobItem according to the IJob.ChildJobs of JobItem.Job (pretty confusing, right)
+    /// </summary>
+    /// <param name="jobItem"></param>
+    private void UpdateChildJobs(JobItem jobItem) {
+      List<JobItem> newJobItems = new List<JobItem>();
+      foreach (IJob job in jobItem.Job.ChildJobs) {
+        if (!jobItem.ReplaceChildJob(job)) {
+          newJobItems.Add(ToJobItem(job));
+        }
+      }
+      foreach (JobItem item in newJobItems) {
+        jobItem.AddChildJob(item);
+      }
+    }
+
+    private JobItem FindJobItem(JobItem parentJobItem, Guid jobId) {
+      if (parentJobItem.JobDto.Id == jobId) {
+        return parentJobItem;
+      } else {
+        foreach (JobItem child in parentJobItem.ChildJobItems) {
+          JobItem result = FindJobItem(child, jobId);
+          if (result != null)
+            return result;
+        }
+      }
+      return null;
     }
 
@@ -441,19 +424,11 @@
       Thread t = new Thread(() => {
         try {
-          if (jobItem.State == JobState.Finished) {
+          if (jobItem.JobDto.State == JobState.Finished) {
             FetchAndUpdateJob(jobItem.JobDto.Id);
-            DisposeOptimizerMappings(jobItem.JobDto.Id);
-          } else if (jobItem.State == JobState.Failed) {
-            DisposeOptimizerMappings(jobItem.JobDto.Id);
+          } else if (jobItem.JobDto.State == JobState.Failed) {
+            
           }
-
-          if (NoMorePendingOptimizers()) {
-            StopResultPolling();
-            this.ExecutionState = Core.ExecutionState.Stopped;
-            OnStopped();
-          }
         }
         catch (Exception ex) {
-          Logger.Error("JobItem_JobStateChanged failed badly: " + ex.Message);
           LogMessage("JobItem_JobStateChanged failed badly: " + ex.Message);
         }
@@ -469,15 +444,12 @@
       LogMessage(jobId, "FetchAndUpdateJob started");
       if (fetchJobSemaphore.WaitOne(new TimeSpan(0, 2, 0))) {
-        IClientFacade clientFacade = null;
+
         try {
-          clientFacade = CreateStreamedClientFacade();
-          IOptimizer originalOptimizer;
-          originalOptimizer = pendingOptimizersByJobId[jobId];
-
-          ResponseObject<SerializedJob> jobResponse = clientFacade.GetLastSerializedResult(jobId, false, false);
-          IJob restoredObject = XmlParser.Deserialize<IJob>(new MemoryStream(jobResponse.Obj.SerializedJobData));
-          IOptimizer restoredOptimizer = ((OptimizerJob)restoredObject).Optimizer;
-          ReplaceOptimizer(parentOptimizersByPendingOptimizer[originalOptimizer], originalOptimizer, restoredOptimizer);
-          LogMessage(jobId, "FetchAndUpdateJob ended");
+          using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
+            ResponseObject<SerializedJob> jobResponse = service.Obj.GetLastSerializedResult(jobId);
+            IJob restoredObject = XmlParser.Deserialize<IJob>(new MemoryStream(jobResponse.Obj.SerializedJobData));
+            IOptimizer restoredOptimizer = ((OptimizerJob)restoredObject).Optimizer;
+            LogMessage(jobId, "FetchAndUpdateJob ended");
+          }
         }
         catch (Exception e) {
@@ -486,5 +458,4 @@
         }
         finally {
-          ServiceLocator.DisposeClientFacade(clientFacade);
           fetchJobSemaphore.Release();
         }
@@ -499,51 +470,9 @@
     }
 
-    private void UpdateJobItem(JobDto jobDto) {
-      JobItem jobItem = jobItems.Single(x => x.JobDto.Id == jobDto.Id);
-      jobItem.JobDto = jobDto;
-    }
-
     public void AbortJob(Guid jobId) {
-      IClientFacade clientFacade = CreateClientFacade();
-      Response response = clientFacade.AbortJob(jobId);
-      LogMessage(jobId, "Aborting Job: " + response.StatusMessage);
-    }
-
-    private SerializedJob CreateSerializedJob(IOptimizer optimizer) {
-      IJob job = new OptimizerJob() {
-        Optimizer = optimizer
-      };
-
-      // serialize job
-      MemoryStream memStream = new MemoryStream();
-      XmlGenerator.Serialize(job, memStream);
-      byte[] jobByteArray = memStream.ToArray();
-      memStream.Dispose();
-
-      // find out which which plugins are needed for the given object
-      List<HivePluginInfoDto> pluginsNeeded = (
-        from p in GetDeclaringPlugins(job.GetType())
-        select new HivePluginInfoDto() {
-          Name = p.Name,
-          Version = p.Version
-        }).ToList();
-
-      JobDto jobDto = new JobDto() {
-        CoresNeeded = 1, // [chn] how to determine real cores needed?
-        PluginsNeeded = pluginsNeeded,
-        State = JobState.Offline,
-        MemoryNeeded = 0
-      };
-
-      SerializedJob serializedJob = new SerializedJob() {
-        JobInfo = jobDto,
-        SerializedJobData = jobByteArray
-      };
-
-      return serializedJob;
-    }
-
-    private JobItem GetJobItemById(Guid jobId) {
-      return jobItems.Single(x => x.JobDto.Id == jobId);
+      using (Disposable<IClientFacade> service = ServiceLocator.Instance.ClientFacadePool.GetService()) {
+        Response response = service.Obj.AbortJob(jobId);
+        LogMessage(jobId, "Aborting Job: " + response.StatusMessage);
+      }
     }
     #endregion
@@ -553,5 +482,5 @@
       this.stopResultsPollingPending = false;
       this.IsPollingResults = true;
-      resultPollingThread = CreateResultPollingThread();
+      resultPollingThread = new Thread(RunResultPollingThread);
       if (resultPollingThread.ThreadState != System.Threading.ThreadState.Running)
         resultPollingThread.Start();
@@ -560,23 +489,21 @@
     public void StopResultPolling() {
       this.stopResultsPollingPending = true;
-      if (resultPollingThread != null && resultPollingThread.ThreadState == System.Threading.ThreadState.WaitSleepJoin) {
-        resultPollingThread.Interrupt();
+      if (resultPollingThread != null) {
+        if (resultPollingThread.ThreadState == System.Threading.ThreadState.WaitSleepJoin) {
+          resultPollingThread.Interrupt();
+        }
+        resultPollingThread.Join();
       }
       this.stopResultsPollingPending = false;
     }
 
-    private Thread CreateResultPollingThread() {
-      return new Thread(() => {
-        try {
-          do {
-            IClientFacade clientFacade = CreateStreamedClientFacade();
-            IEnumerable<Guid> jobIdsToQuery = from job in JobItems
-                                              where job.State != JobState.Finished &&
-                                              job.State != JobState.Failed
-                                              select job.JobDto.Id;
-            if (jobIdsToQuery.Count() > 0) {
-              LogMessage("Polling results for " + jobIdsToQuery.Count() + " jobs");
+    private void RunResultPollingThread() {
+      try {
+        do {
+          if (RootJobItem.JobDto.State != JobState.Finished) {
+            using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
+              LogMessage("Polling results");
               try {
-                ResponseObject<JobResultList> response = clientFacade.GetJobResults(jobIdsToQuery);
+                ResponseObject<JobResultList> response = service.Obj.GetChildJobResults(RootJobItem.JobDto.Id, true, true);
                 if (response.StatusMessage == ResponseStatus.Ok) {
                   JobResultList jobItemList = response.Obj;
@@ -591,27 +518,21 @@
                 LogMessage("Polling results failed: " + e.Message);
               }
-              finally {
-                ServiceLocator.DisposeClientFacade(clientFacade);
-              }
-              Thread.Sleep(resultPollingIntervalMs);
-            } else {
-              if (sendingJobsFinished) {
-                // all the jobs have been sent to hive, but non are to query any more (all finished or failed)
-                this.stopResultsPollingPending = true;
-              }
             }
-          } while (!this.stopResultsPollingPending);
-        }
-        catch (ThreadInterruptedException exception) {
-          // thread has been interuppted
-        }
-        catch (Exception e) {
-          LogMessage("Result Polling Thread failed badly: " + e.Message);
-          Logger.Error("Result Polling Thread failed badly: " + e.Message);
-        }
-        finally {
-          this.IsPollingResults = false;
-        }
-      });
+            Thread.Sleep(resultPollingIntervalMs);
+          } else {
+            // all the jobs have been sent to hive, but non are to query any more (all finished or failed)
+            this.stopResultsPollingPending = true;
+          }
+        } while (!this.stopResultsPollingPending);
+      }
+      catch (ThreadInterruptedException) {
+        // thread has been interuppted
+      }
+      catch (Exception e) {
+        LogMessage("Result Polling Thread failed badly: " + e.Message);
+      }
+      finally {
+        this.IsPollingResults = false;
+      }
     }
 
@@ -620,151 +541,66 @@
     #region Snapshots
 
-    private void UpdateSnapshot(ResponseObject<SerializedJob> response) {
-      JobItem jobItem = jobItems.Single(x => x.JobDto.Id == response.Obj.JobInfo.Id);
-      jobItem.LatestSnapshot = response;
-    }
-
-    public void RequestSnapshot(Guid jobId) {
-      Thread t = new Thread(() => {
-        IClientFacade clientFacade = null;
-        try {
-          clientFacade = CreateStreamedClientFacade();
-
-          ResponseObject<SerializedJob> response;
-          int retryCount = 0;
-
-          Response snapShotResponse = clientFacade.RequestSnapshot(jobId);
-          if (snapShotResponse.StatusMessage == ResponseStatus.RequestSnapshot_JobIsNotBeeingCalculated) {
-            // job already finished
-            Logger.Debug("HiveExperiment: Abort - GetLastResult(false)");
-            response = clientFacade.GetLastSerializedResult(jobId, false, false);
-            Logger.Debug("HiveExperiment: Abort - Server: " + response.StatusMessage);
-          } else {
-            // server sent snapshot request to client
-            // poll until snapshot is ready
-            do {
-              Thread.Sleep(snapshotPollingIntervalMs);
-              Logger.Debug("HiveExperiment: Abort - GetLastResult(true)");
-              response = clientFacade.GetLastSerializedResult(jobId, false, true);
-              Logger.Debug("HiveExperiment: Abort - Server: " + response.StatusMessage);
-              retryCount++;
-              // loop while
-              // 1. problem with communication with server
-              // 2. job result not yet ready
-            } while (
-              (retryCount < maxSnapshotRetries) && (
-              response.StatusMessage == ResponseStatus.GetLastSerializedResult_JobResultNotYetThere)
-              );
-          }
-          if (response.StatusMessage == ResponseStatus.Ok) {
-            LogMessage(jobId, "Snapshot polling successfull for job " + jobId);
-            UpdateSnapshot(response);
-          } else {
-            LogMessage(jobId, "Error: Polling of Snapshot failed for job " + jobId + ": " + response.StatusMessage);
-          }
-        }
-        catch (Exception e) {
-          LogMessage("RequestSnapshot Thread failed badly: " + e.Message);
-          Logger.Error("RequestSnapshot Thread failed badly: " + e.Message);
-        }
-        finally {
-          ServiceLocator.DisposeClientFacade(clientFacade);
-        }
-      });
-      t.Start();
-    }
-
-    void JobItem_SnapshotRequestedStateChanged(object sender, EventArgs e) {
-      JobItem jobItem = (JobItem)sender;
-      if (jobItem.SnapshotRequestedState == SnapshotRequestedState.Requested) {
-        RequestSnapshot(jobItem.JobDto.Id);
-      }
-    }
-
-    #endregion
-
-    #region Required Plugin Search
-    /// <summary>
-    /// Returns a list of plugins in which the type itself and all members 
-    /// of the type are declared. Objectgraph is searched recursively.
-    /// </summary>
-    private IEnumerable<IPluginDescription> GetDeclaringPlugins(Type type) {
-      HashSet<Type> types = new HashSet<Type>();
-      FindTypes(type, types, "HeuristicLab.");
-      return GetDeclaringPlugins(types);
-    }
-
-    /// <summary>
-    /// Returns the plugins (including dependencies) in which the given types are declared
-    /// </summary>
-    private IEnumerable<IPluginDescription> GetDeclaringPlugins(IEnumerable<Type> types) {
-      HashSet<IPluginDescription> plugins = new HashSet<IPluginDescription>();
-      foreach (Type t in types) {
-        FindDeclaringPlugins(ApplicationManager.Manager.GetDeclaringPlugin(t), plugins);
-      }
-      return plugins;
-    }
-
-    /// <summary>
-    /// Finds the dependencies of the given plugin and adds it to the plugins hashset.
-    /// Also searches the dependencies recursively.
-    /// </summary>
-    private void FindDeclaringPlugins(IPluginDescription plugin, HashSet<IPluginDescription> plugins) {
-      if (!plugins.Contains(plugin)) {
-        plugins.Add(plugin);
-        foreach (IPluginDescription dependency in plugin.Dependencies) {
-          FindDeclaringPlugins(dependency, plugins);
-        }
-      }
-    }
-
-    /// <summary>
-    /// Recursively finds all types used in type which are in a namespace which starts with namespaceStart
-    /// Be aware that search is not performed on attributes
-    /// </summary>
-    /// <param name="type">the type to be searched</param>
-    /// <param name="types">found types will be stored there, needed in order to avoid duplicates</param>
-    /// <param name="namespaceStart">only types from namespaces which start with this will be searched and added</param>
-    private void FindTypes(Type type, HashSet<Type> types, string namespaceStart) {
-      if (!types.Contains(type) && type.Namespace.StartsWith(namespaceStart)) {
-        types.Add(type);
-
-        // constructors
-        foreach (ConstructorInfo info in type.GetConstructors()) {
-          foreach (ParameterInfo paramInfo in info.GetParameters()) {
-            FindTypes(paramInfo.ParameterType, types, namespaceStart);
-          }
-        }
-
-        // interfaces
-        foreach (Type t in type.GetInterfaces()) {
-          FindTypes(t, types, namespaceStart);
-        }
-
-        // events
-        foreach (EventInfo info in type.GetEvents()) {
-          FindTypes(info.EventHandlerType, types, namespaceStart);
-          FindTypes(info.DeclaringType, types, namespaceStart);
-        }
-
-        // properties
-        foreach (PropertyInfo info in type.GetProperties()) {
-          FindTypes(info.PropertyType, types, namespaceStart);
-        }
-
-        // fields
-        foreach (FieldInfo info in type.GetFields()) {
-          FindTypes(info.FieldType, types, namespaceStart);
-        }
-
-        // methods
-        foreach (MethodInfo info in type.GetMethods()) {
-          foreach (ParameterInfo paramInfo in info.GetParameters()) {
-            FindTypes(paramInfo.ParameterType, types, namespaceStart);
-          }
-          FindTypes(info.ReturnType, types, namespaceStart);
-        }
-      }
-    }
+    //private void UpdateSnapshot(ResponseObject<SerializedJob> response) {
+    //  JobItem jobItem = jobItems.Single(x => x.JobDto.Id == response.Obj.JobInfo.Id);
+    //  jobItem.LatestSnapshot = response;
+    //}
+
+    //public void RequestSnapshot(Guid jobId) {
+    //  Thread t = new Thread(() => {
+    //    IClientFacade clientFacade = null;
+    //    try {
+    //      clientFacade = CreateStreamedClientFacade();
+
+    //      ResponseObject<SerializedJob> response;
+    //      int retryCount = 0;
+
+    //      Response snapShotResponse = clientFacade.RequestSnapshot(jobId);
+    //      if (snapShotResponse.StatusMessage == ResponseStatus.RequestSnapshot_JobIsNotBeeingCalculated) {
+    //        // job already finished
+    //        Logger.Debug("HiveExperiment: Abort - GetLastResult(false)");
+    //        response = clientFacade.GetLastSerializedResult(jobId, false, false);
+    //        Logger.Debug("HiveExperiment: Abort - Server: " + response.StatusMessage);
+    //      } else {
+    //        // server sent snapshot request to client
+    //        // poll until snapshot is ready
+    //        do {
+    //          Thread.Sleep(snapshotPollingIntervalMs);
+    //          Logger.Debug("HiveExperiment: Abort - GetLastResult(true)");
+    //          response = clientFacade.GetLastSerializedResult(jobId, false, true);
+    //          Logger.Debug("HiveExperiment: Abort - Server: " + response.StatusMessage);
+    //          retryCount++;
+    //          // loop while
+    //          // 1. problem with communication with server
+    //          // 2. job result not yet ready
+    //        } while (
+    //          (retryCount < maxSnapshotRetries) && (
+    //          response.StatusMessage == ResponseStatus.GetLastSerializedResult_JobResultNotYetThere)
+    //          );
+    //      }
+    //      if (response.StatusMessage == ResponseStatus.Ok) {
+    //        LogMessage(jobId, "Snapshot polling successfull for job " + jobId);
+    //        //UpdateSnapshot(response);
+    //      } else {
+    //        LogMessage(jobId, "Error: Polling of Snapshot failed for job " + jobId + ": " + response.StatusMessage);
+    //      }
+    //    }
+    //    catch (Exception e) {
+    //      LogMessage("RequestSnapshot Thread failed badly: " + e.Message);
+    //      Logger.Error("RequestSnapshot Thread failed badly: " + e.Message);
+    //    }
+    //    finally {
+    //      ServiceLocator.DisposeClientFacade(clientFacade);
+    //    }
+    //  });
+    //  t.Start();
+    //}
+
+    //void JobItem_SnapshotRequestedStateChanged(object sender, EventArgs e) {
+    //  JobItem jobItem = (JobItem)sender;
+    //  if (jobItem.SnapshotRequestedState == SnapshotRequestedState.Requested) {
+    //    RequestSnapshot(jobItem.JobDto.Id);
+    //  }
+    //}
+
     #endregion
 
@@ -827,4 +663,16 @@
       LogMessage("Experiment changed");
       EventHandler handler = ExperimentChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler RootJobChanged;
+    private void OnRootJobChanged() {
+      EventHandler handler = RootJobChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler RootJobItemChanged;
+    private void OnRootJobItemChanged() {
+      EventHandler handler = RootJobItemChanged;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -843,107 +691,13 @@
     }
 
-    private void RegisterJobItemListEvents() {
-      jobItems.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_CollectionReset);
-      jobItems.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsAdded);
-      jobItems.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsRemoved);
-      jobItems.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsReplaced);
-      foreach (JobItem jobItem in jobItems) {
-        RegisterJobItemEvents(jobItem);
-      }
-    }
-
-    private void DeregisterJobItemListEvents() {
-      jobItems.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_CollectionReset);
-      jobItems.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsAdded);
-      jobItems.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsRemoved);
-      jobItems.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsReplaced);
-      foreach (JobItem jobItem in jobItems) {
-        DeregisterJobItemEvents(jobItem);
-      }
-    }
-
-    void jobItems_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
-      UpdateJobItemEvents(e);
-    }
-
-    private void UpdateJobItemEvents(CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
-      if (e.OldItems != null) {
-        foreach (var item in e.OldItems) {
-          DeregisterJobItemEvents(item.Value);
-        }
-      }
-      if (e.Items != null) {
-        foreach (var item in e.Items) {
-          RegisterJobItemEvents(item.Value);
-        }
-      }
-    }
-
-    private void RegisterJobItemEvents(JobItem jobItem) {
-      jobItem.SnapshotRequestedStateChanged += new EventHandler(JobItem_SnapshotRequestedStateChanged);
-      jobItem.JobStateChanged += new EventHandler(JobItem_JobStateChanged);
-    }
-
-    private void DeregisterJobItemEvents(JobItem jobItem) {
-      jobItem.SnapshotRequestedStateChanged -= new EventHandler(JobItem_SnapshotRequestedStateChanged);
-      jobItem.JobStateChanged -= new EventHandler(JobItem_JobStateChanged);
-    }
-
-    void jobItems_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
-      UpdateJobItemEvents(e);
-    }
-
-    void jobItems_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
-      UpdateJobItemEvents(e);
-    }
-
-    void jobItems_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
-      foreach (var item in e.OldItems) {
-        item.Value.JobStateChanged -= new EventHandler(JobItem_JobStateChanged);
-        item.Value.SnapshotRequestedStateChanged -= new EventHandler(JobItem_SnapshotRequestedStateChanged);
-      }
+    void HiveExperiment_RootJobChanged(object sender, EventArgs e) {
+      this.Experiment = (Optimization.Experiment)((ExperimentJob)rootJobItem.Job).Optimizer;
+    }
+
+    void rootJobItem_FinalResultAvailable(object sender, EventArgs e) {
+      this.Experiment = (Optimization.Experiment)((ExperimentJob)rootJobItem.Job).Optimizer;
     }
     #endregion
-
-    #region Helper Functions
-    private IClientFacade CreateClientFacade() {
-      IClientFacade clientFacade = null;
-      do {
-        try {
-          //clientFacade = ServiceLocator.CreateClientFacade(string.Format("http://{0}:{1}/{2}", Settings.Default.HiveServerIp, Settings.Default.HiveServerPort, WcfSettings.ClientServiceName));
-          clientFacade = ServiceLocator.CreateClientFacade(Settings.Default.HiveServerIp);
-
-        }
-        catch (EndpointNotFoundException exception) {
-          LogMessage("Could not connect to Server: " + exception.Message + ". Will try again in " + (resultPollingIntervalMs / 1000) + " sec.");
-          Thread.Sleep(resultPollingIntervalMs);
-        }
-      } while (clientFacade == null && this.ExecutionState != Core.ExecutionState.Stopped);
-      return clientFacade;
-    }
-
-    private IClientFacade CreateStreamedClientFacade() {
-      IClientFacade clientFacade = null;
-      do {
-        try {
-          //clientFacade = ServiceLocator.CreateStreamedClientFacade(string.Format("http://{0}:{1}/{2}", Settings.Default.HiveServerIp, Settings.Default.HiveServerPort, WcfSettings.ClientStreamedServiceName));
-          clientFacade = ServiceLocator.CreateStreamedClientFacade(Settings.Default.HiveServerIp);
-        }
-        catch (EndpointNotFoundException exception) {
-          LogMessage("Could not connect to Server: " + exception.Message + ". Will try again in " + (resultPollingIntervalMs / 1000) + " sec.");
-          Thread.Sleep(resultPollingIntervalMs);
-        }
-      } while (clientFacade == null && this.ExecutionState != Core.ExecutionState.Stopped);
-      return clientFacade;
-    }
-
-    private void AddRange(IDictionary<IOptimizer, IOptimizer> optimizers, IDictionary<IOptimizer, IOptimizer> childs) {
-      foreach (KeyValuePair<IOptimizer, IOptimizer> kvp in childs) {
-        optimizers.Add(kvp);
-      }
-    }
-
-    #endregion
-
+    
     #region Logging
     private void LogMessage(string message) {
@@ -951,13 +705,32 @@
       lock (locker) {
         log.LogMessage(message);
+        Logger.Debug(message);
       }
     }
 
     private void LogMessage(Guid jobId, string message) {
-      GetJobItemById(jobId).LogMessage(message);
+      //GetJobItemById(jobId).LogMessage(message);
       LogMessage(message + " (jobId: " + jobId + ")");
     }
 
     #endregion
+
+    /// <summary>
+    /// Downloads the root job from hive and sets the experiment, rootJob and rootJobItem
+    /// </summary>
+    public void LoadExperimentFromHive() {
+      using (Disposable<IClientFacade> service = ServiceLocator.Instance.StreamedClientFacadePool.GetService()) {
+        ResponseObject<SerializedJob> response = service.Obj.GetLastSerializedResult(RootJobItem.JobDto.Id);
+        IJob job = XmlParser.Deserialize<IJob>(new MemoryStream(response.Obj.SerializedJobData));
+        RootJob = job;
+        RootJobItem.JobDto = response.Obj.JobInfo;
+        this.Experiment = (Optimization.Experiment)((OptimizerJob)job).Optimizer;
+        if (rootJobItem.JobDto.State == JobState.Finished) {
+          // set execution time and finish up
+        } else if (rootJobItem.JobDto.State != JobState.Aborted && rootJobItem.JobDto.State != JobState.Failed) {
+          this.ExecutionState = Core.ExecutionState.Started;
+        }
+      }
+    }
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperimentList.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperimentList.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperimentList.cs	(revision 4368)
@@ -0,0 +1,27 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Contracts.Interfaces;
+using HeuristicLab.Hive.Experiment.Properties;
+using System.ServiceModel;
+using System.Threading;
+using HeuristicLab.Hive.Contracts.ResponseObjects;
+
+namespace HeuristicLab.Hive.Experiment {
+  [Item("HiveExperiment List", "Represents a list of hive experiments.")]
+  [StorableClass]
+  public class HiveExperimentList : ItemList<HiveExperiment> {
+    public HiveExperimentList() : base() { }
+    public HiveExperimentList(int capacity) : base(capacity) { }
+    public HiveExperimentList(IEnumerable<HiveExperiment> collection) : base(collection) { }
+
+    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      HiveExperimentList clone = (HiveExperimentList)base.Clone(cloner);
+      return clone;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs	(revision 4368)
@@ -12,4 +12,10 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Hive.Contracts.ResponseObjects;
+using HeuristicLab.Hive.JobBase;
+using System.IO;
+using HeuristicLab.Persistence.Default.Xml;
+using HeuristicLab.PluginInfrastructure;
+using System.Reflection;
+using HeuristicLab.Hive.Experiment.Jobs;
 
 namespace HeuristicLab.Hive.Experiment {
@@ -22,9 +28,9 @@
     public override Image ItemImage {
       get {
-        if (State == JobState.Offline) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePrepared;
-        else if (State == JobState.Calculating) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStarted;
-        else if (State == JobState.Aborted) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
-        else if (State == JobState.Failed) return HeuristicLab.Common.Resources.VS2008ImageLibrary.Error;
-        else if (State == JobState.Finished) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
+        if (jobDto.State == JobState.Offline) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutablePrepared;
+        else if (jobDto.State == JobState.Calculating) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStarted;
+        else if (jobDto.State == JobState.Aborted) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
+        else if (jobDto.State == JobState.Failed) return HeuristicLab.Common.Resources.VS2008ImageLibrary.Error;
+        else if (jobDto.State == JobState.Finished) return HeuristicLab.Common.Resources.VS2008ImageLibrary.ExecutableStopped;
         else return HeuristicLab.Common.Resources.VS2008ImageLibrary.Event;
       }
@@ -33,7 +39,4 @@
     [Storable]
     private JobDto jobDto;
-    /// <summary>
-    /// Some static information about the job. Don't use State-Information out of there
-    /// </summary>
     public JobDto JobDto {
       get { return jobDto; }
@@ -49,89 +52,47 @@
 
     [Storable]
-    private JobResult jobResult;
-    public JobResult JobResult {
-      private get { return jobResult; }
+    private IJob job;
+    public IJob Job {
+      get { return job; }
       set {
-        if (jobResult != value) {
-          jobResult = value;
-          OnJobStateChanged();
-          OnToStringChanged();
-          OnItemImageChanged();
-        }
-      }
-    }
-
-    public JobState State {
-      get { return jobResult != null ? JobResult.State : JobDto.State; }
-    }
-
-    public double? Percentage {
-      get { return jobResult != null ? JobResult.Percentage : JobDto.Percentage; }
-    }
-
-    public string Exception {
-      get { return jobResult != null ? JobResult.Exception : JobDto.Exception; }
-    }
-
-    public DateTime? DateCalculated {
-      get { return jobResult != null ? JobResult.DateCalculated : JobDto.DateCalculated; }
-    }
-
-    public DateTime? DateFinished {
-      get { return jobResult != null ? JobResult.DateFinished : JobDto.DateFinished; }
-    }
-    
-    [Storable]
-    private ResponseObject<SerializedJob> latestSnapshot;
-    public ResponseObject<SerializedJob> LatestSnapshot {
-      get { return latestSnapshot; }
+        if (job != value) {
+          job = value;
+          IsFinalResultAvailable = job.ExecutionState == ExecutionState.Stopped;
+          OnJobChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private ICollection<JobItem> childJobItems;
+    public IEnumerable<JobItem> ChildJobItems {
+      get { return childJobItems; }
+    }
+
+    [Storable]
+    private bool isFinalResultAvailable;
+    public bool IsFinalResultAvailable {
+      get { return isFinalResultAvailable; }
       set {
-        if (latestSnapshot != value) {
-          latestSnapshot = value;
-          if (value != null) {
-            latestSnapshotTime = DateTime.Now;
-          }
-          SnapshotRequestedState = Experiment.SnapshotRequestedState.Idle;
-          OnLatestSnapshotChanged();
-        }
-      }
-    }
-
-    [Storable]
-    private DateTime latestSnapshotTime;
-    public DateTime LatestSnapshotTime {
-      get { return latestSnapshotTime; }
-    }
-
-    [Storable]
-    private ILog log;
-    public ILog Log {
-      get { return log; }
-    }
-
-    [Storable]
-    private IOptimizer optimizer;
-    public IOptimizer Optimizer {
-      get { return optimizer; }
-      set { this.optimizer = value; }
-    }
-
-    [Storable]
-    private SnapshotRequestedState snapshotRequestedState;
-    public SnapshotRequestedState SnapshotRequestedState {
-      get { return snapshotRequestedState; }
-      private set {
-        this.snapshotRequestedState = value;
-        OnSnapshotRequestedStateChanged();
-      }
-    }
-
+        if (isFinalResultAvailable != value) {
+          isFinalResultAvailable = value;
+          if (isFinalResultAvailable)
+            OnFinalResultAvailable();
+        }
+      }
+    }
+   
     public JobItem() {
-      log = new Log();
+      childJobItems = new List<JobItem>();
+    }
+
+    public JobItem(JobResult jobResult) : this() {
+      this.jobDto = new JobDto();
+      UpdateJob(jobResult);
     }
 
     public override string ToString() {
       if (jobDto != null) {
-        return optimizer.Name;
+        return job.Name;
       } else {
         return base.ToString();
@@ -139,11 +100,66 @@
     }
 
-    public event EventHandler LatestSnapshotChanged;
-    private void OnLatestSnapshotChanged() {
-      LogMessage("LatestSnapshotChanged");
-      EventHandler handler = LatestSnapshotChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
+    public void UpdateJob(JobResult jobResult) {
+      if (jobResult != null) {
+        jobDto.Id = jobResult.Id;
+        jobDto.DateCreated = jobResult.DateCreated;
+        jobDto.DateCalculated = jobResult.DateCalculated;
+        jobDto.DateFinished = jobResult.DateFinished;
+        jobDto.Exception = jobResult.Exception;
+        jobDto.Id = jobResult.Id;
+        jobDto.Percentage = jobResult.Percentage;
+        jobDto.State = jobResult.State;
+        // what about parentJob
+        OnJobStateChanged();
+        OnToStringChanged();
+        OnItemImageChanged();
+      }
+    }
+
+    public void AddChildJob(JobItem child) {
+      this.childJobItems.Add(child);
+      OnChildJobAdded();
+    }
+
+    //public IEnumerable<JobItem> GetChildJobItems() {
+    //  if (childJobItems == null)
+    //    childJobItems = CreateChildJobItems();
+    //  return childJobItems;
+    //}
+
+    //protected IEnumerable<JobItem> CreateChildJobItems() {
+    //  return (from j in Job.ChildJobs
+    //          select new JobItem() {
+    //            Job = j,
+    //            JobDto = new JobDto() {
+    //              State = JobState.Offline
+    //            }
+    //          }).ToList();
+    //}
+
+    public SerializedJob ToSerializedJob() {
+      MemoryStream memStream = new MemoryStream();
+      XmlGenerator.Serialize(job, memStream);
+      byte[] jobByteArray = memStream.ToArray();
+      memStream.Dispose();
+
+      UpdateRequiredPlugins();
+
+      this.JobDto.CoresNeeded = job.CoresNeeded;
+      this.JobDto.MemoryNeeded = job.MemoryNeeded;
+
+      SerializedJob serializedJob = new SerializedJob() {
+        JobInfo = jobDto,
+        SerializedJobData = jobByteArray
+      };
+
+      return serializedJob;
+    }
+
+    private void UpdateRequiredPlugins() {
+      // find out which which plugins are needed for the given object
+      this.JobDto.PluginsNeeded = HivePluginInfoDto.FindPluginsNeeded(job.GetType());
+    }
+   
     public event EventHandler JobDtoChanged;
     private void OnJobDtoChanged() {
@@ -155,6 +171,24 @@
     public event EventHandler JobStateChanged;
     private void OnJobStateChanged() {
-      LogMessage("JobStateChanged (State: " + this.State + ", Percentage: " + this.Percentage + ")");
+      LogMessage("JobStateChanged (State: " + this.JobDto.State + ", Percentage: " + this.JobDto.Percentage + ")");
       EventHandler handler = JobStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    
+    public event EventHandler ChildJobAdded;
+    private void OnChildJobAdded() {
+      var handler = ChildJobAdded;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    
+    public event EventHandler JobChanged;
+    private void OnJobChanged() {
+      var handler = JobChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler FinalResultAvailable;
+    private void OnFinalResultAvailable() {
+      var handler = FinalResultAvailable;
       if (handler != null) handler(this, EventArgs.Empty);
     }
@@ -162,5 +196,7 @@
     public void LogMessage(string message) {
       lock (locker) {
-        log.LogMessage(message);
+        if (job != null) {
+          job.Log.LogMessage(message);
+        }
       }
     }
@@ -169,25 +205,26 @@
       LogMessage("I am beeing cloned");
       JobItem clone = (JobItem)base.Clone(cloner);
-      clone.latestSnapshotTime = this.latestSnapshotTime;
       clone.jobDto = (JobDto)cloner.Clone(this.jobDto);
-      clone.latestSnapshot = (ResponseObject<SerializedJob>)cloner.Clone(this.latestSnapshot);
-      clone.log = (ILog)cloner.Clone(this.log);
-      clone.optimizer = (IOptimizer)cloner.Clone(this.optimizer);
-      clone.jobResult = (JobResult)cloner.Clone(this.jobResult);
+      clone.job = (IJob)cloner.Clone(this.job);
       return clone;
     }
 
-
-    public event EventHandler SnapshotRequestedStateChanged;
-    private void OnSnapshotRequestedStateChanged() {
-      EventHandler handler = SnapshotRequestedStateChanged;
-      if (handler != null) handler(this, EventArgs.Empty);
-    }
-
-    public void RequestSnapshot() {
-      this.SnapshotRequestedState = Experiment.SnapshotRequestedState.Requested;
-    }
-
-
+    public void UpdateFinalResults(IJob j) {
+      if (this.Job is OptimizerJob && j is OptimizerJob) {
+        ((OptimizerJob)this.Job).Optimizer.Runs.AddRange(((OptimizerJob)j).Optimizer.Runs);
+        IsFinalResultAvailable = true; //job.ExecutionState == ExecutionState.Stopped; //??
+      } else {
+        throw new NotSupportedException();
+      }
+    }
+
+    internal bool ReplaceChildJob(IJob job) {
+      var matches = this.childJobItems.Where(child => child.Job.InternalId == job.InternalId);
+      if (matches.Count() > 0) {
+        matches.First().job = job;
+        return true;
+      }
+      return false;
+    }
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/BachRunJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/BachRunJob.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/BachRunJob.cs	(revision 4368)
@@ -0,0 +1,26 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Hive.Experiment.Jobs {
+  [StorableClass]
+  public class BatchRunJob : OptimizerJob {
+    public BatchRunJob() {
+    }
+
+    public BatchRunJob(IOptimizer optimizer) : base(optimizer) { }
+
+    public override void Start() {
+      base.Start();
+    }
+
+    public override bool IsParallelizable {
+      get { return true; }
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/ExperimentJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/ExperimentJob.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/ExperimentJob.cs	(revision 4368)
@@ -0,0 +1,68 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Contracts.Interfaces;
+using HeuristicLab.Hive.Experiment.Properties;
+
+namespace HeuristicLab.Hive.Experiment.Jobs {
+  [StorableClass]
+  public class ExperimentJob : OptimizerJob {
+    [Storable]
+    private ExecutionState executionState = ExecutionState.Stopped;
+
+    public ExperimentJob() {
+      this.ComputeInParallel = true;
+    }
+
+    public ExperimentJob(IOptimizer optimizer) : base(optimizer) {
+      this.ComputeInParallel = true;
+    }
+
+    public override ExecutionState ExecutionState {
+      get {
+        return ComputeInParallel ? executionState : base.ExecutionState;
+      }
+    }
+
+    public override void Start() {
+      if (ComputeInParallel) {
+        executionState = Core.ExecutionState.Started;
+        foreach (IJob child in this.ChildJobs) {
+          OnNewChildJob(child);
+        }
+        executionState = Core.ExecutionState.Paused;
+        OnWaitForChildJobs();
+      } else {
+        base.Start();
+      }
+    }
+
+    public override void Resume(IEnumerable<IJob> childJobs) {
+      executionState = Core.ExecutionState.Started;
+      this.childJobs = new List<IJob>(childJobs);
+      UpdateRuns();
+      executionState = Core.ExecutionState.Stopped;
+      OnJobStopped();
+    }
+
+    private void UpdateRuns() {
+      foreach (OptimizerJob optimizerJob in childJobs.Cast<OptimizerJob>()) {
+        this.optimizer.Runs.AddRange(optimizerJob.Optimizer.Runs);
+      }
+    }
+
+    public void AddChildJob(IJob job) {
+      this.childJobs.Add(job);
+    }
+
+    public override bool IsParallelizable {
+      get { return true; }
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/JobList.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/JobList.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/JobList.cs	(revision 4368)
@@ -0,0 +1,21 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Hive.Experiment.Jobs {
+  [Item("IJob List", "Represents a list of hive jobs.")]
+  [StorableClass]
+  public class JobList : ItemList<IJob> {
+    public JobList() : base() { }
+    public JobList(int capacity) : base(capacity) { }
+    public JobList(IEnumerable<IJob> collection) : base(collection) { }
+
+    public override Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      JobItemList clone = (JobItemList)base.Clone(cloner);
+      return clone;
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/OptimizerJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/OptimizerJob.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Jobs/OptimizerJob.cs	(revision 4368)
@@ -0,0 +1,265 @@
+﻿using System;
+using System.Collections.Generic;
+using HeuristicLab.Core;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Hive.Experiment.Jobs {
+  [StorableClass]
+  public class OptimizerJob : IJob {
+    [Storable]
+    protected Guid internalId;
+    public Guid InternalId {
+      get { return internalId; }
+    }
+    
+    [Storable]
+    protected IOptimizer optimizer;
+    public IOptimizer Optimizer {
+      get { return optimizer; }
+      set {
+        if (optimizer != null && value != optimizer) {
+          DeregisterEvents();
+        }
+        optimizer = value;
+        if (optimizer != null) {
+          RegisterEvents();
+        }
+      }
+    }
+
+    [Storable]
+    protected double progress = 0.0;
+
+    [Storable]
+    protected ILog log;
+    public ILog Log {
+      get { return log; }
+    }
+
+    [Storable]
+    protected ICollection<IJob> childJobs;
+    public IEnumerable<IJob> ChildJobs {
+      get { return childJobs; }
+    }
+
+    [Storable]
+    protected bool computeInParallel;
+    public bool ComputeInParallel {
+      get { return computeInParallel; }
+      set { computeInParallel = value; }
+    }
+
+    [Storable]
+    protected int coresNeeded;
+    public int CoresNeeded {
+      get { return coresNeeded; }
+      set { coresNeeded = value; }
+    }
+
+    [Storable]
+    protected int memoryNeeded;
+    public int MemoryNeeded {
+      get { return memoryNeeded; }
+      set { memoryNeeded = value; }
+    }
+
+    public OptimizerJob() {
+      this.internalId = Guid.NewGuid();
+      this.log = new Log();
+      this.childJobs = new List<IJob>();
+      this.ComputeInParallel = false;
+      this.CoresNeeded = 1;
+      this.MemoryNeeded = 0;
+    }
+
+    public OptimizerJob(IOptimizer optimizer)
+      : this() {
+      this.optimizer = optimizer;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    protected virtual void AfterDeserialization() {
+      RegisterEvents();
+    }
+
+    #region IJob Members
+    
+    public double Progress {
+      get { return optimizer.ExecutionState == ExecutionState.Stopped ? 1.0 : this.progress; }
+    }
+
+    public virtual ExecutionState ExecutionState {
+      get { return optimizer.ExecutionState; }
+    }
+
+    public virtual void Run() {
+      throw new NotSupportedException();
+    }
+
+    public virtual void Prepare() {
+      optimizer.Prepare();
+    }
+
+    public virtual void Start() {
+      optimizer.Start();
+    }
+
+    public virtual void Stop() {
+      optimizer.Stop();
+    }
+
+    public virtual void Resume(IEnumerable<IJob> childJobs) {
+      throw new NotSupportedException();
+    }
+
+    public event EventHandler JobStopped;
+    protected virtual void OnJobStopped() {
+      EventHandler handler = JobStopped;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobFailed;
+    protected virtual void OnJobFailed(Common.EventArgs<Exception> e) {
+      EventHandler handler = JobFailed;
+      if (handler != null) handler(this, e);
+    }
+
+    public event EventHandler<Common.EventArgs<IJob>> NewChildJob;
+    protected virtual void OnNewChildJob(IJob job) {
+      EventHandler<Common.EventArgs<IJob>> handler = NewChildJob;
+      if (handler != null) handler(this, new Common.EventArgs<IJob>(job));
+    }
+
+    public event EventHandler WaitForChildJobs;
+    protected virtual void OnWaitForChildJobs() {
+      EventHandler handler = WaitForChildJobs;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    #endregion
+
+    #region Events
+    protected virtual void RegisterEvents() {
+      optimizer.Stopped += new EventHandler(optimizer_Stopped);
+      optimizer.ExceptionOccurred += new EventHandler<Common.EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      optimizer.DescriptionChanged += this.DescriptionChanged;
+      optimizer.FilenameChanged += this.FilenameChanged;
+      optimizer.ItemImageChanged += this.ItemImageChanged;
+      optimizer.NameChanged += this.NameChanged;
+      optimizer.NameChanging += this.NameChanging;
+      optimizer.ToStringChanged += this.ToStringChanged;
+    }
+
+    protected virtual void DeregisterEvents() {
+      optimizer.Stopped -= new EventHandler(optimizer_Stopped);
+      optimizer.ExceptionOccurred -= new EventHandler<Common.EventArgs<Exception>>(optimizer_ExceptionOccurred);
+      optimizer.DescriptionChanged -= this.DescriptionChanged;
+      optimizer.FilenameChanged -= this.FilenameChanged;
+      optimizer.ItemImageChanged -= this.ItemImageChanged;
+      optimizer.NameChanged -= this.NameChanged;
+      optimizer.NameChanging -= this.NameChanging;
+      optimizer.ToStringChanged -= this.ToStringChanged;
+    }
+
+    protected virtual void optimizer_ExceptionOccurred(object sender, Common.EventArgs<Exception> e) {
+      if (optimizer.ExecutionState != ExecutionState.Stopped) this.progress = 0.0;
+      else this.progress = 1.0;
+      OnJobFailed(e);
+    }
+
+    protected virtual void optimizer_Stopped(object sender, EventArgs e) {
+      if (optimizer.ExecutionState != ExecutionState.Stopped) this.progress = 0.0;
+      else this.progress = 1.0;
+      OnJobStopped();
+    }
+    #endregion
+
+
+    #region INamedItem Members
+
+    public bool CanChangeDescription {
+      get { return optimizer.CanChangeDescription; }
+    }
+
+    public bool CanChangeName {
+      get { return optimizer.CanChangeName; }
+    }
+
+    public string Description {
+      get { return optimizer.Description; }
+      set { optimizer.Description = value; }
+    }
+    public event EventHandler DescriptionChanged;
+
+    public string Name {
+      get { return optimizer.Name; }
+      set { optimizer.Name = value; }
+    }
+    public event EventHandler NameChanged;
+    public event EventHandler<Common.CancelEventArgs<string>> NameChanging;
+
+    #endregion
+
+    #region IItem Members
+
+    public string ItemDescription {
+      get { return optimizer.ItemDescription; }
+    }
+
+    public System.Drawing.Image ItemImage {
+      get { return optimizer.ItemImage; }
+    }
+
+    public event EventHandler ItemImageChanged;
+    public string ItemName {
+      get { return optimizer.ItemName; }
+    }
+
+    public Version ItemVersion {
+      get { return optimizer.ItemVersion; }
+    }
+    public event EventHandler ToStringChanged;
+
+    #endregion
+
+    #region IStorableContent Members
+
+    public string Filename {
+      get;
+      set;
+    }
+    public event EventHandler FilenameChanged;
+
+    #endregion
+
+    #region IDeepCloneable Members
+
+    public Common.IDeepCloneable Clone(Common.Cloner cloner) {
+      throw new NotImplementedException();
+    }
+
+    #endregion
+
+    #region ICloneable Members
+
+    public object Clone() {
+      throw new NotImplementedException();
+    }
+
+    #endregion
+
+    /// <summary>
+    /// Gets the string representation of the current instance in the format: <c>Name: [null|Value]</c>.
+    /// </summary>
+    /// <returns>The current instance as a string.</returns>
+    public override string ToString() {
+      return Name;
+    }
+    
+    public virtual bool IsParallelizable {
+      get { return false; }
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/OptimizerJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/OptimizerJob.cs	(revision 4343)
+++ 	(revision )
@@ -1,105 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Hive.JobBase;
-using HeuristicLab.Optimization;
-using HeuristicLab.Core;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-
-namespace HeuristicLab.Hive.Experiment {
-  [StorableClass]
-  public class OptimizerJob : IJob {
-
-    [Storable]
-    private IOptimizer optimizer;
-    public IOptimizer Optimizer {
-      get { return optimizer;  }
-      set {
-        if (optimizer != null && value != optimizer) {
-          DeregisterEvents();
-        }
-        optimizer = value;
-        if (optimizer != null) {
-          RegisterEvents();
-        }
-      }
-    }
-
-    [Storable]
-    private double progress = 0.0;
-
-    public OptimizerJob() {
-    }
-
-    [StorableHook(HookType.AfterDeserialization)]
-    private void AfterDeserialization() {
-      RegisterEvents();
-    }
-
-    #region IJob Members
-
-    public long JobId {
-      get;
-      set;
-    }
-
-    public double Progress {
-      get { return optimizer.ExecutionState == ExecutionState.Stopped ? 1.0 : this.progress; }
-    }
-
-    public ExecutionState ExecutionState {
-      get { return optimizer.ExecutionState; }
-    }
-
-    public void Run() {
-      throw new NotSupportedException();
-    }
-
-    public void Prepare() {
-      optimizer.Prepare();
-    }
-
-    public void Start() {
-      optimizer.Start();
-    }
-
-    public void Stop() {
-      optimizer.Stop();
-    }
-
-    public event EventHandler JobStopped;
-
-    public event EventHandler JobFailed;
-
-    #endregion
-
-    #region Events
-    private void RegisterEvents() {
-      optimizer.Stopped += new EventHandler(optimizer_Stopped);
-      optimizer.ExceptionOccurred += new EventHandler<Common.EventArgs<Exception>>(optimizer_ExceptionOccurred);
-    }
-
-    private void DeregisterEvents() {
-      optimizer.Stopped -= new EventHandler(optimizer_Stopped);
-      optimizer.ExceptionOccurred -= new EventHandler<Common.EventArgs<Exception>>(optimizer_ExceptionOccurred);
-    }
-
-    void optimizer_ExceptionOccurred(object sender, Common.EventArgs<Exception> e) {
-      if (optimizer.ExecutionState != ExecutionState.Stopped) this.progress = 0.0;
-      else this.progress = 1.0;
-      EventHandler handler = JobFailed;
-      if (handler != null) handler(this, e);
-    }
-
-    void optimizer_Stopped(object sender, EventArgs e) {
-      if (optimizer.ExecutionState != ExecutionState.Stopped) this.progress = 0.0;
-      else this.progress = 1.0;
-      EventHandler handler = JobStopped;
-      if (handler != null) handler(this, e);
-    }
-    #endregion
-
-
-  }
-}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs	(revision 4368)
@@ -28,31 +28,38 @@
 using HeuristicLab.Hive.Contracts;
 using HeuristicLab.Hive.Experiment.Properties;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Experiment {
   internal class ServiceLocator {
-    internal static IClientFacade CreateClientFacade(string hostAddress) {
-      ChannelFactory<IClientFacade> factory = new ChannelFactory<IClientFacade>("ClientHttpEndpoint");
-      WcfSettings.SetEndpointAddress(factory.Endpoint, hostAddress);
+    private static ServiceLocator instance = null;
+    private WcfServicePool<IClientFacade> clientFacadePool = null;
+    private WcfServicePool<IClientFacade> streamedClientFacadePool = null;
 
-      factory.Credentials.UserName.UserName = Settings.Default.HiveUsername;
-      factory.Credentials.UserName.Password = Settings.Default.HivePassword;
-
-      IClientFacade client = factory.CreateChannel();
-      return client;
+    internal static ServiceLocator Instance {
+      get {
+        if (instance == null) {
+          instance = new ServiceLocator();
+        }
+        return instance;
+      }
     }
 
-    internal static IClientFacade CreateStreamedClientFacade(string hostAddress) {
-      ChannelFactory<IClientFacade> factory = new ChannelFactory<IClientFacade>("ClientTcpStreamedEndpoint");
-      WcfSettings.SetEndpointAddress(factory.Endpoint, hostAddress);
-
-      factory.Credentials.UserName.UserName = Settings.Default.HiveUsername;
-      factory.Credentials.UserName.Password = Settings.Default.HivePassword;
-
-      IClientFacade client = factory.CreateChannel();
-      return client;
+    internal WcfServicePool<IClientFacade> ClientFacadePool {
+      get {
+        if (clientFacadePool == null) {
+          clientFacadePool = new WcfServicePool<IClientFacade>(Settings.Default.HiveServerIp, Settings.Default.HiveUsername, Settings.Default.HivePassword, "ClientHttpEndpoint");
+        }
+        return clientFacadePool;
+      }
     }
 
-    public static void DisposeClientFacade(IClientFacade clientFacade) {
-      WcfSettings.DisposeWcfClient((ICommunicationObject)clientFacade);      
+    internal WcfServicePool<IClientFacade> StreamedClientFacadePool {
+      get {
+        if (streamedClientFacadePool == null) {
+          streamedClientFacadePool = new WcfServicePool<IClientFacade>(Settings.Default.HiveServerIp, Settings.Default.HiveUsername, Settings.Default.HivePassword, "ClientTcpStreamedEndpoint");
+        }
+        return streamedClientFacadePool;
+      }
     }
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj	(revision 4368)
@@ -91,4 +91,5 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Core-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
@@ -116,4 +117,5 @@
     <Compile Include="Interfaces\IJob.cs" />
     <Compile Include="HeuristicLabHiveJobBasePlugin.cs" />
+    <Compile Include="PluginUtil.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/Interfaces/IJob.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/Interfaces/IJob.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/Interfaces/IJob.cs	(revision 4368)
@@ -2,18 +2,57 @@
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Hive.JobBase {
-  public interface IJob {
-    long JobId { get; set; }
+  public interface IJob : INamedItem {
+    /// <summary>
+    /// This ID is needed to identify the object when it returns from hive
+    /// </summary>
+    Guid InternalId { get; }
+
     ExecutionState ExecutionState { get; }
+    IEnumerable<IJob> ChildJobs { get; }
     double Progress { get; }
+    ILog Log { get; }
 
+    /// <summary>
+    /// indicates wether it is possible to create childjobs from this job
+    /// </summary>
+    bool IsParallelizable { get; }
+
+    /// <summary>
+    /// Configuration to indicate if this job should create child-jobs which will be executed in hive
+    /// Cannot be set true if IsParallelizable is false
+    /// </summary>
+    bool ComputeInParallel { get; set; }
+
+    /// <summary>
+    /// Gets or sets the cores that will be needed by this job
+    /// </summary>
+    int CoresNeeded { get; set; }
+
+    /// <summary>
+    /// Gets or sets the memory that will be consumed by this job
+    /// </summary>
+    int MemoryNeeded { get; set; }
+    
     void Run();
     void Prepare();
     void Start();
     void Stop();
+    void Resume(IEnumerable<IJob> childJobs);
 
     event EventHandler JobStopped;
     event EventHandler JobFailed;
+
+    /// <summary>
+    /// When this event occurs the job wants to sleep until all his child jobs are finished
+    /// </summary>
+    event EventHandler WaitForChildJobs;
+
+    /// <summary>
+    /// This event will be thrown when the job wants to have a child-job to be computed
+    /// </summary>
+    event EventHandler<Common.EventArgs<IJob>> NewChildJob;
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/PluginUtil.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/PluginUtil.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/PluginUtil.cs	(revision 4368)
@@ -0,0 +1,96 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Reflection;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Hive.JobBase {
+  public static class PluginUtil {
+    #region Required Plugin Search
+    
+    /// <summary>
+    /// Returns a list of plugins in which the type itself and all members 
+    /// of the type are declared. Objectgraph is searched recursively.
+    /// </summary>
+    public static IEnumerable<IPluginDescription> GetDeclaringPlugins(Type type) {
+      HashSet<Type> types = new HashSet<Type>();
+      FindTypes(type, types, "HeuristicLab.");
+      return GetDeclaringPlugins(types);
+    }
+
+    /// <summary>
+    /// Returns the plugins (including dependencies) in which the given types are declared
+    /// </summary>
+    public static IEnumerable<IPluginDescription> GetDeclaringPlugins(IEnumerable<Type> types) {
+      HashSet<IPluginDescription> plugins = new HashSet<IPluginDescription>();
+      foreach (Type t in types) {
+        FindDeclaringPlugins(ApplicationManager.Manager.GetDeclaringPlugin(t), plugins);
+      }
+      return plugins;
+    }
+
+    /// <summary>
+    /// Finds the dependencies of the given plugin and adds it to the plugins hashset.
+    /// Also searches the dependencies recursively.
+    /// </summary>
+    public static void FindDeclaringPlugins(IPluginDescription plugin, HashSet<IPluginDescription> plugins) {
+      if (!plugins.Contains(plugin)) {
+        plugins.Add(plugin);
+        foreach (IPluginDescription dependency in plugin.Dependencies) {
+          FindDeclaringPlugins(dependency, plugins);
+        }
+      }
+    }
+
+    /// <summary>
+    /// Recursively finds all types used in type which are in a namespace which starts with namespaceStart
+    /// Be aware that search is not performed on attributes
+    /// </summary>
+    /// <param name="type">the type to be searched</param>
+    /// <param name="types">found types will be stored there, needed in order to avoid duplicates</param>
+    /// <param name="namespaceStart">only types from namespaces which start with this will be searched and added</param>
+    public static void FindTypes(Type type, HashSet<Type> types, string namespaceStart) {
+      if (!types.Contains(type) && type.Namespace.StartsWith(namespaceStart)) {
+        types.Add(type);
+
+        // constructors
+        foreach (ConstructorInfo info in type.GetConstructors()) {
+          foreach (ParameterInfo paramInfo in info.GetParameters()) {
+            FindTypes(paramInfo.ParameterType, types, namespaceStart);
+          }
+        }
+
+        // interfaces
+        foreach (Type t in type.GetInterfaces()) {
+          FindTypes(t, types, namespaceStart);
+        }
+
+        // events
+        foreach (EventInfo info in type.GetEvents()) {
+          FindTypes(info.EventHandlerType, types, namespaceStart);
+          FindTypes(info.DeclaringType, types, namespaceStart);
+        }
+
+        // properties
+        foreach (PropertyInfo info in type.GetProperties()) {
+          FindTypes(info.PropertyType, types, namespaceStart);
+        }
+
+        // fields
+        foreach (FieldInfo info in type.GetFields()) {
+          FindTypes(info.FieldType, types, namespaceStart);
+        }
+
+        // methods
+        foreach (MethodInfo info in type.GetMethods()) {
+          foreach (ParameterInfo paramInfo in info.GetParameters()) {
+            FindTypes(paramInfo.ParameterType, types, namespaceStart);
+          }
+          FindTypes(info.ReturnType, types, namespaceStart);
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/app.config
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/app.config	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/app.config	(revision 4368)
@@ -18,8 +18,8 @@
             openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
             bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
-            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
+            maxBufferPoolSize="524288" maxReceivedMessageSize="104857600"
             messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
             allowCookies="false">
-          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
+          <readerQuotas maxDepth="32" maxStringContentLength="104857600" maxArrayLength="104857600"
               maxBytesPerRead="4096" maxNameTableCharCount="16384" />
           <reliableSession ordered="true" inactivityTimeout="00:10:00"
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Authorization/AuthorizationManager.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Authorization/AuthorizationManager.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Authorization/AuthorizationManager.cs	(revision 4368)
@@ -9,25 +9,24 @@
 using HeuristicLab.Hive.Server.DataAccess;
 using HeuristicLab.Hive.Server.Core.InternalInterfaces;
+using System.Web.Security;
 
 namespace HeuristicLab.Hive.Server.Core.Authorization {
   public class AuthorizationManager : IAuthorizationManager {
-    private IContextFactory contextFactory = ServiceLocator.GetContextFactory();
+    private MembershipUser Identity {
+      get { return Membership.GetUser(); }
+    }
+
+    public Guid UserId {
+      get { return (Guid)Identity.ProviderUserKey; }
+    }
 
     public void AuthorizeForJobs(params Guid[] jobIds) {
-      if (!(Identity.IsAuthenticated && IsAuthorizedForJobs(jobIds))) {
-        throw new SecurityException("User '" + Identity.Name + "' is not authorized to access job (Id: " + string.Join(", ", jobIds.Select(x => x.ToString()).ToArray()) + ")");
+      if (!IsAuthorizedForJobs(jobIds)) {
+        throw new SecurityException("User '" + Identity.UserName + "' is not authorized to access job (Id: " + string.Join(", ", jobIds.Select(x => x.ToString()).ToArray()) + ")");
       }
-    }
-
-    public string UserId {
-      get { return Identity.Name; }
     }
     
     private bool IsAuthorizedForJobs(params Guid[] jobIds) {
-      return DaoLocator.JobDao.IsUserAuthorizedForJobs(Identity.Name, jobIds);
-    }
-
-    private IIdentity Identity {
-      get { return ServiceSecurityContext.Current.PrimaryIdentity; }
+      return DaoLocator.JobDao.IsUserAuthorizedForJobs(UserId, jobIds);
     }
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/DefaultScheduler.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/DefaultScheduler.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/DefaultScheduler.cs	(revision 4368)
@@ -21,6 +21,7 @@
 
     public bool ExistsJobForSlave(HeartBeatData hbData) {
-      List<JobDto> allOfflineJobsForSlave = new List<JobDto>(DaoLocator.JobDao.FindFittingJobsForSlave(JobState.Offline, hbData.FreeCores, hbData.FreeMemory, hbData.SlaveId));
-      return (allOfflineJobsForSlave != null && allOfflineJobsForSlave.Count > 0);
+      return 
+        DaoLocator.JobDao.FindJobsWithFinishedChilds(hbData.SlaveId).Count() > 0 || 
+        DaoLocator.JobDao.FindFittingJobs(JobState.Offline, hbData.FreeCores, hbData.FreeMemory, hbData.SlaveId).Count() > 0;
     }
 
@@ -31,15 +32,16 @@
         using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
           SlaveDto slave = DaoLocator.SlaveDao.FindById(slaveId);
+
           if (slave != null) {
-            LinkedList<JobDto> allOfflineJobsForSlave = new LinkedList<JobDto>(DaoLocator.JobDao.FindFittingJobsForSlave(JobState.Offline, slave.NrOfFreeCores, slave.FreeMemory, slave.Id));
-            if (allOfflineJobsForSlave != null && allOfflineJobsForSlave.Count > 0) {
-              jobToCalculate = allOfflineJobsForSlave.First.Value;
-              jobToCalculate.State = JobState.Calculating;
-              jobToCalculate.Slave = slave;
-              jobToCalculate.Slave.State = SlaveState.Calculating;
-              jobToCalculate.DateCalculated = DateTime.Now;
-              DaoLocator.JobDao.AssignSlaveToJob(slave.Id, jobToCalculate.Id);
-              DaoLocator.JobDao.Update(jobToCalculate);
-              DaoLocator.SlaveDao.Update(jobToCalculate.Slave);
+            LinkedList<JobDto> finishedJobsForSlave = new LinkedList<JobDto>(DaoLocator.JobDao.FindJobsWithFinishedChilds(slave.Id));
+            if (finishedJobsForSlave != null && finishedJobsForSlave.Count > 0) {
+              jobToCalculate = finishedJobsForSlave.First.Value;
+              UpdateJobAsCalculating(jobToCalculate, slave);
+            }
+
+            LinkedList<JobDto> offlineJobsForSlave = new LinkedList<JobDto>(DaoLocator.JobDao.FindFittingJobs(JobState.Offline, slave.NrOfFreeCores, slave.FreeMemory, slave.Id));
+            if (offlineJobsForSlave != null && offlineJobsForSlave.Count > 0) {
+              jobToCalculate = offlineJobsForSlave.First.Value;
+              UpdateJobAsCalculating(jobToCalculate, slave);
             }
           }
@@ -52,4 +54,14 @@
     }
 
+    private static void UpdateJobAsCalculating(JobDto jobToCalculate, SlaveDto slave) {
+      jobToCalculate.State = JobState.Calculating;
+      jobToCalculate.Slave = slave;
+      jobToCalculate.Slave.State = SlaveState.Calculating;
+      jobToCalculate.DateCalculated = DateTime.Now;
+      DaoLocator.JobDao.AssignSlaveToJob(slave.Id, jobToCalculate.Id);
+      DaoLocator.JobDao.Update(jobToCalculate);
+      DaoLocator.SlaveDao.Update(jobToCalculate.Slave);
+    }
+
     #endregion
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ClientFacade.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ClientFacade.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ClientFacade.cs	(revision 4368)
@@ -69,8 +69,17 @@
     [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
-    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot) {
+    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId) {
       using (contextFactory.GetContext(false)) {
         ServiceLocator.GetAuthorizationManager().AuthorizeForJobs(jobId);
-        return jobManager.GetLastSerializedResult(jobId, requested, snapshot);
+        return jobManager.GetLastSerializedResult(jobId);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    public ResponseObject<SerializedJob> GetSnapshotResult(Guid jobId) {
+      using (contextFactory.GetContext(false)) {
+        ServiceLocator.GetAuthorizationManager().AuthorizeForJobs(jobId);
+        return jobManager.GetSnapshotResult(jobId);
       }
     }
@@ -103,5 +112,18 @@
     }
 
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Client)]
+    public ResponseObject<JobResultList> GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent) {
+      using (contextFactory.GetContext(false)) {
+        if (parentJobId.HasValue) {
+          ServiceLocator.GetAuthorizationManager().AuthorizeForJobs(parentJobId.Value);
+        } 
+        // If parentJobId is null, GetChildJobResults will filter the results for the current user
+        return jobManager.GetChildJobResults(parentJobId, recursive, includeParent);
+      }
+    }
     #endregion
+
+
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ServerConsoleFacade.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ServerConsoleFacade.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ServerConsoleFacade.cs	(revision 4368)
@@ -32,4 +32,5 @@
 using HeuristicLab.Hive.Contracts.ResponseObjects;
 using System.Security.Permissions;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -46,4 +47,5 @@
     }
 
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
     public Response Login() {
       Response resp = new Response();
@@ -129,7 +131,14 @@
 
     [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
-    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot) {
-      using (contextFactory.GetContext(false)) {
-        return jobManager.GetLastSerializedResult(jobId, requested, snapshot);
+    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId) {
+      using (contextFactory.GetContext(false)) {
+        return jobManager.GetLastSerializedResult(jobId);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    public ResponseObject<SerializedJob> GetSnapshotResult(Guid jobId) {
+      using (contextFactory.GetContext(false)) {
+        return jobManager.GetSnapshotResult(jobId);
       }
     }
@@ -223,4 +232,25 @@
       using (contextFactory.GetContext()) {
         return jobManager.AddJobWithGroupStrings(job, resources);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    public ResponseObject<JobResultList> GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent) {
+      using (contextFactory.GetContext()) {
+        return jobManager.GetChildJobResults(parentJobId, recursive, includeParent);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    public ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob) {
+      using (contextFactory.GetContext()) {
+        return jobManager.AddChildJob(parentJobId, serializedJob);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    public ResponseObject<JobDto> PauseJob(SerializedJob serializedJob) {
+      using (contextFactory.GetContext()) {
+        return jobManager.PauseJob(serializedJob);
       }
     }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/SlaveFacade.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/SlaveFacade.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/SlaveFacade.cs	(revision 4368)
@@ -37,4 +37,5 @@
 using HeuristicLab.Hive.Contracts.ResponseObjects;
 using System.Security.Permissions;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -42,4 +43,5 @@
   public class SlaveFacade : ISlaveFacade {
     private ISlaveCommunicator slaveCommunicator = ServiceLocator.GetSlaveCommunicator();
+    private IJobManager jobManager = ServiceLocator.GetJobManager();
     private IContextFactory contextFactory = ServiceLocator.GetContextFactory();
 
@@ -126,4 +128,13 @@
       using (contextFactory.GetContext()) {
         return slaveCommunicator.SetCalendarStatus(slaveId, state);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    public ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob) {
+      using (contextFactory.GetContext()) {
+        return jobManager.AddChildJob(parentJobId, serializedJob);
+        
       }
     }
@@ -186,4 +197,28 @@
       }
     }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    public ResponseObject<JobDto> PauseJob(SerializedJob serializedJob) {
+      using (contextFactory.GetContext()) {
+        return jobManager.PauseJob(serializedJob);
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    public JobResultList GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent) {
+      using (contextFactory.GetContext(false)) {
+        return jobManager.GetChildJobResults(parentJobId, recursive, includeParent).Obj;
+      }
+    }
+
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Administrator)]
+    [PrincipalPermission(SecurityAction.Demand, Role = HiveRoles.Slave)]
+    public SerializedJob GetLastSerializedResult(Guid jobId) {
+      using (contextFactory.GetContext(false)) {
+        return jobManager.GetLastSerializedResult(jobId).Obj;
+      }
+    }
     #endregion
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/HeuristicLab.Hive.Server.Core-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/HeuristicLab.Hive.Server.Core-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/HeuristicLab.Hive.Server.Core-3.3.csproj	(revision 4368)
@@ -83,4 +83,7 @@
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
@@ -150,4 +153,8 @@
       <Name>HeuristicLab.Hive.Contracts-3.3</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive.JobBase\3.3\HeuristicLab.Hive.JobBase-3.3.csproj">
+      <Project>{21187322-52DD-4243-80A4-A85F0263E63B}</Project>
+      <Name>HeuristicLab.Hive.JobBase-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Hive.Server.DataAccess\3.3\HeuristicLab.Hive.Server.DataAccess-3.3.csproj">
       <Project>{4D5A2A16-66C2-431D-9AA3-BD3041E64B84}</Project>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/InternalInterfaces/IAuthorizationManager.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/InternalInterfaces/IAuthorizationManager.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/InternalInterfaces/IAuthorizationManager.cs	(revision 4368)
@@ -4,5 +4,5 @@
   public interface IAuthorizationManager {
 
-    string UserId { get; }
+    Guid UserId { get; }
 
     /// <summary>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs	(revision 4368)
@@ -39,4 +39,5 @@
 using IsolationLevel = System.Transactions.IsolationLevel;
 using HeuristicLab.Hive.Contracts.ResponseObjects;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -141,5 +142,5 @@
         }
       }
-      return AddNewJob(job);
+      return AddNewJob(job, true);
     }
 
@@ -148,6 +149,7 @@
     /// </summary>
     /// <param name="job"></param>
-    /// <returns></returns>
-    public ResponseObject<JobDto> AddNewJob(SerializedJob job) {
+    /// <param name="overrideUserid">if false, job.JobInfo.UserId will not be overridden</param>
+    /// <returns></returns>
+    public ResponseObject<JobDto> AddNewJob(SerializedJob job, bool overrideUserid) {
       ResponseObject<JobDto> response = new ResponseObject<JobDto>();
 
@@ -167,5 +169,7 @@
 
         job.JobInfo.DateCreated = DateTime.Now;
-        job.JobInfo.UserId = ServiceLocator.GetAuthorizationManager().UserId;
+        if (overrideUserid) {
+          job.JobInfo.UserId = ServiceLocator.GetAuthorizationManager().UserId;
+        }
         DaoLocator.JobDao.InsertWithAttachedJob(job);
         DaoLocator.PluginInfoDao.InsertPluginDependenciesForJob(job.JobInfo);
@@ -177,4 +181,8 @@
 
       return response;
+    }
+
+    public ResponseObject<JobDto> AddNewJob(SerializedJob job) {
+      return AddNewJob(job, true);
     }
 
@@ -213,31 +221,29 @@
     //}
 
-    // [chn] [refactor] why does this method handle 3 different cases? wouldn't 3 methods be easier?
-    //Requested means: there MUST be a job result which gets sent back
-    // requested==true: resultat mit job
-    // requested==false: 
-    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot) {
+    public ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId) {
       ResponseObject<SerializedJob> response = new ResponseObject<SerializedJob>();
-
       JobDto job = DaoLocator.JobDao.FindById(jobId);
 
-      //if it's a snapshot but the result hasn't reached the server yet...
-      if (snapshot && (job.State == JobState.SnapshotRequested || job.State == JobState.SnapshotSent)) {
-        response.StatusMessage = ResponseStatus.GetLastSerializedResult_JobResultNotYetThere;
-
-        return response;
-      }
-
-      //if it's NOT a snapshot, NEITHER request NOR is it finished
-      if (!requested && !snapshot && job.State != JobState.Finished) {
-        response.StatusMessage = ResponseStatus.GetLastSerializedResult_JobResultNotYetThere;
-
-        return response;
-      }
-
-      //every other case - snapshot, job finished or it's requested
       response.Obj = new SerializedJob();
       response.Obj.JobInfo = job;
 
+      response.Obj.SerializedJobData = DaoLocator.JobDao.GetBinaryJobFile(jobId);
+
+      return response;
+    }
+
+    public ResponseObject<SerializedJob> GetSnapshotResult(Guid jobId) {
+      ResponseObject<SerializedJob> response = new ResponseObject<SerializedJob>();
+
+      JobDto job = DaoLocator.JobDao.FindById(jobId);
+
+      //if it's a snapshot but the result hasn't reached the server yet...
+      if (job.State == JobState.SnapshotRequested || job.State == JobState.SnapshotSent) {
+        response.StatusMessage = ResponseStatus.GetSnapshotResult_JobResultNotYetThere;
+        return response;
+      }
+
+      response.Obj = new SerializedJob();
+      response.Obj.JobInfo = job;
       response.Obj.SerializedJobData = DaoLocator.JobDao.GetBinaryJobFile(jobId);
 
@@ -304,5 +310,5 @@
       foreach (JobDto job in jobs) {
         jobResultList.Add(new JobResult() {
-          JobId = job.Id,
+          Id = job.Id,
           State = job.State,
           DateCalculated = job.DateCalculated,
@@ -324,4 +330,64 @@
     }
 
+    public ResponseObject<JobResultList> GetChildJobResults(Guid? parentJobId, bool recursive, bool includeParent) {
+      ResponseObject<JobResultList> response = new ResponseObject<JobResultList>();
+      JobResultList jobResultList = new JobResultList();
+
+      IList<JobDto> jobs = DaoLocator.JobDao.FindJobsByParentId(parentJobId, recursive).ToList();
+      if (!parentJobId.HasValue) {
+        jobs = jobs.Where(job => job.UserId == ServiceLocator.GetAuthorizationManager().UserId).ToList();
+      }
+
+      if (includeParent && parentJobId.HasValue) {
+        jobs.Add(DaoLocator.JobDao.FindById(parentJobId.Value));
+      }
+
+      foreach (JobDto job in jobs) {
+        if (job != null) {
+          jobResultList.Add(new JobResult() {
+            Id = job.Id,
+            State = job.State,
+            DateCreated = job.DateCreated,
+            DateCalculated = job.DateCalculated,
+            DateFinished = job.DateFinished,
+            Exception = job.Exception,
+            Percentage = job.Percentage,
+            ParentJobId = job.ParentJob != null ? new Nullable<Guid>(job.ParentJob.Id) : null
+          });
+        }
+      }
+      
+      response.Obj = jobResultList;
+      return response;
+    }
+
+    public ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob) {
+      JobDto parentJob = DaoLocator.JobDao.FindById(parentJobId);
+
+      serializedJob.JobInfo.ParentJob = parentJob;
+      serializedJob.JobInfo.UserId = parentJob.UserId;
+      serializedJob.JobInfo.AssignedResourceIds = parentJob.AssignedResourceIds;
+
+      return AddNewJob(serializedJob, false);
+    }
+
+    public ResponseObject<JobDto> PauseJob(SerializedJob serializedJob) {
+      JobDto jobDto = DaoLocator.JobDao.FindById(serializedJob.JobInfo.Id);
+
+      jobDto.State = serializedJob.JobInfo.State;
+      jobDto.Percentage = serializedJob.JobInfo.Percentage;
+      
+
+      DaoLocator.JobDao.SetBinaryJobFile(serializedJob.JobInfo.Id, serializedJob.SerializedJobData);
+      DaoLocator.JobDao.Update(jobDto);
+
+      DaoLocator.JobDao.UnAssignSlaveToJob(jobDto.Id);
+
+      return new ResponseObject<JobDto>() {
+        Obj = jobDto,
+        StatusMessage = ResponseStatus.Ok
+      };
+    }
+
     #endregion
 
@@ -352,4 +418,8 @@
     }
     #endregion
+
+
+    
+
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/SlaveCommunicator.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/SlaveCommunicator.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/SlaveCommunicator.cs	(revision 4368)
@@ -39,4 +39,5 @@
 using System.ServiceModel;
 using System.Security;
+using HeuristicLab.Hive.JobBase;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -465,5 +466,5 @@
       //tx = session.BeginTransaction();
 
-      ResponseResultReceived response = ProcessJobResult(result.SlaveId, result.JobId, new byte[] { }, result.Percentage, result.Exception, finished);
+      ResponseResultReceived response = ProcessJobResult(result.SlaveId, result.Id, new byte[] { }, result.Percentage, result.Exception, finished);
 
       if (response.StatusMessage == ResponseStatus.Ok) {
@@ -487,5 +488,5 @@
         //jobStream.Close();
 
-        DaoLocator.JobDao.SetBinaryJobFile(result.JobId, serializedJob.ToArray());
+        DaoLocator.JobDao.SetBinaryJobFile(result.Id, serializedJob.ToArray());
       }
       Logger.Info("END Job received for Storage:");
@@ -721,5 +722,5 @@
       return currCachedPlugin;
     }
-
+    
     #endregion
   }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/app.config
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/app.config	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/app.config	(revision 4368)
@@ -53,5 +53,5 @@
         <binding name="TcpStreamedBinding" sendTimeout="00:10:00" transferMode="Streamed"
           maxBufferPoolSize="104857600" maxBufferSize="104857600"
-          maxReceivedMessageSize="104857600">
+          maxReceivedMessageSize="104857600" maxConnections="50">
           <readerQuotas maxStringContentLength="104857600" maxArrayLength="104857600" />
           <security mode="TransportWithMessageCredential">
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.DataAccess/3.3/IJobDao.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.DataAccess/3.3/IJobDao.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.DataAccess/3.3/IJobDao.cs	(revision 4368)
@@ -13,4 +13,6 @@
     void AssignSlaveToJob(Guid slaveId, Guid jobId);
 
+    void UnAssignSlaveToJob(Guid jobId);
+
     void SetJobOffline(JobDto job);
 
@@ -19,5 +21,5 @@
     byte[] GetBinaryJobFile(Guid jobId); 
 
-    IEnumerable<JobDto> FindFittingJobsForSlave(JobState state, int freeCores, int freeMemory, Guid slaveGuid);
+    IEnumerable<JobDto> FindFittingJobs(JobState state, int freeCores, int freeMemory, Guid slaveGuid);
 
     Stream GetSerializedJobStream(Guid jobId);
@@ -29,5 +31,12 @@
     IEnumerable<JobDto> FindJobsById(IEnumerable<Guid> jobIds);
 
-    bool IsUserAuthorizedForJobs(string userId, params Guid[] jobIds);
+    bool IsUserAuthorizedForJobs(Guid userId, params Guid[] jobIds);
+
+    IEnumerable<JobDto> FindJobsByParentId(Guid? parentJobId, bool recursive);
+
+    /// <summary>
+    /// Returns a list of jobs which are on state WaitForChildJobs and those child-jobs are finished
+    /// </summary>
+    IEnumerable<JobDto> FindJobsWithFinishedChilds(Guid guid);
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.cs	(revision 4368)
@@ -1979,5 +1979,5 @@
 		private System.Nullable<System.Guid> _ProjectId;
 		
-		private string _UserId;
+		private System.Nullable<System.Guid> _UserId;
 		
 		private int _CoresNeeded;
@@ -2025,5 +2025,5 @@
     partial void OnProjectIdChanging(System.Nullable<System.Guid> value);
     partial void OnProjectIdChanged();
-    partial void OnUserIdChanging(string value);
+    partial void OnUserIdChanging(System.Nullable<System.Guid> value);
     partial void OnUserIdChanged();
     partial void OnCoresNeededChanging(int value);
@@ -2296,6 +2296,6 @@
 		}
 		
-		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UserId", DbType="VarChar(MAX)")]
-		public string UserId
+		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_UserId", DbType="UniqueIdentifier")]
+		public System.Nullable<System.Guid> UserId
 		{
 			get
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.xml
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.xml	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/HiveDataContext.xml	(revision 4368)
@@ -107,5 +107,5 @@
       <Column Name="Priority" Member="Priority" DbType="Int NOT NULL" Type="System.Int32"/>
       <Column Name="ProjectId" Member="ProjectId" DbType="UniqueIdentifier" Type="System.Guid" CanBeNull="true"/>
-      <Column Name="UserId" Member="UserId" DbType="VarChar(MAX)" Type="System.String" CanBeNull="true"/>
+      <Column Name="UserId" Member="UserId" DbType="UniqueIdentifier" Type="System.Guid" CanBeNull="true"/>
       <Column Name="CoresNeeded" Member="CoresNeeded" DbType="Int NOT NULL" Type="System.Int32"/>
       <Column Name="MemoryNeeded" Member="MemoryNeeded" DbType="Int NOT NULL" Type="System.Int32"/>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/JobDao.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/JobDao.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/JobDao.cs	(revision 4368)
@@ -73,6 +73,6 @@
       Job j = DtoToEntity(job.JobInfo, null);
       j.SerializedJob = job.SerializedJobData;
-      foreach (Guid assignRessourceId in job.JobInfo.AssignedResourceIds)
-        j.AssignedResources.Add(new AssignedResource { ResourceId = assignRessourceId });
+      //foreach (Guid assignRessourceId in job.JobInfo.AssignedResourceIds)
+      //  j.AssignedResources.Add(new AssignedResource { ResourceId = assignRessourceId });
       Context.Jobs.InsertOnSubmit(j);
       CommitChanges();
@@ -98,10 +98,11 @@
                      j.JobState == Enum.GetName(typeof(JobState), JobState.Aborted) ||
                      j.JobState == Enum.GetName(typeof(JobState), JobState.SnapshotRequested) ||
-                     j.JobState == Enum.GetName(typeof(JobState), JobState.SnapshotSent)) &&
+                     j.JobState == Enum.GetName(typeof(JobState), JobState.SnapshotSent) ||
+                     j.JobState == Enum.GetName(typeof(JobState), JobState.WaitForChildJobs)) &&
                     (j.ResourceId.Equals(slave.Id))
               select EntityToDto(j, null)).ToList();
     }
 
-    public IEnumerable<JobDto> FindFittingJobsForSlave(JobState state, int freeCores, int freeMemory, Guid slaveId) {
+    public IEnumerable<JobDto> FindFittingJobs(JobState state, int freeCores, int freeMemory, Guid slaveId) {
       SlaveGroupDao cgd = new SlaveGroupDao();
 
@@ -111,5 +112,5 @@
 
       var q = (from ar in Context.AssignedResources
-               where ar.Job.JobState == Enum.GetName(typeof(JobState), JobState.Offline) &&
+               where ar.Job.JobState == Enum.GetName(typeof(JobState), state) &&
                      ar.Job.CoresNeeded <= freeCores &&
                      ar.Job.MemoryNeeded <= freeMemory &&
@@ -120,4 +121,22 @@
     }
 
+    public IEnumerable<JobDto> FindJobsWithFinishedChilds(Guid slaveId) {
+      SlaveGroupDao cgd = new SlaveGroupDao();
+      
+      List<Guid> idList = new List<Guid>(cgd.FindAllGroupAndParentGroupIdsForSlave(slaveId));
+      //Add myself too - enables jobs for one specific host!
+      idList.Add(slaveId);
+
+      var query = from ar in Context.AssignedResources
+                  where ar.Job.JobState == Enum.GetName(typeof(JobState), JobState.WaitForChildJobs) &&
+                    (from child in Context.Jobs
+                     where child.ParentJobId == ar.Job.JobId
+                     select child.JobState == Enum.GetName(typeof(JobState), JobState.Finished)).All(x => x)
+                  orderby ar.Job.Priority descending
+                  select EntityToDto(ar.Job, null);
+      var list = query.ToList();
+      return list;
+    }
+
     public IEnumerable<JobDto> GetJobsByState(JobState state) {
       return (from j in Context.Jobs
@@ -127,8 +146,14 @@
 
     public void AssignSlaveToJob(Guid slaveId, Guid jobId) {
-      Slave c = Context.Resources.OfType<Slave>().SingleOrDefault(slave => slave.ResourceId.Equals(slaveId));
+      Slave s = Context.Resources.OfType<Slave>().SingleOrDefault(slave => slave.ResourceId.Equals(slaveId));
       Job j = Context.Jobs.SingleOrDefault(job => job.JobId.Equals(jobId));
-      c.Jobs.Add(j);
-      j.Slave = c;
+      s.Jobs.Add(j);
+      j.Slave = s;
+      CommitChanges();
+    }
+
+    public void UnAssignSlaveToJob(Guid jobId) {
+      Job j = Context.Jobs.SingleOrDefault(job => job.JobId.Equals(jobId));
+      j.Slave = null;
       CommitChanges();
     }
@@ -153,5 +178,5 @@
     }
 
-    public bool IsUserAuthorizedForJobs(string userId, params Guid[] jobIds) {
+    public bool IsUserAuthorizedForJobs(Guid userId, params Guid[] jobIds) {
       var jobs = from job in Context.Jobs
                  where jobIds.Contains(job.JobId)
@@ -159,4 +184,20 @@
       return jobs.All(job => job.UserId == userId);
     }
+
+    public IEnumerable<JobDto> FindJobsByParentId(Guid? parentJobId, bool recursive) {
+      IQueryable<JobDto> query = from job in Context.Jobs
+                                 where parentJobId == null ? !job.ParentJobId.HasValue : job.ParentJobId.Value == parentJobId
+                                 select EntityToDto(job, null);
+      List<JobDto> jobs = query.ToList();
+      if (recursive) {
+        List<JobDto> childs = new List<JobDto>();
+        foreach (JobDto job in jobs) {
+          childs.AddRange(FindJobsByParentId(job.Id, recursive));
+        }
+        jobs.AddRange(childs);
+      }
+      return jobs;
+    }
+
     #endregion
 
@@ -181,8 +222,17 @@
       target.JobState = Enum.GetName(typeof(JobState), source.State);
       target.UserId = source.UserId;
+      if (source.ParentJob != null) {
+        target.ParentJobId = source.ParentJob.Id;
+      }
+
+      foreach (Guid assignRessourceId in source.AssignedResourceIds) {
+        if (!target.AssignedResources.Select(x => x.ResourceId).Contains(assignRessourceId)) {
+          target.AssignedResources.Add(new AssignedResource { ResourceId = assignRessourceId });
+        }
+      }
+
       return target;
     }
 
-    //Assigned ressources are not used atm!
     //Slave is not used ATM - not sure when we stopped using those...
     public override JobDto EntityToDto(Job source, JobDto target) {
@@ -199,5 +249,5 @@
       target.DateFinished = source.DateFinished;
       target.Id = source.JobId;
-      
+
       target.Exception = source.Exception;
       target.Percentage = source.Percentage;
@@ -206,4 +256,10 @@
       target.State = (JobState)Enum.Parse(typeof(JobState), source.JobState, true);
       target.UserId = source.UserId;
+
+      if (source.ParentJobId.HasValue) {
+        target.ParentJob = new JobDto() { Id = source.ParentJobId.Value };
+      }
+      target.AssignedResourceIds = source.AssignedResources.Select(x => x.ResourceId).ToList();
+
       return target;
     }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/GetJobCompletedEventArgs.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/GetJobCompletedEventArgs.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/GetJobCompletedEventArgs.cs	(revision 4368)
@@ -21,5 +21,5 @@
 using System;
 
-namespace HeuristicLab.Hive.Slave.Communication.SlaveService {
+namespace HeuristicLab.Hive.Slave.Communication.SlaveFacade {
   public partial class GetJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
 
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLab.Hive.Slave.Communication-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLab.Hive.Slave.Communication-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLab.Hive.Slave.Communication-3.3.csproj	(revision 4368)
@@ -76,4 +76,5 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Common-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
@@ -112,9 +113,4 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="GetJobCompletedEventArgs.cs" />
-    <Compile Include="Service References\SlaveService\Reference.cs">
-      <AutoGen>True</AutoGen>
-      <DesignTime>True</DesignTime>
-      <DependentUpon>Reference.svcmap</DependentUpon>
-    </Compile>
     <Compile Include="Properties\Settings.Designer.cs">
       <AutoGen>True</AutoGen>
@@ -122,5 +118,10 @@
       <DependentUpon>Settings.settings</DependentUpon>
     </Compile>
-    <Compile Include="SlaveServiceCache.cs" />
+    <Compile Include="Service References\SlaveFacade\Reference.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Reference.svcmap</DependentUpon>
+    </Compile>
+    <Compile Include="ServiceLocator.cs" />
     <Compile Include="WcfService.cs" />
   </ItemGroup>
@@ -130,4 +131,6 @@
     <None Include="Properties\AssemblyInfo.frame" />
     <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.BusinessObjects.JobDto.datasource" />
+    <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.BusinessObjects.JobResult.datasource" />
+    <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob.datasource" />
     <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.ResponseObjects.Response.datasource" />
     <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar.datasource" />
@@ -135,40 +138,39 @@
     <None Include="Properties\DataSources\HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived.datasource" />
     <None Include="Properties\DataSources\HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto.datasource" />
-    <None Include="Service References\SlaveService\SlaveFacade.wsdl" />
-    <None Include="Service References\SlaveService\SlaveService.wsdl" />
-    <None Include="Service References\SlaveService\SlaveService.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService1.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService2.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService3.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService4.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService5.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService6.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService7.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService8.xsd">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="Service References\SlaveService\SlaveService9.xsd">
-      <SubType>Designer</SubType>
-    </None>
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
     </None>
+    <None Include="Service References\SlaveFacade\Arrays.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\HeuristicLab.DataAccess.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\HeuristicLab.Hive.Contracts.BusinessObjects.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\HeuristicLab.Hive.Contracts.ResponseObjects.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\HeuristicLab.Hive.Contracts.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\HeuristicLab.PluginInfrastructure.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\Message.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\service.wsdl" />
+    <None Include="Service References\SlaveFacade\service.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\service1.xsd">
+      <SubType>Designer</SubType>
+    </None>
+    <None Include="Service References\SlaveFacade\System.xsd">
+      <SubType>Designer</SubType>
+    </None>
   </ItemGroup>
   <ItemGroup>
@@ -176,4 +178,8 @@
       <Project>{134F93D7-E7C8-4ECD-9923-7F63259A60D8}</Project>
       <Name>HeuristicLab.Hive.Contracts-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive.JobBase\3.3\HeuristicLab.Hive.JobBase-3.3.csproj">
+      <Project>{21187322-52DD-4243-80A4-A85F0263E63B}</Project>
+      <Name>HeuristicLab.Hive.JobBase-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Hive.Slave.Common\3.3\HeuristicLab.Hive.Slave.Common-3.3.csproj">
@@ -186,17 +192,14 @@
   </ItemGroup>
   <ItemGroup>
-    <WCFMetadataStorage Include="Service References\SlaveService\" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Service References\SlaveService\SlaveService.disco" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Service References\SlaveService\configuration91.svcinfo" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Service References\SlaveService\configuration.svcinfo" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="Service References\SlaveService\Reference.svcmap">
+    <WCFMetadataStorage Include="Service References\SlaveFacade\" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\SlaveFacade\configuration91.svcinfo" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\SlaveFacade\configuration.svcinfo" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Service References\SlaveFacade\Reference.svcmap">
       <Generator>WCF Proxy Generator</Generator>
       <LastGenOutput>Reference.cs</LastGenOutput>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLabHiveSlaveCommunicationPlugin.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLabHiveSlaveCommunicationPlugin.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/HeuristicLabHiveSlaveCommunicationPlugin.cs	(revision 4368)
@@ -36,4 +36,5 @@
   [PluginDependency("HeuristicLab.Hive.Slave.Common", "3.3")]
   [PluginDependency("HeuristicLab.Hive.Contracts", "3.3")]
+  [PluginDependency("HeuristicLab.Hive.JobBase", "3.3")]
   [PluginDependency("HeuristicLab.Tracing", "3.3")]
   public class HeuristicLabHiveSlaveCommunicationPlugin : PluginBase {
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.JobResult.datasource
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.JobResult.datasource	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.JobResult.datasource	(revision 4368)
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="JobResult" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>HeuristicLab.Hive.Contracts.BusinessObjects.JobResult, HeuristicLab.Hive.Contracts-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec</TypeInfo>
+</GenericObjectDataSource>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob.datasource
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob.datasource	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Properties/DataSources/HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob.datasource	(revision 4368)
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio .Net. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="SerializedJob" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+   <TypeInfo>HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob, HeuristicLab.Hive.Contracts-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec</TypeInfo>
+</GenericObjectDataSource>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Arrays.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Arrays.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Arrays.xsd	(revision 4368)
@@ -0,0 +1,28 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:complexType name="ArrayOfKeyValueOfguiddouble">
+    <xs:annotation>
+      <xs:appinfo>
+        <IsDictionary xmlns="http://schemas.microsoft.com/2003/10/Serialization/">true</IsDictionary>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="KeyValueOfguiddouble">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element name="Key" type="ser:guid" />
+            <xs:element name="Value" type="xs:double" />
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfKeyValueOfguiddouble" nillable="true" type="tns:ArrayOfKeyValueOfguiddouble" />
+  <xs:complexType name="ArrayOfguid">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="guid" type="ser:guid" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfguid" nillable="true" type="tns:ArrayOfguid" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.DataAccess.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.DataAccess.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.DataAccess.xsd	(revision 4368)
@@ -0,0 +1,10 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:complexType name="PersistableObject">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="Id" type="ser:guid" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="PersistableObject" nillable="true" type="tns:PersistableObject" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.BusinessObjects.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.BusinessObjects.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.BusinessObjects.xsd	(revision 4368)
@@ -0,0 +1,206 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" />
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/System" />
+  <xs:complexType name="SlaveDto">
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:ResourceDto">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="CalendarSyncStatus" type="tns:CalendarState" />
+          <xs:element minOccurs="0" name="Config" nillable="true" type="tns:SlaveConfigDto" />
+          <xs:element minOccurs="0" name="CpuSpeedPerCore" nillable="true" type="xs:int" />
+          <xs:element minOccurs="0" name="FreeMemory" type="xs:int" />
+          <xs:element minOccurs="0" name="IsAllowedToCalculate" type="xs:boolean" />
+          <xs:element minOccurs="0" name="Login" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="Memory" type="xs:int" />
+          <xs:element minOccurs="0" name="NrOfCores" type="xs:int" />
+          <xs:element minOccurs="0" name="NrOfFreeCores" type="xs:int" />
+          <xs:element minOccurs="0" name="State" type="tns:SlaveState" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="SlaveDto" nillable="true" type="tns:SlaveDto" />
+  <xs:complexType name="ResourceDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q1="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q1:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResourceDto" nillable="true" type="tns:ResourceDto" />
+  <xs:simpleType name="CalendarState">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="Fetch" />
+      <xs:enumeration value="ForceFetch" />
+      <xs:enumeration value="Fetching" />
+      <xs:enumeration value="Fetched" />
+      <xs:enumeration value="NotAllowedToFetch" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="CalendarState" nillable="true" type="tns:CalendarState" />
+  <xs:complexType name="SlaveConfigDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q2="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q2:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="HeartBeatIntervall" nillable="true" type="xs:int" />
+          <xs:element minOccurs="0" name="UpDownTimeCalendar" nillable="true" type="xs:string" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="SlaveConfigDto" nillable="true" type="tns:SlaveConfigDto" />
+  <xs:simpleType name="SlaveState">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="NullState" />
+      <xs:enumeration value="Idle" />
+      <xs:enumeration value="Calculating" />
+      <xs:enumeration value="Offline" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="SlaveState" nillable="true" type="tns:SlaveState" />
+  <xs:complexType name="HeartBeatData">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="FreeCores" type="xs:int" />
+      <xs:element minOccurs="0" name="FreeMemory" type="xs:int" />
+      <xs:element minOccurs="0" name="IsAllowedToCalculate" type="xs:boolean" />
+      <xs:element xmlns:q3="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="JobProgress" nillable="true" type="q3:ArrayOfKeyValueOfguiddouble" />
+      <xs:element minOccurs="0" name="SlaveId" type="ser:guid" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="HeartBeatData" nillable="true" type="tns:HeartBeatData" />
+  <xs:complexType name="JobDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q4="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q4:PersistableObject">
+        <xs:sequence>
+          <xs:element xmlns:q5="http://schemas.microsoft.com/2003/10/Serialization/Arrays" minOccurs="0" name="AssignedResourceIds" nillable="true" type="q5:ArrayOfguid" />
+          <xs:element minOccurs="0" name="CoresNeeded" type="xs:int" />
+          <xs:element minOccurs="0" name="DateCalculated" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="DateCreated" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="DateFinished" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="Exception" nillable="true" type="xs:string" />
+          <xs:element minOccurs="0" name="MemoryNeeded" type="xs:int" />
+          <xs:element minOccurs="0" name="ParentJob" nillable="true" type="tns:JobDto" />
+          <xs:element minOccurs="0" name="Percentage" nillable="true" type="xs:double" />
+          <xs:element minOccurs="0" name="PluginsNeeded" nillable="true" type="tns:ArrayOfHivePluginInfoDto" />
+          <xs:element minOccurs="0" name="Priority" type="xs:int" />
+          <xs:element minOccurs="0" name="Project" nillable="true" type="tns:ProjectDto" />
+          <xs:element minOccurs="0" name="Slave" nillable="true" type="tns:SlaveDto" />
+          <xs:element minOccurs="0" name="State" type="tns:JobState" />
+          <xs:element minOccurs="0" name="UserId" nillable="true" type="ser:guid" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="JobDto" nillable="true" type="tns:JobDto" />
+  <xs:complexType name="ArrayOfHivePluginInfoDto">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="HivePluginInfoDto" nillable="true" type="tns:HivePluginInfoDto" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfHivePluginInfoDto" nillable="true" type="tns:ArrayOfHivePluginInfoDto" />
+  <xs:complexType name="HivePluginInfoDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q6="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q6:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
+          <xs:element minOccurs="0" name="Update" type="xs:boolean" />
+          <xs:element xmlns:q7="http://schemas.datacontract.org/2004/07/System" minOccurs="0" name="Version" nillable="true" type="q7:Version" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="HivePluginInfoDto" nillable="true" type="tns:HivePluginInfoDto" />
+  <xs:complexType name="ProjectDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q8="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q8:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ProjectDto" nillable="true" type="tns:ProjectDto" />
+  <xs:simpleType name="JobState">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="Calculating" />
+      <xs:enumeration value="Offline" />
+      <xs:enumeration value="Finished" />
+      <xs:enumeration value="Aborted" />
+      <xs:enumeration value="SnapshotRequested" />
+      <xs:enumeration value="SnapshotSent" />
+      <xs:enumeration value="Pending" />
+      <xs:enumeration value="Failed" />
+      <xs:enumeration value="WaitForChildJobs" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="JobState" nillable="true" type="tns:JobState" />
+  <xs:complexType name="ArrayOfHivePluginFile">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="HivePluginFile" nillable="true" type="tns:HivePluginFile" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfHivePluginFile" nillable="true" type="tns:ArrayOfHivePluginFile" />
+  <xs:complexType name="HivePluginFile">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="BinaryFile" nillable="true" type="xs:base64Binary" />
+      <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="HivePluginFile" nillable="true" type="tns:HivePluginFile" />
+  <xs:complexType name="ArrayOfAppointmentDto">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="AppointmentDto" nillable="true" type="tns:AppointmentDto" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfAppointmentDto" nillable="true" type="tns:ArrayOfAppointmentDto" />
+  <xs:complexType name="AppointmentDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q9="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q9:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="AllDayEvent" type="xs:boolean" />
+          <xs:element minOccurs="0" name="EndDate" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="Recurring" type="xs:boolean" />
+          <xs:element minOccurs="0" name="RecurringId" type="ser:guid" />
+          <xs:element minOccurs="0" name="ResourceId" type="ser:guid" />
+          <xs:element minOccurs="0" name="StartDate" type="xs:dateTime" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="AppointmentDto" nillable="true" type="tns:AppointmentDto" />
+  <xs:complexType name="SerializedJob">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="JobInfo" nillable="true" type="tns:JobDto" />
+      <xs:element minOccurs="0" name="SerializedJobData" nillable="true" type="xs:base64Binary" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="SerializedJob" nillable="true" type="tns:SerializedJob" />
+  <xs:complexType name="ArrayOfJobResult">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="JobResult" nillable="true" type="tns:JobResult" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfJobResult" nillable="true" type="tns:ArrayOfJobResult" />
+  <xs:complexType name="JobResult">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q10="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" base="q10:PersistableObject">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="DateCalculated" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="DateCreated" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="DateFinished" nillable="true" type="xs:dateTime" />
+          <xs:element minOccurs="0" name="Exception" nillable="true" type="xs:string" />
+          <xs:element minOccurs="0" name="ParentJobId" nillable="true" type="ser:guid" />
+          <xs:element minOccurs="0" name="Percentage" nillable="true" type="xs:double" />
+          <xs:element minOccurs="0" name="SlaveId" type="ser:guid" />
+          <xs:element minOccurs="0" name="State" type="tns:JobState" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="JobResult" nillable="true" type="tns:JobResult" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.ResponseObjects.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.ResponseObjects.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.ResponseObjects.xsd	(revision 4368)
@@ -0,0 +1,79 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" />
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" />
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" />
+  <xs:complexType name="Response">
+    <xs:sequence>
+      <xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" minOccurs="0" name="StatusMessage" type="q1:ResponseStatus" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="Response" nillable="true" type="tns:Response" />
+  <xs:complexType name="ResponseHeartBeat">
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:Response">
+        <xs:sequence>
+          <xs:element xmlns:q2="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" minOccurs="0" name="ActionRequest" nillable="true" type="q2:ArrayOfMessageContainer" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResponseHeartBeat" nillable="true" type="tns:ResponseHeartBeat" />
+  <xs:complexType name="ResponseObjectOfJobDtoZAa7YIsz">
+    <xs:annotation>
+      <xs:appinfo>
+        <GenericType Name="ResponseObjectOf{0}{#}" Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
+          <GenericParameter Name="JobDto" Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" />
+        </GenericType>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:Response">
+        <xs:sequence>
+          <xs:element xmlns:q3="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="Obj" nillable="true" type="q3:JobDto" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResponseObjectOfJobDtoZAa7YIsz" nillable="true" type="tns:ResponseObjectOfJobDtoZAa7YIsz" />
+  <xs:complexType name="ResponseResultReceived">
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:Response">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="Finished" type="xs:boolean" />
+          <xs:element minOccurs="0" name="JobId" type="ser:guid" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResponseResultReceived" nillable="true" type="tns:ResponseResultReceived" />
+  <xs:complexType name="ResponseListOfCachedHivePluginInfoDtoZMwZop09">
+    <xs:annotation>
+      <xs:appinfo>
+        <GenericType Name="ResponseListOf{0}{#}" Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
+          <GenericParameter Name="CachedHivePluginInfoDto" Namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" />
+        </GenericType>
+      </xs:appinfo>
+    </xs:annotation>
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:Response">
+        <xs:sequence>
+          <xs:element xmlns:q4="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" minOccurs="0" name="List" nillable="true" type="q4:ArrayOfCachedHivePluginInfoDto" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResponseListOfCachedHivePluginInfoDtoZMwZop09" nillable="true" type="tns:ResponseListOfCachedHivePluginInfoDtoZMwZop09" />
+  <xs:complexType name="ResponseCalendar">
+    <xs:complexContent mixed="false">
+      <xs:extension base="tns:Response">
+        <xs:sequence>
+          <xs:element xmlns:q5="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="Appointments" nillable="true" type="q5:ArrayOfAppointmentDto" />
+          <xs:element minOccurs="0" name="ForceFetch" type="xs:boolean" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="ResponseCalendar" nillable="true" type="tns:ResponseCalendar" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.Hive.Contracts.xsd	(revision 4368)
@@ -0,0 +1,74 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:ser="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:tns="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:simpleType name="ResponseStatus">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="Ok" />
+      <xs:enumeration value="RequestSnapshot_JobIsNotBeeingCalculated" />
+      <xs:enumeration value="RequestSnapshot_SnapshotAlreadyRequested" />
+      <xs:enumeration value="GetJobById_JobDoesNotExist" />
+      <xs:enumeration value="GetJobByIdWithDetails_JobDoesNotExist" />
+      <xs:enumeration value="AddNewJob_JobStateMustBeOffline" />
+      <xs:enumeration value="AddNewJob_JobIdMustNotBeSet" />
+      <xs:enumeration value="AddNewJob_JobNull" />
+      <xs:enumeration value="RemoveJob_JobDoesNotExist" />
+      <xs:enumeration value="GetSnapshotResult_JobResultNotYetThere" />
+      <xs:enumeration value="AbortJob_JobDoesNotExist" />
+      <xs:enumeration value="AbortJob_AbortAlreadyRequested" />
+      <xs:enumeration value="AbortJob_JobIsNotBeeingCalculated" />
+      <xs:enumeration value="GetCalendar_ResourceNotFound" />
+      <xs:enumeration value="GetCalendar_NoCalendarFound" />
+      <xs:enumeration value="SetCalendarStatus_ResourceNotFound" />
+      <xs:enumeration value="ProcessHeartBeat_UserNotLoggedIn" />
+      <xs:enumeration value="GetJob_NoJobsAvailable" />
+      <xs:enumeration value="ProcessJobResult_JobDoesNotExist" />
+      <xs:enumeration value="ProcessJobResult_JobAborted" />
+      <xs:enumeration value="ProcessJobResult_JobIsNotBeeingCalculated" />
+      <xs:enumeration value="ProcessJobResult_WrongSlaveForJob" />
+      <xs:enumeration value="ProcessJobResult_InvalidJobState" />
+      <xs:enumeration value="Login_LoginFaild" />
+      <xs:enumeration value="Logout_SlaveNotRegistered" />
+      <xs:enumeration value="IsJobStillNeeded_JobDoesNotExist" />
+      <xs:enumeration value="IsJobStillNeeded_JobAlreadyFinished" />
+      <xs:enumeration value="GetPlugins_PluginsNotAvailable" />
+      <xs:enumeration value="AddSlaveGroup_SlaveIdMustNotBeSet" />
+      <xs:enumeration value="AddResourceToGroup_SlaveGroupDoesNotExist" />
+      <xs:enumeration value="DeleteResourceFromGroup_SlaveGroupDoesNotExist" />
+      <xs:enumeration value="GetAllGroupsOfResource_ResourceNotFound" />
+      <xs:enumeration value="DeleteSlaveGroup_SlaveGroupDoesNotExist" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="ResponseStatus" nillable="true" type="tns:ResponseStatus" />
+  <xs:complexType name="ArrayOfMessageContainer">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="MessageContainer" nillable="true" type="tns:MessageContainer" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfMessageContainer" nillable="true" type="tns:ArrayOfMessageContainer" />
+  <xs:complexType name="MessageContainer">
+    <xs:sequence>
+      <xs:element name="_x003C_JobId_x003E_k__BackingField" type="ser:guid" />
+      <xs:element name="_x003C_Message_x003E_k__BackingField" type="tns:MessageContainer.MessageType" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="MessageContainer" nillable="true" type="tns:MessageContainer" />
+  <xs:simpleType name="MessageContainer.MessageType">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="FetchJob" />
+      <xs:enumeration value="AbortJob" />
+      <xs:enumeration value="JobAborted" />
+      <xs:enumeration value="RequestSnapshot" />
+      <xs:enumeration value="FinishedJob" />
+      <xs:enumeration value="NoMessage" />
+      <xs:enumeration value="SnapshotReady" />
+      <xs:enumeration value="Shutdown" />
+      <xs:enumeration value="JobFailed" />
+      <xs:enumeration value="UptimeLimitDisconnect" />
+      <xs:enumeration value="FetchOrForceFetchCalendar" />
+      <xs:enumeration value="AddChildJob" />
+      <xs:enumeration value="PauseJob" />
+      <xs:enumeration value="GetChildJobs" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="MessageContainer.MessageType" nillable="true" type="tns:MessageContainer.MessageType" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.PluginInfrastructure.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.PluginInfrastructure.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/HeuristicLab.PluginInfrastructure.xsd	(revision 4368)
@@ -0,0 +1,20 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" />
+  <xs:complexType name="ArrayOfCachedHivePluginInfoDto">
+    <xs:sequence>
+      <xs:element minOccurs="0" maxOccurs="unbounded" name="CachedHivePluginInfoDto" nillable="true" type="tns:CachedHivePluginInfoDto" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="ArrayOfCachedHivePluginInfoDto" nillable="true" type="tns:ArrayOfCachedHivePluginInfoDto" />
+  <xs:complexType name="CachedHivePluginInfoDto">
+    <xs:complexContent mixed="false">
+      <xs:extension xmlns:q1="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" base="q1:HivePluginInfoDto">
+        <xs:sequence>
+          <xs:element minOccurs="0" name="PluginFiles" nillable="true" type="q1:ArrayOfHivePluginFile" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:element name="CachedHivePluginInfoDto" nillable="true" type="tns:CachedHivePluginInfoDto" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Message.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Message.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Message.xsd	(revision 4368)
@@ -0,0 +1,6 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:tns="http://schemas.microsoft.com/Message" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/Message" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:simpleType name="StreamBody">
+    <xs:restriction base="xs:base64Binary" />
+  </xs:simpleType>
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.cs	(revision 4368)
@@ -0,0 +1,1620 @@
+﻿//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.1
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HeuristicLab.Hive.Slave.Communication.SlaveFacade {
+    
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="SlaveFacade.ISlaveFacade")]
+    public interface ISlaveFacade {
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/Login", ReplyAction="http://tempuri.org/ISlaveCommunicator/LoginResponse")]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar))]
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response Login(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/Login", ReplyAction="http://tempuri.org/ISlaveCommunicator/LoginResponse")]
+        System.IAsyncResult BeginLogin(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response EndLogin(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeat", ReplyAction="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeatResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat ProcessHeartBeat(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeat", ReplyAction="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeatResponse")]
+        System.IAsyncResult BeginProcessHeartBeat(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat EndProcessHeartBeat(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/GetJob", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetJobResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> GetJob(System.Guid clientId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/GetJob", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetJobResponse")]
+        System.IAsyncResult BeginGetJob(System.Guid clientId, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndGetJob(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResult", ReplyAction="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResultResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived StoreFinishedJobResult(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResult", ReplyAction="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResultResponse")]
+        System.IAsyncResult BeginStoreFinishedJobResult(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndStoreFinishedJobResult(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/ProcessSnapshot", ReplyAction="http://tempuri.org/ISlaveCommunicator/ProcessSnapshotResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived ProcessSnapshot(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/ProcessSnapshot", ReplyAction="http://tempuri.org/ISlaveCommunicator/ProcessSnapshotResponse")]
+        System.IAsyncResult BeginProcessSnapshot(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndProcessSnapshot(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/Logout", ReplyAction="http://tempuri.org/ISlaveCommunicator/LogoutResponse")]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar))]
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response Logout(System.Guid clientId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/Logout", ReplyAction="http://tempuri.org/ISlaveCommunicator/LogoutResponse")]
+        System.IAsyncResult BeginLogout(System.Guid clientId, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response EndLogout(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/IsJobStillNeeded", ReplyAction="http://tempuri.org/ISlaveCommunicator/IsJobStillNeededResponse")]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar))]
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response IsJobStillNeeded(System.Guid jobId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/IsJobStillNeeded", ReplyAction="http://tempuri.org/ISlaveCommunicator/IsJobStillNeededResponse")]
+        System.IAsyncResult BeginIsJobStillNeeded(System.Guid jobId, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response EndIsJobStillNeeded(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/GetPlugins", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetPluginsResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> GetPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/GetPlugins", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetPluginsResponse")]
+        System.IAsyncResult BeginGetPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> EndGetPlugins(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/GetCalendar", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetCalendarResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar GetCalendar(System.Guid clientId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/GetCalendar", ReplyAction="http://tempuri.org/ISlaveCommunicator/GetCalendarResponse")]
+        System.IAsyncResult BeginGetCalendar(System.Guid clientId, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar EndGetCalendar(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveCommunicator/SetCalendarStatus", ReplyAction="http://tempuri.org/ISlaveCommunicator/SetCalendarStatusResponse")]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto>))]
+        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar))]
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response SetCalendarStatus(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveCommunicator/SetCalendarStatus", ReplyAction="http://tempuri.org/ISlaveCommunicator/SetCalendarStatusResponse")]
+        System.IAsyncResult BeginSetCalendarStatus(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.Response EndSetCalendarStatus(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/GetStreamedJob", ReplyAction="http://tempuri.org/ISlaveFacade/GetStreamedJobResponse")]
+        System.IO.Stream GetStreamedJob(System.Guid clientId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/GetStreamedJob", ReplyAction="http://tempuri.org/ISlaveFacade/GetStreamedJobResponse")]
+        System.IAsyncResult BeginGetStreamedJob(System.Guid clientId, System.AsyncCallback callback, object asyncState);
+        
+        System.IO.Stream EndGetStreamedJob(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/GetStreamedPlugins", ReplyAction="http://tempuri.org/ISlaveFacade/GetStreamedPluginsResponse")]
+        System.IO.Stream GetStreamedPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/GetStreamedPlugins", ReplyAction="http://tempuri.org/ISlaveFacade/GetStreamedPluginsResponse")]
+        System.IAsyncResult BeginGetStreamedPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, System.AsyncCallback callback, object asyncState);
+        
+        System.IO.Stream EndGetStreamedPlugins(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamed", ReplyAction="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamedResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived StoreFinishedJobResultStreamed(System.IO.Stream stream);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamed", ReplyAction="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamedResponse")]
+        System.IAsyncResult BeginStoreFinishedJobResultStreamed(System.IO.Stream stream, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndStoreFinishedJobResultStreamed(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamed", ReplyAction="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamedResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived ProcessSnapshotStreamed(System.IO.Stream stream);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamed", ReplyAction="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamedResponse")]
+        System.IAsyncResult BeginProcessSnapshotStreamed(System.IO.Stream stream, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndProcessSnapshotStreamed(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/AddChildJob", ReplyAction="http://tempuri.org/ISlaveFacade/AddChildJobResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> AddChildJob(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/AddChildJob", ReplyAction="http://tempuri.org/ISlaveFacade/AddChildJobResponse")]
+        System.IAsyncResult BeginAddChildJob(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndAddChildJob(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/PauseJob", ReplyAction="http://tempuri.org/ISlaveFacade/PauseJobResponse")]
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> PauseJob(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/PauseJob", ReplyAction="http://tempuri.org/ISlaveFacade/PauseJobResponse")]
+        System.IAsyncResult BeginPauseJob(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndPauseJob(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/GetChildJobResults", ReplyAction="http://tempuri.org/ISlaveFacade/GetChildJobResultsResponse")]
+        HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] GetChildJobResults(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/GetChildJobResults", ReplyAction="http://tempuri.org/ISlaveFacade/GetChildJobResultsResponse")]
+        System.IAsyncResult BeginGetChildJobResults(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] EndGetChildJobResults(System.IAsyncResult result);
+        
+        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ISlaveFacade/GetLastSerializedResult", ReplyAction="http://tempuri.org/ISlaveFacade/GetLastSerializedResultResponse")]
+        HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob GetLastSerializedResult(System.Guid jobId);
+        
+        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/ISlaveFacade/GetLastSerializedResult", ReplyAction="http://tempuri.org/ISlaveFacade/GetLastSerializedResultResponse")]
+        System.IAsyncResult BeginGetLastSerializedResult(System.Guid jobId, System.AsyncCallback callback, object asyncState);
+        
+        HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob EndGetLastSerializedResult(System.IAsyncResult result);
+    }
+    
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public interface ISlaveFacadeChannel : HeuristicLab.Hive.Slave.Communication.SlaveFacade.ISlaveFacade, System.ServiceModel.IClientChannel {
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class LoginCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public LoginCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.Response)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class ProcessHeartBeatCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public ProcessHeartBeatCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class StoreFinishedJobResultCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public StoreFinishedJobResultCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class ProcessSnapshotCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public ProcessSnapshotCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class LogoutCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public LogoutCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.Response)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class IsJobStillNeededCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public IsJobStillNeededCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.Response)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetPluginsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetPluginsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto>)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetCalendarCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetCalendarCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class SetCalendarStatusCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public SetCalendarStatusCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.Response)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetStreamedJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetStreamedJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public System.IO.Stream Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((System.IO.Stream)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetStreamedPluginsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetStreamedPluginsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public System.IO.Stream Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((System.IO.Stream)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class StoreFinishedJobResultStreamedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public StoreFinishedJobResultStreamedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class ProcessSnapshotStreamedCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public ProcessSnapshotStreamedCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class AddChildJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public AddChildJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class PauseJobCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public PauseJobCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto>)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetChildJobResultsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetChildJobResultsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[])(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class GetLastSerializedResultCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
+        
+        private object[] results;
+        
+        public GetLastSerializedResultCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
+                base(exception, cancelled, userState) {
+            this.results = results;
+        }
+        
+        public HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob Result {
+            get {
+                base.RaiseExceptionIfNecessary();
+                return ((HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob)(this.results[0]));
+            }
+        }
+    }
+    
+    [System.Diagnostics.DebuggerStepThroughAttribute()]
+    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
+    public partial class SlaveFacadeClient : System.ServiceModel.ClientBase<HeuristicLab.Hive.Slave.Communication.SlaveFacade.ISlaveFacade>, HeuristicLab.Hive.Slave.Communication.SlaveFacade.ISlaveFacade {
+        
+        private BeginOperationDelegate onBeginLoginDelegate;
+        
+        private EndOperationDelegate onEndLoginDelegate;
+        
+        private System.Threading.SendOrPostCallback onLoginCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginProcessHeartBeatDelegate;
+        
+        private EndOperationDelegate onEndProcessHeartBeatDelegate;
+        
+        private System.Threading.SendOrPostCallback onProcessHeartBeatCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetJobDelegate;
+        
+        private EndOperationDelegate onEndGetJobDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetJobCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginStoreFinishedJobResultDelegate;
+        
+        private EndOperationDelegate onEndStoreFinishedJobResultDelegate;
+        
+        private System.Threading.SendOrPostCallback onStoreFinishedJobResultCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginProcessSnapshotDelegate;
+        
+        private EndOperationDelegate onEndProcessSnapshotDelegate;
+        
+        private System.Threading.SendOrPostCallback onProcessSnapshotCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginLogoutDelegate;
+        
+        private EndOperationDelegate onEndLogoutDelegate;
+        
+        private System.Threading.SendOrPostCallback onLogoutCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginIsJobStillNeededDelegate;
+        
+        private EndOperationDelegate onEndIsJobStillNeededDelegate;
+        
+        private System.Threading.SendOrPostCallback onIsJobStillNeededCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetPluginsDelegate;
+        
+        private EndOperationDelegate onEndGetPluginsDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetPluginsCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetCalendarDelegate;
+        
+        private EndOperationDelegate onEndGetCalendarDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetCalendarCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginSetCalendarStatusDelegate;
+        
+        private EndOperationDelegate onEndSetCalendarStatusDelegate;
+        
+        private System.Threading.SendOrPostCallback onSetCalendarStatusCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetStreamedJobDelegate;
+        
+        private EndOperationDelegate onEndGetStreamedJobDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetStreamedJobCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetStreamedPluginsDelegate;
+        
+        private EndOperationDelegate onEndGetStreamedPluginsDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetStreamedPluginsCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginStoreFinishedJobResultStreamedDelegate;
+        
+        private EndOperationDelegate onEndStoreFinishedJobResultStreamedDelegate;
+        
+        private System.Threading.SendOrPostCallback onStoreFinishedJobResultStreamedCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginProcessSnapshotStreamedDelegate;
+        
+        private EndOperationDelegate onEndProcessSnapshotStreamedDelegate;
+        
+        private System.Threading.SendOrPostCallback onProcessSnapshotStreamedCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginAddChildJobDelegate;
+        
+        private EndOperationDelegate onEndAddChildJobDelegate;
+        
+        private System.Threading.SendOrPostCallback onAddChildJobCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginPauseJobDelegate;
+        
+        private EndOperationDelegate onEndPauseJobDelegate;
+        
+        private System.Threading.SendOrPostCallback onPauseJobCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetChildJobResultsDelegate;
+        
+        private EndOperationDelegate onEndGetChildJobResultsDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetChildJobResultsCompletedDelegate;
+        
+        private BeginOperationDelegate onBeginGetLastSerializedResultDelegate;
+        
+        private EndOperationDelegate onEndGetLastSerializedResultDelegate;
+        
+        private System.Threading.SendOrPostCallback onGetLastSerializedResultCompletedDelegate;
+        
+        public SlaveFacadeClient() {
+        }
+        
+        public SlaveFacadeClient(string endpointConfigurationName) : 
+                base(endpointConfigurationName) {
+        }
+        
+        public SlaveFacadeClient(string endpointConfigurationName, string remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public SlaveFacadeClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(endpointConfigurationName, remoteAddress) {
+        }
+        
+        public SlaveFacadeClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
+                base(binding, remoteAddress) {
+        }
+        
+        public event System.EventHandler<LoginCompletedEventArgs> LoginCompleted;
+        
+        public event System.EventHandler<ProcessHeartBeatCompletedEventArgs> ProcessHeartBeatCompleted;
+        
+        public event System.EventHandler<GetJobCompletedEventArgs> GetJobCompleted;
+        
+        public event System.EventHandler<StoreFinishedJobResultCompletedEventArgs> StoreFinishedJobResultCompleted;
+        
+        public event System.EventHandler<ProcessSnapshotCompletedEventArgs> ProcessSnapshotCompleted;
+        
+        public event System.EventHandler<LogoutCompletedEventArgs> LogoutCompleted;
+        
+        public event System.EventHandler<IsJobStillNeededCompletedEventArgs> IsJobStillNeededCompleted;
+        
+        public event System.EventHandler<GetPluginsCompletedEventArgs> GetPluginsCompleted;
+        
+        public event System.EventHandler<GetCalendarCompletedEventArgs> GetCalendarCompleted;
+        
+        public event System.EventHandler<SetCalendarStatusCompletedEventArgs> SetCalendarStatusCompleted;
+        
+        public event System.EventHandler<GetStreamedJobCompletedEventArgs> GetStreamedJobCompleted;
+        
+        public event System.EventHandler<GetStreamedPluginsCompletedEventArgs> GetStreamedPluginsCompleted;
+        
+        public event System.EventHandler<StoreFinishedJobResultStreamedCompletedEventArgs> StoreFinishedJobResultStreamedCompleted;
+        
+        public event System.EventHandler<ProcessSnapshotStreamedCompletedEventArgs> ProcessSnapshotStreamedCompleted;
+        
+        public event System.EventHandler<AddChildJobCompletedEventArgs> AddChildJobCompleted;
+        
+        public event System.EventHandler<PauseJobCompletedEventArgs> PauseJobCompleted;
+        
+        public event System.EventHandler<GetChildJobResultsCompletedEventArgs> GetChildJobResultsCompleted;
+        
+        public event System.EventHandler<GetLastSerializedResultCompletedEventArgs> GetLastSerializedResultCompleted;
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Login(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave) {
+            return base.Channel.Login(slave);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginLogin(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginLogin(slave, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response EndLogin(System.IAsyncResult result) {
+            return base.Channel.EndLogin(result);
+        }
+        
+        private System.IAsyncResult OnBeginLogin(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave = ((HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto)(inValues[0]));
+            return this.BeginLogin(slave, callback, asyncState);
+        }
+        
+        private object[] OnEndLogin(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.Response retVal = this.EndLogin(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnLoginCompleted(object state) {
+            if ((this.LoginCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.LoginCompleted(this, new LoginCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void LoginAsync(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave) {
+            this.LoginAsync(slave, null);
+        }
+        
+        public void LoginAsync(HeuristicLab.Hive.Contracts.BusinessObjects.SlaveDto slave, object userState) {
+            if ((this.onBeginLoginDelegate == null)) {
+                this.onBeginLoginDelegate = new BeginOperationDelegate(this.OnBeginLogin);
+            }
+            if ((this.onEndLoginDelegate == null)) {
+                this.onEndLoginDelegate = new EndOperationDelegate(this.OnEndLogin);
+            }
+            if ((this.onLoginCompletedDelegate == null)) {
+                this.onLoginCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnLoginCompleted);
+            }
+            base.InvokeAsync(this.onBeginLoginDelegate, new object[] {
+                        slave}, this.onEndLoginDelegate, this.onLoginCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat ProcessHeartBeat(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData) {
+            return base.Channel.ProcessHeartBeat(hbData);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginProcessHeartBeat(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginProcessHeartBeat(hbData, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat EndProcessHeartBeat(System.IAsyncResult result) {
+            return base.Channel.EndProcessHeartBeat(result);
+        }
+        
+        private System.IAsyncResult OnBeginProcessHeartBeat(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData = ((HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData)(inValues[0]));
+            return this.BeginProcessHeartBeat(hbData, callback, asyncState);
+        }
+        
+        private object[] OnEndProcessHeartBeat(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseHeartBeat retVal = this.EndProcessHeartBeat(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnProcessHeartBeatCompleted(object state) {
+            if ((this.ProcessHeartBeatCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.ProcessHeartBeatCompleted(this, new ProcessHeartBeatCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void ProcessHeartBeatAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData) {
+            this.ProcessHeartBeatAsync(hbData, null);
+        }
+        
+        public void ProcessHeartBeatAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HeartBeatData hbData, object userState) {
+            if ((this.onBeginProcessHeartBeatDelegate == null)) {
+                this.onBeginProcessHeartBeatDelegate = new BeginOperationDelegate(this.OnBeginProcessHeartBeat);
+            }
+            if ((this.onEndProcessHeartBeatDelegate == null)) {
+                this.onEndProcessHeartBeatDelegate = new EndOperationDelegate(this.OnEndProcessHeartBeat);
+            }
+            if ((this.onProcessHeartBeatCompletedDelegate == null)) {
+                this.onProcessHeartBeatCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnProcessHeartBeatCompleted);
+            }
+            base.InvokeAsync(this.onBeginProcessHeartBeatDelegate, new object[] {
+                        hbData}, this.onEndProcessHeartBeatDelegate, this.onProcessHeartBeatCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> GetJob(System.Guid clientId) {
+            return base.Channel.GetJob(clientId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetJob(System.Guid clientId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetJob(clientId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndGetJob(System.IAsyncResult result) {
+            return base.Channel.EndGetJob(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetJob(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            return this.BeginGetJob(clientId, callback, asyncState);
+        }
+        
+        private object[] OnEndGetJob(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> retVal = this.EndGetJob(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetJobCompleted(object state) {
+            if ((this.GetJobCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetJobCompleted(this, new GetJobCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetJobAsync(System.Guid clientId) {
+            this.GetJobAsync(clientId, null);
+        }
+        
+        public void GetJobAsync(System.Guid clientId, object userState) {
+            if ((this.onBeginGetJobDelegate == null)) {
+                this.onBeginGetJobDelegate = new BeginOperationDelegate(this.OnBeginGetJob);
+            }
+            if ((this.onEndGetJobDelegate == null)) {
+                this.onEndGetJobDelegate = new EndOperationDelegate(this.OnEndGetJob);
+            }
+            if ((this.onGetJobCompletedDelegate == null)) {
+                this.onGetJobCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetJobCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetJobDelegate, new object[] {
+                        clientId}, this.onEndGetJobDelegate, this.onGetJobCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived StoreFinishedJobResult(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception) {
+            return base.Channel.StoreFinishedJobResult(clientId, jobId, result, percentage, exception);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginStoreFinishedJobResult(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginStoreFinishedJobResult(clientId, jobId, result, percentage, exception, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndStoreFinishedJobResult(System.IAsyncResult result) {
+            return base.Channel.EndStoreFinishedJobResult(result);
+        }
+        
+        private System.IAsyncResult OnBeginStoreFinishedJobResult(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            System.Guid jobId = ((System.Guid)(inValues[1]));
+            byte[] result = ((byte[])(inValues[2]));
+            double percentage = ((double)(inValues[3]));
+            string exception = ((string)(inValues[4]));
+            return this.BeginStoreFinishedJobResult(clientId, jobId, result, percentage, exception, callback, asyncState);
+        }
+        
+        private object[] OnEndStoreFinishedJobResult(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived retVal = this.EndStoreFinishedJobResult(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnStoreFinishedJobResultCompleted(object state) {
+            if ((this.StoreFinishedJobResultCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.StoreFinishedJobResultCompleted(this, new StoreFinishedJobResultCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void StoreFinishedJobResultAsync(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception) {
+            this.StoreFinishedJobResultAsync(clientId, jobId, result, percentage, exception, null);
+        }
+        
+        public void StoreFinishedJobResultAsync(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, object userState) {
+            if ((this.onBeginStoreFinishedJobResultDelegate == null)) {
+                this.onBeginStoreFinishedJobResultDelegate = new BeginOperationDelegate(this.OnBeginStoreFinishedJobResult);
+            }
+            if ((this.onEndStoreFinishedJobResultDelegate == null)) {
+                this.onEndStoreFinishedJobResultDelegate = new EndOperationDelegate(this.OnEndStoreFinishedJobResult);
+            }
+            if ((this.onStoreFinishedJobResultCompletedDelegate == null)) {
+                this.onStoreFinishedJobResultCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStoreFinishedJobResultCompleted);
+            }
+            base.InvokeAsync(this.onBeginStoreFinishedJobResultDelegate, new object[] {
+                        clientId,
+                        jobId,
+                        result,
+                        percentage,
+                        exception}, this.onEndStoreFinishedJobResultDelegate, this.onStoreFinishedJobResultCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived ProcessSnapshot(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception) {
+            return base.Channel.ProcessSnapshot(clientId, jobId, result, percentage, exception);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginProcessSnapshot(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginProcessSnapshot(clientId, jobId, result, percentage, exception, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndProcessSnapshot(System.IAsyncResult result) {
+            return base.Channel.EndProcessSnapshot(result);
+        }
+        
+        private System.IAsyncResult OnBeginProcessSnapshot(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            System.Guid jobId = ((System.Guid)(inValues[1]));
+            byte[] result = ((byte[])(inValues[2]));
+            double percentage = ((double)(inValues[3]));
+            string exception = ((string)(inValues[4]));
+            return this.BeginProcessSnapshot(clientId, jobId, result, percentage, exception, callback, asyncState);
+        }
+        
+        private object[] OnEndProcessSnapshot(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived retVal = this.EndProcessSnapshot(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnProcessSnapshotCompleted(object state) {
+            if ((this.ProcessSnapshotCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.ProcessSnapshotCompleted(this, new ProcessSnapshotCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void ProcessSnapshotAsync(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception) {
+            this.ProcessSnapshotAsync(clientId, jobId, result, percentage, exception, null);
+        }
+        
+        public void ProcessSnapshotAsync(System.Guid clientId, System.Guid jobId, byte[] result, double percentage, string exception, object userState) {
+            if ((this.onBeginProcessSnapshotDelegate == null)) {
+                this.onBeginProcessSnapshotDelegate = new BeginOperationDelegate(this.OnBeginProcessSnapshot);
+            }
+            if ((this.onEndProcessSnapshotDelegate == null)) {
+                this.onEndProcessSnapshotDelegate = new EndOperationDelegate(this.OnEndProcessSnapshot);
+            }
+            if ((this.onProcessSnapshotCompletedDelegate == null)) {
+                this.onProcessSnapshotCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnProcessSnapshotCompleted);
+            }
+            base.InvokeAsync(this.onBeginProcessSnapshotDelegate, new object[] {
+                        clientId,
+                        jobId,
+                        result,
+                        percentage,
+                        exception}, this.onEndProcessSnapshotDelegate, this.onProcessSnapshotCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response Logout(System.Guid clientId) {
+            return base.Channel.Logout(clientId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginLogout(System.Guid clientId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginLogout(clientId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response EndLogout(System.IAsyncResult result) {
+            return base.Channel.EndLogout(result);
+        }
+        
+        private System.IAsyncResult OnBeginLogout(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            return this.BeginLogout(clientId, callback, asyncState);
+        }
+        
+        private object[] OnEndLogout(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.Response retVal = this.EndLogout(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnLogoutCompleted(object state) {
+            if ((this.LogoutCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.LogoutCompleted(this, new LogoutCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void LogoutAsync(System.Guid clientId) {
+            this.LogoutAsync(clientId, null);
+        }
+        
+        public void LogoutAsync(System.Guid clientId, object userState) {
+            if ((this.onBeginLogoutDelegate == null)) {
+                this.onBeginLogoutDelegate = new BeginOperationDelegate(this.OnBeginLogout);
+            }
+            if ((this.onEndLogoutDelegate == null)) {
+                this.onEndLogoutDelegate = new EndOperationDelegate(this.OnEndLogout);
+            }
+            if ((this.onLogoutCompletedDelegate == null)) {
+                this.onLogoutCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnLogoutCompleted);
+            }
+            base.InvokeAsync(this.onBeginLogoutDelegate, new object[] {
+                        clientId}, this.onEndLogoutDelegate, this.onLogoutCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response IsJobStillNeeded(System.Guid jobId) {
+            return base.Channel.IsJobStillNeeded(jobId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginIsJobStillNeeded(System.Guid jobId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginIsJobStillNeeded(jobId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response EndIsJobStillNeeded(System.IAsyncResult result) {
+            return base.Channel.EndIsJobStillNeeded(result);
+        }
+        
+        private System.IAsyncResult OnBeginIsJobStillNeeded(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid jobId = ((System.Guid)(inValues[0]));
+            return this.BeginIsJobStillNeeded(jobId, callback, asyncState);
+        }
+        
+        private object[] OnEndIsJobStillNeeded(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.Response retVal = this.EndIsJobStillNeeded(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnIsJobStillNeededCompleted(object state) {
+            if ((this.IsJobStillNeededCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.IsJobStillNeededCompleted(this, new IsJobStillNeededCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void IsJobStillNeededAsync(System.Guid jobId) {
+            this.IsJobStillNeededAsync(jobId, null);
+        }
+        
+        public void IsJobStillNeededAsync(System.Guid jobId, object userState) {
+            if ((this.onBeginIsJobStillNeededDelegate == null)) {
+                this.onBeginIsJobStillNeededDelegate = new BeginOperationDelegate(this.OnBeginIsJobStillNeeded);
+            }
+            if ((this.onEndIsJobStillNeededDelegate == null)) {
+                this.onEndIsJobStillNeededDelegate = new EndOperationDelegate(this.OnEndIsJobStillNeeded);
+            }
+            if ((this.onIsJobStillNeededCompletedDelegate == null)) {
+                this.onIsJobStillNeededCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnIsJobStillNeededCompleted);
+            }
+            base.InvokeAsync(this.onBeginIsJobStillNeededDelegate, new object[] {
+                        jobId}, this.onEndIsJobStillNeededDelegate, this.onIsJobStillNeededCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> GetPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList) {
+            return base.Channel.GetPlugins(pluginList);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetPlugins(pluginList, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> EndGetPlugins(System.IAsyncResult result) {
+            return base.Channel.EndGetPlugins(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetPlugins(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList = ((HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[])(inValues[0]));
+            return this.BeginGetPlugins(pluginList, callback, asyncState);
+        }
+        
+        private object[] OnEndGetPlugins(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseList<HeuristicLab.PluginInfrastructure.CachedHivePluginInfoDto> retVal = this.EndGetPlugins(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetPluginsCompleted(object state) {
+            if ((this.GetPluginsCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetPluginsCompleted(this, new GetPluginsCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetPluginsAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList) {
+            this.GetPluginsAsync(pluginList, null);
+        }
+        
+        public void GetPluginsAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, object userState) {
+            if ((this.onBeginGetPluginsDelegate == null)) {
+                this.onBeginGetPluginsDelegate = new BeginOperationDelegate(this.OnBeginGetPlugins);
+            }
+            if ((this.onEndGetPluginsDelegate == null)) {
+                this.onEndGetPluginsDelegate = new EndOperationDelegate(this.OnEndGetPlugins);
+            }
+            if ((this.onGetPluginsCompletedDelegate == null)) {
+                this.onGetPluginsCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetPluginsCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetPluginsDelegate, new object[] {
+                        pluginList}, this.onEndGetPluginsDelegate, this.onGetPluginsCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar GetCalendar(System.Guid clientId) {
+            return base.Channel.GetCalendar(clientId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetCalendar(System.Guid clientId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetCalendar(clientId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar EndGetCalendar(System.IAsyncResult result) {
+            return base.Channel.EndGetCalendar(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetCalendar(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            return this.BeginGetCalendar(clientId, callback, asyncState);
+        }
+        
+        private object[] OnEndGetCalendar(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseCalendar retVal = this.EndGetCalendar(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetCalendarCompleted(object state) {
+            if ((this.GetCalendarCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetCalendarCompleted(this, new GetCalendarCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetCalendarAsync(System.Guid clientId) {
+            this.GetCalendarAsync(clientId, null);
+        }
+        
+        public void GetCalendarAsync(System.Guid clientId, object userState) {
+            if ((this.onBeginGetCalendarDelegate == null)) {
+                this.onBeginGetCalendarDelegate = new BeginOperationDelegate(this.OnBeginGetCalendar);
+            }
+            if ((this.onEndGetCalendarDelegate == null)) {
+                this.onEndGetCalendarDelegate = new EndOperationDelegate(this.OnEndGetCalendar);
+            }
+            if ((this.onGetCalendarCompletedDelegate == null)) {
+                this.onGetCalendarCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetCalendarCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetCalendarDelegate, new object[] {
+                        clientId}, this.onEndGetCalendarDelegate, this.onGetCalendarCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response SetCalendarStatus(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state) {
+            return base.Channel.SetCalendarStatus(clientId, state);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginSetCalendarStatus(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginSetCalendarStatus(clientId, state, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.Response EndSetCalendarStatus(System.IAsyncResult result) {
+            return base.Channel.EndSetCalendarStatus(result);
+        }
+        
+        private System.IAsyncResult OnBeginSetCalendarStatus(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state = ((HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState)(inValues[1]));
+            return this.BeginSetCalendarStatus(clientId, state, callback, asyncState);
+        }
+        
+        private object[] OnEndSetCalendarStatus(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.Response retVal = this.EndSetCalendarStatus(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnSetCalendarStatusCompleted(object state) {
+            if ((this.SetCalendarStatusCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.SetCalendarStatusCompleted(this, new SetCalendarStatusCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void SetCalendarStatusAsync(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state) {
+            this.SetCalendarStatusAsync(clientId, state, null);
+        }
+        
+        public void SetCalendarStatusAsync(System.Guid clientId, HeuristicLab.Hive.Contracts.BusinessObjects.CalendarState state, object userState) {
+            if ((this.onBeginSetCalendarStatusDelegate == null)) {
+                this.onBeginSetCalendarStatusDelegate = new BeginOperationDelegate(this.OnBeginSetCalendarStatus);
+            }
+            if ((this.onEndSetCalendarStatusDelegate == null)) {
+                this.onEndSetCalendarStatusDelegate = new EndOperationDelegate(this.OnEndSetCalendarStatus);
+            }
+            if ((this.onSetCalendarStatusCompletedDelegate == null)) {
+                this.onSetCalendarStatusCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnSetCalendarStatusCompleted);
+            }
+            base.InvokeAsync(this.onBeginSetCalendarStatusDelegate, new object[] {
+                        clientId,
+                        state}, this.onEndSetCalendarStatusDelegate, this.onSetCalendarStatusCompletedDelegate, userState);
+        }
+        
+        public System.IO.Stream GetStreamedJob(System.Guid clientId) {
+            return base.Channel.GetStreamedJob(clientId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetStreamedJob(System.Guid clientId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetStreamedJob(clientId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IO.Stream EndGetStreamedJob(System.IAsyncResult result) {
+            return base.Channel.EndGetStreamedJob(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetStreamedJob(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid clientId = ((System.Guid)(inValues[0]));
+            return this.BeginGetStreamedJob(clientId, callback, asyncState);
+        }
+        
+        private object[] OnEndGetStreamedJob(System.IAsyncResult result) {
+            System.IO.Stream retVal = this.EndGetStreamedJob(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetStreamedJobCompleted(object state) {
+            if ((this.GetStreamedJobCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetStreamedJobCompleted(this, new GetStreamedJobCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetStreamedJobAsync(System.Guid clientId) {
+            this.GetStreamedJobAsync(clientId, null);
+        }
+        
+        public void GetStreamedJobAsync(System.Guid clientId, object userState) {
+            if ((this.onBeginGetStreamedJobDelegate == null)) {
+                this.onBeginGetStreamedJobDelegate = new BeginOperationDelegate(this.OnBeginGetStreamedJob);
+            }
+            if ((this.onEndGetStreamedJobDelegate == null)) {
+                this.onEndGetStreamedJobDelegate = new EndOperationDelegate(this.OnEndGetStreamedJob);
+            }
+            if ((this.onGetStreamedJobCompletedDelegate == null)) {
+                this.onGetStreamedJobCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetStreamedJobCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetStreamedJobDelegate, new object[] {
+                        clientId}, this.onEndGetStreamedJobDelegate, this.onGetStreamedJobCompletedDelegate, userState);
+        }
+        
+        public System.IO.Stream GetStreamedPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList) {
+            return base.Channel.GetStreamedPlugins(pluginList);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetStreamedPlugins(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetStreamedPlugins(pluginList, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IO.Stream EndGetStreamedPlugins(System.IAsyncResult result) {
+            return base.Channel.EndGetStreamedPlugins(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetStreamedPlugins(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList = ((HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[])(inValues[0]));
+            return this.BeginGetStreamedPlugins(pluginList, callback, asyncState);
+        }
+        
+        private object[] OnEndGetStreamedPlugins(System.IAsyncResult result) {
+            System.IO.Stream retVal = this.EndGetStreamedPlugins(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetStreamedPluginsCompleted(object state) {
+            if ((this.GetStreamedPluginsCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetStreamedPluginsCompleted(this, new GetStreamedPluginsCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetStreamedPluginsAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList) {
+            this.GetStreamedPluginsAsync(pluginList, null);
+        }
+        
+        public void GetStreamedPluginsAsync(HeuristicLab.Hive.Contracts.BusinessObjects.HivePluginInfoDto[] pluginList, object userState) {
+            if ((this.onBeginGetStreamedPluginsDelegate == null)) {
+                this.onBeginGetStreamedPluginsDelegate = new BeginOperationDelegate(this.OnBeginGetStreamedPlugins);
+            }
+            if ((this.onEndGetStreamedPluginsDelegate == null)) {
+                this.onEndGetStreamedPluginsDelegate = new EndOperationDelegate(this.OnEndGetStreamedPlugins);
+            }
+            if ((this.onGetStreamedPluginsCompletedDelegate == null)) {
+                this.onGetStreamedPluginsCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetStreamedPluginsCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetStreamedPluginsDelegate, new object[] {
+                        pluginList}, this.onEndGetStreamedPluginsDelegate, this.onGetStreamedPluginsCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived StoreFinishedJobResultStreamed(System.IO.Stream stream) {
+            return base.Channel.StoreFinishedJobResultStreamed(stream);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginStoreFinishedJobResultStreamed(System.IO.Stream stream, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginStoreFinishedJobResultStreamed(stream, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndStoreFinishedJobResultStreamed(System.IAsyncResult result) {
+            return base.Channel.EndStoreFinishedJobResultStreamed(result);
+        }
+        
+        private System.IAsyncResult OnBeginStoreFinishedJobResultStreamed(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.IO.Stream stream = ((System.IO.Stream)(inValues[0]));
+            return this.BeginStoreFinishedJobResultStreamed(stream, callback, asyncState);
+        }
+        
+        private object[] OnEndStoreFinishedJobResultStreamed(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived retVal = this.EndStoreFinishedJobResultStreamed(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnStoreFinishedJobResultStreamedCompleted(object state) {
+            if ((this.StoreFinishedJobResultStreamedCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.StoreFinishedJobResultStreamedCompleted(this, new StoreFinishedJobResultStreamedCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void StoreFinishedJobResultStreamedAsync(System.IO.Stream stream) {
+            this.StoreFinishedJobResultStreamedAsync(stream, null);
+        }
+        
+        public void StoreFinishedJobResultStreamedAsync(System.IO.Stream stream, object userState) {
+            if ((this.onBeginStoreFinishedJobResultStreamedDelegate == null)) {
+                this.onBeginStoreFinishedJobResultStreamedDelegate = new BeginOperationDelegate(this.OnBeginStoreFinishedJobResultStreamed);
+            }
+            if ((this.onEndStoreFinishedJobResultStreamedDelegate == null)) {
+                this.onEndStoreFinishedJobResultStreamedDelegate = new EndOperationDelegate(this.OnEndStoreFinishedJobResultStreamed);
+            }
+            if ((this.onStoreFinishedJobResultStreamedCompletedDelegate == null)) {
+                this.onStoreFinishedJobResultStreamedCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnStoreFinishedJobResultStreamedCompleted);
+            }
+            base.InvokeAsync(this.onBeginStoreFinishedJobResultStreamedDelegate, new object[] {
+                        stream}, this.onEndStoreFinishedJobResultStreamedDelegate, this.onStoreFinishedJobResultStreamedCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived ProcessSnapshotStreamed(System.IO.Stream stream) {
+            return base.Channel.ProcessSnapshotStreamed(stream);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginProcessSnapshotStreamed(System.IO.Stream stream, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginProcessSnapshotStreamed(stream, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived EndProcessSnapshotStreamed(System.IAsyncResult result) {
+            return base.Channel.EndProcessSnapshotStreamed(result);
+        }
+        
+        private System.IAsyncResult OnBeginProcessSnapshotStreamed(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.IO.Stream stream = ((System.IO.Stream)(inValues[0]));
+            return this.BeginProcessSnapshotStreamed(stream, callback, asyncState);
+        }
+        
+        private object[] OnEndProcessSnapshotStreamed(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseResultReceived retVal = this.EndProcessSnapshotStreamed(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnProcessSnapshotStreamedCompleted(object state) {
+            if ((this.ProcessSnapshotStreamedCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.ProcessSnapshotStreamedCompleted(this, new ProcessSnapshotStreamedCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void ProcessSnapshotStreamedAsync(System.IO.Stream stream) {
+            this.ProcessSnapshotStreamedAsync(stream, null);
+        }
+        
+        public void ProcessSnapshotStreamedAsync(System.IO.Stream stream, object userState) {
+            if ((this.onBeginProcessSnapshotStreamedDelegate == null)) {
+                this.onBeginProcessSnapshotStreamedDelegate = new BeginOperationDelegate(this.OnBeginProcessSnapshotStreamed);
+            }
+            if ((this.onEndProcessSnapshotStreamedDelegate == null)) {
+                this.onEndProcessSnapshotStreamedDelegate = new EndOperationDelegate(this.OnEndProcessSnapshotStreamed);
+            }
+            if ((this.onProcessSnapshotStreamedCompletedDelegate == null)) {
+                this.onProcessSnapshotStreamedCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnProcessSnapshotStreamedCompleted);
+            }
+            base.InvokeAsync(this.onBeginProcessSnapshotStreamedDelegate, new object[] {
+                        stream}, this.onEndProcessSnapshotStreamedDelegate, this.onProcessSnapshotStreamedCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> AddChildJob(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob) {
+            return base.Channel.AddChildJob(parentJobId, serializedJob);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginAddChildJob(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginAddChildJob(parentJobId, serializedJob, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndAddChildJob(System.IAsyncResult result) {
+            return base.Channel.EndAddChildJob(result);
+        }
+        
+        private System.IAsyncResult OnBeginAddChildJob(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid parentJobId = ((System.Guid)(inValues[0]));
+            HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob = ((HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob)(inValues[1]));
+            return this.BeginAddChildJob(parentJobId, serializedJob, callback, asyncState);
+        }
+        
+        private object[] OnEndAddChildJob(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> retVal = this.EndAddChildJob(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnAddChildJobCompleted(object state) {
+            if ((this.AddChildJobCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.AddChildJobCompleted(this, new AddChildJobCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void AddChildJobAsync(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob) {
+            this.AddChildJobAsync(parentJobId, serializedJob, null);
+        }
+        
+        public void AddChildJobAsync(System.Guid parentJobId, HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, object userState) {
+            if ((this.onBeginAddChildJobDelegate == null)) {
+                this.onBeginAddChildJobDelegate = new BeginOperationDelegate(this.OnBeginAddChildJob);
+            }
+            if ((this.onEndAddChildJobDelegate == null)) {
+                this.onEndAddChildJobDelegate = new EndOperationDelegate(this.OnEndAddChildJob);
+            }
+            if ((this.onAddChildJobCompletedDelegate == null)) {
+                this.onAddChildJobCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnAddChildJobCompleted);
+            }
+            base.InvokeAsync(this.onBeginAddChildJobDelegate, new object[] {
+                        parentJobId,
+                        serializedJob}, this.onEndAddChildJobDelegate, this.onAddChildJobCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> PauseJob(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob) {
+            return base.Channel.PauseJob(serializedJob);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginPauseJob(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginPauseJob(serializedJob, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> EndPauseJob(System.IAsyncResult result) {
+            return base.Channel.EndPauseJob(result);
+        }
+        
+        private System.IAsyncResult OnBeginPauseJob(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob = ((HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob)(inValues[0]));
+            return this.BeginPauseJob(serializedJob, callback, asyncState);
+        }
+        
+        private object[] OnEndPauseJob(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.ResponseObjects.ResponseObject<HeuristicLab.Hive.Contracts.BusinessObjects.JobDto> retVal = this.EndPauseJob(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnPauseJobCompleted(object state) {
+            if ((this.PauseJobCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.PauseJobCompleted(this, new PauseJobCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void PauseJobAsync(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob) {
+            this.PauseJobAsync(serializedJob, null);
+        }
+        
+        public void PauseJobAsync(HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob serializedJob, object userState) {
+            if ((this.onBeginPauseJobDelegate == null)) {
+                this.onBeginPauseJobDelegate = new BeginOperationDelegate(this.OnBeginPauseJob);
+            }
+            if ((this.onEndPauseJobDelegate == null)) {
+                this.onEndPauseJobDelegate = new EndOperationDelegate(this.OnEndPauseJob);
+            }
+            if ((this.onPauseJobCompletedDelegate == null)) {
+                this.onPauseJobCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnPauseJobCompleted);
+            }
+            base.InvokeAsync(this.onBeginPauseJobDelegate, new object[] {
+                        serializedJob}, this.onEndPauseJobDelegate, this.onPauseJobCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] GetChildJobResults(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent) {
+            return base.Channel.GetChildJobResults(parentJobId, recursive, includeParent);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetChildJobResults(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetChildJobResults(parentJobId, recursive, includeParent, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] EndGetChildJobResults(System.IAsyncResult result) {
+            return base.Channel.EndGetChildJobResults(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetChildJobResults(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Nullable<System.Guid> parentJobId = ((System.Nullable<System.Guid>)(inValues[0]));
+            bool recursive = ((bool)(inValues[1]));
+            bool includeParent = ((bool)(inValues[2]));
+            return this.BeginGetChildJobResults(parentJobId, recursive, includeParent, callback, asyncState);
+        }
+        
+        private object[] OnEndGetChildJobResults(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.JobResult[] retVal = this.EndGetChildJobResults(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetChildJobResultsCompleted(object state) {
+            if ((this.GetChildJobResultsCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetChildJobResultsCompleted(this, new GetChildJobResultsCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetChildJobResultsAsync(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent) {
+            this.GetChildJobResultsAsync(parentJobId, recursive, includeParent, null);
+        }
+        
+        public void GetChildJobResultsAsync(System.Nullable<System.Guid> parentJobId, bool recursive, bool includeParent, object userState) {
+            if ((this.onBeginGetChildJobResultsDelegate == null)) {
+                this.onBeginGetChildJobResultsDelegate = new BeginOperationDelegate(this.OnBeginGetChildJobResults);
+            }
+            if ((this.onEndGetChildJobResultsDelegate == null)) {
+                this.onEndGetChildJobResultsDelegate = new EndOperationDelegate(this.OnEndGetChildJobResults);
+            }
+            if ((this.onGetChildJobResultsCompletedDelegate == null)) {
+                this.onGetChildJobResultsCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetChildJobResultsCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetChildJobResultsDelegate, new object[] {
+                        parentJobId,
+                        recursive,
+                        includeParent}, this.onEndGetChildJobResultsDelegate, this.onGetChildJobResultsCompletedDelegate, userState);
+        }
+        
+        public HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob GetLastSerializedResult(System.Guid jobId) {
+            return base.Channel.GetLastSerializedResult(jobId);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public System.IAsyncResult BeginGetLastSerializedResult(System.Guid jobId, System.AsyncCallback callback, object asyncState) {
+            return base.Channel.BeginGetLastSerializedResult(jobId, callback, asyncState);
+        }
+        
+        [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
+        public HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob EndGetLastSerializedResult(System.IAsyncResult result) {
+            return base.Channel.EndGetLastSerializedResult(result);
+        }
+        
+        private System.IAsyncResult OnBeginGetLastSerializedResult(object[] inValues, System.AsyncCallback callback, object asyncState) {
+            System.Guid jobId = ((System.Guid)(inValues[0]));
+            return this.BeginGetLastSerializedResult(jobId, callback, asyncState);
+        }
+        
+        private object[] OnEndGetLastSerializedResult(System.IAsyncResult result) {
+            HeuristicLab.Hive.Contracts.BusinessObjects.SerializedJob retVal = this.EndGetLastSerializedResult(result);
+            return new object[] {
+                    retVal};
+        }
+        
+        private void OnGetLastSerializedResultCompleted(object state) {
+            if ((this.GetLastSerializedResultCompleted != null)) {
+                InvokeAsyncCompletedEventArgs e = ((InvokeAsyncCompletedEventArgs)(state));
+                this.GetLastSerializedResultCompleted(this, new GetLastSerializedResultCompletedEventArgs(e.Results, e.Error, e.Cancelled, e.UserState));
+            }
+        }
+        
+        public void GetLastSerializedResultAsync(System.Guid jobId) {
+            this.GetLastSerializedResultAsync(jobId, null);
+        }
+        
+        public void GetLastSerializedResultAsync(System.Guid jobId, object userState) {
+            if ((this.onBeginGetLastSerializedResultDelegate == null)) {
+                this.onBeginGetLastSerializedResultDelegate = new BeginOperationDelegate(this.OnBeginGetLastSerializedResult);
+            }
+            if ((this.onEndGetLastSerializedResultDelegate == null)) {
+                this.onEndGetLastSerializedResultDelegate = new EndOperationDelegate(this.OnEndGetLastSerializedResult);
+            }
+            if ((this.onGetLastSerializedResultCompletedDelegate == null)) {
+                this.onGetLastSerializedResultCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnGetLastSerializedResultCompleted);
+            }
+            base.InvokeAsync(this.onBeginGetLastSerializedResultDelegate, new object[] {
+                        jobId}, this.onEndGetLastSerializedResultDelegate, this.onGetLastSerializedResultCompletedDelegate, userState);
+        }
+    }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.svcmap
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.svcmap	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/Reference.svcmap	(revision 4368)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ReferenceGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ID="8c777be0-84f8-4f50-b7fe-6f897eb23eae" xmlns="urn:schemas-microsoft-com:xml-wcfservicemap">
+  <ClientOptions>
+    <GenerateAsynchronousMethods>true</GenerateAsynchronousMethods>
+    <EnableDataBinding>true</EnableDataBinding>
+    <ExcludedTypes />
+    <ImportXmlTypes>false</ImportXmlTypes>
+    <GenerateInternalTypes>false</GenerateInternalTypes>
+    <GenerateMessageContracts>false</GenerateMessageContracts>
+    <NamespaceMappings />
+    <CollectionMappings />
+    <GenerateSerializableTypes>true</GenerateSerializableTypes>
+    <Serializer>Auto</Serializer>
+    <UseSerializerForFaults>true</UseSerializerForFaults>
+    <ReferenceAllAssemblies>true</ReferenceAllAssemblies>
+    <ReferencedAssemblies />
+    <ReferencedDataContractTypes />
+    <ServiceContractMappings />
+  </ClientOptions>
+  <MetadataSources>
+    <MetadataSource Address="http://localhost:9000/SlaveService/mex" Protocol="mex" SourceId="1" />
+  </MetadataSources>
+  <Metadata>
+    <MetadataFile FileName="service.wsdl" MetadataType="Wsdl" ID="dcf9b8de-fa8b-4a06-918e-78a8745e2302" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="service.xsd" MetadataType="Schema" ID="9faa3ead-f748-4382-89b5-59c6b7f8fd9f" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="service1.xsd" MetadataType="Schema" ID="6c39d767-dc42-4385-bf62-da3598ad90d7" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="HeuristicLab.Hive.Contracts.BusinessObjects.xsd" MetadataType="Schema" ID="32fd4d95-00f1-4e54-a309-e3a757038728" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="HeuristicLab.DataAccess.xsd" MetadataType="Schema" ID="7132388d-ae5d-42f6-852b-2efef1734b5f" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="HeuristicLab.Hive.Contracts.ResponseObjects.xsd" MetadataType="Schema" ID="23f0123d-4cb9-4dc0-bb56-3f96933c2019" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="HeuristicLab.Hive.Contracts.xsd" MetadataType="Schema" ID="43cac61f-a998-40b2-bb22-de5bd6c549db" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="Arrays.xsd" MetadataType="Schema" ID="994dcbb5-effa-481c-84cf-788a8ba6bb46" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="System.xsd" MetadataType="Schema" ID="c73812f0-bba6-41c6-b2c0-e186ab8c5827" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="HeuristicLab.PluginInfrastructure.xsd" MetadataType="Schema" ID="22532107-63f9-484c-b5ab-d16f632a8f21" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+    <MetadataFile FileName="Message.xsd" MetadataType="Schema" ID="e12260d0-b856-4848-8dc2-8946cd4e4635" SourceId="1" SourceUrl="http://localhost:9000/SlaveService/mex" />
+  </Metadata>
+  <Extensions>
+    <ExtensionFile FileName="configuration91.svcinfo" Name="configuration91.svcinfo" />
+    <ExtensionFile FileName="configuration.svcinfo" Name="configuration.svcinfo" />
+  </Extensions>
+</ReferenceGroup>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/System.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/System.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/System.xsd	(revision 4368)
@@ -0,0 +1,12 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/System" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:complexType name="Version">
+    <xs:sequence>
+      <xs:element name="_Build" type="xs:int" />
+      <xs:element name="_Major" type="xs:int" />
+      <xs:element name="_Minor" type="xs:int" />
+      <xs:element name="_Revision" type="xs:int" />
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="Version" nillable="true" type="tns:Version" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration.svcinfo
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration.svcinfo	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration.svcinfo	(revision 4368)
@@ -0,0 +1,12 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<configurationSnapshot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-wcfconfigurationsnapshot">
+  <behaviors />
+  <bindings>
+    <binding digest="System.ServiceModel.Configuration.NetTcpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; listenBacklog=&quot;10&quot; maxBufferSize=&quot;65536&quot; maxConnections=&quot;10&quot; name=&quot;SlaveTcpStreamedEndpoint&quot; transactionFlow=&quot;false&quot; transactionProtocol=&quot;OleTransactions&quot; transferMode=&quot;Streamed&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;reliableSession enabled=&quot;false&quot; inactivityTimeout=&quot;00:10:00&quot; ordered=&quot;true&quot; /&gt;&lt;security mode=&quot;TransportWithMessageCredential&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; /&gt;&lt;transport clientCredentialType=&quot;Windows&quot; protectionLevel=&quot;EncryptAndSign&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="netTcpBinding" name="SlaveTcpStreamedEndpoint" />
+    <binding digest="System.ServiceModel.Configuration.WSHttpBindingElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089:&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data hostNameComparisonMode=&quot;StrongWildcard&quot; messageEncoding=&quot;Text&quot; name=&quot;SlaveHttpEndpoint&quot; textEncoding=&quot;utf-8&quot; transactionFlow=&quot;false&quot;&gt;&lt;readerQuotas maxArrayLength=&quot;16384&quot; maxBytesPerRead=&quot;4096&quot; maxDepth=&quot;32&quot; maxNameTableCharCount=&quot;16384&quot; maxStringContentLength=&quot;8192&quot; /&gt;&lt;reliableSession enabled=&quot;false&quot; inactivityTimeout=&quot;00:10:00&quot; ordered=&quot;true&quot; /&gt;&lt;security mode=&quot;Message&quot;&gt;&lt;message algorithmSuite=&quot;Default&quot; clientCredentialType=&quot;UserName&quot; negotiateServiceCredential=&quot;true&quot; /&gt;&lt;transport clientCredentialType=&quot;Windows&quot; proxyCredentialType=&quot;None&quot; realm=&quot;&quot; /&gt;&lt;/security&gt;&lt;/Data&gt;" bindingType="wsHttpBinding" name="SlaveHttpEndpoint" />
+  </bindings>
+  <endpoints>
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://localhost:9000/SlaveService&quot; binding=&quot;wsHttpBinding&quot; bindingConfiguration=&quot;SlaveHttpEndpoint&quot; contract=&quot;SlaveFacade.ISlaveFacade&quot; name=&quot;SlaveHttpEndpoint&quot;&gt;&lt;identity&gt;&lt;certificate encodedValue=&quot;AwAAAAEAAAAUAAAAJ5p7xBv8o/BZ9Lp1c1d+F13FxN8gAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMDgzMDA5MTMyMVoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbjJrhOtSpfFz51JPvdfxMVSKqnWhfzjrZvtwpVsy8D589m3SeS6AalWwtkpPCR2C+a4GKo9e689o0+BtuOugypAWqkUhkz//XLvUp5KPNB7igY7he4ngMLp4GsWBWZdl+P8g29t5+nde1Tiv6dPzx5YgfB9lrvZzaS6TT/eNasQIDAQABo0kwRzBFBgNVHQEEPjA8gBBPTuRH17g8MfpeT/ODWdXuoRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQADgYEAUpgK4sUxAqwR8eyRK8cmyzhhN31xN8/nKPIo9cETaNvjJXL8zO7DeXCyyiBETAkfnhIChRIAmE/PjxvFdB2fOuQY3/OHrobai+G7IQ8SHF+AKdx7cJXt0h4Okny4DpPjQl4V9P2lZaG8fVXmpKhpeZ+ChA8Y/xPCDzTzLleQ/mY=&quot; /&gt;&lt;/identity&gt;&lt;/Data&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;http://localhost:9000/SlaveService&quot; binding=&quot;wsHttpBinding&quot; bindingConfiguration=&quot;SlaveHttpEndpoint&quot; contract=&quot;SlaveFacade.ISlaveFacade&quot; name=&quot;SlaveHttpEndpoint&quot;&gt;&lt;identity&gt;&lt;certificate encodedValue=&quot;AwAAAAEAAAAUAAAAJ5p7xBv8o/BZ9Lp1c1d+F13FxN8gAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMDgzMDA5MTMyMVoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbjJrhOtSpfFz51JPvdfxMVSKqnWhfzjrZvtwpVsy8D589m3SeS6AalWwtkpPCR2C+a4GKo9e689o0+BtuOugypAWqkUhkz//XLvUp5KPNB7igY7he4ngMLp4GsWBWZdl+P8g29t5+nde1Tiv6dPzx5YgfB9lrvZzaS6TT/eNasQIDAQABo0kwRzBFBgNVHQEEPjA8gBBPTuRH17g8MfpeT/ODWdXuoRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQADgYEAUpgK4sUxAqwR8eyRK8cmyzhhN31xN8/nKPIo9cETaNvjJXL8zO7DeXCyyiBETAkfnhIChRIAmE/PjxvFdB2fOuQY3/OHrobai+G7IQ8SHF+AKdx7cJXt0h4Okny4DpPjQl4V9P2lZaG8fVXmpKhpeZ+ChA8Y/xPCDzTzLleQ/mY=&quot; /&gt;&lt;/identity&gt;&lt;/Data&gt;" contractName="SlaveFacade.ISlaveFacade" name="SlaveHttpEndpoint" />
+    <endpoint normalizedDigest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;net.tcp://localhost:9001/SlaveServiceStreamed&quot; binding=&quot;netTcpBinding&quot; bindingConfiguration=&quot;SlaveTcpStreamedEndpoint&quot; contract=&quot;SlaveFacade.ISlaveFacade&quot; name=&quot;SlaveTcpStreamedEndpoint&quot;&gt;&lt;identity&gt;&lt;dns value=&quot;localhost&quot; /&gt;&lt;/identity&gt;&lt;/Data&gt;" digest="&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;&lt;Data address=&quot;net.tcp://localhost:9001/SlaveServiceStreamed&quot; binding=&quot;netTcpBinding&quot; bindingConfiguration=&quot;SlaveTcpStreamedEndpoint&quot; contract=&quot;SlaveFacade.ISlaveFacade&quot; name=&quot;SlaveTcpStreamedEndpoint&quot;&gt;&lt;identity&gt;&lt;dns value=&quot;localhost&quot; /&gt;&lt;/identity&gt;&lt;/Data&gt;" contractName="SlaveFacade.ISlaveFacade" name="SlaveTcpStreamedEndpoint" />
+  </endpoints>
+</configurationSnapshot>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration91.svcinfo
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration91.svcinfo	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/configuration91.svcinfo	(revision 4368)
@@ -0,0 +1,416 @@
+<?xml version="1.0" encoding="utf-8"?>
+<SavedWcfConfigurationInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="9.1" CheckSum="mdvHGx1cXH30EVgYx7zLInxCjgQ=">
+  <bindingConfigurations>
+    <bindingConfiguration bindingType="netTcpBinding" name="SlaveTcpStreamedEndpoint">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveTcpStreamedEndpoint</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/transactionFlow" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/transferMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransferMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Streamed</serializedValue>
+        </property>
+        <property path="/transactionProtocol" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TransactionProtocol, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>OleTransactions</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/listenBacklog" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>10</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxBufferSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/maxConnections" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>10</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/portSharingEnabled" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/reliableSession" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement</serializedValue>
+        </property>
+        <property path="/reliableSession/ordered" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+        <property path="/reliableSession/inactivityTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/reliableSession/enabled" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.NetTcpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.NetTcpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.SecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportWithMessageCredential</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.TcpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.TcpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.TcpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Windows</serializedValue>
+        </property>
+        <property path="/security/transport/protectionLevel" isComplexType="false" isExplicitlyDefined="true" clrType="System.Net.Security.ProtectionLevel, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>EncryptAndSign</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.MessageSecurityOverTcpElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.MessageSecurityOverTcpElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.MessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+    <bindingConfiguration bindingType="wsHttpBinding" name="SlaveHttpEndpoint">
+      <properties>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveHttpEndpoint</serializedValue>
+        </property>
+        <property path="/closeTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/openTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/receiveTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/sendTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:01:00</serializedValue>
+        </property>
+        <property path="/bypassProxyOnLocal" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/transactionFlow" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/hostNameComparisonMode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HostNameComparisonMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>StrongWildcard</serializedValue>
+        </property>
+        <property path="/maxBufferPoolSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>524288</serializedValue>
+        </property>
+        <property path="/maxReceivedMessageSize" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>65536</serializedValue>
+        </property>
+        <property path="/messageEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.WSMessageEncoding, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Text</serializedValue>
+        </property>
+        <property path="/proxyAddress" isComplexType="false" isExplicitlyDefined="false" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/readerQuotas" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxDepth" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>32</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxStringContentLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>8192</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxArrayLength" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxBytesPerRead" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>4096</serializedValue>
+        </property>
+        <property path="/readerQuotas/maxNameTableCharCount" isComplexType="false" isExplicitlyDefined="true" clrType="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>16384</serializedValue>
+        </property>
+        <property path="/reliableSession" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.StandardBindingOptionalReliableSessionElement</serializedValue>
+        </property>
+        <property path="/reliableSession/ordered" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+        <property path="/reliableSession/inactivityTimeout" isComplexType="false" isExplicitlyDefined="true" clrType="System.TimeSpan, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>00:10:00</serializedValue>
+        </property>
+        <property path="/reliableSession/enabled" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/textEncoding" isComplexType="false" isExplicitlyDefined="true" clrType="System.Text.Encoding, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Text.UTF8Encoding</serializedValue>
+        </property>
+        <property path="/useDefaultWebProxy" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+        <property path="/allowCookies" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/security" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.WSHttpSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.WSHttpSecurityElement</serializedValue>
+        </property>
+        <property path="/security/mode" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.SecurityMode, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Message</serializedValue>
+        </property>
+        <property path="/security/transport" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.WSHttpTransportSecurityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.WSHttpTransportSecurityElement</serializedValue>
+        </property>
+        <property path="/security/transport/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpClientCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Windows</serializedValue>
+        </property>
+        <property path="/security/transport/proxyCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.HttpProxyCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>None</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/policyEnforcement" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.PolicyEnforcement, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Never</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/protectionScenario" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.ProtectionScenario, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>TransportSelected</serializedValue>
+        </property>
+        <property path="/security/transport/extendedProtectionPolicy/customServiceNames" isComplexType="true" isExplicitlyDefined="false" clrType="System.Security.Authentication.ExtendedProtection.Configuration.ServiceNameElementCollection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>(Collection)</serializedValue>
+        </property>
+        <property path="/security/transport/realm" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/security/message" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.NonDualMessageSecurityOverHttpElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.NonDualMessageSecurityOverHttpElement</serializedValue>
+        </property>
+        <property path="/security/message/clientCredentialType" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.MessageCredentialType, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>UserName</serializedValue>
+        </property>
+        <property path="/security/message/negotiateServiceCredential" isComplexType="false" isExplicitlyDefined="true" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+        <property path="/security/message/algorithmSuite" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Security.SecurityAlgorithmSuite, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>Default</serializedValue>
+        </property>
+        <property path="/security/message/establishSecurityContext" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>True</serializedValue>
+        </property>
+      </properties>
+    </bindingConfiguration>
+  </bindingConfigurations>
+  <endpoints>
+    <endpoint name="SlaveHttpEndpoint" contract="SlaveFacade.ISlaveFacade" bindingType="wsHttpBinding" address="http://localhost:9000/SlaveService" bindingConfiguration="SlaveHttpEndpoint">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>http://localhost:9000/SlaveService</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>wsHttpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveHttpEndpoint</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveFacade.ISlaveFacade</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>AwAAAAEAAAAUAAAAJ5p7xBv8o/BZ9Lp1c1d+F13FxN8gAAAAAQAAAPIBAAAwggHuMIIBW6ADAgECAhBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQAwFDESMBAGA1UEAxMJbG9jYWxob3N0MB4XDTEwMDgzMDA5MTMyMVoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbjJrhOtSpfFz51JPvdfxMVSKqnWhfzjrZvtwpVsy8D589m3SeS6AalWwtkpPCR2C+a4GKo9e689o0+BtuOugypAWqkUhkz//XLvUp5KPNB7igY7he4ngMLp4GsWBWZdl+P8g29t5+nde1Tiv6dPzx5YgfB9lrvZzaS6TT/eNasQIDAQABo0kwRzBFBgNVHQEEPjA8gBBPTuRH17g8MfpeT/ODWdXuoRYwFDESMBAGA1UEAxMJbG9jYWxob3N0ghBvZlgTCjsfjEG5QUX7yOhOMAkGBSsOAwIdBQADgYEAUpgK4sUxAqwR8eyRK8cmyzhhN31xN8/nKPIo9cETaNvjJXL8zO7DeXCyyiBETAkfnhIChRIAmE/PjxvFdB2fOuQY3/OHrobai+G7IQ8SHF+AKdx7cJXt0h4Okny4DpPjQl4V9P2lZaG8fVXmpKhpeZ+ChA8Y/xPCDzTzLleQ/mY=</serializedValue>
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveHttpEndpoint</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+    <endpoint name="SlaveTcpStreamedEndpoint" contract="SlaveFacade.ISlaveFacade" bindingType="netTcpBinding" address="net.tcp://localhost:9001/SlaveServiceStreamed" bindingConfiguration="SlaveTcpStreamedEndpoint">
+      <properties>
+        <property path="/address" isComplexType="false" isExplicitlyDefined="true" clrType="System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>net.tcp://localhost:9001/SlaveServiceStreamed</serializedValue>
+        </property>
+        <property path="/behaviorConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/binding" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>netTcpBinding</serializedValue>
+        </property>
+        <property path="/bindingConfiguration" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveTcpStreamedEndpoint</serializedValue>
+        </property>
+        <property path="/contract" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveFacade.ISlaveFacade</serializedValue>
+        </property>
+        <property path="/headers" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.AddressHeaderCollectionElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.AddressHeaderCollectionElement</serializedValue>
+        </property>
+        <property path="/headers/headers" isComplexType="false" isExplicitlyDefined="true" clrType="System.ServiceModel.Channels.AddressHeaderCollection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>&lt;Header /&gt;</serializedValue>
+        </property>
+        <property path="/identity" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.IdentityElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.IdentityElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.UserPrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.UserPrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/userPrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/servicePrincipalName" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.ServicePrincipalNameElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.ServicePrincipalNameElement</serializedValue>
+        </property>
+        <property path="/identity/servicePrincipalName/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/dns" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.DnsElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.DnsElement</serializedValue>
+        </property>
+        <property path="/identity/dns/value" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>localhost</serializedValue>
+        </property>
+        <property path="/identity/rsa" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.RsaElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.RsaElement</serializedValue>
+        </property>
+        <property path="/identity/rsa/value" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificate" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateElement</serializedValue>
+        </property>
+        <property path="/identity/certificate/encodedValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference" isComplexType="true" isExplicitlyDefined="false" clrType="System.ServiceModel.Configuration.CertificateReferenceElement, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>System.ServiceModel.Configuration.CertificateReferenceElement</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeName" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreName, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>My</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/storeLocation" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.StoreLocation, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>LocalMachine</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/x509FindType" isComplexType="false" isExplicitlyDefined="false" clrType="System.Security.Cryptography.X509Certificates.X509FindType, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>FindBySubjectDistinguishedName</serializedValue>
+        </property>
+        <property path="/identity/certificateReference/findValue" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/identity/certificateReference/isChainIncluded" isComplexType="false" isExplicitlyDefined="false" clrType="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>False</serializedValue>
+        </property>
+        <property path="/name" isComplexType="false" isExplicitlyDefined="true" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue>SlaveTcpStreamedEndpoint</serializedValue>
+        </property>
+        <property path="/kind" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+        <property path="/endpointConfiguration" isComplexType="false" isExplicitlyDefined="false" clrType="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+          <serializedValue />
+        </property>
+      </properties>
+    </endpoint>
+  </endpoints>
+</SavedWcfConfigurationInformation>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.wsdl
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.wsdl	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.wsdl	(revision 4368)
@@ -0,0 +1,1483 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<wsdl:definitions xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SlaveFacade" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SymmetricBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy>
+            <sp:ProtectionToken>
+              <wsp:Policy>
+                <sp:SecureConversationToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
+                  <wsp:Policy>
+                    <sp:RequireDerivedKeys />
+                    <sp:BootstrapPolicy>
+                      <wsp:Policy>
+                        <sp:SignedParts>
+                          <sp:Body />
+                          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+                        </sp:SignedParts>
+                        <sp:EncryptedParts>
+                          <sp:Body />
+                        </sp:EncryptedParts>
+                        <sp:SymmetricBinding>
+                          <wsp:Policy>
+                            <sp:ProtectionToken>
+                              <wsp:Policy>
+                                <mssp:SslContextToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" xmlns:mssp="http://schemas.microsoft.com/ws/2005/07/securitypolicy">
+                                  <wsp:Policy>
+                                    <sp:RequireDerivedKeys />
+                                  </wsp:Policy>
+                                </mssp:SslContextToken>
+                              </wsp:Policy>
+                            </sp:ProtectionToken>
+                            <sp:AlgorithmSuite>
+                              <wsp:Policy>
+                                <sp:Basic256 />
+                              </wsp:Policy>
+                            </sp:AlgorithmSuite>
+                            <sp:Layout>
+                              <wsp:Policy>
+                                <sp:Strict />
+                              </wsp:Policy>
+                            </sp:Layout>
+                            <sp:IncludeTimestamp />
+                            <sp:EncryptSignature />
+                            <sp:OnlySignEntireHeadersAndBody />
+                          </wsp:Policy>
+                        </sp:SymmetricBinding>
+                        <sp:SignedSupportingTokens>
+                          <wsp:Policy>
+                            <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
+                              <wsp:Policy>
+                                <sp:WssUsernameToken10 />
+                              </wsp:Policy>
+                            </sp:UsernameToken>
+                          </wsp:Policy>
+                        </sp:SignedSupportingTokens>
+                        <sp:Wss11>
+                          <wsp:Policy />
+                        </sp:Wss11>
+                        <sp:Trust10>
+                          <wsp:Policy>
+                            <sp:MustSupportIssuedTokens />
+                            <sp:RequireClientEntropy />
+                            <sp:RequireServerEntropy />
+                          </wsp:Policy>
+                        </sp:Trust10>
+                      </wsp:Policy>
+                    </sp:BootstrapPolicy>
+                  </wsp:Policy>
+                </sp:SecureConversationToken>
+              </wsp:Policy>
+            </sp:ProtectionToken>
+            <sp:AlgorithmSuite>
+              <wsp:Policy>
+                <sp:Basic256 />
+              </wsp:Policy>
+            </sp:AlgorithmSuite>
+            <sp:Layout>
+              <wsp:Policy>
+                <sp:Strict />
+              </wsp:Policy>
+            </sp:Layout>
+            <sp:IncludeTimestamp />
+            <sp:EncryptSignature />
+            <sp:OnlySignEntireHeadersAndBody />
+          </wsp:Policy>
+        </sp:SymmetricBinding>
+        <sp:Wss11 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy />
+        </sp:Wss11>
+        <sp:Trust10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy>
+            <sp:MustSupportIssuedTokens />
+            <sp:RequireClientEntropy />
+            <sp:RequireServerEntropy />
+          </wsp:Policy>
+        </sp:Trust10>
+        <wsaw:UsingAddressing />
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_Login_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_Login_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessHeartBeat_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessHeartBeat_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetJob_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetJob_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_StoreFinishedJobResult_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_StoreFinishedJobResult_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessSnapshot_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessSnapshot_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_Logout_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_Logout_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_IsJobStillNeeded_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_IsJobStillNeeded_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetPlugins_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetPlugins_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetCalendar_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetCalendar_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_SetCalendarStatus_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_SetCalendarStatus_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetStreamedJob_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetStreamedJob_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetStreamedPlugins_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetStreamedPlugins_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_StoreFinishedJobResultStreamed_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_StoreFinishedJobResultStreamed_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessSnapshotStreamed_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_ProcessSnapshotStreamed_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_AddChildJob_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_AddChildJob_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_PauseJob_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_PauseJob_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetChildJobResults_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetChildJobResults_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetLastSerializedResult_Input_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveHttpEndpoint_GetLastSerializedResult_output_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <sp:SignedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+          <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+          <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+        </sp:SignedParts>
+        <sp:EncryptedParts xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <sp:Body />
+        </sp:EncryptedParts>
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsp:Policy wsu:Id="SlaveTcpStreamedEndpoint_policy">
+    <wsp:ExactlyOne>
+      <wsp:All>
+        <msb:BinaryEncoding xmlns:msb="http://schemas.microsoft.com/ws/06/2004/mspolicy/netbinary1" />
+        <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy>
+            <sp:TransportToken>
+              <wsp:Policy>
+                <msf:SslTransportSecurity xmlns:msf="http://schemas.microsoft.com/ws/2006/05/framing/policy" />
+              </wsp:Policy>
+            </sp:TransportToken>
+            <sp:AlgorithmSuite>
+              <wsp:Policy>
+                <sp:Basic256 />
+              </wsp:Policy>
+            </sp:AlgorithmSuite>
+            <sp:Layout>
+              <wsp:Policy>
+                <sp:Strict />
+              </wsp:Policy>
+            </sp:Layout>
+            <sp:IncludeTimestamp />
+          </wsp:Policy>
+        </sp:TransportBinding>
+        <sp:EndorsingSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy>
+            <sp:SecureConversationToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
+              <wsp:Policy>
+                <sp:BootstrapPolicy>
+                  <wsp:Policy>
+                    <sp:SignedParts>
+                      <sp:Body />
+                      <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing" />
+                      <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing" />
+                    </sp:SignedParts>
+                    <sp:EncryptedParts>
+                      <sp:Body />
+                    </sp:EncryptedParts>
+                    <sp:TransportBinding>
+                      <wsp:Policy>
+                        <sp:TransportToken>
+                          <wsp:Policy>
+                            <msf:SslTransportSecurity xmlns:msf="http://schemas.microsoft.com/ws/2006/05/framing/policy" />
+                          </wsp:Policy>
+                        </sp:TransportToken>
+                        <sp:AlgorithmSuite>
+                          <wsp:Policy>
+                            <sp:Basic256 />
+                          </wsp:Policy>
+                        </sp:AlgorithmSuite>
+                        <sp:Layout>
+                          <wsp:Policy>
+                            <sp:Strict />
+                          </wsp:Policy>
+                        </sp:Layout>
+                        <sp:IncludeTimestamp />
+                      </wsp:Policy>
+                    </sp:TransportBinding>
+                    <sp:SignedSupportingTokens>
+                      <wsp:Policy>
+                        <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
+                          <wsp:Policy>
+                            <sp:WssUsernameToken10 />
+                          </wsp:Policy>
+                        </sp:UsernameToken>
+                      </wsp:Policy>
+                    </sp:SignedSupportingTokens>
+                    <sp:Wss11>
+                      <wsp:Policy />
+                    </sp:Wss11>
+                    <sp:Trust10>
+                      <wsp:Policy>
+                        <sp:MustSupportIssuedTokens />
+                        <sp:RequireClientEntropy />
+                        <sp:RequireServerEntropy />
+                      </wsp:Policy>
+                    </sp:Trust10>
+                  </wsp:Policy>
+                </sp:BootstrapPolicy>
+              </wsp:Policy>
+            </sp:SecureConversationToken>
+          </wsp:Policy>
+        </sp:EndorsingSupportingTokens>
+        <sp:Wss11 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy />
+        </sp:Wss11>
+        <sp:Trust10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
+          <wsp:Policy>
+            <sp:MustSupportIssuedTokens />
+            <sp:RequireClientEntropy />
+            <sp:RequireServerEntropy />
+          </wsp:Policy>
+        </sp:Trust10>
+        <msf:Streamed xmlns:msf="http://schemas.microsoft.com/ws/2006/05/framing/policy" />
+        <wsaw:UsingAddressing />
+      </wsp:All>
+    </wsp:ExactlyOne>
+  </wsp:Policy>
+  <wsdl:types>
+    <xsd:schema targetNamespace="http://tempuri.org/Imports">
+      <xsd:import namespace="http://tempuri.org/" />
+      <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.DataAccess" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts" />
+      <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/System" />
+      <xsd:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.PluginInfrastructure" />
+      <xsd:import namespace="http://schemas.microsoft.com/Message" />
+    </xsd:schema>
+  </wsdl:types>
+  <wsdl:message name="ISlaveFacade_Login_InputMessage">
+    <wsdl:part name="parameters" element="tns:Login" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_Login_OutputMessage">
+    <wsdl:part name="parameters" element="tns:LoginResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessHeartBeat_InputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessHeartBeat" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessHeartBeat_OutputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessHeartBeatResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetJob_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetJob" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetJob_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetJobResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_StoreFinishedJobResult_InputMessage">
+    <wsdl:part name="parameters" element="tns:StoreFinishedJobResult" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_StoreFinishedJobResult_OutputMessage">
+    <wsdl:part name="parameters" element="tns:StoreFinishedJobResultResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessSnapshot_InputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessSnapshot" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessSnapshot_OutputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessSnapshotResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_Logout_InputMessage">
+    <wsdl:part name="parameters" element="tns:Logout" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_Logout_OutputMessage">
+    <wsdl:part name="parameters" element="tns:LogoutResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_IsJobStillNeeded_InputMessage">
+    <wsdl:part name="parameters" element="tns:IsJobStillNeeded" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_IsJobStillNeeded_OutputMessage">
+    <wsdl:part name="parameters" element="tns:IsJobStillNeededResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetPlugins_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetPlugins" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetPlugins_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetPluginsResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetCalendar_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetCalendar" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetCalendar_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetCalendarResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_SetCalendarStatus_InputMessage">
+    <wsdl:part name="parameters" element="tns:SetCalendarStatus" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_SetCalendarStatus_OutputMessage">
+    <wsdl:part name="parameters" element="tns:SetCalendarStatusResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetStreamedJob_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetStreamedJob" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetStreamedJob_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetStreamedJobResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetStreamedPlugins_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetStreamedPlugins" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetStreamedPlugins_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetStreamedPluginsResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_StoreFinishedJobResultStreamed_InputMessage">
+    <wsdl:part name="parameters" element="tns:StoreFinishedJobResultStreamed" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_StoreFinishedJobResultStreamed_OutputMessage">
+    <wsdl:part name="parameters" element="tns:StoreFinishedJobResultStreamedResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessSnapshotStreamed_InputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessSnapshotStreamed" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_ProcessSnapshotStreamed_OutputMessage">
+    <wsdl:part name="parameters" element="tns:ProcessSnapshotStreamedResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_AddChildJob_InputMessage">
+    <wsdl:part name="parameters" element="tns:AddChildJob" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_AddChildJob_OutputMessage">
+    <wsdl:part name="parameters" element="tns:AddChildJobResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_PauseJob_InputMessage">
+    <wsdl:part name="parameters" element="tns:PauseJob" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_PauseJob_OutputMessage">
+    <wsdl:part name="parameters" element="tns:PauseJobResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetChildJobResults_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetChildJobResults" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetChildJobResults_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetChildJobResultsResponse" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetLastSerializedResult_InputMessage">
+    <wsdl:part name="parameters" element="tns:GetLastSerializedResult" />
+  </wsdl:message>
+  <wsdl:message name="ISlaveFacade_GetLastSerializedResult_OutputMessage">
+    <wsdl:part name="parameters" element="tns:GetLastSerializedResultResponse" />
+  </wsdl:message>
+  <wsdl:portType name="ISlaveFacade">
+    <wsdl:operation name="Login">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/Login" message="tns:ISlaveFacade_Login_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/LoginResponse" message="tns:ISlaveFacade_Login_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="ProcessHeartBeat">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeat" message="tns:ISlaveFacade_ProcessHeartBeat_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeatResponse" message="tns:ISlaveFacade_ProcessHeartBeat_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetJob">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetJob" message="tns:ISlaveFacade_GetJob_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetJobResponse" message="tns:ISlaveFacade_GetJob_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResult">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResult" message="tns:ISlaveFacade_StoreFinishedJobResult_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResultResponse" message="tns:ISlaveFacade_StoreFinishedJobResult_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshot">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/ProcessSnapshot" message="tns:ISlaveFacade_ProcessSnapshot_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/ProcessSnapshotResponse" message="tns:ISlaveFacade_ProcessSnapshot_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="Logout">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/Logout" message="tns:ISlaveFacade_Logout_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/LogoutResponse" message="tns:ISlaveFacade_Logout_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="IsJobStillNeeded">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/IsJobStillNeeded" message="tns:ISlaveFacade_IsJobStillNeeded_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/IsJobStillNeededResponse" message="tns:ISlaveFacade_IsJobStillNeeded_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetPlugins">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetPlugins" message="tns:ISlaveFacade_GetPlugins_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetPluginsResponse" message="tns:ISlaveFacade_GetPlugins_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetCalendar">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetCalendar" message="tns:ISlaveFacade_GetCalendar_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/GetCalendarResponse" message="tns:ISlaveFacade_GetCalendar_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="SetCalendarStatus">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveCommunicator/SetCalendarStatus" message="tns:ISlaveFacade_SetCalendarStatus_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveCommunicator/SetCalendarStatusResponse" message="tns:ISlaveFacade_SetCalendarStatus_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedJob">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/GetStreamedJob" message="tns:ISlaveFacade_GetStreamedJob_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/GetStreamedJobResponse" message="tns:ISlaveFacade_GetStreamedJob_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedPlugins">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/GetStreamedPlugins" message="tns:ISlaveFacade_GetStreamedPlugins_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/GetStreamedPluginsResponse" message="tns:ISlaveFacade_GetStreamedPlugins_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResultStreamed">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamed" message="tns:ISlaveFacade_StoreFinishedJobResultStreamed_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamedResponse" message="tns:ISlaveFacade_StoreFinishedJobResultStreamed_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshotStreamed">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamed" message="tns:ISlaveFacade_ProcessSnapshotStreamed_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamedResponse" message="tns:ISlaveFacade_ProcessSnapshotStreamed_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="AddChildJob">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/AddChildJob" message="tns:ISlaveFacade_AddChildJob_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/AddChildJobResponse" message="tns:ISlaveFacade_AddChildJob_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="PauseJob">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/PauseJob" message="tns:ISlaveFacade_PauseJob_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/PauseJobResponse" message="tns:ISlaveFacade_PauseJob_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetChildJobResults">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/GetChildJobResults" message="tns:ISlaveFacade_GetChildJobResults_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/GetChildJobResultsResponse" message="tns:ISlaveFacade_GetChildJobResults_OutputMessage" />
+    </wsdl:operation>
+    <wsdl:operation name="GetLastSerializedResult">
+      <wsdl:input wsaw:Action="http://tempuri.org/ISlaveFacade/GetLastSerializedResult" message="tns:ISlaveFacade_GetLastSerializedResult_InputMessage" />
+      <wsdl:output wsaw:Action="http://tempuri.org/ISlaveFacade/GetLastSerializedResultResponse" message="tns:ISlaveFacade_GetLastSerializedResult_OutputMessage" />
+    </wsdl:operation>
+  </wsdl:portType>
+  <wsdl:binding name="SlaveHttpEndpoint" type="tns:ISlaveFacade">
+    <wsp:PolicyReference URI="#SlaveHttpEndpoint_policy" />
+    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
+    <wsdl:operation name="Login">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/Login" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_Login_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_Login_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessHeartBeat">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeat" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessHeartBeat_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessHeartBeat_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetJob" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetJob_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetJob_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResult">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResult" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_StoreFinishedJobResult_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_StoreFinishedJobResult_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshot">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/ProcessSnapshot" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessSnapshot_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessSnapshot_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="Logout">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/Logout" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_Logout_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_Logout_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="IsJobStillNeeded">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/IsJobStillNeeded" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_IsJobStillNeeded_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_IsJobStillNeeded_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetPlugins">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetPlugins" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetPlugins_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetPlugins_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetCalendar">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetCalendar" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetCalendar_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetCalendar_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="SetCalendarStatus">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/SetCalendarStatus" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_SetCalendarStatus_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_SetCalendarStatus_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetStreamedJob" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetStreamedJob_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetStreamedJob_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedPlugins">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetStreamedPlugins" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetStreamedPlugins_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetStreamedPlugins_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResultStreamed">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamed" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_StoreFinishedJobResultStreamed_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_StoreFinishedJobResultStreamed_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshotStreamed">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamed" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessSnapshotStreamed_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_ProcessSnapshotStreamed_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="AddChildJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/AddChildJob" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_AddChildJob_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_AddChildJob_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="PauseJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/PauseJob" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_PauseJob_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_PauseJob_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetChildJobResults">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetChildJobResults" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetChildJobResults_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetChildJobResults_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetLastSerializedResult">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetLastSerializedResult" style="document" />
+      <wsdl:input>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetLastSerializedResult_Input_policy" />
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <wsp:PolicyReference URI="#SlaveHttpEndpoint_GetLastSerializedResult_output_policy" />
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:binding>
+  <wsdl:binding name="SlaveTcpStreamedEndpoint" type="tns:ISlaveFacade">
+    <wsp:PolicyReference URI="#SlaveTcpStreamedEndpoint_policy" />
+    <soap12:binding transport="http://schemas.microsoft.com/soap/tcp" />
+    <wsdl:operation name="Login">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/Login" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessHeartBeat">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/ProcessHeartBeat" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetJob" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResult">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/StoreFinishedJobResult" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshot">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/ProcessSnapshot" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="Logout">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/Logout" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="IsJobStillNeeded">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/IsJobStillNeeded" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetPlugins">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetPlugins" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetCalendar">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/GetCalendar" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="SetCalendarStatus">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveCommunicator/SetCalendarStatus" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetStreamedJob" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetStreamedPlugins">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetStreamedPlugins" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="StoreFinishedJobResultStreamed">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/StoreFinishedJobResultStreamed" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="ProcessSnapshotStreamed">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/ProcessSnapshotStreamed" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="AddChildJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/AddChildJob" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="PauseJob">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/PauseJob" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetChildJobResults">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetChildJobResults" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+    <wsdl:operation name="GetLastSerializedResult">
+      <soap12:operation soapAction="http://tempuri.org/ISlaveFacade/GetLastSerializedResult" style="document" />
+      <wsdl:input>
+        <soap12:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap12:body use="literal" />
+      </wsdl:output>
+    </wsdl:operation>
+  </wsdl:binding>
+  <wsdl:service name="SlaveFacade">
+    <wsdl:port name="SlaveHttpEndpoint" binding="tns:SlaveHttpEndpoint">
+      <soap12:address location="http://localhost:9000/SlaveService" />
+      <wsa10:EndpointReference>
+        <wsa10:Address>http://localhost:9000/SlaveService</wsa10:Address>
+        <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
+          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
+            <X509Data>
+              <X509Certificate>MIIB7jCCAVugAwIBAgIQb2ZYEwo7H4xBuUFF+8joTjAJBgUrDgMCHQUAMBQxEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMDA4MzAwOTEzMjFaFw0zOTEyMzEyMzU5NTlaMBQxEjAQBgNVBAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAm4ya4TrUqXxc+dST73X8TFUiqp1oX8462b7cKVbMvA+fPZt0nkugGpVsLZKTwkdgvmuBiqPXuvPaNPgbbjroMqQFqpFIZM//1y71KeSjzQe4oGO4XuJ4DC6eBrFgVmXZfj/INvbefp3XtU4r+nT88eWIHwfZa72c2kuk0/3jWrECAwEAAaNJMEcwRQYDVR0BBD4wPIAQT07kR9e4PDH6Xk/zg1nV7qEWMBQxEjAQBgNVBAMTCWxvY2FsaG9zdIIQb2ZYEwo7H4xBuUFF+8joTjAJBgUrDgMCHQUAA4GBAFKYCuLFMQKsEfHskSvHJss4YTd9cTfP5yjyKPXBE2jb4yVy/Mzuw3lwssogREwJH54SAoUSAJhPz48bxXQdnzrkGN/zh66G2ovhuyEPEhxfgCnce3CV7dIeDpJ8uA6T40JeFfT9pWWhvH1V5qSoaXmfgoQPGP8Twg808y5XkP5m</X509Certificate>
+            </X509Data>
+          </KeyInfo>
+        </Identity>
+      </wsa10:EndpointReference>
+    </wsdl:port>
+    <wsdl:port name="SlaveTcpStreamedEndpoint" binding="tns:SlaveTcpStreamedEndpoint">
+      <soap12:address location="net.tcp://localhost:9001/SlaveServiceStreamed" />
+      <wsa10:EndpointReference>
+        <wsa10:Address>net.tcp://localhost:9001/SlaveServiceStreamed</wsa10:Address>
+        <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
+          <Dns>localhost</Dns>
+        </Identity>
+      </wsa10:EndpointReference>
+    </wsdl:port>
+  </wsdl:service>
+</wsdl:definitions>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service.xsd	(revision 4368)
@@ -0,0 +1,271 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:tns="http://tempuri.org/" elementFormDefault="qualified" targetNamespace="http://tempuri.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" />
+  <xs:import namespace="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" />
+  <xs:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
+  <xs:import namespace="http://schemas.microsoft.com/Message" />
+  <xs:element name="Login">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="slave" nillable="true" type="q1:SlaveDto" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="LoginResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q2="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="LoginResult" nillable="true" type="q2:Response" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessHeartBeat">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q3="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="hbData" nillable="true" type="q3:HeartBeatData" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessHeartBeatResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q4="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="ProcessHeartBeatResult" nillable="true" type="q4:ResponseHeartBeat" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetJob">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q5="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q5:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetJobResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q6="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="GetJobResult" nillable="true" type="q6:ResponseObjectOfJobDtoZAa7YIsz" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="StoreFinishedJobResult">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q7="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q7:guid" />
+        <xs:element xmlns:q8="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="jobId" type="q8:guid" />
+        <xs:element minOccurs="0" name="result" nillable="true" type="xs:base64Binary" />
+        <xs:element minOccurs="0" name="percentage" type="xs:double" />
+        <xs:element minOccurs="0" name="exception" nillable="true" type="xs:string" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="StoreFinishedJobResultResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q9="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="StoreFinishedJobResultResult" nillable="true" type="q9:ResponseResultReceived" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessSnapshot">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q10="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q10:guid" />
+        <xs:element xmlns:q11="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="jobId" type="q11:guid" />
+        <xs:element minOccurs="0" name="result" nillable="true" type="xs:base64Binary" />
+        <xs:element minOccurs="0" name="percentage" type="xs:double" />
+        <xs:element minOccurs="0" name="exception" nillable="true" type="xs:string" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessSnapshotResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q12="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="ProcessSnapshotResult" nillable="true" type="q12:ResponseResultReceived" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="Logout">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q13="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q13:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="LogoutResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q14="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="LogoutResult" nillable="true" type="q14:Response" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="IsJobStillNeeded">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q15="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="jobId" type="q15:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="IsJobStillNeededResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q16="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="IsJobStillNeededResult" nillable="true" type="q16:Response" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetPlugins">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q17="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="pluginList" nillable="true" type="q17:ArrayOfHivePluginInfoDto" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetPluginsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q18="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="GetPluginsResult" nillable="true" type="q18:ResponseListOfCachedHivePluginInfoDtoZMwZop09" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetCalendar">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q19="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q19:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetCalendarResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q20="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="GetCalendarResult" nillable="true" type="q20:ResponseCalendar" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="SetCalendarStatus">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q21="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q21:guid" />
+        <xs:element xmlns:q22="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="state" type="q22:CalendarState" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="SetCalendarStatusResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q23="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="SetCalendarStatusResult" nillable="true" type="q23:Response" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetStreamedJob">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q24="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="clientId" type="q24:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetStreamedJobResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q25="http://schemas.microsoft.com/Message" name="GetStreamedJobResult" type="q25:StreamBody" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetStreamedPlugins">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q26="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="pluginList" nillable="true" type="q26:ArrayOfHivePluginInfoDto" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetStreamedPluginsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q27="http://schemas.microsoft.com/Message" name="GetStreamedPluginsResult" type="q27:StreamBody" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="StoreFinishedJobResultStreamed">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q28="http://schemas.microsoft.com/Message" name="stream" type="q28:StreamBody" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="StoreFinishedJobResultStreamedResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q29="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="StoreFinishedJobResultStreamedResult" nillable="true" type="q29:ResponseResultReceived" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessSnapshotStreamed">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q30="http://schemas.microsoft.com/Message" name="stream" type="q30:StreamBody" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ProcessSnapshotStreamedResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q31="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="ProcessSnapshotStreamedResult" nillable="true" type="q31:ResponseResultReceived" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="AddChildJob">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q32="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="parentJobId" type="q32:guid" />
+        <xs:element xmlns:q33="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="serializedJob" nillable="true" type="q33:SerializedJob" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="AddChildJobResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q34="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="AddChildJobResult" nillable="true" type="q34:ResponseObjectOfJobDtoZAa7YIsz" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PauseJob">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q35="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="serializedJob" nillable="true" type="q35:SerializedJob" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PauseJobResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q36="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.ResponseObjects" minOccurs="0" name="PauseJobResult" nillable="true" type="q36:ResponseObjectOfJobDtoZAa7YIsz" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetChildJobResults">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q37="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="parentJobId" nillable="true" type="q37:guid" />
+        <xs:element minOccurs="0" name="recursive" type="xs:boolean" />
+        <xs:element minOccurs="0" name="includeParent" type="xs:boolean" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetChildJobResultsResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q38="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="GetChildJobResultsResult" nillable="true" type="q38:ArrayOfJobResult" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetLastSerializedResult">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q39="http://schemas.microsoft.com/2003/10/Serialization/" minOccurs="0" name="jobId" type="q39:guid" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="GetLastSerializedResultResponse">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element xmlns:q40="http://schemas.datacontract.org/2004/07/HeuristicLab.Hive.Contracts.BusinessObjects" minOccurs="0" name="GetLastSerializedResultResult" nillable="true" type="q40:SerializedJob" />
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service1.xsd
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service1.xsd	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/Service References/SlaveFacade/service1.xsd	(revision 4368)
@@ -0,0 +1,42 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="anyType" nillable="true" type="xs:anyType" />
+  <xs:element name="anyURI" nillable="true" type="xs:anyURI" />
+  <xs:element name="base64Binary" nillable="true" type="xs:base64Binary" />
+  <xs:element name="boolean" nillable="true" type="xs:boolean" />
+  <xs:element name="byte" nillable="true" type="xs:byte" />
+  <xs:element name="dateTime" nillable="true" type="xs:dateTime" />
+  <xs:element name="decimal" nillable="true" type="xs:decimal" />
+  <xs:element name="double" nillable="true" type="xs:double" />
+  <xs:element name="float" nillable="true" type="xs:float" />
+  <xs:element name="int" nillable="true" type="xs:int" />
+  <xs:element name="long" nillable="true" type="xs:long" />
+  <xs:element name="QName" nillable="true" type="xs:QName" />
+  <xs:element name="short" nillable="true" type="xs:short" />
+  <xs:element name="string" nillable="true" type="xs:string" />
+  <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" />
+  <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" />
+  <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" />
+  <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" />
+  <xs:element name="char" nillable="true" type="tns:char" />
+  <xs:simpleType name="char">
+    <xs:restriction base="xs:int" />
+  </xs:simpleType>
+  <xs:element name="duration" nillable="true" type="tns:duration" />
+  <xs:simpleType name="duration">
+    <xs:restriction base="xs:duration">
+      <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" />
+      <xs:minInclusive value="-P10675199DT2H48M5.4775808S" />
+      <xs:maxInclusive value="P10675199DT2H48M5.4775807S" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="guid" nillable="true" type="tns:guid" />
+  <xs:simpleType name="guid">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" />
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:attribute name="FactoryType" type="xs:QName" />
+  <xs:attribute name="Id" type="xs:ID" />
+  <xs:attribute name="Ref" type="xs:IDREF" />
+</xs:schema>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/ServiceLocator.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/ServiceLocator.cs	(revision 4368)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/ServiceLocator.cs	(revision 4368)
@@ -0,0 +1,64 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 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.Hive.Contracts;
+using HeuristicLab.Hive.Contracts.Interfaces;
+using HeuristicLab.Hive.Slave.Communication.Properties;
+
+namespace HeuristicLab.Hive.Slave.Communication {
+  internal class ServiceLocator {
+    private static ServiceLocator instance = null;
+    private WcfServicePool<SlaveFacade.ISlaveFacade> slaveFacadePool = null;
+    private WcfServicePool<SlaveFacade.ISlaveFacade> streamedSlaveFacadePool = null;
+
+    internal static ServiceLocator Instance {
+      get {
+        if (instance == null) {
+          instance = new ServiceLocator();
+        }
+        return instance;
+      }
+    }
+
+    internal string HostAddress {
+      get;
+      set;
+    }
+
+    internal WcfServicePool<SlaveFacade.ISlaveFacade> SlaveFacadePool {
+      get {
+        if (slaveFacadePool == null) {
+          slaveFacadePool = new WcfServicePool<SlaveFacade.ISlaveFacade>(HostAddress, Settings.Default.HiveUsername, Settings.Default.HivePassword, "SlaveHttpEndpoint");
+        }
+        return slaveFacadePool;
+      }
+    }
+
+    internal WcfServicePool<SlaveFacade.ISlaveFacade> StreamedSlaveFacadePool {
+      get {
+        if (streamedSlaveFacadePool == null) {
+          streamedSlaveFacadePool = new WcfServicePool<SlaveFacade.ISlaveFacade>(HostAddress, Settings.Default.HiveUsername, Settings.Default.HivePassword, "SlaveTcpStreamedEndpoint");
+        }
+        return streamedSlaveFacadePool;
+      }
+    }
+  }
+}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/SlaveServiceCache.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/SlaveServiceCache.cs	(revision 4343)
+++ 	(revision )
@@ -1,121 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using HeuristicLab.Hive.Slave.Communication.SlaveService;
-using HeuristicLab.Hive.Contracts;
-using System.ServiceModel;
-using HeuristicLab.Hive.Slave.Communication.Properties;
-using HeuristicLab.Tracing;
-using System.ServiceModel.Security;
-
-namespace HeuristicLab.Hive.Slave.Communication {
-  internal class SlaveServiceCache {
-    /// <summary>
-    /// Cache of SlaveFacadeClients, to check if all get disposed
-    /// </summary>
-    private DisposableSlaveFacadeClient cachedSlaveFacadeClientStreamed = null;
-    private DisposableSlaveFacadeClient cachedSlaveFacadeClient = null;
-    private int streamedClientCount = 0;
-    private int clientCount = 0;
-    private string serverIp;
-    private static object locker = new object();
-
-    public SlaveServiceCache(string serverIp) {
-      this.serverIp = serverIp;
-    }
-
-    internal DisposableSlaveFacadeClient GetSlaveFacade() {
-      lock (locker) {
-        try {
-          if (cachedSlaveFacadeClient == null) {
-            cachedSlaveFacadeClient = new DisposableSlaveFacadeClient("SlaveHttpEndpoint");
-            cachedSlaveFacadeClient.OnDisposing += new EventHandler(OnSlaveClientDisposing);
-            WcfSettings.SetEndpointAddress(cachedSlaveFacadeClient.Endpoint, this.serverIp);
-            SetCredentials(cachedSlaveFacadeClient);
-            cachedSlaveFacadeClient.Open();
-            Logger.Debug("Created SlaveFacadeClient");
-          }
-          clientCount++;
-          Logger.Debug("SlaveFacadeClientCount: " + clientCount);
-          return cachedSlaveFacadeClient;
-        }
-        catch (MessageSecurityException exception) {
-          // more info in innerexception, probably credentials are wrong
-          throw exception.InnerException;
-        }
-      }
-    }
-    
-    internal DisposableSlaveFacadeClient GetStreamedSlaveFacade() {
-      lock (locker) {
-        try {
-          if (cachedSlaveFacadeClientStreamed == null) {
-            cachedSlaveFacadeClientStreamed = new DisposableSlaveFacadeClient("SlaveTcpStreamedEndpoint");
-            cachedSlaveFacadeClientStreamed.OnDisposing += new EventHandler(OnSlaveClientDisposing);
-            WcfSettings.SetEndpointAddress(cachedSlaveFacadeClientStreamed.Endpoint, this.serverIp);
-            SetCredentials(cachedSlaveFacadeClientStreamed);
-            cachedSlaveFacadeClientStreamed.Open();
-            Logger.Debug("Created SlaveFacadeClientStreamed");
-          }
-          streamedClientCount++;
-          Logger.Debug("SlaveFacadeClientCount: " + streamedClientCount);
-          return cachedSlaveFacadeClientStreamed;
-        }
-        catch (MessageSecurityException exception) {
-          // more info in innerexception, probably credentials are wrong
-          throw exception.InnerException;
-        }
-      }
-    }
-
-    private void SetCredentials(SlaveFacadeClient client) {
-      Logger.Debug("Setting credentials for user \"" + Settings.Default.HiveUsername + "\"");
-      client.ClientCredentials.UserName.UserName = Settings.Default.HiveUsername;
-      client.ClientCredentials.UserName.Password = Settings.Default.HivePassword;
-    }
-
-    public void ReleaseSlaveClient(DisposableSlaveFacadeClient slaveFacade) {
-      lock (locker) {
-        if (slaveFacade != null) {
-          if (slaveFacade == cachedSlaveFacadeClient) {
-            clientCount--;
-            Logger.Debug("Disposing SlaveFacadeClient. Count: " + clientCount);
-            if (clientCount < 0)
-              throw new Exception("SlaveFacadeClient Count is less than zero. It was released too often.");
-            if (clientCount == 0) {
-              WcfSettings.DisposeWcfClient((ICommunicationObject)slaveFacade);
-              cachedSlaveFacadeClient = null;
-            }
-          } else if (slaveFacade == cachedSlaveFacadeClientStreamed) {
-            streamedClientCount--;
-            Logger.Debug("Disposing SlaveFacadeClientStreamed. Count: " + streamedClientCount);
-            if (streamedClientCount < 0)
-              throw new Exception("SlaveFacadeClientStreamed Count is less than zero. It was released too often.");
-            if (streamedClientCount == 0) {
-              WcfSettings.DisposeWcfClient((ICommunicationObject)slaveFacade);
-              cachedSlaveFacadeClientStreamed = null;
-            }
-          } else {
-            throw new Exception("Cannot dispose slaveFacade. Cannot be found in cache.");
-          }
-        }
-      } // lock
-    }
-
-    private void OnSlaveClientDisposing(object sender, EventArgs e) {
-      ReleaseSlaveClient((DisposableSlaveFacadeClient)sender);
-    }
-  }
-
-  internal class DisposableSlaveFacadeClient : SlaveFacadeClient, IDisposable {
-    public DisposableSlaveFacadeClient(string endpointConfigurationName) : base(endpointConfigurationName) { }
-
-    public void Dispose() {
-      if (OnDisposing != null)
-        OnDisposing(this, new EventArgs());
-    }
-
-    public event EventHandler OnDisposing;
-  }
-}
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/WcfService.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/WcfService.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/WcfService.cs	(revision 4368)
@@ -22,18 +22,14 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.ServiceModel;
-using HeuristicLab.Hive.Contracts.Interfaces;
-using HeuristicLab.Hive.Slave.Common;
-using HeuristicLab.PluginInfrastructure;
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
-using HeuristicLab.Tracing;
+using System.ServiceModel;
 using HeuristicLab.Hive.Contracts;
 using HeuristicLab.Hive.Contracts.BusinessObjects;
-using HeuristicLab.Hive.Slave.Communication.SlaveService;
 using HeuristicLab.Hive.Contracts.ResponseObjects;
-using HeuristicLab.Hive.Slave.Communication.Properties;
+using HeuristicLab.Hive.Slave.Common;
+using HeuristicLab.Hive.Slave.Communication.SlaveFacade;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Slave.Communication {
@@ -78,6 +74,4 @@
     public event EventHandler Connected;
 
-    SlaveServiceCache servicePool;
-
     /// <summary>
     /// Constructor
@@ -92,6 +86,8 @@
     /// </summary>
     public void Connect() {
-      servicePool = new SlaveServiceCache(ServerIp);
-      using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
+      ServiceLocator.Instance.HostAddress = ServerIp;
+      ServiceLocator.Instance.SlaveFacadePool.ExceptionOccured += new EventHandler<HeuristicLab.Common.EventArgs<Exception>>(ClientFacadePool_ExceptionOccured);
+      ServiceLocator.Instance.StreamedSlaveFacadePool.ExceptionOccured += new EventHandler<HeuristicLab.Common.EventArgs<Exception>>(ClientFacadePool_ExceptionOccured);
+      using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
         try {
           Logger.Debug("Starting the Connection Process");
@@ -114,4 +110,8 @@
         }
       }
+    }
+
+    void ClientFacadePool_ExceptionOccured(object sender, HeuristicLab.Common.EventArgs<Exception> e) {
+      Logger.Error("An exception occured in the WCF-Communication: " + e.Value.ToString());
     }
 
@@ -138,9 +138,9 @@
     /// </summary>
     public void Login(SlaveDto slaveInfo) {
-      using (DisposableSlaveFacadeClient client = servicePool.GetSlaveFacade()) {
+      using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.SlaveFacadePool.GetService()) {
         try {
           if (ConnState == NetworkEnum.WcfConnState.Connected) {
             Logger.Debug("STARTED: Login Sync");
-            Response res = client.Login(slaveInfo);
+            Response res = service.Obj.Login(slaveInfo);
             if (res.StatusMessage != ResponseStatus.Ok) {
               Logger.Error("FAILED: Login Failed! " + res.StatusMessage);
@@ -165,7 +165,7 @@
     public void GetJobAsync(Guid guid) {
       if (LoggedIn) {
-        DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade();
+        Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService();
         Logger.Debug("STARTED: Fetching of Jobs from Server for Slave");
-        client.BeginGetStreamedJob(guid, (ar => {
+        service.Obj.BeginGetStreamedJob(guid, (ar => {
           if (ar.IsCompleted) {
             Stream stream = null;
@@ -173,5 +173,5 @@
             try {
               Logger.Debug("ENDED: Fetching of Jobs from Server for Slave");
-              stream = client.EndGetStreamedJob(ar);
+              stream = service.Obj.EndGetStreamedJob(ar);
 
               //first deserialize the response
@@ -203,5 +203,5 @@
                 memStream.Dispose();
 
-              servicePool.ReleaseSlaveClient(client);
+              service.Dispose();
             }
           } else
@@ -220,5 +220,5 @@
     public void GetFinishedJobResultAsync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception, bool finished) {
       if (LoggedIn) {
-        DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade();
+        Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService();
         Logger.Debug("STARTED: Sending back the finished job results");
         Logger.Debug("Building stream");
@@ -226,6 +226,6 @@
         Logger.Debug("Builded stream");
         Logger.Debug("Making the call");
-
-        client.BeginStoreFinishedJobResultStreamed(stream, (ar => {
+        
+        service.Obj.BeginStoreFinishedJobResultStreamed(stream, (ar => {
           try {
             Logger.Debug("Finished storing the job");
@@ -234,5 +234,5 @@
 
             if (ar.IsCompleted) {
-              var res = client.EndStoreFinishedJobResultStreamed(ar);
+              var res = service.Obj.EndStoreFinishedJobResultStreamed(ar);
               StoreFinishedJobResultCompletedEventArgs args = new StoreFinishedJobResultCompletedEventArgs(new object[] { res }, null, false, null);
               Logger.Debug("calling the Finished Job Event");
@@ -244,5 +244,5 @@
           }
           finally {
-            servicePool.ReleaseSlaveClient(client);
+            service.Dispose();
           }
         }), null);
@@ -256,8 +256,8 @@
     public void ProcessSnapshotAsync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception, bool finished) {
       if (LoggedIn) {
-        DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade();
+        Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService();
 
         Stream stream = GetStreamedJobResult(clientId, jobId, result, percentage, exception);
-        client.BeginProcessSnapshotStreamed(stream, (ar => {
+        service.Obj.BeginProcessSnapshotStreamed(stream, (ar => {
           try {
             if (stream != null)
@@ -265,5 +265,5 @@
 
             if (ar.IsCompleted) {
-              var res = client.EndStoreFinishedJobResultStreamed(ar);
+              var res = service.Obj.EndStoreFinishedJobResultStreamed(ar);
               ProcessSnapshotCompletedEventArgs args = new ProcessSnapshotCompletedEventArgs(new object[] { res }, null, false, null);
               ProcessSnapshotCompleted(this, args);
@@ -273,5 +273,5 @@
           }
           finally {
-            servicePool.ReleaseSlaveClient(client);
+            service.Dispose();
           }
         }), null);
@@ -289,11 +289,13 @@
     public void ProcessHeartBeatSync(HeartBeatData hbd) {
       if (LoggedIn) {
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
           Logger.Debug("STARTING: sending heartbeat");
-          var res = client.ProcessHeartBeat(hbd);
+          var res = service.Obj.ProcessHeartBeat(hbd);
 
           if (res.StatusMessage == ResponseStatus.Ok) {
             ProcessHeartBeatCompleted(this, new ProcessHeartBeatCompletedEventArgs(new object[] { res }, null, false, null));
             Logger.Debug("ENDED: sending heartbeats");
+          } else if (res.StatusMessage == ResponseStatus.ProcessHeartBeat_UserNotLoggedIn) {
+            LoggedIn = false;
           } else {
             Logger.Error("FAILED: sending heartbeats: " + res.StatusMessage.ToString());
@@ -311,5 +313,5 @@
       JobResult jobResult = new JobResult();
       jobResult.SlaveId = clientId;
-      jobResult.JobId = jobId;
+      jobResult.Id = jobId;
       jobResult.Percentage = percentage;
       jobResult.Exception = exception != null ? exception.Message : "";
@@ -328,6 +330,6 @@
 
     public ResponseResultReceived StoreFinishedJobResultsSync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception, bool finished) {
-      using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-        ResponseResultReceived res = client.StoreFinishedJobResultStreamed(GetStreamedJobResult(clientId, jobId, result, percentage, exception));
+      using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+        ResponseResultReceived res = service.Obj.StoreFinishedJobResultStreamed(GetStreamedJobResult(clientId, jobId, result, percentage, exception));
         return res;
       }
@@ -337,6 +339,6 @@
       try {
         Logger.Debug("STARTING: Sync call: IsJobStillNeeded");
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-          Response res = client.IsJobStillNeeded(jobId);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          Response res = service.Obj.IsJobStillNeeded(jobId);
           Logger.Debug("ENDED: Sync call: IsJobStillNeeded");
           return res;
@@ -351,6 +353,6 @@
     public ResponseResultReceived ProcessSnapshotSync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception) {
       try {
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-          return client.ProcessSnapshotStreamed(GetStreamedJobResult(clientId, jobId, result, percentage, exception));
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          return service.Obj.ProcessSnapshotStreamed(GetStreamedJobResult(clientId, jobId, result, percentage, exception));
         }
       }
@@ -363,8 +365,8 @@
     public IEnumerable<CachedHivePluginInfoDto> RequestPlugins(List<HivePluginInfoDto> requestedPlugins) {
       try {
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
           Logger.Debug("STARTED: Requesting Plugins for Job");
           Logger.Debug("STARTED: Getting the stream");
-          Stream stream = client.GetStreamedPlugins(requestedPlugins.ToArray());
+          Stream stream = service.Obj.GetStreamedPlugins(requestedPlugins.ToArray());
           Logger.Debug("ENDED: Getting the stream");
           BinaryFormatter formatter = new BinaryFormatter();
@@ -386,6 +388,6 @@
       try {
         Logger.Debug("STARTED: Logout");
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-          client.Logout(guid);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          service.Obj.Logout(guid);
         }
         Logger.Debug("ENDED: Logout");
@@ -399,6 +401,6 @@
       try {
         Logger.Debug("STARTED: Syncing Calendars");
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-          ResponseCalendar cal = client.GetCalendar(clientId);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          ResponseCalendar cal = service.Obj.GetCalendar(clientId);
           Logger.Debug("ENDED: Syncing Calendars");
           return cal;
@@ -414,6 +416,6 @@
       try {
         Logger.Debug("STARTED: Setting Calendar status to: " + state);
-        using (DisposableSlaveFacadeClient client = servicePool.GetStreamedSlaveFacade()) {
-          Response resp = client.SetCalendarStatus(clientId, state);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          Response resp = service.Obj.SetCalendarStatus(clientId, state);
           Logger.Debug("ENDED: Setting Calendar status to: " + state);
           return resp;
@@ -425,4 +427,56 @@
       }
     }
+
+    public ResponseObject<JobDto> AddChildJob(Guid parentJobId, SerializedJob serializedJob) {
+      try {
+        Logger.Debug("STARTED: Add Child Job for parent: " + parentJobId);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          ResponseObject<JobDto> response = service.Obj.AddChildJob(parentJobId, serializedJob);
+          Logger.Debug("ENDED: Add Child Job for parent: " + parentJobId);
+          return response;
+        }
+      }
+      catch (Exception e) {
+        HandleNetworkError(e);
+        return null;
+      }
+    }
+
+    public ResponseObject<JobDto> PauseJob(SerializedJob serializedJob) {
+      try {
+        Logger.Debug("STARTED: Pausing job: " + serializedJob.JobInfo.Id);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          ResponseObject<JobDto> response = service.Obj.PauseJob(serializedJob);
+          Logger.Debug("ENDED: Pausing job: " + serializedJob.JobInfo.Id);
+          return response;
+        }
+      }
+      catch (Exception e) {
+        HandleNetworkError(e);
+        return null;
+      }
+    }
+
+    public ResponseObject<SerializedJobList> GetChildJobs(Guid parentJob) {
+      try {
+        Logger.Debug("STARTED: GetChildJobs job: " + parentJob);
+        using (Disposable<SlaveFacade.ISlaveFacade> service = ServiceLocator.Instance.StreamedSlaveFacadePool.GetService()) {
+          SerializedJobList serializedJobs = new SerializedJobList();
+          JobResult[] results = service.Obj.GetChildJobResults(new Guid?(parentJob), false, false);
+          foreach (JobResult result in results) {
+            serializedJobs.Add(service.Obj.GetLastSerializedResult(result.Id));
+          }
+
+          Logger.Debug("ENDED: GetChildJobs job: " + parentJob);
+          return new ResponseObject<SerializedJobList>() {
+            Obj = serializedJobs
+          };
+        }
+      }
+      catch (Exception e) {
+        HandleNetworkError(e);
+        return null;
+      }
+    }
   }
 }
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/app.config
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/app.config	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Communication/3.3/app.config	(revision 4368)
@@ -28,5 +28,5 @@
           receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
           transactionFlow="false" hostNameComparisonMode="StrongWildcard"
-          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
+          maxBufferPoolSize="524288" maxReceivedMessageSize="104857600" messageEncoding="Text"
           textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
           <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
@@ -45,5 +45,5 @@
     <client>
       <endpoint address="http://localhost:9000/SlaveService" binding="wsHttpBinding" behaviorConfiguration="SlaveServiceBehaviour"
-        bindingConfiguration="SlaveHttpEndpoint" contract="SlaveService.ISlaveFacade"
+        bindingConfiguration="SlaveHttpEndpoint" contract="SlaveFacade.ISlaveFacade"
         name="SlaveHttpEndpoint">
         <identity>
@@ -53,5 +53,5 @@
       <endpoint address="net.tcp://localhost:9001/SlaveServiceStreamed" behaviorConfiguration="SlaveServiceBehaviour"
         binding="netTcpBinding" bindingConfiguration="SlaveTcpStreamedEndpoint"
-        contract="SlaveService.ISlaveFacade" name="SlaveTcpStreamedEndpoint">
+        contract="SlaveFacade.ISlaveFacade" name="SlaveTcpStreamedEndpoint">
         <identity>
           <dns value="localhost" />
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Console/3.3/Properties/AssemblyInfo.frame
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Console/3.3/Properties/AssemblyInfo.frame	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Console/3.3/Properties/AssemblyInfo.frame	(revision 4368)
@@ -55,5 +55,4 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("3.3.0.$WCREV$")]
+[assembly: AssemblyVersion("3.3.0.0")]
 [assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
-[assembly: AssemblyBuildDate("$WCNOW$")]
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/Core.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/Core.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/Core.cs	(revision 4368)
@@ -30,10 +30,10 @@
 using HeuristicLab.Hive.Slave.Common;
 using HeuristicLab.Hive.Slave.Communication;
-using HeuristicLab.Hive.Slave.Core.SlaveConsoleService;
+using HeuristicLab.Hive.Slave.Communication.SlaveFacade;
 using HeuristicLab.Hive.Slave.Core.ConfigurationManager;
 using HeuristicLab.Hive.Slave.Core.JobStorage;
+using HeuristicLab.Hive.Slave.Core.SlaveConsoleService;
 using HeuristicLab.Hive.Slave.ExecutionEngine;
 using HeuristicLab.Tracing;
-using HeuristicLab.Hive.Slave.Communication.SlaveService;
 
 namespace HeuristicLab.Hive.Slave.Core {
@@ -205,5 +205,44 @@
           WcfService.Instance.Logout(ConfigManager.Instance.GetClientInfo().Id);
           break;
-      }
+
+        case MessageContainer.MessageType.AddChildJob:
+          AddChildJob((MessageContainerWithJob)container);
+          break;
+
+        case MessageContainer.MessageType.PauseJob:
+          // send the job back to hive
+          PauseJob((MessageContainerWithJob)container);
+          break;
+
+        case MessageContainer.MessageType.GetChildJobs:
+          // send the job back to hive
+          GetChildJobs((MessageContainerWithCallback<SerializedJobList>)container);
+          break;
+      }
+    }
+
+    private void GetChildJobs(MessageContainerWithCallback<SerializedJobList> mc) {
+      ResponseObject<SerializedJobList> response = wcfService.GetChildJobs(mc.JobId);
+      if (response.StatusMessage != ResponseStatus.Ok) {
+        Logger.Error("GetChildJobs failed: " + response.StatusMessage);
+      } else {
+        mc.Callback(response.Obj);
+      }
+    }
+
+    private void PauseJob(MessageContainerWithJob mc) {
+      ResponseObject<JobDto> response = wcfService.PauseJob(mc.SerializedJob);
+      KillAppDomain(mc.JobId);
+      if (response.StatusMessage != ResponseStatus.Ok) {
+        Logger.Error("PauseJob failed: " + response.StatusMessage);
+      }
+    }
+
+    private ResponseObject<JobDto> AddChildJob(MessageContainerWithJob mc) {
+      ResponseObject<JobDto> response = wcfService.AddChildJob(mc.JobId, mc.SerializedJob);
+      if (response.StatusMessage != ResponseStatus.Ok) {
+        Logger.Error("AddChildJob failed: " + response.StatusMessage);
+      }
+      return response;
     }
 
@@ -462,4 +501,5 @@
             appDomains.Remove(id);
           }
+
           engines.Remove(id);
           jobs.Remove(id);
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeartbeatManager.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeartbeatManager.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeartbeatManager.cs	(revision 4368)
@@ -33,5 +33,5 @@
 using HeuristicLab.Tracing;
 using System.Threading;
-using HeuristicLab.Hive.Slave.Communication.SlaveService;
+using HeuristicLab.Hive.Slave.Communication.SlaveFacade;
 
 namespace HeuristicLab.Hive.Slave.Core {
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeuristicLab.Hive.Slave.Core-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeuristicLab.Hive.Slave.Core-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/HeuristicLab.Hive.Slave.Core-3.3.csproj	(revision 4368)
@@ -77,4 +77,5 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Common-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/PluginCache.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/PluginCache.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.Core/3.3/PluginCache.cs	(revision 4368)
@@ -10,4 +10,5 @@
 using HeuristicLab.Tracing;
 using System.Reflection;
+using System.Threading;
 
 namespace HeuristicLab.Hive.Slave.Core {
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/Executor.cs
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/Executor.cs	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/Executor.cs	(revision 4368)
@@ -30,4 +30,7 @@
 using System.IO;
 using HeuristicLab.Core;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace HeuristicLab.Hive.Slave.ExecutionEngine {
@@ -57,10 +60,53 @@
     public void Start(byte[] serializedJob) {
       CreationTime = DateTime.Now;
-      Job = XmlParser.Deserialize<IJob>(new MemoryStream(serializedJob));
+      Job = DeserializeJobObject(serializedJob);
 
       Job.JobStopped += new EventHandler(Job_JobStopped);
       Job.JobFailed += new EventHandler(Job_JobFailed);
-      Job.Prepare();
-      Job.Start();
+      Job.NewChildJob += new EventHandler<EventArgs<IJob>>(Job_NewChildJob);
+      Job.WaitForChildJobs += new EventHandler(Job_WaitForChildJobs);
+
+      if (Job.ExecutionState == Core.ExecutionState.Paused) {
+        Queue.AddMessage(new MessageContainerWithCallback<SerializedJobList>(MessageContainer.MessageType.GetChildJobs, JobId,
+          (childjobs) => {
+            Job.Resume(childjobs.Select(j => DeserializeJobObject(j.SerializedJobData)));
+          }
+        ));
+      } else {
+        Job.Prepare();
+        Job.Start();
+      }
+    }
+
+    void Job_NewChildJob(object sender, EventArgs<IJob> e) {
+      byte[] jobByteArray = SerializeJobObject(e.Value);
+
+      SerializedJob serializedJob = new SerializedJob() {
+        JobInfo = new JobDto() {
+          State = JobState.Offline,
+          CoresNeeded = e.Value.CoresNeeded,
+          MemoryNeeded = e.Value.MemoryNeeded,
+          PluginsNeeded = HivePluginInfoDto.FindPluginsNeeded(e.Value.GetType()),
+        },
+        SerializedJobData = jobByteArray
+      };
+
+      Queue.AddMessage(new MessageContainerWithJob(MessageContainer.MessageType.AddChildJob, this.JobId, serializedJob));
+    }
+
+    void Job_WaitForChildJobs(object sender, EventArgs e) {
+      // Pause the job and send it back to the hive. The server will awake it when all child-jobs are finished
+      byte[] jobByteArray = SerializeJobObject(Job);
+
+      SerializedJob serializedJob = new SerializedJob() {
+        JobInfo = new JobDto() {
+          Id = JobId,
+          State = JobState.WaitForChildJobs
+        },
+        SerializedJobData = jobByteArray
+      };
+
+      JobIsFinished = true;
+      Queue.AddMessage(new MessageContainerWithJob(MessageContainer.MessageType.PauseJob, this.JobId, serializedJob));
     }
 
@@ -101,5 +147,5 @@
         CurrentMessage = MessageContainer.MessageType.NoMessage;
         // Pack the whole job inside an xml document
-        byte[] job = SerializeJobObject();
+        byte[] job = SerializeJobObject(Job);
         // Restart the job
         // Return the Snapshot
@@ -113,5 +159,5 @@
         throw new InvalidStateException("Job is still running");
       } else {
-        byte[] jobArr = SerializeJobObject();
+        byte[] jobArr = SerializeJobObject(Job);
         return jobArr;
       }
@@ -123,12 +169,21 @@
     }
 
-    private byte[] SerializeJobObject() {
-      MemoryStream stream = new MemoryStream();
-      XmlGenerator.Serialize(Job, stream);
-      return stream.ToArray();
+    private byte[] SerializeJobObject(IJob job) {
+      MemoryStream memStream = new MemoryStream();
+      XmlGenerator.Serialize(job, memStream);
+      byte[] jobByteArray = memStream.ToArray();
+      memStream.Dispose();
+      return jobByteArray;
+    }
+
+    private IJob DeserializeJobObject(byte[] sjob) {
+      MemoryStream memStream = new MemoryStream(sjob);
+      IJob job = XmlParser.Deserialize<IJob>(memStream);
+      memStream.Dispose();
+      return job;
     }
 
     private void RestoreJobObject(byte[] sjob) {
-      Job = XmlParser.Deserialize<IJob>(new MemoryStream(sjob));
+      Job = DeserializeJobObject(sjob);
     }
 
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/HeuristicLab.Hive.Slave.ExecutionEngine-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/HeuristicLab.Hive.Slave.ExecutionEngine-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Slave.ExecutionEngine/3.3/HeuristicLab.Hive.Slave.ExecutionEngine-3.3.csproj	(revision 4368)
@@ -76,10 +76,12 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Common-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Core-3.3" >
+    <Reference Include="HeuristicLab.Core-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.DataAccess-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Persistence-3.3">
       <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Tracing/3.3/HeuristicLab.Hive.Tracing-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Tracing/3.3/HeuristicLab.Hive.Tracing-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive.Tracing/3.3/HeuristicLab.Hive.Tracing-3.3.csproj	(revision 4368)
@@ -23,4 +23,6 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -31,4 +33,66 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Hive.Tracing-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Hive.Tracing-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Hive.Tracing-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Hive.Tracing-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
   </PropertyGroup>
   <ItemGroup>
Index: branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj
===================================================================
--- branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj	(revision 4343)
+++ branches/3.3-Hive/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj	(revision 4368)
@@ -24,4 +24,5 @@
     <WarningLevel>4</WarningLevel>
     <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <PlatformTarget>AnyCPU</PlatformTarget>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
@@ -49,4 +50,35 @@
     <PlatformTarget>x86</PlatformTarget>
     <OutputPath>bin\x86\Release\</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.Hive-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.Hive-3.3.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
   </PropertyGroup>
   <ItemGroup>
