Index: sc/tools/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain.sln
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain.sln	(revision 15920)
+++ 	(revision )
@@ -1,20 +1,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveDrain", "HeuristicLab.HiveDrain\HeuristicLab.HiveDrain.csproj", "{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
Index: /misc/tools/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain.csproj
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain.csproj	(revision 15920)
+++ /misc/tools/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain/HeuristicLab.HiveDrain.csproj	(revision 15921)
@@ -20,5 +20,5 @@
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
-    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -29,5 +29,5 @@
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
-    <OutputPath>..\..\..\..\trunk\sources\bin\</OutputPath>
+    <OutputPath>..\..\..\..\trunk\bin\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
@@ -47,10 +47,10 @@
     <Reference Include="HeuristicLab.Core.Views-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core.Views-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
@@ -89,64 +89,64 @@
     <Reference Include="HeuristicLab.Clients.Access-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Access-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Clients.Access-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Clients.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Clients.Hive-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Core-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Core-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Data-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Data-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Hive-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Hive-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Hive-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.MainForm-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Optimization-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
-      <HintPath>..\..\..\..\trunk\sources\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
       <Private>False</Private>
     </Reference>
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/App.config
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/App.config	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/App.config	(revision 15921)
@@ -0,0 +1,95 @@
+﻿<?xml version="1.0"?>
+<configuration>
+  <configSections>
+    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+      <section name="HeuristicLab.Clients.Hive.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+    </sectionGroup>
+    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+      <section name="HeuristicLab.Clients.Common.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+    </sectionGroup>
+  </configSections>
+  <connectionStrings>
+  </connectionStrings>
+  <system.serviceModel>
+    <behaviors />
+    <bindings>
+      <wsHttpBinding>
+        <binding name="WSHttpBinding_IHiveService" receiveTimeout="00:20:00" sendTimeout="00:20:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security>
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </wsHttpBinding>
+      <netTcpBinding>
+        <binding name="NetBinding_IHiveService" receiveTimeout="00:20:00" sendTimeout="00:20:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
+          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
+          <security mode="TransportWithMessageCredential">
+            <message clientCredentialType="UserName" />
+          </security>
+        </binding>
+      </netTcpBinding>
+    </bindings>
+    <client>
+      <endpoint address="http://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHiveService" contract="HeuristicLab.Clients.Hive.IHiveService" name="WSHttpBinding_IHiveService">
+        <identity>
+          <dns value="services.heuristiclab.com" />
+        </identity>
+      </endpoint>
+      <endpoint address="net.tcp://services.heuristiclab.com/Hive-3.3/HiveService.svc" binding="netTcpBinding" bindingConfiguration="NetBinding_IHiveService" contract="HeuristicLab.Clients.Hive.IHiveService" name="NetBinding_IHiveService">
+        <identity>
+          <dns value="services.heuristiclab.com" />
+        </identity>
+      </endpoint>
+    </client>
+  </system.serviceModel>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+  </startup>
+  <applicationSettings>
+    <HeuristicLab.Clients.Hive.Settings>
+      <setting name="MaxParallelUploads" serializeAs="String">
+        <value>2</value>
+      </setting>
+      <setting name="HLBinaryName" serializeAs="String">
+        <value>HeuristicLab 3.3.exe</value>
+      </setting>
+      <setting name="ResultPollingInterval" serializeAs="String">
+        <value>00:00:20</value>
+      </setting>
+      <setting name="MaxParallelDownloads" serializeAs="String">
+        <value>2</value>
+      </setting>
+      <setting name="MaxRepeatServiceCalls" serializeAs="String">
+        <value>5</value>
+      </setting>
+      <setting name="AnonymousUserName" serializeAs="String">
+        <value>anonymous</value>
+      </setting>
+      <setting name="MaxEndpointRetries" serializeAs="String">
+        <value>3</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>NetBinding_IHiveService</string>
+            <string>WSHttpBinding_IHiveService</string>
+          </ArrayOfString>
+        </value>
+      </setting>
+    </HeuristicLab.Clients.Hive.Settings>
+  </applicationSettings>
+  <userSettings>
+    <HeuristicLab.Clients.Common.Properties.Settings>
+      <setting name="UserName" serializeAs="String">
+        <value>anonymous</value>
+      </setting>
+      <setting name="SavePassword" serializeAs="String">
+        <value>True</value>
+      </setting>
+      <setting name="Password" serializeAs="String">
+        <value>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA36TvN4MDBkWUU6yPrzj49gAAAAACAAAAAAADZgAAwAAAABAAAABr3+B3SidbFwV5hCTHGoESAAAAAASAAACgAAAAEAAAAGSI+4CIIV5GmEl09qLBIxIYAAAAkpj3t9H1LBYhpUjjoM6qEc83XlY0xbnuFAAAADY3OscJ1F9ThR3SHB0sLax4TAN8</value>
+      </setting>
+    </HeuristicLab.Clients.Common.Properties.Settings>
+  </userSettings>
+</configuration>
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/HiveStatus.csproj
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/HiveStatus.csproj	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/HiveStatus.csproj	(revision 15921)
@@ -0,0 +1,90 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>HiveStatus</RootNamespace>
+    <AssemblyName>HiveStatus</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32, processorArchitecture=MSIL">
+      <HintPath>..\packages\CommandLineParser.2.2.1\lib\net45\CommandLine.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Clients.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Clients.Hive-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Clients.Hive-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Hive-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Hive-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\trunk\bin\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.ServiceModel" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Options.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Options.cs
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Options.cs	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Options.cs	(revision 15921)
@@ -0,0 +1,39 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 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 CommandLine;
+
+namespace HiveStatus {
+  internal class Options {
+    [Option('u', "user", HelpText = "Username")]
+    public string Username { get; set; }
+    [Option('p', "password", HelpText = "Password")]
+    public string Password { get; set; }
+
+    [Option('a', "all", HelpText = "Checks status of all jobs.", SetName = "ALL")]
+    public bool All { get; set; }
+    [Option('j', "job", HelpText = "Checks status of a certain job", SetName = "SINGLE")]
+    public Guid JobId { get; set; }
+    [Option('v', "verbose", HelpText = "More detailed status of a job")]
+    public bool Verbose { get; set; }
+  }
+}
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Program.cs
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Program.cs	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Program.cs	(revision 15921)
@@ -0,0 +1,219 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using CommandLine;
+using HeuristicLab.Clients.Hive;
+
+namespace HiveStatus {
+  class Program {
+    public const int EXIT_OK = 0;
+    public const int EXIT_ERR = 1;
+    public const int EXIT_WAITING = 2;
+    public const int EXIT_FAILED = 3;
+    public const int EXIT_NOTFOUND = 4;
+
+    static void Main(string[] args) {
+      var result = Parser.Default.ParseArguments<Options>(args)
+        .WithParsed(x => {
+          try {
+            Environment.Exit(Run(x));
+          } catch { Environment.Exit(EXIT_ERR); }
+        })
+        .WithNotParsed(x => Environment.Exit(EXIT_ERR));
+    }
+
+    private static int Run(Options opt) {
+      if (!string.IsNullOrEmpty(opt.Username)) {
+        HiveServiceLocator.Instance.Username = opt.Username;
+        var password = opt.Password;
+        if (string.IsNullOrEmpty(password)) {
+          Console.Error.Write("Password for " + opt.Username + ": ");
+          password = ReadPassword();
+        }
+        HiveServiceLocator.Instance.Password = password;
+      }
+      return CheckStatus(opt);
+    }
+
+    private static string ReadPassword() {
+      ConsoleKeyInfo info;
+      var sb = new StringBuilder();
+      var index = 0;
+      while (true) {
+        info = Console.ReadKey(true);
+        if (info.Key == ConsoleKey.Escape) Environment.Exit(EXIT_ERR);
+        if (info.Key == ConsoleKey.Enter) break;
+
+        if (info.Key == ConsoleKey.Backspace) {
+          if (index > 0) {
+            sb.Remove(index - 1, 1);
+            //else sb.Remove(index, 1);
+            index--;
+            Console.CursorLeft--;
+            for (var i = index; i < sb.Length; i++)
+              Console.Write('*');
+            Console.Write(' ');
+            Console.CursorLeft -= sb.Length - index + 1;
+          } else Console.Write((char)7);
+        } else if (info.Key == ConsoleKey.LeftArrow) {
+          if (index > 0) {
+            index--;
+            Console.CursorLeft--;
+          }
+        } else if (info.Key == ConsoleKey.RightArrow) {
+          if (index < sb.Length) {
+            index++;
+            Console.CursorLeft++;
+          }
+        } else if (info.KeyChar < 32) {
+          Console.Write((char)7);
+        } else {
+          if (sb.Length == index)
+            sb.Append(info.KeyChar);
+          else sb.Insert(index, info.KeyChar);
+          for (var i = index; i < sb.Length; i++)
+            Console.Write('*');
+          index++;
+          Console.CursorLeft -= sb.Length - index;
+        }
+      }
+      Console.WriteLine();
+      return sb.ToString();
+    }
+
+    private static int CheckStatus(Options opt) {
+      if (opt.All) return CheckStatusAll(opt);
+
+      var jobId = opt.JobId;
+
+      if (opt.Verbose) {
+
+        List<LightweightTask> tasks = null;
+        try {
+          tasks = HiveServiceLocator.Instance.CallHiveService(x => x.GetLightweightJobTasksWithoutStateLog(jobId));
+        } catch (System.ServiceModel.Security.SecurityAccessDeniedException) {
+          Console.WriteLine("?");
+          return EXIT_NOTFOUND;
+        }
+
+        int completed, failed, running, paused;
+        GetStats(tasks, out completed, out failed, out running, out paused);
+        Console.WriteLine(FormatStateInfo(tasks.Count, completed, failed, running, paused));
+        return completed == tasks.Count ? EXIT_OK : failed > 0 ? EXIT_FAILED : EXIT_WAITING;
+
+      } else {
+
+        Job job = null;
+        try {
+          job = HiveServiceLocator.Instance.CallHiveService(x => x.GetJob(jobId));
+        } catch (System.ServiceModel.Security.SecurityAccessDeniedException) {
+          Console.WriteLine("?");
+          return EXIT_NOTFOUND;
+        }
+        Console.WriteLine(FormatStateInfo(job.JobCount, job.FinishedCount, job.CalculatingCount));
+        return job.FinishedCount == job.JobCount ? EXIT_OK : EXIT_WAITING;
+      }
+    }
+
+    private static int CheckStatusAll(Options opt) {
+      List<Job> jobs = null;
+      try {
+        jobs = HiveServiceLocator.Instance.CallHiveService(x => x.GetJobs());
+      } catch (System.ServiceModel.Security.SecurityAccessDeniedException) {
+        Console.WriteLine("?");
+        return EXIT_NOTFOUND;
+      }
+
+      if (opt.Verbose) {
+        List<LightweightTask> tasks = null;
+        int totFinished, totFailed, totCalculating, totPaused, total;
+        totFinished = totFailed = totCalculating = totPaused = total = 0;
+        try {
+
+          foreach (var j in jobs) {
+            tasks = HiveServiceLocator.Instance.CallHiveService(x => x.GetLightweightJobTasksWithoutStateLog(j.Id));
+
+            int finished, failed, calculating, paused;
+            GetStats(tasks, out finished, out failed, out calculating, out paused);
+            totFinished += finished;
+            totFailed += failed;
+            totCalculating += calculating;
+            totPaused += paused;
+            total += tasks.Count;
+
+            Console.WriteLine(FormatStateInfo(tasks.Count, finished, failed, calculating, paused) + " | " + Truncate(j.Name, 40).PadRight(40) + " | " + j.DateCreated.ToShortDateString());
+          }
+        } catch (System.ServiceModel.Security.SecurityAccessDeniedException) {
+          Console.WriteLine("?");
+          return EXIT_NOTFOUND;
+        }
+        Console.WriteLine();
+        Console.WriteLine(FormatStateInfo(total, totFinished, totFailed, totCalculating, totPaused) + " | ALL");
+        return totFinished == total ? EXIT_OK : totFailed > 0 ? EXIT_FAILED : EXIT_WAITING;
+      } else {
+        int totFinished, totCalculating, total;
+        totFinished = totCalculating = total = 0;
+        foreach (var j in jobs) {
+          Console.WriteLine(FormatStateInfo(j.JobCount, j.FinishedCount, j.CalculatingCount) + " | " + Truncate(j.Name, 40).PadRight(40) + " | " + j.DateCreated.ToShortDateString());
+          totFinished += j.FinishedCount;
+          totCalculating += j.CalculatingCount;
+          total += j.JobCount;
+        }
+        Console.WriteLine();
+        Console.WriteLine(FormatStateInfo(total, totFinished, totCalculating) + " | ALL");
+        return totFinished == total ? EXIT_OK : EXIT_WAITING;
+      }
+    }
+
+    private static void GetStats(List<LightweightTask> tasks, out int completed, out int failed, out int running, out int paused) {
+      completed = tasks.Count(x => x.State == TaskState.Finished);
+      failed = tasks.Count(x => x.State == TaskState.Failed || x.State == TaskState.Aborted);
+      running = tasks.Count(x => x.State == TaskState.Calculating || x.State == TaskState.Transferring
+|| x.State == TaskState.Waiting);
+      paused = tasks.Count(x => x.State == TaskState.Paused);
+    }
+
+    private static string FormatStateInfo(int total, int finished, int calculating) {
+      var state = finished == total ? "DONE" : "CALC";
+      return string.Join(" ", new object[] { state
+        , "CALC=" + calculating.ToString().PadRight(4)
+        , "DONE=" + finished.ToString().PadRight(4) });
+    }
+
+    private static string FormatStateInfo(int total, int finished, int failed, int calculating, int paused) {
+      var state = finished == total ? "DONE" : failed > 0 ? "FAIL" : calculating > 0 ? "CALC" : paused > 0 ? "PAUS" : "NDEF";
+      return string.Join(" ", new object[] { state
+        , "CALC=" + calculating.ToString().PadRight(4)
+        , "DONE=" + finished.ToString().PadRight(4)
+        , "FAIL=" + failed.ToString().PadRight(4)
+        , "PAUS=" + paused.ToString().PadRight(4) });
+    }
+
+    private static string Truncate(string text, int length) {
+      if (text.Length <= length) return text;
+      return text.Substring(0, length - 3) + "...";
+    }
+  }
+}
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Properties/AssemblyInfo.cs
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Properties/AssemblyInfo.cs	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/Properties/AssemblyInfo.cs	(revision 15921)
@@ -0,0 +1,36 @@
+﻿using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HiveStatus")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("HiveStatus")]
+[assembly: AssemblyCopyright("Copyright ©  2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components.  If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("e5faa64a-cde0-4932-8813-4f1ac041d8a4")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
Index: /misc/tools/HeuristicLab.HiveDrain/HiveStatus/packages.config
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveStatus/packages.config	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveStatus/packages.config	(revision 15921)
@@ -0,0 +1,4 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="CommandLineParser" version="2.2.1" targetFramework="net45" />
+</packages>
Index: /misc/tools/HeuristicLab.HiveDrain/HiveTools.sln
===================================================================
--- /misc/tools/HeuristicLab.HiveDrain/HiveTools.sln	(revision 15921)
+++ /misc/tools/HeuristicLab.HiveDrain/HiveTools.sln	(revision 15921)
@@ -0,0 +1,31 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.27428.2011
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveDrain", "HeuristicLab.HiveDrain\HeuristicLab.HiveDrain.csproj", "{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HiveStatus", "HiveStatus\HiveStatus.csproj", "{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F032B48F-9D2B-4A58-818A-91FD00BD7C9B}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E5FAA64A-CDE0-4932-8813-4F1AC041D8A4}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {6A8BCBC8-1AD0-49E8-A326-9574328CDC1E}
+	EndGlobalSection
+EndGlobal
