Index: /stable/HeuristicLab.Clients.Hive.Slave.ConsoleClient/3.3/app.config
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave.ConsoleClient/3.3/app.config	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive.Slave.ConsoleClient/3.3/app.config	(revision 9700)
@@ -20,5 +20,5 @@
     <bindings>
       <wsHttpBinding>
-        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
           <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
           <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
@@ -29,4 +29,14 @@
         </binding>
       </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="netTcpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Windows" />
+            <message clientCredentialType="UserName" algorithmSuite="Default" />
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
     
@@ -39,13 +49,14 @@
    <client>
      <endpoint name="SlaveCommunicationServiceEndpoint" address="net.pipe://localhost/HeuristicLabSlaveCom" binding="netNamedPipeBinding" contract="HeuristicLab.Clients.Hive.SlaveCore.ServiceContracts.ISlaveCommunication"/>
-    <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc" 
-              binding="wsHttpBinding" 
-              bindingConfiguration="wsHttpBinding_Hive" 
-              contract="HeuristicLab.Clients.Hive.IHiveService" 
-              name="wsHttpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
+    <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="wsHttpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
       <identity>
         <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
       </identity>
     </endpoint>
+     <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding" bindingConfiguration="netTcpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="netTcpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
+       <identity>
+         <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+       </identity>
+     </endpoint>
    </client>
    
Index: /stable/HeuristicLab.Clients.Hive.Slave.WindowsService/3.3/app.config
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave.WindowsService/3.3/app.config	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive.Slave.WindowsService/3.3/app.config	(revision 9700)
@@ -13,5 +13,5 @@
     <bindings>
       <wsHttpBinding>
-        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
           <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
           <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
@@ -22,4 +22,14 @@
         </binding>
       </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="netTcpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Windows" />
+            <message clientCredentialType="UserName" algorithmSuite="Default" />
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
 
@@ -32,9 +42,10 @@
     <client>
       <endpoint name="SlaveCommunicationServiceEndpoint" address="net.pipe://localhost/HeuristicLabSlaveCom" binding="netNamedPipeBinding" contract="HeuristicLab.Clients.Hive.SlaveCore.ServiceContracts.ISlaveCommunication"/>
-      <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc"
-                binding="wsHttpBinding"
-                bindingConfiguration="wsHttpBinding_Hive"
-                contract="HeuristicLab.Clients.Hive.IHiveService"
-                name="wsHttpBinding_IHiveService">
+      <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="wsHttpBinding_IHiveService">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+        </identity>
+      </endpoint>
+      <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding" bindingConfiguration="netTcpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="netTcpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
         <identity>
           <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.Designer.cs	(revision 9700)
@@ -2,5 +2,5 @@
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.586
+//     Runtime Version:4.0.30319.18047
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
@@ -13,5 +13,5 @@
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
     public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
         
@@ -21,4 +21,292 @@
             get {
                 return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("lastUsed.dat")]
+        public string LastUsedFileName {
+            get {
+                return ((string)(this["LastUsedFileName"]));
+            }
+            set {
+                this["LastUsedFileName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("PluginCache")]
+        public string PluginCacheDir {
+            get {
+                return ((string)(this["PluginCacheDir"]));
+            }
+            set {
+                this["PluginCacheDir"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("PluginTemp")]
+        public string PluginTempBaseDir {
+            get {
+                return ((string)(this["PluginTempBaseDir"]));
+            }
+            set {
+                this["PluginTempBaseDir"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Configuration")]
+        public string ConfigurationName {
+            get {
+                return ((string)(this["ConfigurationName"]));
+            }
+            set {
+                this["ConfigurationName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.PluginInfrastructure-3.3.dll")]
+        public string PluginInfrastructureDll {
+            get {
+                return ((string)(this["PluginInfrastructureDll"]));
+            }
+            set {
+                this["PluginInfrastructureDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("ICSharpCode.SharpZipLib.dll")]
+        public string SharpZipLibDll {
+            get {
+                return ((string)(this["SharpZipLibDll"]));
+            }
+            set {
+                this["SharpZipLibDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("ICSharpCode.SharpZipLib License.txt")]
+        public string SharpZipLibLicense {
+            get {
+                return ((string)(this["SharpZipLibLicense"]));
+            }
+            set {
+                this["SharpZipLibLicense"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Hive.SlaveCore-3.3.dll")]
+        public string ClientsHiveSlaveCoreDll {
+            get {
+                return ((string)(this["ClientsHiveSlaveCoreDll"]));
+            }
+            set {
+                this["ClientsHiveSlaveCoreDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Hive-3.3.dll")]
+        public string ClientsHiveDll {
+            get {
+                return ((string)(this["ClientsHiveDll"]));
+            }
+            set {
+                this["ClientsHiveDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Hive-3.3.dll")]
+        public string HiveDll {
+            get {
+                return ((string)(this["HiveDll"]));
+            }
+            set {
+                this["HiveDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Common-3.3.dll")]
+        public string ClientsCommonDll {
+            get {
+                return ((string)(this["ClientsCommonDll"]));
+            }
+            set {
+                this["ClientsCommonDll"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("3")]
+        public int PluginLifetime {
+            get {
+                return ((int)(this["PluginLifetime"]));
+            }
+            set {
+                this["PluginLifetime"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("00:00:01")]
+        public global::System.TimeSpan DirOpSleepTime {
+            get {
+                return ((global::System.TimeSpan)(this["DirOpSleepTime"]));
+            }
+            set {
+                this["DirOpSleepTime"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("5")]
+        public int PluginDeletionRetries {
+            get {
+                return ((int)(this["PluginDeletionRetries"]));
+            }
+            set {
+                this["PluginDeletionRetries"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("00:00:01")]
+        public global::System.TimeSpan PluginDeletionTimeout {
+            get {
+                return ((global::System.TimeSpan)(this["PluginDeletionTimeout"]));
+            }
+            set {
+                this["PluginDeletionTimeout"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("00:00:46")]
+        public global::System.TimeSpan ExecutorSemTimeouts {
+            get {
+                return ((global::System.TimeSpan)(this["ExecutorSemTimeouts"]));
+            }
+            set {
+                this["ExecutorSemTimeouts"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("5000")]
+        public int QueuesMaxThreads {
+            get {
+                return ((int)(this["QueuesMaxThreads"]));
+            }
+            set {
+                this["QueuesMaxThreads"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("SlaveCommunicationServiceEndpoint")]
+        public string SlaveCommunicationServiceEndpoint {
+            get {
+                return ((string)(this["SlaveCommunicationServiceEndpoint"]));
+            }
+            set {
+                this["SlaveCommunicationServiceEndpoint"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("hiveslave")]
+        public string SlaveUser {
+            get {
+                return ((string)(this["SlaveUser"]));
+            }
+            set {
+                this["SlaveUser"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("hiveslave")]
+        public string SlavePwd {
+            get {
+                return ((string)(this["SlavePwd"]));
+            }
+            set {
+                this["SlavePwd"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("1")]
+        public int MaxLogCount {
+            get {
+                return ((int)(this["MaxLogCount"]));
+            }
+            set {
+                this["MaxLogCount"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("00:00:20")]
+        public global::System.TimeSpan ExecutorQueueTimeout {
+            get {
+                return ((global::System.TimeSpan)(this["ExecutorQueueTimeout"]));
+            }
+            set {
+                this["ExecutorQueueTimeout"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("-1")]
+        public int NrOfCoresToScavenge {
+            get {
+                return ((int)(this["NrOfCoresToScavenge"]));
+            }
+            set {
+                this["NrOfCoresToScavenge"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("shutdown.exe")]
+        public string ShutdownCommand {
+            get {
+                return ((string)(this["ShutdownCommand"]));
+            }
+            set {
+                this["ShutdownCommand"] = value;
             }
         }
@@ -35,292 +323,4 @@
             }
         }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("lastUsed.dat")]
-        public string LastUsedFileName {
-            get {
-                return ((string)(this["LastUsedFileName"]));
-            }
-            set {
-                this["LastUsedFileName"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("PluginCache")]
-        public string PluginCacheDir {
-            get {
-                return ((string)(this["PluginCacheDir"]));
-            }
-            set {
-                this["PluginCacheDir"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("PluginTemp")]
-        public string PluginTempBaseDir {
-            get {
-                return ((string)(this["PluginTempBaseDir"]));
-            }
-            set {
-                this["PluginTempBaseDir"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("Configuration")]
-        public string ConfigurationName {
-            get {
-                return ((string)(this["ConfigurationName"]));
-            }
-            set {
-                this["ConfigurationName"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.PluginInfrastructure-3.3.dll")]
-        public string PluginInfrastructureDll {
-            get {
-                return ((string)(this["PluginInfrastructureDll"]));
-            }
-            set {
-                this["PluginInfrastructureDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("ICSharpCode.SharpZipLib.dll")]
-        public string SharpZipLibDll {
-            get {
-                return ((string)(this["SharpZipLibDll"]));
-            }
-            set {
-                this["SharpZipLibDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("ICSharpCode.SharpZipLib License.txt")]
-        public string SharpZipLibLicense {
-            get {
-                return ((string)(this["SharpZipLibLicense"]));
-            }
-            set {
-                this["SharpZipLibLicense"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Hive.SlaveCore-3.3.dll")]
-        public string ClientsHiveSlaveCoreDll {
-            get {
-                return ((string)(this["ClientsHiveSlaveCoreDll"]));
-            }
-            set {
-                this["ClientsHiveSlaveCoreDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Hive-3.3.dll")]
-        public string ClientsHiveDll {
-            get {
-                return ((string)(this["ClientsHiveDll"]));
-            }
-            set {
-                this["ClientsHiveDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Hive-3.3.dll")]
-        public string HiveDll {
-            get {
-                return ((string)(this["HiveDll"]));
-            }
-            set {
-                this["HiveDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("HeuristicLab.Clients.Common-3.3.dll")]
-        public string ClientsCommonDll {
-            get {
-                return ((string)(this["ClientsCommonDll"]));
-            }
-            set {
-                this["ClientsCommonDll"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("3")]
-        public int PluginLifetime {
-            get {
-                return ((int)(this["PluginLifetime"]));
-            }
-            set {
-                this["PluginLifetime"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("00:00:01")]
-        public global::System.TimeSpan DirOpSleepTime {
-            get {
-                return ((global::System.TimeSpan)(this["DirOpSleepTime"]));
-            }
-            set {
-                this["DirOpSleepTime"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("5")]
-        public int PluginDeletionRetries {
-            get {
-                return ((int)(this["PluginDeletionRetries"]));
-            }
-            set {
-                this["PluginDeletionRetries"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("00:00:01")]
-        public global::System.TimeSpan PluginDeletionTimeout {
-            get {
-                return ((global::System.TimeSpan)(this["PluginDeletionTimeout"]));
-            }
-            set {
-                this["PluginDeletionTimeout"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("00:00:46")]
-        public global::System.TimeSpan ExecutorSemTimeouts {
-            get {
-                return ((global::System.TimeSpan)(this["ExecutorSemTimeouts"]));
-            }
-            set {
-                this["ExecutorSemTimeouts"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("5000")]
-        public int QueuesMaxThreads {
-            get {
-                return ((int)(this["QueuesMaxThreads"]));
-            }
-            set {
-                this["QueuesMaxThreads"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("SlaveCommunicationServiceEndpoint")]
-        public string SlaveCommunicationServiceEndpoint {
-            get {
-                return ((string)(this["SlaveCommunicationServiceEndpoint"]));
-            }
-            set {
-                this["SlaveCommunicationServiceEndpoint"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("hiveslave")]
-        public string SlaveUser {
-            get {
-                return ((string)(this["SlaveUser"]));
-            }
-            set {
-                this["SlaveUser"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("hiveslave")]
-        public string SlavePwd {
-            get {
-                return ((string)(this["SlavePwd"]));
-            }
-            set {
-                this["SlavePwd"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("1")]
-        public int MaxLogCount {
-            get {
-                return ((int)(this["MaxLogCount"]));
-            }
-            set {
-                this["MaxLogCount"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("00:00:20")]
-        public global::System.TimeSpan ExecutorQueueTimeout {
-            get {
-                return ((global::System.TimeSpan)(this["ExecutorQueueTimeout"]));
-            }
-            set {
-                this["ExecutorQueueTimeout"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("-1")]
-        public int NrOfCoresToScavenge {
-            get {
-                return ((int)(this["NrOfCoresToScavenge"]));
-            }
-            set {
-                this["NrOfCoresToScavenge"] = value;
-            }
-        }
-        
-        [global::System.Configuration.UserScopedSettingAttribute()]
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("shutdown.exe")]
-        public string ShutdownCommand {
-            get {
-                return ((string)(this["ShutdownCommand"]));
-            }
-            set {
-                this["ShutdownCommand"] = value;
-            }
-        }
     }
 }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Properties/Settings.settings	(revision 9700)
@@ -3,7 +3,4 @@
   <Profiles />
   <Settings>
-    <Setting Name="HeartbeatInterval" Type="System.TimeSpan" Scope="User">
-      <Value Profile="(Default)">00:00:40</Value>
-    </Setting>
     <Setting Name="LastUsedFileName" Type="System.String" Scope="User">
       <Value Profile="(Default)">lastUsed.dat</Value>
@@ -78,4 +75,7 @@
       <Value Profile="(Default)">shutdown.exe</Value>
     </Setting>
+    <Setting Name="HeartbeatInterval" Type="System.TimeSpan" Scope="User">
+      <Value Profile="(Default)">00:00:40</Value>
+    </Setting>
   </Settings>
 </SettingsFile>
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/app.config	(revision 9700)
@@ -24,5 +24,5 @@
     <bindings>
       <wsHttpBinding>
-        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:20:00" sendTimeout="00:20:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
           <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
           <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
@@ -33,4 +33,14 @@
         </binding>
       </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="netTcpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Windows" />
+            <message clientCredentialType="UserName" algorithmSuite="Default" />
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
     <services>
@@ -46,11 +56,13 @@
         </identity>
       </endpoint>
+      <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding" bindingConfiguration="netTcpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="netTcpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+        </identity>
+      </endpoint>
     </client>
   </system.serviceModel>
   <userSettings>
     <HeuristicLab.Clients.Hive.SlaveCore.Properties.Settings>
-      <setting name="HeartbeatInterval" serializeAs="String">
-        <value>00:00:40</value>
-      </setting>
       <setting name="LastUsedFileName" serializeAs="String">
         <value>lastUsed.dat</value>
@@ -125,4 +137,7 @@
         <value>shutdown.exe</value>
       </setting>
+      <setting name="HeartbeatInterval" serializeAs="String">
+        <value>00:00:40</value>
+      </setting>
     </HeuristicLab.Clients.Hive.SlaveCore.Properties.Settings>
   </userSettings>
Index: /stable/HeuristicLab.Clients.Hive/3.3/HiveServiceLocator.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/HiveServiceLocator.cs	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive/3.3/HiveServiceLocator.cs	(revision 9700)
@@ -35,4 +35,7 @@
     }
 
+    private HiveServiceLocator() {
+    }
+
     private string username;
     public string Username {
@@ -47,10 +50,39 @@
     }
 
+    public int EndpointRetries { get; private set; }
+
+    public string WorkingEndpoint { get; private set; }
+
     private HiveServiceClient NewServiceClient() {
-      HiveServiceClient cl;
+      if (EndpointRetries >= Settings.Default.MaxEndpointRetries) {
+        return CreateClient(WorkingEndpoint);
+      }
+
+      var configurations = Settings.Default.EndpointConfigurationPriorities;
+
+      Exception exception = null;
+      foreach (var endpointConfigurationName in configurations) {
+        try {
+          var cl = CreateClient(endpointConfigurationName);
+          cl.Open();
+          WorkingEndpoint = endpointConfigurationName;
+          return cl;
+        }
+        catch (Exception exc) {
+          exception = exc;
+          EndpointRetries++;
+        }
+      }
+
+      throw exception ?? new Exception("No endpoint for Hive service found.");
+    }
+
+    private HiveServiceClient CreateClient(string endpointConfigurationName) {
+      HiveServiceClient cl = null;
+
       if (string.IsNullOrEmpty(username) && string.IsNullOrEmpty(password))
-        cl = ClientFactory.CreateClient<HiveServiceClient, IHiveService>();
+        cl = ClientFactory.CreateClient<HiveServiceClient, IHiveService>(endpointConfigurationName);
       else
-        cl = ClientFactory.CreateClient<HiveServiceClient, IHiveService>(null, null, username, password);
+        cl = ClientFactory.CreateClient<HiveServiceClient, IHiveService>(endpointConfigurationName, null, username, password);
 
       return cl;
Index: /stable/HeuristicLab.Clients.Hive/3.3/Settings.Designer.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/Settings.Designer.cs	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive/3.3/Settings.Designer.cs	(revision 9700)
@@ -2,5 +2,5 @@
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:4.0.30319.586
+//     Runtime Version:4.0.30319.18047
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
@@ -13,5 +13,5 @@
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
     internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
         
@@ -26,5 +26,5 @@
         [global::System.Configuration.ApplicationScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("1")]
+        [global::System.Configuration.DefaultSettingValueAttribute("2")]
         public int MaxParallelUploads {
             get {
@@ -77,4 +77,26 @@
             }
         }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute(@"<?xml version=""1.0"" encoding=""utf-16""?>
+<ArrayOfString xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
+  <string>netTcpBinding_IHiveService</string>
+  <string>wsHttpBinding_IHiveService</string>
+</ArrayOfString>")]
+        public global::System.Collections.Specialized.StringCollection EndpointConfigurationPriorities {
+            get {
+                return ((global::System.Collections.Specialized.StringCollection)(this["EndpointConfigurationPriorities"]));
+            }
+        }
+        
+        [global::System.Configuration.ApplicationScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("3")]
+        public int MaxEndpointRetries {
+            get {
+                return ((int)(this["MaxEndpointRetries"]));
+            }
+        }
     }
 }
Index: /stable/HeuristicLab.Clients.Hive/3.3/Settings.settings
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/Settings.settings	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive/3.3/Settings.settings	(revision 9700)
@@ -4,5 +4,5 @@
   <Settings>
     <Setting Name="MaxParallelUploads" Type="System.Int32" Scope="Application">
-      <Value Profile="(Default)">1</Value>
+      <Value Profile="(Default)">2</Value>
     </Setting>
     <Setting Name="HLBinaryName" Type="System.String" Scope="Application">
@@ -21,4 +21,14 @@
       <Value Profile="(Default)">anonymous</Value>
     </Setting>
+    <Setting Name="EndpointConfigurationPriorities" Type="System.Collections.Specialized.StringCollection" Scope="Application">
+      <Value Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
+&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
+  &lt;string&gt;netTcpBinding_IHiveService&lt;/string&gt;
+  &lt;string&gt;wsHttpBinding_IHiveService&lt;/string&gt;
+&lt;/ArrayOfString&gt;</Value>
+    </Setting>
+    <Setting Name="MaxEndpointRetries" Type="System.Int32" Scope="Application">
+      <Value Profile="(Default)">3</Value>
+    </Setting>
   </Settings>
 </SettingsFile>
Index: /stable/HeuristicLab.Clients.Hive/3.3/app.config
===================================================================
--- /stable/HeuristicLab.Clients.Hive/3.3/app.config	(revision 9699)
+++ /stable/HeuristicLab.Clients.Hive/3.3/app.config	(revision 9700)
@@ -9,5 +9,5 @@
     <HeuristicLab.Clients.Hive.Settings>
       <setting name="MaxParallelUploads" serializeAs="String">
-        <value>1</value>
+        <value>2</value>
       </setting>
       <setting name="HLBinaryName" serializeAs="String">
@@ -26,4 +26,16 @@
         <value>anonymous</value>
       </setting>
+      <setting name="EndpointConfigurationPriorities" serializeAs="Xml">
+        <value>
+          <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+            <string>netTcpBinding_IHiveService</string>
+            <string>wsHttpBinding_IHiveService</string>
+          </ArrayOfString>
+        </value>
+      </setting>
+      <setting name="MaxEndpointRetries" serializeAs="String">
+        <value>3</value>
+      </setting>
     </HeuristicLab.Clients.Hive.Settings>
   </applicationSettings>
@@ -38,24 +50,6 @@
     <bindings>
       <wsHttpBinding>
-        <binding name="wsHttpBinding_Hive"
-                 closeTimeout="00:01:00"
-                 openTimeout="00:01:00"
-                 receiveTimeout="00:20:00"
-                 sendTimeout="00:20:00"
-                 bypassProxyOnLocal="false"
-                 transactionFlow="false"
-                 hostNameComparisonMode="StrongWildcard"
-                 maxBufferPoolSize="2147483647"
-                 maxReceivedMessageSize="2147483647"
-                 messageEncoding="Text"
-                 textEncoding="utf-8"
-                 useDefaultWebProxy="true"
-                 allowCookies="false">
-
-          <readerQuotas maxDepth="2147483647"
-                        maxStringContentLength="2147483647"
-                        maxArrayLength="2147483647"
-                        maxBytesPerRead="2147483647"
-                        maxNameTableCharCount="2147483647"/>
+        <binding name="wsHttpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
           <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
           <security mode="Message">
@@ -65,9 +59,24 @@
         </binding>
       </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="netTcpBinding_Hive" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:35:00" sendTimeout="00:35:00" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Windows" />
+            <message clientCredentialType="UserName" algorithmSuite="Default" />
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
     <client>
       <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="wsHttpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
         <identity>
-          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ=="/>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
+        </identity>
+      </endpoint>
+      <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding" bindingConfiguration="netTcpBinding_Hive" contract="HeuristicLab.Clients.Hive.IHiveService" name="netTcpBinding_IHiveService" behaviorConfiguration="HiveBehaviorConfiguration">
+        <identity>
+          <certificate encodedValue="AwAAAAEAAAAUAAAAwK1+2oAmcy/mI2P2QjyiJRh0y60gAAAAAQAAACoCAAAwggImMIIBj6ADAgECAhAIkseQ2EEhgU720qJA61gqMA0GCSqGSIb3DQEBBAUAMCQxIjAgBgNVBAMTGXNlcnZpY2VzLmhldXJpc3RpY2xhYi5jb20wHhcNMTAwNTExMTExNDAyWhcNMzkxMjMxMjM1OTU5WjAkMSIwIAYDVQQDExlzZXJ2aWNlcy5oZXVyaXN0aWNsYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq26Bwmwc7k+4W30qLQ2j+FInEL5BuH6opDY6CSlrtt3xQS/anrhvpbf3QghLDVINzcHkzbPmm/SguG4F85QLB6xO+tJaOvRo0iEK5g3c307vMIru7FJwk/OhplEQ5J1hbDgL3zOJlrWlgtqRVxCtVdF3XroI9BctOt1NkeKv9ewIDAQABo1kwVzBVBgNVHQEETjBMgBCjbgdYd4j5JgUuJ1Wo/GxroSYwJDEiMCAGA1UEAxMZc2VydmljZXMuaGV1cmlzdGljbGFiLmNvbYIQCJLHkNhBIYFO9tKiQOtYKjANBgkqhkiG9w0BAQQFAAOBgQAb/2xk2uQad68shSPl/uixWgvFI8WkxOTBopOLaLtDxwCeZ3mWVHdV9VnixHtThubnEBXAhYOCQSIXWtQuXFWO+gH3YyjTRJY5kTmXyuvBRTn3/so5SrQ7Rdlm9hf6E5YVX3tCjAy7ybUyaDUkQfmH5vmvgvpMzRfsJ1qhnUpJiQ==" />
         </identity>
       </endpoint>
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HeuristicLab.Services.Hive.DataAccess-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HeuristicLab.Services.Hive.DataAccess-3.3.csproj	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HeuristicLab.Services.Hive.DataAccess-3.3.csproj	(revision 9700)
@@ -149,4 +149,5 @@
   <ItemGroup>
     <Content Include="SQL Scripts\Initialize Hive Database.sql" />
+    <Content Include="SQL Scripts\Migrate to Filestream.sql" />
     <Content Include="SQL Scripts\Prepare Hive Database.sql" />
   </ItemGroup>
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.cs	(revision 9700)
@@ -23,11 +23,8 @@
 using System.Data.Linq.Mapping;
 namespace HeuristicLab.Services.Hive.DataAccess {
-  partial class SlaveStatistics {
-  }
-
   partial class HiveDataContext {
     // source: http://stackoverflow.com/questions/648196/random-row-from-linq-to-sql
     [Function(Name = "NEWID", IsComposable = true)]
-    public Guid Random() { 
+    public Guid Random() {
       // to prove not used by our C# code... 
       throw new NotImplementedException();
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml	(revision 9700)
@@ -114,5 +114,5 @@
     <Type Name="TaskData">
       <Column Name="TaskId" Storage="_JobId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
-      <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX)" CanBeNull="false" UpdateCheck="Never" IsDelayLoaded="true" />
+      <Column Name="Data" Type="System.Byte[]" DbType="VarBinary(MAX)" CanBeNull="false" UpdateCheck="Never" IsDelayLoaded="true" />
       <Column Name="LastUpdate" Type="System.DateTime" DbType="DateTime" CanBeNull="false" />
       <Association Name="Task_TaskData" Member="Task" Storage="_Job" ThisKey="TaskId" OtherKey="TaskId" Type="Task" IsForeignKey="true" />
@@ -123,5 +123,5 @@
       <Column Name="PluginDataId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
       <Column Name="PluginId" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" CanBeNull="false" />
-      <Column Name="Data" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" IsDelayLoaded="true" />
+      <Column Name="Data" Type="System.Byte[]" DbType="VarBinary(MAX) NOT NULL" CanBeNull="false" UpdateCheck="Never" IsDelayLoaded="true" />
       <Column Name="FileName" Type="System.String" DbType="VarChar(MAX)" CanBeNull="false" />
       <Association Name="Plugin_PluginData" Member="Plugin" ThisKey="PluginId" OtherKey="PluginId" Type="Plugin" IsForeignKey="true" />
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.dbml.layout	(revision 9700)
@@ -3,56 +3,56 @@
   <DataContextMoniker Name="/HiveDataContext" />
   <nestedChildShapes>
-    <classShape Id="a929c9dc-69f4-4488-ba1c-a2342bf81d89" absoluteBounds="8.875, 4.5, 2, 1.1939925130208327">
+    <classShape Id="a929c9dc-69f4-4488-ba1c-a2342bf81d89" absoluteBounds="8.875, 4.5, 2, 1.0961531575520827">
       <DataClassMoniker Name="/HiveDataContext/AssignedResource" />
       <nestedChildShapes>
-        <elementListCompartment Id="8b005775-f0ee-41b0-ae10-6d1151003708" absoluteBounds="8.89, 4.9600000000000009, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="7d998e56-4fba-41ca-a1a8-1dcdb9068edf" absoluteBounds="8.875, 5.875, 2, 1.9631982421874996">
+        <elementListCompartment Id="8b005775-f0ee-41b0-ae10-6d1151003708" absoluteBounds="8.89, 4.9600000000000009, 1.9700000000000002, 0.53615315755208326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="7d998e56-4fba-41ca-a1a8-1dcdb9068edf" absoluteBounds="8.875, 5.875, 2, 1.7535424804687496">
       <DataClassMoniker Name="/HiveDataContext/Plugin" />
       <nestedChildShapes>
-        <elementListCompartment Id="ec4ba325-6dff-4418-baad-59af81ae2024" absoluteBounds="8.89, 6.3350000000000009, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="97b00810-fa30-457e-b484-b4e80b22f91b" absoluteBounds="6.5, 5.875, 2, 1.3862939453124987">
+        <elementListCompartment Id="ec4ba325-6dff-4418-baad-59af81ae2024" absoluteBounds="8.89, 6.3350000000000009, 1.9700000000000002, 1.19354248046875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="97b00810-fa30-457e-b484-b4e80b22f91b" absoluteBounds="6.5, 5.875, 2, 1.2605004882812496">
       <DataClassMoniker Name="/HiveDataContext/RequiredPlugin" />
       <nestedChildShapes>
-        <elementListCompartment Id="df6451e5-069e-4ca0-a909-61b8213b5047" absoluteBounds="6.5150000000000006, 6.3350000000000009, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="706a4581-6daf-4e71-ae2a-87d50b27a051" absoluteBounds="11.25, 1, 2, 1.9631982421875">
+        <elementListCompartment Id="df6451e5-069e-4ca0-a909-61b8213b5047" absoluteBounds="6.5150000000000006, 6.3350000000000009, 1.9700000000000002, 0.70050048828125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="706a4581-6daf-4e71-ae2a-87d50b27a051" absoluteBounds="11.25, 1, 2, 1.75354248046875">
       <DataClassMoniker Name="/HiveDataContext/Resource" />
       <nestedChildShapes>
-        <elementListCompartment Id="8c24f5bf-2164-4d0f-832e-1730eb0066df" absoluteBounds="11.265, 1.46, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="695bfc39-59f3-4e60-8644-f847964bf62c" absoluteBounds="6.5, 1, 2, 3.3093082682291666">
+        <elementListCompartment Id="8c24f5bf-2164-4d0f-832e-1730eb0066df" absoluteBounds="11.265, 1.46, 1.9700000000000002, 1.19354248046875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="695bfc39-59f3-4e60-8644-f847964bf62c" absoluteBounds="6.5, 1, 2, 2.9039737955729166">
       <DataClassMoniker Name="/HiveDataContext/Task" />
       <nestedChildShapes>
-        <elementListCompartment Id="a6a30e11-03d1-4869-82e6-b733f4ef9974" absoluteBounds="6.5150000000000006, 1.46, 1.9700000000000002, 2.7493082682291665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="8d5712f7-7a1a-4a89-bd4d-fd60200d3306" absoluteBounds="13.5, 2.5, 2, 2.3478011067708326">
+        <elementListCompartment Id="a6a30e11-03d1-4869-82e6-b733f4ef9974" absoluteBounds="6.5150000000000006, 1.46, 1.9700000000000002, 2.3439737955729165" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="8d5712f7-7a1a-4a89-bd4d-fd60200d3306" absoluteBounds="13.5, 2.5, 2, 2.0822371419270826">
       <DataClassMoniker Name="/HiveDataContext/Downtime" />
       <nestedChildShapes>
-        <elementListCompartment Id="7d8f121b-35bb-4753-a25f-3fac1562e68e" absoluteBounds="13.515, 2.9600000000000009, 1.9700000000000002, 1.7878011067708333" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="e6f840cc-2968-4be1-b234-eef624ccacbb" absoluteBounds="4.125, 2.625, 2, 1.9631982421874996">
+        <elementListCompartment Id="7d8f121b-35bb-4753-a25f-3fac1562e68e" absoluteBounds="13.515, 2.9600000000000009, 1.9700000000000002, 1.5222371419270833" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="e6f840cc-2968-4be1-b234-eef624ccacbb" absoluteBounds="4.125, 2.625, 2, 1.7535424804687496">
       <DataClassMoniker Name="/HiveDataContext/Job" />
       <nestedChildShapes>
-        <elementListCompartment Id="0c65d4e1-256a-4a91-9a57-392f25e4de7f" absoluteBounds="4.1400000000000006, 3.0850000000000009, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="26f4edfa-91dd-4941-a058-359f89e567a8" absoluteBounds="8.875, 0.75, 2, 3.3093082682291666">
+        <elementListCompartment Id="0c65d4e1-256a-4a91-9a57-392f25e4de7f" absoluteBounds="4.1400000000000006, 3.0850000000000009, 1.9700000000000002, 1.19354248046875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="26f4edfa-91dd-4941-a058-359f89e567a8" absoluteBounds="8.875, 0.75, 2, 2.9039737955729166">
       <DataClassMoniker Name="/HiveDataContext/Slave" />
       <nestedChildShapes>
-        <elementListCompartment Id="1e61f36b-08dc-4df7-8594-c9dcd95c0791" absoluteBounds="8.89, 1.21, 1.9700000000000002, 2.7493082682291665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="bbd91675-92f2-4a69-8429-0950008fc8a4" absoluteBounds="13.5, 1, 2, 0.8093896484375">
+        <elementListCompartment Id="1e61f36b-08dc-4df7-8594-c9dcd95c0791" absoluteBounds="8.89, 1.21, 1.9700000000000002, 2.3439737955729165" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="bbd91675-92f2-4a69-8429-0950008fc8a4" absoluteBounds="13.5, 1, 2, 0.76745849609375">
       <DataClassMoniker Name="/HiveDataContext/SlaveGroup" />
       <nestedChildShapes>
-        <elementListCompartment Id="5a790e8f-6e2e-4bf5-bd2b-f8a82224d9d7" absoluteBounds="13.5, 1, 0.125, 0.2493896484375" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="5a790e8f-6e2e-4bf5-bd2b-f8a82224d9d7" absoluteBounds="13.5, 1, 0.125, 0.20745849609375" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -69,5 +69,5 @@
       </nodes>
     </inheritanceConnector>
-    <associationConnector edgePoints="[(11.8134963640734 : 2.9631982421875); (11.8134963640734 : 3.56770833333333); (11.1119791666667 : 3.56770833333333); (11.1119791666667 : 5.09699625651042); (10.875 : 5.09699625651042)]" manuallyRouted="true" fixedFrom="NotFixed" fixedTo="NotFixed">
+    <associationConnector edgePoints="[(11.8134963640734 : 2.75354248046875); (11.8134963640734 : 3.56770833333333); (11.1119791666667 : 3.56770833333333); (11.1119791666667 : 5.09699625651042); (10.875 : 5.09699625651042)]" manuallyRouted="true" fixedFrom="Algorithm" fixedTo="Algorithm">
       <AssociationMoniker Name="/HiveDataContext/Resource/Resource_AssignedResource" />
       <nodes>
@@ -76,14 +76,14 @@
       </nodes>
     </associationConnector>
-    <classShape Id="6bc13f26-f9a8-4597-b054-35be34190d12" absoluteBounds="4.125, 1, 2, 1.3862939453125">
+    <classShape Id="6bc13f26-f9a8-4597-b054-35be34190d12" absoluteBounds="4.125, 1, 2, 1.26050048828125">
       <DataClassMoniker Name="/HiveDataContext/TaskData" />
       <nestedChildShapes>
-        <elementListCompartment Id="a068522c-7974-4679-b356-e33c941c465b" absoluteBounds="4.14, 1.46, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="ad25bd0f-80e8-4a06-abd8-190eb678eec7" absoluteBounds="11.25, 5.875, 2, 1.5785953776041666">
+        <elementListCompartment Id="a068522c-7974-4679-b356-e33c941c465b" absoluteBounds="4.14, 1.46, 1.9700000000000002, 0.70050048828125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="ad25bd0f-80e8-4a06-abd8-190eb678eec7" absoluteBounds="11.25, 5.875, 2, 1.4248478190104166">
       <DataClassMoniker Name="/HiveDataContext/PluginData" />
       <nestedChildShapes>
-        <elementListCompartment Id="acddb513-7de6-4bb4-8335-d6982fb2ef35" absoluteBounds="11.265, 6.3350000000000009, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="acddb513-7de6-4bb4-8335-d6982fb2ef35" absoluteBounds="11.265, 6.3350000000000009, 1.9700000000000002, 0.86484781901041663" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -109,14 +109,14 @@
       </nodes>
     </associationConnector>
-    <classShape Id="00352397-340e-449a-8e23-6ddd216e8617" absoluteBounds="1.75, 1, 2, 2.1554996744791666">
+    <classShape Id="00352397-340e-449a-8e23-6ddd216e8617" absoluteBounds="1.75, 1, 2, 1.9178898111979166">
       <DataClassMoniker Name="/HiveDataContext/StateLog" />
       <nestedChildShapes>
-        <elementListCompartment Id="9a003897-deef-4bb5-b180-4c4bcdb7fadc" absoluteBounds="1.765, 1.46, 1.9700000000000002, 1.5954996744791665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="4d800dc9-1b18-469f-b02c-d4554757c5e1" absoluteBounds="1.75, 3.625, 2, 1.5785953776041666">
+        <elementListCompartment Id="9a003897-deef-4bb5-b180-4c4bcdb7fadc" absoluteBounds="1.765, 1.46, 1.9700000000000002, 1.3578898111979165" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="4d800dc9-1b18-469f-b02c-d4554757c5e1" absoluteBounds="1.75, 3.625, 2, 1.4248478190104166">
       <DataClassMoniker Name="/HiveDataContext/JobPermission" />
       <nestedChildShapes>
-        <elementListCompartment Id="dedd97d3-a9a2-45a2-9b95-d7366fb65a7f" absoluteBounds="1.765, 4.085, 1.9700000000000002, 1.0185953776041665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="dedd97d3-a9a2-45a2-9b95-d7366fb65a7f" absoluteBounds="1.765, 4.085, 1.9700000000000002, 0.86484781901041663" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -128,32 +128,32 @@
       </nodes>
     </associationConnector>
-    <classShape Id="b4e7aaa8-a382-4560-a1fd-498de77e9340" absoluteBounds="1.75, 5.5, 2, 1.1939925130208327">
+    <classShape Id="b4e7aaa8-a382-4560-a1fd-498de77e9340" absoluteBounds="1.75, 5.5, 2, 1.0961531575520827">
       <DataClassMoniker Name="/HiveDataContext/Lifecycle" />
       <nestedChildShapes>
-        <elementListCompartment Id="03597a2c-5c5d-4c2c-b741-c49ab5aa34d5" absoluteBounds="1.7650000000000001, 5.96, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="cdddf4da-eaef-46a1-9cfd-987bb6b3d03e" absoluteBounds="17, 3.125, 2.5, 1.7708968098958327">
+        <elementListCompartment Id="03597a2c-5c5d-4c2c-b741-c49ab5aa34d5" absoluteBounds="1.7650000000000001, 5.96, 1.9700000000000002, 0.53615315755208326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="cdddf4da-eaef-46a1-9cfd-987bb6b3d03e" absoluteBounds="17, 3.125, 2.5, 1.5891951497395827">
       <DataClassMoniker Name="/HiveDataContext/DeletedJobStatistics" />
       <nestedChildShapes>
-        <elementListCompartment Id="b8738381-f696-4dba-a517-47e9cd96a9a6" absoluteBounds="17.015, 3.585, 2.4699999999999998, 1.2108968098958333" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="25442617-ff41-49a0-b5d5-4cbe0b2f0f45" absoluteBounds="22, 4.5, 2, 1.9631982421874996">
+        <elementListCompartment Id="b8738381-f696-4dba-a517-47e9cd96a9a6" absoluteBounds="17.015, 3.585, 2.4699999999999998, 1.0291951497395833" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="25442617-ff41-49a0-b5d5-4cbe0b2f0f45" absoluteBounds="22, 4.5, 2, 1.7535424804687496">
       <DataClassMoniker Name="/HiveDataContext/UserStatistics" />
       <nestedChildShapes>
-        <elementListCompartment Id="6edf08e7-054a-4253-8d4f-5bf2dfec2d29" absoluteBounds="22.015, 4.96, 1.9700000000000002, 1.4031982421875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="f78ec989-4862-4bac-87e3-9b0aad4bc037" absoluteBounds="19.875, 4.5, 2, 2.1554996744791666">
+        <elementListCompartment Id="6edf08e7-054a-4253-8d4f-5bf2dfec2d29" absoluteBounds="22.015, 4.96, 1.9700000000000002, 1.19354248046875" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="f78ec989-4862-4bac-87e3-9b0aad4bc037" absoluteBounds="19.875, 4.5, 2, 1.9178898111979166">
       <DataClassMoniker Name="/HiveDataContext/SlaveStatistics" />
       <nestedChildShapes>
-        <elementListCompartment Id="98cb46fe-820e-4041-aee8-04e8bed3df23" absoluteBounds="19.89, 4.96, 1.9700000000000002, 1.5954996744791665" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
-      </nestedChildShapes>
-    </classShape>
-    <classShape Id="4d9f0606-b7ee-4dae-a8ac-aff88d25a941" absoluteBounds="21, 3, 2, 1.1939925130208327">
+        <elementListCompartment Id="98cb46fe-820e-4041-aee8-04e8bed3df23" absoluteBounds="19.89, 4.96, 1.9700000000000002, 1.3578898111979165" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+      </nestedChildShapes>
+    </classShape>
+    <classShape Id="4d9f0606-b7ee-4dae-a8ac-aff88d25a941" absoluteBounds="21, 3, 2, 1.0961531575520827">
       <DataClassMoniker Name="/HiveDataContext/Statistics" />
       <nestedChildShapes>
-        <elementListCompartment Id="17821282-8edf-40b7-9065-84f53391d5c1" absoluteBounds="21.015, 3.46, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="17821282-8edf-40b7-9065-84f53391d5c1" absoluteBounds="21.015, 3.46, 1.9700000000000002, 0.53615315755208326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -228,8 +228,8 @@
       </nodes>
     </associationConnector>
-    <classShape Id="a3f352be-9f15-4e73-8d44-3e8ac02fb4cf" absoluteBounds="11.25, 3.875, 2, 1.3862939453124996">
+    <classShape Id="a3f352be-9f15-4e73-8d44-3e8ac02fb4cf" absoluteBounds="11.25, 3.875, 2, 1.2605004882812496">
       <DataClassMoniker Name="/HiveDataContext/ResourcePermission" />
       <nestedChildShapes>
-        <elementListCompartment Id="45e2f1a8-8a1e-4647-b649-10ec55976ab4" absoluteBounds="11.265, 4.335, 1.9700000000000002, 0.8262939453125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="45e2f1a8-8a1e-4647-b649-10ec55976ab4" absoluteBounds="11.265, 4.335, 1.9700000000000002, 0.70050048828125" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
@@ -241,8 +241,8 @@
       </nodes>
     </associationConnector>
-    <classShape Id="f9e8867f-fd15-4a72-8ca4-4f02cd3f141f" absoluteBounds="4.125, 5.5, 2, 1.1939925130208327">
+    <classShape Id="f9e8867f-fd15-4a72-8ca4-4f02cd3f141f" absoluteBounds="4.125, 5.5, 2, 1.0961531575520827">
       <DataClassMoniker Name="/HiveDataContext/UserPriority" />
       <nestedChildShapes>
-        <elementListCompartment Id="ee41f516-7d9c-4a1d-a1b8-bbe00a6ffea8" absoluteBounds="4.14, 5.96, 1.9700000000000002, 0.63399251302083326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
+        <elementListCompartment Id="ee41f516-7d9c-4a1d-a1b8-bbe00a6ffea8" absoluteBounds="4.14, 5.96, 1.9700000000000002, 0.53615315755208326" name="DataPropertiesCompartment" titleTextColor="Black" itemTextColor="Black" />
       </nestedChildShapes>
     </classShape>
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/HiveDataContext.designer.cs	(revision 9700)
@@ -2661,5 +2661,5 @@
 		private System.Guid _JobId;
 		
-		private System.Data.Linq.Link<System.Data.Linq.Binary> _Data;
+		private System.Data.Linq.Link<byte[]> _Data;
 		
 		private System.DateTime _LastUpdate;
@@ -2673,5 +2673,5 @@
     partial void OnTaskIdChanging(System.Guid value);
     partial void OnTaskIdChanged();
-    partial void OnDataChanging(System.Data.Linq.Binary value);
+    partial void OnDataChanging(byte[] value);
     partial void OnDataChanged();
     partial void OnLastUpdateChanging(System.DateTime value);
@@ -2710,5 +2710,5 @@
 		
 		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Data", DbType="VarBinary(MAX)", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
-		public System.Data.Linq.Binary Data
+		public byte[] Data
 		{
 			get
@@ -2814,5 +2814,5 @@
 		private System.Guid _PluginId;
 		
-		private System.Data.Linq.Link<System.Data.Linq.Binary> _Data;
+		private System.Data.Linq.Link<byte[]> _Data;
 		
 		private string _FileName;
@@ -2828,5 +2828,5 @@
     partial void OnPluginIdChanging(System.Guid value);
     partial void OnPluginIdChanged();
-    partial void OnDataChanging(System.Data.Linq.Binary value);
+    partial void OnDataChanging(byte[] value);
     partial void OnDataChanged();
     partial void OnFileNameChanging(string value);
@@ -2885,5 +2885,5 @@
 		
 		[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Data", DbType="VarBinary(MAX) NOT NULL", CanBeNull=false, UpdateCheck=UpdateCheck.Never)]
-		public System.Data.Linq.Binary Data
+		public byte[] Data
 		{
 			get
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Initialize Hive Database.sql	(revision 9700)
@@ -1,4 +1,9 @@
 ﻿USE [HeuristicLab.Hive-3.3]
 /* create and initialize hive database tables */
+
+EXEC sp_configure filestream_access_level, 2
+GO
+RECONFIGURE
+GO 
 
 SET ARITHABORT ON
@@ -88,13 +93,13 @@
   )
 CREATE TABLE [dbo].[TaskData](
-  [TaskId] UniqueIdentifier NOT NULL,
-  [Data] VarBinary(MAX) NOT NULL,
+  [TaskId] UniqueIdentifier RowGuidCol NOT NULL,
+  [Data] VarBinary(MAX) Filestream NOT NULL,
   [LastUpdate] DateTime NOT NULL,
   CONSTRAINT [PK_dbo.TaskData] PRIMARY KEY ([TaskId])
   )
 CREATE TABLE [dbo].[PluginData](
-  [PluginDataId] UniqueIdentifier NOT NULL,
+  [PluginDataId] UniqueIdentifier RowGuidCol NOT NULL,
   [PluginId] UniqueIdentifier NOT NULL,
-  [Data] VarBinary(MAX) NOT NULL,
+  [Data] VarBinary(MAX) FileStream NOT NULL,
   [FileName] VarChar(MAX) NOT NULL,
   CONSTRAINT [PK_dbo.PluginData] PRIMARY KEY ([PluginDataId])
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Migrate to Filestream.sql
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Migrate to Filestream.sql	(revision 9700)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Migrate to Filestream.sql	(revision 9700)
@@ -0,0 +1,79 @@
+/* Upgrade script from HeuristicLab Hive 3.3.8 to 3.3.9 */
+
+USE [HeuristicLab.Hive-3.3]
+
+EXEC sp_configure filestream_access_level, 2
+GO
+RECONFIGURE
+GO 
+
+/**********************************************************/
+
+/* Move old Task Data */
+
+CREATE TABLE [dbo].[TaskDataTemp](
+  [TaskId] UniqueIdentifier RowGuidCol NOT NULL,
+  [Data] VarBinary(MAX) Filestream NOT NULL,
+  [LastUpdate] DateTime NOT NULL,
+  CONSTRAINT [PK_dbo.TaskDataTemp] PRIMARY KEY ([TaskId])
+)
+
+INSERT INTO dbo.TaskDataTemp (TaskId, Data, LastUpdate)
+SELECT TaskId, Data, LastUpdate
+FROM dbo.TaskData
+
+DELETE FROM dbo.TaskData
+
+/* Alter TaskId and Data Column */
+
+ALTER TABLE dbo.TaskData
+ALTER COLUMN [TaskId] ADD RowGuidCol
+
+ALTER TABLE dbo.TaskData
+DROP COLUMN Data
+
+ALTER TABLE dbo.TaskData
+ADD [Data] VarBinary(MAX) Filestream NOT NULL
+
+/* Insert data */
+
+INSERT INTO dbo.TaskData (TaskId, Data, LastUpdate)
+SELECT TaskId, Data, LastUpdate
+FROM dbo.TaskDataTemp
+
+DROP TABLE dbo.TaskDataTemp
+
+
+/**********************************************************/
+
+/* Move old Plugin Data */
+
+CREATE TABLE [dbo].[PluginDataTemp](
+  [PluginDataId] UniqueIdentifier RowGuidCol NOT NULL,
+  [PluginId] UniqueIdentifier NOT NULL,
+  [Data] VarBinary(MAX) FileStream NOT NULL,
+  [FileName] VarChar(MAX) NOT NULL,
+  CONSTRAINT [PK_dbo.PluginDataTemp] PRIMARY KEY ([PluginDataId])
+)
+
+INSERT INTO dbo.PluginDataTemp (PluginDataId, PluginId, Data, [FileName])
+SELECT PluginDataId, PluginId, Data, [FileName]
+FROM dbo.PluginData
+
+DELETE FROM dbo.PluginData
+
+/* Alter Data Column */
+
+ALTER TABLE dbo.PluginData
+DROP COLUMN Data
+
+ALTER TABLE dbo.PluginData
+ADD [Data] VarBinary(MAX) Filestream NOT NULL
+
+/* Insert data */
+
+INSERT INTO dbo.PluginData (PluginDataId, PluginId, Data, [FileName])
+SELECT PluginDataId, PluginId, Data, [FileName]
+FROM dbo.PluginDataTemp
+
+DROP TABLE dbo.PluginDataTemp
Index: /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Prepare Hive Database.sql
===================================================================
--- /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Prepare Hive Database.sql	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.DataAccess/3.3/SQL Scripts/Prepare Hive Database.sql	(revision 9700)
@@ -41,5 +41,4 @@
 ALTER TABLE dbo.Plugin WITH NOCHECK ADD CONSTRAINT [DF_Plugin_PluginId] DEFAULT (NEWSEQUENTIALID()) FOR PluginId;
 
-ALTER TABLE dbo.PluginData ALTER COLUMN PluginDataId ADD ROWGUIDCOL;
 ALTER TABLE dbo.PluginData WITH NOCHECK ADD CONSTRAINT [DF_PluginData_PluginDataId] DEFAULT (NEWSEQUENTIALID()) FOR PluginDataId;
 
Index: /stable/HeuristicLab.Services.Hive.Web/Hive-3.3/Web.config
===================================================================
--- /stable/HeuristicLab.Services.Hive.Web/Hive-3.3/Web.config	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.Web/Hive-3.3/Web.config	(revision 9700)
@@ -54,10 +54,10 @@
   </system.web>
   <system.serviceModel>
-    <diagnostics>
+    <diagnostics performanceCounters="All">
       <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000"/>
     </diagnostics>
     <bindings>
       <wsHttpBinding>
-        <binding name="WSHttpBinding_IHiveService" receiveTimeout="00:15:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+        <binding name="WSHttpBinding_IHiveService" messageEncoding="Text" receiveTimeout="00:35:00" sendTimeout="00:35:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
           <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
           <security mode="Message">
@@ -67,4 +67,13 @@
         </binding>
       </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="NetTcpBinding_IHiveService" portSharingEnabled="true" receiveTimeout="00:35:00" sendTimeout="00:35:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Certificate"/>
+            <message clientCredentialType="UserName"/>
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
     <behaviors>
@@ -88,6 +97,8 @@
     <services>
       <service behaviorConfiguration="ServiceBehaviour_IHiveService" name="HeuristicLab.Services.Hive.HiveService">
-        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="MexEndpoint" contract="IMetadataExchange"/>
-        <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" name="WSHttpBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService"/>
+        <endpoint address="mexhttp" binding="mexHttpBinding" bindingConfiguration="" name="MexHttpEndpoint" contract="IMetadataExchange"/>
+        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="MexTcpEndpoint" contract="IMetadataExchange"/>
+        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" name="WSHttpBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService"/>
+        <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding"  bindingConfiguration="NetTcpBinding_IHiveService" name="NetBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService"/>
       </service>
     </services>
Index: /stable/HeuristicLab.Services.Hive.Web/web_services.config
===================================================================
--- /stable/HeuristicLab.Services.Hive.Web/web_services.config	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive.Web/web_services.config	(revision 9700)
@@ -29,8 +29,8 @@
   </connectionStrings>
   
-  <system.web>
+  <system.web>      
 	<customErrors mode="Off"/>
     <authentication mode="Forms" />
-    <compilation debug="true" targetFramework="4.0">
+    <compilation debug="true" targetFramework="4.0" batch="false">
       <assemblies>
         <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
@@ -55,6 +55,5 @@
       </controls>
     </pages>
-    <httpRuntime maxRequestLength="2147483647"/>
-	
+    <httpRuntime maxRequestLength="2147483647"/>		
   </system.web>
   
@@ -67,6 +66,6 @@
       <wsHttpBinding>
         <binding name="WSHttpBinding_IHiveService" 
-		  receiveTimeout="00:15:00"
-          sendTimeout="00:10:00" 
+		  receiveTimeout="00:35:00"
+          sendTimeout="00:35:00" 
 		  maxBufferPoolSize="2147483647" 
 		  maxReceivedMessageSize="2147483647">
@@ -78,4 +77,13 @@
         </binding>
       </wsHttpBinding>
+	  <netTcpBinding>
+        <binding name="NetTcpBinding_IHiveService" portSharingEnabled="true" receiveTimeout="00:35:00" sendTimeout="00:35:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security mode="TransportWithMessageCredential">
+            <transport clientCredentialType="Certificate"/>
+            <message clientCredentialType="UserName"/>
+          </security>
+        </binding>
+      </netTcpBinding>
     </bindings>
     
@@ -105,8 +113,10 @@
     </behaviors>
 
-    <services>
+     <services>
       <service behaviorConfiguration="ServiceBehaviour_IHiveService" name="HeuristicLab.Services.Hive.HiveService">
-        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="MexEndpoint" contract="IMetadataExchange" />
-        <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" name="WSHttpBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService" />
+        <endpoint address="mexhttp" binding="mexHttpBinding" bindingConfiguration="" name="MexHttpEndpoint" contract="IMetadataExchange"/>
+        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="MexTcpEndpoint" contract="IMetadataExchange"/>
+        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" name="WSHttpBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService"/>
+        <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding"  bindingConfiguration="NetTcpBinding_IHiveService" name="NetBinding_IHiveService" contract="HeuristicLab.Services.Hive.ServiceContracts.IHiveService"/>
       </service>
     </services>
Index: /stable/HeuristicLab.Services.Hive/3.3/Convert.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/Convert.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/Convert.cs	(revision 9700)
@@ -102,5 +102,5 @@
     public static DT.TaskData ToDto(DB.TaskData source) {
       if (source == null) return null;
-      return new DT.TaskData { TaskId = source.TaskId, Data = source.Data.ToArray(), LastUpdate = source.LastUpdate };
+      return new DT.TaskData { TaskId = source.TaskId, Data = source.Data, LastUpdate = source.LastUpdate };
     }
     public static DB.TaskData ToEntity(DT.TaskData source) {
@@ -111,5 +111,7 @@
     public static void ToEntity(DT.TaskData source, DB.TaskData target) {
       if ((source != null) && (target != null)) {
-        target.TaskId = source.TaskId; target.Data = new Binary(source.Data); target.LastUpdate = source.LastUpdate;
+        target.TaskId = source.TaskId;
+        target.Data = source.Data;
+        target.LastUpdate = source.LastUpdate;
       }
     }
@@ -213,5 +215,8 @@
     public static void ToEntity(DT.PluginData source, DB.PluginData target) {
       if ((source != null) && (target != null)) {
-        target.PluginDataId = source.Id; target.PluginId = source.PluginId; target.Data = new Binary(source.Data); target.FileName = source.FileName;
+        target.PluginDataId = source.Id;
+        target.PluginId = source.PluginId;
+        target.Data = source.Data;
+        target.FileName = source.FileName;
       }
     }
Index: /stable/HeuristicLab.Services.Hive/3.3/HeuristicLab.Services.Hive-3.3.csproj
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/HeuristicLab.Services.Hive-3.3.csproj	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/HeuristicLab.Services.Hive-3.3.csproj	(revision 9700)
@@ -137,6 +137,9 @@
     <Compile Include="DataTransfer\Statistics.cs" />
     <Compile Include="DataTransfer\UserStatistics.cs" />
+    <Compile Include="OptimizedHiveDao.cs" />
     <Compile Include="HiveDao.cs" />
     <Compile Include="HiveJanitor.cs" />
+    <Compile Include="HiveOperationContext.cs" />
+    <Compile Include="Interfaces\IOptimizedHiveDao.cs" />
     <Compile Include="Interfaces\IHiveDao.cs" />
     <Compile Include="Interfaces\ITaskScheduler.cs" />
Index: /stable/HeuristicLab.Services.Hive/3.3/HiveDao.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/HiveDao.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/HiveDao.cs	(revision 9700)
@@ -35,6 +35,4 @@
     }
 
-    public HiveDao() { }
-
     #region Task Methods
     public DT.Task GetTask(Guid id) {
@@ -666,5 +664,5 @@
     }
 
-    private void CollectParentResources(List<Resource> resources, Resource resource) {
+    private static void CollectParentResources(ICollection<Resource> resources, Resource resource) {
       if (resource == null) return;
       resources.Add(resource);
Index: /stable/HeuristicLab.Services.Hive/3.3/HiveOperationContext.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/HiveOperationContext.cs	(revision 9700)
+++ /stable/HeuristicLab.Services.Hive/3.3/HiveOperationContext.cs	(revision 9700)
@@ -0,0 +1,85 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.ObjectModel;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Description;
+using System.ServiceModel.Dispatcher;
+using HeuristicLab.Services.Hive.DataAccess;
+
+namespace HeuristicLab.Services.Hive {
+  public class HiveOperationContext : IExtension<OperationContext> {
+
+    public static HiveOperationContext Current {
+      get {
+        return OperationContext.Current != null
+          ? OperationContext.Current.Extensions.Find<HiveOperationContext>()
+          : null;
+      }
+    }
+
+    private HiveDataContext dataContext;
+    public HiveDataContext DataContext {
+      get {
+        return dataContext ?? (dataContext = new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString));
+      }
+    }
+
+    public void Attach(OperationContext owner) {
+    }
+
+    public void Detach(OperationContext owner) {
+      if (dataContext != null) {
+        dataContext.Dispose();
+      }
+    }
+  }
+
+  public class HiveOperationContextMessageInspector : IDispatchMessageInspector {
+    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) {
+      OperationContext.Current.Extensions.Add(new HiveOperationContext());
+      return request.Headers.MessageId;
+    }
+
+    public void BeforeSendReply(ref Message reply, object correlationState) {
+      OperationContext.Current.Extensions.Remove(HiveOperationContext.Current);
+    }
+  }
+
+  public class HiveOperationContextBehaviorAttribute : Attribute, IServiceBehavior {
+    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase,
+      Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) {
+    }
+
+    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
+      foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) {
+        foreach (EndpointDispatcher ed in cd.Endpoints) {
+          ed.DispatchRuntime.MessageInspectors.Add(new HiveOperationContextMessageInspector());
+        }
+      }
+    }
+
+    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {
+    }
+  }
+}
Index: /stable/HeuristicLab.Services.Hive/3.3/HiveService.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/HiveService.cs	(revision 9700)
@@ -37,8 +37,12 @@
   /// </summary>
   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, IgnoreExtensionDataObject = true)]
+  [HiveOperationContextBehavior]
   public class HiveService : IHiveService {
     private IHiveDao dao {
       get { return ServiceLocator.Instance.HiveDao; }
     }
+    private IOptimizedHiveDao optimizedDao {
+      get { return ServiceLocator.Instance.OptimizedHiveDao; }
+    }
     private Access.IRoleVerifier authen {
       get { return ServiceLocator.Instance.RoleVerifier; }
@@ -64,11 +68,17 @@
       authen.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
       return trans.UseTransaction(() => {
-        task.Id = dao.AddTask(task);
-        taskData.TaskId = task.Id;
-        taskData.LastUpdate = DateTime.Now;
-        dao.AssignJobToResource(task.Id, resourceIds);
-        dao.AddTaskData(taskData);
-        dao.UpdateTaskState(task.Id, DA.TaskState.Waiting, null, userManager.CurrentUserId, null);
-        return taskData.TaskId;
+        var t = DT.Convert.ToEntity(task);
+        t.RequiredPlugins.AddRange(task.PluginsNeededIds.Select(pluginId => new DA.RequiredPlugin { Task = t, PluginId = pluginId }));
+
+        t.JobData = DT.Convert.ToEntity(taskData);
+        t.JobData.LastUpdate = DateTime.Now;
+
+        optimizedDao.AddTask(t);
+
+        dao.AssignJobToResource(t.TaskId, resourceIds);
+
+        optimizedDao.UpdateTaskState(t.TaskId, DA.TaskState.Waiting, null, userManager.CurrentUserId, null);
+
+        return t.TaskId;
       }, false, true);
     }
@@ -76,8 +86,6 @@
     public Guid AddChildTask(Guid parentTaskId, Task task, TaskData taskData) {
       authen.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client);
-      return trans.UseTransaction(() => {
-        task.ParentTaskId = parentTaskId;
-        return AddTask(task, taskData, dao.GetAssignedResources(parentTaskId).Select(x => x.Id));
-      }, false, true);
+      task.ParentTaskId = parentTaskId;
+      return AddTask(task, taskData, optimizedDao.GetAssignedResourceIds(parentTaskId));
     }
 
@@ -87,5 +95,5 @@
 
       return trans.UseTransaction(() => {
-        return dao.GetTask(taskId);
+        return DT.Convert.ToDto(optimizedDao.GetTaskById(taskId));
       }, false, false);
     }
@@ -128,5 +136,5 @@
 
       return trans.UseTransaction(() => {
-        return dao.GetLightweightTasks(task => task.JobId == jobId).ToArray();
+        return optimizedDao.GetLightweightTasks(jobId).ToArray();
       }, false, true);
     }
@@ -155,5 +163,6 @@
 
       trans.UseTransaction(() => {
-        dao.UpdateTaskAndPlugins(taskDto);
+        var task = optimizedDao.GetTaskByDto(taskDto);
+        optimizedDao.UpdateTask(task);
       });
     }
@@ -164,10 +173,12 @@
 
       trans.UseTransaction(() => {
-        dao.UpdateTaskAndPlugins(task);
-      });
-
-      trans.UseTransaction(() => {
-        taskData.LastUpdate = DateTime.Now;
-        dao.UpdateTaskData(taskData);
+        var t = optimizedDao.GetTaskByDto(task);
+        optimizedDao.UpdateTask(t);
+      });
+
+      trans.UseTransaction(() => {
+        var data = optimizedDao.GetTaskDataByDto(taskData);
+        data.LastUpdate = DateTime.Now;
+        optimizedDao.UpdateTaskData(data);
       });
     }
@@ -196,20 +207,20 @@
       authen.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
       author.AuthorizeForTask(taskId, Permission.Full);
-      return trans.UseTransaction(() => {
-        Task task = dao.UpdateTaskState(taskId, DataTransfer.Convert.ToEntity(taskState), slaveId, userId, exception);
-
-        if (task.Command.HasValue && task.Command.Value == Command.Pause && task.State == TaskState.Paused) {
+
+      return trans.UseTransaction(() => {
+        var task = optimizedDao.UpdateTaskState(taskId, DT.Convert.ToEntity(taskState), slaveId, userId, exception);
+
+        if (task.Command.HasValue && task.Command.Value == DA.Command.Pause && task.State == DA.TaskState.Paused) {
           task.Command = null;
-        } else if (task.Command.HasValue && task.Command.Value == Command.Abort && task.State == TaskState.Aborted) {
+        } else if (task.Command.HasValue && task.Command.Value == DA.Command.Abort && task.State == DA.TaskState.Aborted) {
           task.Command = null;
-        } else if (task.Command.HasValue && task.Command.Value == Command.Stop && task.State == TaskState.Aborted) {
+        } else if (task.Command.HasValue && task.Command.Value == DA.Command.Stop && task.State == DA.TaskState.Aborted) {
           task.Command = null;
         } else if (taskState == TaskState.Paused && !task.Command.HasValue) {
           // slave paused and uploaded the task (no user-command) -> set waiting.
-          task = dao.UpdateTaskState(taskId, DataTransfer.Convert.ToEntity(TaskState.Waiting), slaveId, userId, exception);
-        }
-
-        dao.UpdateTaskAndPlugins(task);
-        return task;
+          task = optimizedDao.UpdateTaskState(taskId, DA.TaskState.Waiting, slaveId, userId, exception);
+        }
+
+        return DT.Convert.ToDto(task);
       });
     }
@@ -463,5 +474,5 @@
       authen.AuthenticateForAnyRole(HiveRoles.Administrator, HiveRoles.Client, HiveRoles.Slave);
       return trans.UseTransaction(() => {
-        return dao.GetPlugin(pluginId);
+        return DT.Convert.ToDto(optimizedDao.GetPluginById(pluginId));
       });
     }
Index: /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs	(revision 9700)
+++ /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IOptimizedHiveDao.cs	(revision 9700)
@@ -0,0 +1,68 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Services.Hive.DataAccess;
+using DT = HeuristicLab.Services.Hive.DataTransfer;
+namespace HeuristicLab.Services.Hive {
+  public interface IOptimizedHiveDao {
+    #region Task Methods
+    Task GetTaskById(Guid task);
+    Task GetTaskByDto(DT.Task taskDto);
+    Tuple<Task, Guid?> GetTaskByIdAndLastStateLogSlaveId(Guid taskId);
+
+    IEnumerable<TaskInfoForScheduler> GetWaitingTasks(Slave slave);
+    IQueryable<DT.LightweightTask> GetLightweightTasks(Guid jobId);
+
+    void UpdateTask(Task task);
+    Task UpdateTaskState(Guid taskId, TaskState taskState, Guid? slaveId, Guid? userId, string exception);
+
+    Guid AddTask(Task task);
+    void AssignJobToResource(Guid taskId, IEnumerable<Guid> resourceIds);
+
+    bool TaskIsAllowedToBeCalculatedBySlave(Guid taskId, Guid slaveId);
+    #endregion
+
+    #region TaskData Methods
+    TaskData GetTaskDataByDto(DT.TaskData taskDataDto);
+    void UpdateTaskData(TaskData taskData);
+    #endregion
+
+    #region Plugin Methods
+    Plugin GetPluginById(Guid pluginId);
+    #endregion
+
+    #region Slave Methods
+    Slave GetSlaveById(Guid id);
+
+    void UpdateSlave(Slave slave);
+
+    bool SlaveHasToShutdownComputer(Guid slaveId);
+    bool SlaveIsAllowedToCalculate(Guid slaveId);
+    #endregion
+
+    #region Resource Methods
+    IEnumerable<Guid> GetAssignedResourceIds(Guid jobId);
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IServiceLocator.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IServiceLocator.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/Interfaces/IServiceLocator.cs	(revision 9700)
@@ -27,4 +27,5 @@
     IAuthorizationManager AuthorizationManager { get; }
     IHiveDao HiveDao { get; }
+    IOptimizedHiveDao OptimizedHiveDao { get; }
     IEventManager EventManager { get; }
     ITransactionManager TransactionManager { get; }
Index: /stable/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/Manager/EventManager.cs	(revision 9700)
@@ -78,5 +78,5 @@
       //we have to find another way to deal with this.  
       //until then the next line is commented out...
-      //stats.UserStatistics = dao.GetUserStatistics();
+      //stats.UserStatistics = dtoDao.GetUserStatistics();
       dao.AddStatistics(stats);
     }
Index: /stable/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/Manager/HeartbeatManager.cs	(revision 9700)
@@ -24,6 +24,6 @@
 using System.Linq;
 using System.Threading;
-using HeuristicLab.Services.Hive.DataTransfer;
-using DA = HeuristicLab.Services.Hive.DataAccess;
+using HeuristicLab.Services.Hive.DataAccess;
+using Heartbeat = HeuristicLab.Services.Hive.DataTransfer.Heartbeat;
 
 namespace HeuristicLab.Services.Hive {
@@ -31,6 +31,6 @@
     private const string MutexName = "HiveTaskSchedulingMutex";
 
-    private IHiveDao dao {
-      get { return ServiceLocator.Instance.HiveDao; }
+    private IOptimizedHiveDao dao {
+      get { return ServiceLocator.Instance.OptimizedHiveDao; }
     }
     private ITaskScheduler taskScheduler {
@@ -47,7 +47,9 @@
     public List<MessageContainer> ProcessHeartbeat(Heartbeat heartbeat) {
       List<MessageContainer> actions = new List<MessageContainer>();
+
       Slave slave = null;
-      slave = trans.UseTransaction(() => { return dao.GetSlave(heartbeat.SlaveId); });
-
+      trans.UseTransaction(() => {
+        slave = dao.GetSlaveById(heartbeat.SlaveId);
+      });
       if (slave == null) {
         actions.Add(new MessageContainer(MessageContainer.MessageType.SayHello));
@@ -56,5 +58,5 @@
           actions.Add(new MessageContainer(MessageContainer.MessageType.NewHBInterval));
         }
-        if (ShutdownSlaveComputer(slave.Id)) {
+        if (dao.SlaveHasToShutdownComputer(slave.ResourceId)) {
           actions.Add(new MessageContainer(MessageContainer.MessageType.ShutdownComputer));
         }
@@ -64,9 +66,11 @@
         slave.FreeMemory = heartbeat.FreeMemory;
         slave.CpuUtilization = heartbeat.CpuUtilization;
-        slave.IsAllowedToCalculate = SlaveIsAllowedToCalculate(slave.Id);
+        slave.IsAllowedToCalculate = dao.SlaveIsAllowedToCalculate(slave.ResourceId);
         slave.SlaveState = (heartbeat.JobProgress != null && heartbeat.JobProgress.Count > 0) ? SlaveState.Calculating : SlaveState.Idle;
         slave.LastHeartbeat = DateTime.Now;
 
-        trans.UseTransaction(() => { dao.UpdateSlave(slave); });
+        trans.UseTransaction(() => {
+          dao.UpdateSlave(slave);
+        });
 
         // update task data
@@ -78,22 +82,25 @@
           var mutex = new Mutex(false, MutexName);
           try {
+
             mutexAquired = mutex.WaitOne(Properties.Settings.Default.SchedulingPatience);
             if (!mutexAquired)
-              DA.LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling could not be aquired.");
+              LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling could not be aquired.");
             else {
-              IEnumerable<TaskInfoForScheduler> availableTasks = null;
-              availableTasks = trans.UseTransaction(() => { return taskScheduler.Schedule(dao.GetWaitingTasks(slave)); });
-              if (availableTasks.Any()) {
-                var task = availableTasks.First();
-                AssignJob(slave, task.TaskId);
-                actions.Add(new MessageContainer(MessageContainer.MessageType.CalculateTask, task.TaskId));
-              }
+              trans.UseTransaction(() => {
+                IEnumerable<TaskInfoForScheduler> availableTasks = null;
+                availableTasks = taskScheduler.Schedule(dao.GetWaitingTasks(slave).ToArray());
+                if (availableTasks.Any()) {
+                  var task = availableTasks.First();
+                  AssignTask(slave, task.TaskId);
+                  actions.Add(new MessageContainer(MessageContainer.MessageType.CalculateTask, task.TaskId));
+                }
+              });
             }
           }
           catch (AbandonedMutexException) {
-            DA.LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling has been abandoned.");
+            LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager: The mutex used for scheduling has been abandoned.");
           }
           catch (Exception ex) {
-            DA.LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager threw an exception in ProcessHeartbeat: " + ex.ToString());
+            LogFactory.GetLogger(this.GetType().Namespace).Log("HeartbeatManager threw an exception in ProcessHeartbeat: " + ex.ToString());
           }
           finally {
@@ -105,12 +112,10 @@
     }
 
-    private void AssignJob(Slave slave, Guid taskId) {
-      trans.UseTransaction(() => {
-        var task = dao.UpdateTaskState(taskId, DataAccess.TaskState.Transferring, slave.Id, null, null);
+    private void AssignTask(Slave slave, Guid taskId) {
+      var task = dao.UpdateTaskState(taskId, TaskState.Transferring, slave.ResourceId, null, null);
 
-        // from now on the task has some time to send the next heartbeat (ApplicationConstants.TransferringJobHeartbeatTimeout)
-        task.LastHeartbeat = DateTime.Now;
-        dao.UpdateTask(task);
-      });
+      // from now on the task has some time to send the next heartbeat (ApplicationConstants.TransferringJobHeartbeatTimeout)
+      task.LastHeartbeat = DateTime.Now;
+      dao.UpdateTask(task);
     }
 
@@ -130,35 +135,41 @@
         // process the jobProgresses
         foreach (var jobProgress in heartbeat.JobProgress) {
-          Task curTask = null;
-          curTask = trans.UseTransaction(() => { return dao.GetTask(jobProgress.Key); });
+          Tuple<Task, Guid?> taskWithLastStateLogSlaveId = null;
+          trans.UseTransaction(() => {
+            taskWithLastStateLogSlaveId = dao.GetTaskByIdAndLastStateLogSlaveId(jobProgress.Key);
+          });
+          var curTask = taskWithLastStateLogSlaveId != null ? taskWithLastStateLogSlaveId.Item1 : null;
           if (curTask == null) {
             // task does not exist in db
             actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, jobProgress.Key));
-            DA.LogFactory.GetLogger(this.GetType().Namespace).Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key);
+            LogFactory.GetLogger(this.GetType().Namespace).Log("Task on slave " + heartbeat.SlaveId + " does not exist in DB: " + jobProgress.Key);
           } else {
-            if (curTask.CurrentStateLog.SlaveId == Guid.Empty || curTask.CurrentStateLog.SlaveId != heartbeat.SlaveId) {
+            var slaveId = taskWithLastStateLogSlaveId.Item2;
+            if (slaveId == Guid.Empty || slaveId != heartbeat.SlaveId) {
               // assigned slave does not match heartbeat
-              actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.Id));
-              DA.LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask);
-            } else if (!TaskIsAllowedToBeCalculatedBySlave(heartbeat.SlaveId, curTask)) {
+              actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
+              LogFactory.GetLogger(this.GetType().Namespace).Log("The slave " + heartbeat.SlaveId + " is not supposed to calculate task: " + curTask);
+            } else if (!dao.TaskIsAllowedToBeCalculatedBySlave(curTask.TaskId, heartbeat.SlaveId)) {
               // assigned resources ids of task do not match with slaveId (and parent resourceGroupIds); this might happen when slave is moved to different group
-              actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.Id));
+              actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
             } else {
               // save task execution time
-              curTask.ExecutionTime = jobProgress.Value;
+              curTask.ExecutionTimeMs = jobProgress.Value.TotalMilliseconds;
               curTask.LastHeartbeat = DateTime.Now;
 
               switch (curTask.Command) {
                 case Command.Stop:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.Id));
+                  actions.Add(new MessageContainer(MessageContainer.MessageType.StopTask, curTask.TaskId));
                   break;
                 case Command.Pause:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.Id));
+                  actions.Add(new MessageContainer(MessageContainer.MessageType.PauseTask, curTask.TaskId));
                   break;
                 case Command.Abort:
-                  actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.Id));
+                  actions.Add(new MessageContainer(MessageContainer.MessageType.AbortTask, curTask.TaskId));
                   break;
               }
-              trans.UseTransaction(() => { dao.UpdateTask(curTask); });
+              trans.UseTransaction(() => {
+                dao.UpdateTask(curTask);
+              });
             }
           }
@@ -167,21 +178,4 @@
       return actions;
     }
-
-    private bool TaskIsAllowedToBeCalculatedBySlave(Guid slaveId, Task curTask) {
-      return trans.UseTransaction(() => {
-        var assignedResourceIds = dao.GetAssignedResources(curTask.Id).Select(x => x.Id);
-        var slaveResourceIds = dao.GetParentResources(slaveId).Select(x => x.Id);
-        return assignedResourceIds.Any(x => slaveResourceIds.Contains(x));
-      });
-    }
-
-    private bool SlaveIsAllowedToCalculate(Guid slaveId) {
-      // the slave may only calculate if there is no downtime right now. this needs to be checked for every parent resource also
-      return trans.UseTransaction(() => { return dao.GetParentResources(slaveId).All(r => dao.GetDowntimes(x => x.ResourceId == r.Id && x.DowntimeType == DA.DowntimeType.Offline && (DateTime.Now >= x.StartDate) && (DateTime.Now <= x.EndDate)).Count() == 0); });
-    }
-
-    private bool ShutdownSlaveComputer(Guid slaveId) {
-      return trans.UseTransaction(() => { return dao.GetParentResources(slaveId).Any(r => dao.GetDowntimes(x => x.ResourceId == r.Id && x.DowntimeType == DA.DowntimeType.Shutdown && (DateTime.Now >= x.StartDate) && (DateTime.Now <= x.EndDate)).Count() != 0); });
-    }
   }
 }
Index: /stable/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs	(revision 9700)
+++ /stable/HeuristicLab.Services.Hive/3.3/OptimizedHiveDao.cs	(revision 9700)
@@ -0,0 +1,248 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Data.Linq;
+using System.Linq;
+using DT = HeuristicLab.Services.Hive.DataTransfer;
+
+namespace HeuristicLab.Services.Hive.DataAccess {
+  public class OptimizedHiveDao : IOptimizedHiveDao {
+    private HiveDataContext Db { get; set; }
+
+    public OptimizedHiveDao(HiveDataContext db) {
+      Db = db;
+    }
+
+    #region Task Methods
+    public Task GetTaskById(Guid taskId) {
+      return GetTaskByIdQuery(Db, taskId).SingleOrDefault();
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<Task>> GetTaskByIdQuery = CompiledQuery.Compile((HiveDataContext db, Guid taskId) =>
+      from t in db.Tasks
+      where t.TaskId == taskId
+      select t
+    );
+
+    public Task GetTaskByDto(DT.Task taskDto) {
+      var task = GetTaskById(taskDto.Id);
+      DT.Convert.ToEntity(taskDto, task);
+      return task;
+    }
+
+    public Tuple<Task, Guid?> GetTaskByIdAndLastStateLogSlaveId(Guid taskId) {
+      return GetTaskByIdAndLastStateLogSlaveIdQuery(Db, taskId).SingleOrDefault();
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<Tuple<Task, Guid?>>> GetTaskByIdAndLastStateLogSlaveIdQuery = CompiledQuery.Compile((HiveDataContext db, Guid taskId) =>
+      from t in db.Tasks
+      let lastStateLog = t.StateLogs.OrderByDescending(sl => sl.DateTime).FirstOrDefault()
+      where t.TaskId == taskId
+      select new Tuple<Task, Guid?>(t, lastStateLog != null ? lastStateLog.SlaveId : null)
+    );
+
+    private const string GetWaitingTasksQueryString = @"
+      WITH pr AS (
+        SELECT ResourceId, ParentResourceId
+        FROM [Resource]
+        WHERE ResourceId = {0}
+        UNION ALL
+        SELECT r.ResourceId, r.ParentResourceId
+        FROM [Resource] r JOIN pr ON r.ResourceId = pr.ParentResourceId
+      )
+      SELECT DISTINCT t.TaskId, t.JobId, t.Priority
+      FROM pr JOIN AssignedResources ar ON ar.ResourceId = pr.ResourceId
+          JOIN Task t ON t.TaskId = ar.TaskId
+      WHERE NOT (t.IsParentTask = 1 AND t.FinishWhenChildJobsFinished = 1)
+          AND t.TaskState = {1}
+          AND t.CoresNeeded <= {2}
+          AND t.MemoryNeeded <= {3}
+    ";
+
+    public IEnumerable<TaskInfoForScheduler> GetWaitingTasks(Slave slave) {
+      //Originally we checked here if there are parent tasks which should be calculated (with GetParentTasks(resourceIds, count, false);).
+      //Because there is at the moment no case where this makes sense (there don't exist parent tasks which need to be calculated), 
+      //we skip this step because it's wasted runtime
+      return Db.ExecuteQuery<TaskInfoForScheduler>(GetWaitingTasksQueryString, slave.ResourceId, Enum.GetName(typeof(TaskState), TaskState.Waiting), slave.FreeCores, slave.FreeMemory);
+    }
+
+    public IQueryable<DT.LightweightTask> GetLightweightTasks(Guid jobId) {
+      return GetLightweightTasksQuery(Db, jobId);
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<DT.LightweightTask>> GetLightweightTasksQuery = CompiledQuery.Compile((HiveDataContext db, Guid jobId) =>
+        from task in db.Tasks
+        where task.JobId == jobId
+        select new DT.LightweightTask {
+          Id = task.TaskId,
+          ExecutionTime = TimeSpan.FromMilliseconds(task.ExecutionTimeMs),
+          ParentTaskId = task.ParentTaskId,
+          StateLog = task.StateLogs.OrderBy(sl => sl.DateTime).Select(sl => ConvertStateLog(sl)).ToList(),
+          State = ConvertTaskState(task.State),
+          Command = ConvertCommand(task.Command),
+          LastTaskDataUpdate = task.JobData.LastUpdate
+        }
+    );
+
+    private static readonly Func<StateLog, DT.StateLog> ConvertStateLog = sl => DT.Convert.ToDto(sl);
+    private static readonly Func<TaskState, DT.TaskState> ConvertTaskState = ts => DT.Convert.ToDto(ts);
+    private static readonly Func<Command?, DT.Command?> ConvertCommand = c => DT.Convert.ToDto(c);
+
+    public void UpdateTask(Task task) {
+      Db.SubmitChanges();
+    }
+
+    public Task UpdateTaskState(Guid taskId, TaskState taskState, Guid? slaveId, Guid? userId, string exception) {
+      Db.StateLogs.InsertOnSubmit(new StateLog {
+        TaskId = taskId,
+        State = taskState,
+        SlaveId = slaveId,
+        UserId = userId,
+        Exception = exception,
+        DateTime = DateTime.Now
+      });
+
+      var task = GetTaskById(taskId);
+      task.State = taskState;
+
+      Db.SubmitChanges();
+
+      return task;
+    }
+
+    public Guid AddTask(Task task) {
+      Db.Tasks.InsertOnSubmit(task);
+      Db.SubmitChanges();
+      return task.TaskId;
+    }
+
+    public void AssignJobToResource(Guid taskId, IEnumerable<Guid> resourceIds) {
+      Db.AssignedResources.InsertAllOnSubmit(resourceIds.Select(resourceId => new AssignedResource { TaskId = taskId, ResourceId = resourceId }));
+      Db.SubmitChanges();
+    }
+
+    private const string TaskIsAllowedToBeCalculatedBySlaveQueryString = @"
+      WITH pr AS (
+        SELECT ResourceId, ParentResourceId
+        FROM [Resource]
+        WHERE ResourceId = {0}
+        UNION ALL
+        SELECT r.ResourceId, r.ParentResourceId
+        FROM [Resource] r JOIN pr ON r.ResourceId = pr.ParentResourceId
+      )
+      SELECT COUNT(ar.TaskId)
+      FROM pr JOIN AssignedResources ar ON pr.ResourceId = ar.ResourceId
+      WHERE ar.TaskId = {1}
+    ";
+
+    public bool TaskIsAllowedToBeCalculatedBySlave(Guid taskId, Guid slaveId) {
+      return Db.ExecuteQuery<int>(TaskIsAllowedToBeCalculatedBySlaveQueryString, slaveId, taskId).First() > 0;
+    }
+    #endregion
+
+    #region TaskData Methods
+    public TaskData GetTaskDataById(Guid id) {
+      return GetTaskDataByIdQuery(Db, id).SingleOrDefault();
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<TaskData>> GetTaskDataByIdQuery = CompiledQuery.Compile((HiveDataContext db, Guid id) =>
+      from t in db.TaskDatas
+      where t.TaskId == id
+      select t
+    );
+
+    public TaskData GetTaskDataByDto(DT.TaskData dto) {
+      var taskData = GetTaskDataById(dto.TaskId);
+      DT.Convert.ToEntity(dto, taskData);
+      return taskData;
+    }
+
+    public void UpdateTaskData(TaskData taskData) {
+      Db.SubmitChanges();
+    }
+    #endregion
+
+    #region Plugin Methods
+    public Plugin GetPluginById(Guid pluginId) {
+      return GetPluginByIdQuery(Db, pluginId).SingleOrDefault();
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<Plugin>> GetPluginByIdQuery = CompiledQuery.Compile((HiveDataContext db, Guid pluginId) =>
+      from p in db.Plugins
+      where p.PluginId == pluginId
+      select p
+    );
+    #endregion
+
+    #region Slave Methods
+    public Slave GetSlaveById(Guid id) {
+      return GetSlaveByIdQuery(Db, id).SingleOrDefault();
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<Slave>> GetSlaveByIdQuery = CompiledQuery.Compile((HiveDataContext db, Guid slaveId) =>
+      from s in db.Resources.OfType<Slave>()
+      where s.ResourceId == slaveId
+      select s
+    );
+
+    public void UpdateSlave(Slave slave) {
+      Db.SubmitChanges();
+    }
+
+    private const string DowntimeQueryString = @"
+      WITH pr AS (
+        SELECT ResourceId, ParentResourceId
+        FROM [Resource]
+        WHERE ResourceId = {0}
+        UNION ALL
+        SELECT r.ResourceId, r.ParentResourceId
+        FROM [Resource] r JOIN pr ON r.ResourceId = pr.ParentResourceId
+      )
+      SELECT COUNT(dt.DowntimeId)
+      FROM pr JOIN [Downtime] dt ON pr.ResourceId = dt.ResourceId
+      WHERE {1} BETWEEN dt.StartDate AND dt.EndDate
+        AND dt.DowntimeType = {2}
+      ";
+
+    public bool SlaveHasToShutdownComputer(Guid slaveId) {
+      return Db.ExecuteQuery<int>(DowntimeQueryString, slaveId, DateTime.Now, DowntimeType.Shutdown.ToString()).FirstOrDefault() > 0;
+    }
+
+    public bool SlaveIsAllowedToCalculate(Guid slaveId) {
+      return Db.ExecuteQuery<int>(DowntimeQueryString, slaveId, DateTime.Now, DowntimeType.Offline.ToString()).FirstOrDefault() == 0;
+    }
+    #endregion
+
+    #region Resource Methods
+    public IEnumerable<Guid> GetAssignedResourceIds(Guid taskId) {
+      return GetAssignedResourceIdsQuery(Db, taskId);
+    }
+
+    private static readonly Func<HiveDataContext, Guid, IQueryable<Guid>> GetAssignedResourceIdsQuery = CompiledQuery.Compile((HiveDataContext db, Guid taskId) =>
+      from ar in db.AssignedResources
+      where ar.TaskId == taskId
+      select ar.ResourceId
+    );
+    #endregion
+  }
+}
Index: /stable/HeuristicLab.Services.Hive/3.3/ServiceLocator.cs
===================================================================
--- /stable/HeuristicLab.Services.Hive/3.3/ServiceLocator.cs	(revision 9699)
+++ /stable/HeuristicLab.Services.Hive/3.3/ServiceLocator.cs	(revision 9700)
@@ -39,4 +39,13 @@
         if (hiveDao == null) hiveDao = new HiveDao();
         return hiveDao;
+      }
+    }
+
+    public IOptimizedHiveDao OptimizedHiveDao {
+      get {
+        var dataContext = HiveOperationContext.Current != null
+                            ? HiveOperationContext.Current.DataContext
+                            : new HiveDataContext(Settings.Default.HeuristicLab_Hive_LinqConnectionString);
+        return new OptimizedHiveDao(dataContext);
       }
     }
