Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLab.Clients.Hive.Administration-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLab.Clients.Hive.Administration-3.4.csproj	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLab.Clients.Hive.Administration-3.4.csproj	(revision 6373)
@@ -0,0 +1,277 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Clients.Hive.Administration</RootNamespace>
+    <AssemblyName>HeuristicLab.Clients.Hive.Administration-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <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' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Calendar.DayView">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\Calendar.DayView.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimizer-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Views\HiveAdministrationView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\HiveAdministrationView.Designer.cs">
+      <DependentUpon>HiveAdministrationView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\HiveAppointment.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Views\MenuItems\AdministrationMenuItem.cs" />
+    <Compile Include="Views\Recurrence.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Views\Recurrence.Designer.cs">
+      <DependentUpon>Recurrence.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\RecurrentEvent.cs" />
+    <Compile Include="Views\ResourcesView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ResourcesView.Designer.cs">
+      <DependentUpon>ResourcesView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\ScheduleView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\ScheduleView.Designer.cs">
+      <DependentUpon>ScheduleView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\SlaveView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\SlaveView.Designer.cs">
+      <DependentUpon>SlaveView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabClientsHiveAdministrationPlugin.cs" />
+    <Compile Include="Views\Common\UpdateControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\Common\UpdateControl.Designer.cs">
+      <DependentUpon>UpdateControl.cs</DependentUpon>
+    </Compile>
+    <None Include="HeuristicLabClientsHiveAdministrationPlugin.cs.frame" />
+    <Compile Include="HiveAdministrationClient.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.ExperimentManager\3.4\HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj">
+      <Project>{DBFD7205-61AF-40EF-8776-3052DEF91CF3}</Project>
+      <Name>HeuristicLab.Clients.Hive.ExperimentManager-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.Views\3.4\HeuristicLab.Clients.Hive.Views-3.4.csproj">
+      <Project>{E1D6C801-892A-406A-B606-F158E36DD3C3}</Project>
+      <Name>HeuristicLab.Clients.Hive.Views-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj">
+      <Project>{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}</Project>
+      <Name>HeuristicLab.Clients.Hive-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.ExtLibs\HeuristicLab.DayView\1.0\HeuristicLab.DayView-1.0.csproj">
+      <Project>{02766ECC-D0F5-4115-9ECA-47409167B638}</Project>
+      <Name>HeuristicLab.DayView-1.0</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
+      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
+      <Name>HeuristicLab.Hive-3.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\HiveAdministrationView.resx">
+      <DependentUpon>HiveAdministrationView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\Recurrence.resx">
+      <DependentUpon>Recurrence.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\ResourcesView.resx">
+      <DependentUpon>ResourcesView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\ScheduleView.resx">
+      <DependentUpon>ScheduleView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\SlaveView.resx">
+      <DependentUpon>SlaveView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\Common\UpdateControl.resx">
+      <DependentUpon>UpdateControl.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Views\Images\Monitor.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Views\Images\network_center.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="Views\Images\status_anim.gif" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLabClientsHiveAdministrationPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLabClientsHiveAdministrationPlugin.cs.frame	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HeuristicLabClientsHiveAdministrationPlugin.cs.frame	(revision 6373)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Administration {
+  [Plugin("HeuristicLab.Clients.Hive.Administration", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Clients.Hive.Administration-3.4.dll", PluginFileType.Assembly)]
+  public class HeuristicLabClientsHiveAdministrationPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HiveAdministrationClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HiveAdministrationClient.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/HiveAdministrationClient.cs	(revision 6373)
@@ -0,0 +1,59 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Hive.Administration {
+  [Item("Hive Administration", "Hive Administration")]
+  public class HiveAdministrationClient : Item {
+    public List<SlaveGroup> SlaveGroups;
+    public List<Slave> Slaves;
+    public List<string> Users;
+    public List<HiveExperiment> Experiments;
+
+
+    public HiveAdministrationClient() {
+      UpdateSlaveGroups();
+      Users = new List<string>();
+      Users.Add("Mr. White");
+      Users.Add("Mr. Pink");
+      Users.Add("Mr. Blue");
+    }
+
+    protected HiveAdministrationClient(HiveAdministrationClient original, Cloner cloner)
+      : base(original, cloner) {
+      //TODO: clone
+    }
+    public override IDeepCloneable Clone(HeuristicLab.Common.Cloner cloner) {
+      return new HiveAdministrationClient(this, cloner);
+    }
+
+    public void UpdateSlaveGroups() {
+      ServiceLocator.Instance.CallHiveService(service => {
+        SlaveGroups = new List<SlaveGroup>(service.GetSlaveGroups());
+        Slaves = new List<Slave>(service.GetSlaves());
+        Experiments = new List<HiveExperiment>(service.GetAllHiveExperiments());
+      });
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.Designer.cs	(revision 6373)
@@ -0,0 +1,70 @@
+﻿namespace HeuristicLab.Clients.Hive.Administration.Views.Common {
+  partial class UpdateControl {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateControl));
+      this.btnRefresh = new System.Windows.Forms.Button();
+      this.imgBoxProgress = new System.Windows.Forms.PictureBox();
+      ((System.ComponentModel.ISupportInitialize)(this.imgBoxProgress)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // btnRefresh
+      // 
+      this.btnRefresh.Image = ((System.Drawing.Image)(resources.GetObject("btnRefresh.Image")));
+      this.btnRefresh.Location = new System.Drawing.Point(0, 0);
+      this.btnRefresh.Name = "btnRefresh";
+      this.btnRefresh.Size = new System.Drawing.Size(24, 24);
+      this.btnRefresh.TabIndex = 4;
+      this.btnRefresh.UseVisualStyleBackColor = true;
+      this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
+      // 
+      // imgBoxProgress
+      // 
+      this.imgBoxProgress.Image = global::HeuristicLab.Clients.Hive.Views.HiveImageLibrary.Progress;
+      this.imgBoxProgress.Location = new System.Drawing.Point(26, 6);
+      this.imgBoxProgress.Name = "imgBoxProgress";
+      this.imgBoxProgress.Size = new System.Drawing.Size(48, 12);
+      this.imgBoxProgress.TabIndex = 5;
+      this.imgBoxProgress.TabStop = false;
+      this.imgBoxProgress.Visible = false;
+      // 
+      // UpdateControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.imgBoxProgress);
+      this.Controls.Add(this.btnRefresh);
+      this.Name = "UpdateControl";
+      this.Size = new System.Drawing.Size(75, 24);
+      ((System.ComponentModel.ISupportInitialize)(this.imgBoxProgress)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button btnRefresh;
+    private System.Windows.Forms.PictureBox imgBoxProgress;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.cs	(revision 6373)
@@ -0,0 +1,27 @@
+﻿using System;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views.Common {
+  public partial class UpdateControl : UserControl {
+    public UpdateControl() {
+      InitializeComponent();
+    }
+
+    public Action UpdateAction { get; set; }
+
+    private void PrivUpdateAction() {
+      UpdateAction();
+      imgBoxProgress.Invoke(new MethodInvoker(() => imgBoxProgress.Visible = false));
+    }
+
+    private void btnRefresh_Click(object sender, EventArgs e) {
+      if (UpdateAction != null) {
+        imgBoxProgress.Visible = true;
+        Action action = new Action(PrivUpdateAction);
+        Task task = new Task(action);
+        task.Start();
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Common/UpdateControl.resx	(revision 6373)
@@ -0,0 +1,182 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="btnRefresh.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.Designer.cs	(revision 6373)
@@ -0,0 +1,439 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.Hive.Administration.Views.Common;
+using HeuristicLab.Clients.Hive.ExperimentManager.Views;
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  partial class HiveAdministrationView {
+    private System.Windows.Forms.TabControl tabAdmin;
+    private System.Windows.Forms.TabPage tabUsers;
+
+    #region Component Designer generated code
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.tabAdmin = new System.Windows.Forms.TabControl();
+      this.tabSlaves = new System.Windows.Forms.TabPage();
+      this.resourcesView = new ResourcesView();
+      this.tabUsers = new System.Windows.Forms.TabPage();
+      this.splitUsers = new System.Windows.Forms.SplitContainer();
+      this.lstUsers = new System.Windows.Forms.ListView();
+      this.imageListUsers = new System.Windows.Forms.ImageList(this.components);
+      this.tabUserDetails = new System.Windows.Forms.TabControl();
+      this.tabUserInformation = new System.Windows.Forms.TabPage();
+      this.txtUserName = new System.Windows.Forms.TextBox();
+      this.txtUserLastActivity = new System.Windows.Forms.TextBox();
+      this.txtUserRole = new System.Windows.Forms.TextBox();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtUserEmail = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.txtUserPriority = new System.Windows.Forms.TextBox();
+      this.label3 = new System.Windows.Forms.Label();
+      this.txtUserCalculatedJobs = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.txtUserExecutionTime = new System.Windows.Forms.TextBox();
+      this.label6 = new System.Windows.Forms.Label();
+      this.label8 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.tabUserJobs = new System.Windows.Forms.TabPage();
+      this.updateControl2 = new UpdateControl();
+      this.hiveExperimentManagerView = new HiveExperimentManagerView();
+      this.tabStatistics = new System.Windows.Forms.TabPage();
+      this.label5 = new System.Windows.Forms.Label();
+      this.tabAdmin.SuspendLayout();
+      this.tabSlaves.SuspendLayout();
+      this.tabUsers.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitUsers)).BeginInit();
+      this.splitUsers.Panel1.SuspendLayout();
+      this.splitUsers.Panel2.SuspendLayout();
+      this.splitUsers.SuspendLayout();
+      this.tabUserDetails.SuspendLayout();
+      this.tabUserInformation.SuspendLayout();
+      this.tabUserJobs.SuspendLayout();
+      this.tabStatistics.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabAdmin
+      // 
+      this.tabAdmin.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabAdmin.Controls.Add(this.tabSlaves);
+      this.tabAdmin.Controls.Add(this.tabUsers);
+      this.tabAdmin.Controls.Add(this.tabStatistics);
+      this.tabAdmin.Location = new System.Drawing.Point(3, 0);
+      this.tabAdmin.Name = "tabAdmin";
+      this.tabAdmin.SelectedIndex = 0;
+      this.tabAdmin.Size = new System.Drawing.Size(742, 546);
+      this.tabAdmin.TabIndex = 0;
+      // 
+      // tabSlaves
+      // 
+      this.tabSlaves.Controls.Add(this.resourcesView);
+      this.tabSlaves.Location = new System.Drawing.Point(4, 22);
+      this.tabSlaves.Name = "tabSlaves";
+      this.tabSlaves.Padding = new System.Windows.Forms.Padding(3);
+      this.tabSlaves.Size = new System.Drawing.Size(734, 520);
+      this.tabSlaves.TabIndex = 3;
+      this.tabSlaves.Text = "Slaves";
+      this.tabSlaves.UseVisualStyleBackColor = true;
+      // 
+      // resourcesView
+      // 
+      this.resourcesView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.resourcesView.Caption = "ResourcesView";
+      this.resourcesView.Content = null;
+      this.resourcesView.Location = new System.Drawing.Point(0, 0);
+      this.resourcesView.Name = "resourcesView";
+      this.resourcesView.ReadOnly = false;
+      this.resourcesView.Size = new System.Drawing.Size(734, 520);
+      this.resourcesView.TabIndex = 0;
+      // 
+      // tabUsers
+      // 
+      this.tabUsers.Controls.Add(this.splitUsers);
+      this.tabUsers.Location = new System.Drawing.Point(4, 22);
+      this.tabUsers.Name = "tabUsers";
+      this.tabUsers.Padding = new System.Windows.Forms.Padding(3);
+      this.tabUsers.Size = new System.Drawing.Size(734, 520);
+      this.tabUsers.TabIndex = 1;
+      this.tabUsers.Text = "Users";
+      this.tabUsers.UseVisualStyleBackColor = true;
+      // 
+      // splitUsers
+      // 
+      this.splitUsers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitUsers.Location = new System.Drawing.Point(3, 6);
+      this.splitUsers.Name = "splitUsers";
+      // 
+      // splitUsers.Panel1
+      // 
+      this.splitUsers.Panel1.Controls.Add(this.lstUsers);
+      // 
+      // splitUsers.Panel2
+      // 
+      this.splitUsers.Panel2.Controls.Add(this.tabUserDetails);
+      this.splitUsers.Size = new System.Drawing.Size(722, 508);
+      this.splitUsers.SplitterDistance = 215;
+      this.splitUsers.TabIndex = 0;
+      // 
+      // lstUsers
+      // 
+      this.lstUsers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lstUsers.Location = new System.Drawing.Point(3, 4);
+      this.lstUsers.Name = "lstUsers";
+      this.lstUsers.Size = new System.Drawing.Size(209, 501);
+      this.lstUsers.SmallImageList = this.imageListUsers;
+      this.lstUsers.TabIndex = 0;
+      this.lstUsers.UseCompatibleStateImageBehavior = false;
+      this.lstUsers.View = System.Windows.Forms.View.List;
+      // 
+      // imageListUsers
+      // 
+      this.imageListUsers.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+      this.imageListUsers.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageListUsers.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // tabUserDetails
+      // 
+      this.tabUserDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabUserDetails.Controls.Add(this.tabUserInformation);
+      this.tabUserDetails.Controls.Add(this.tabUserJobs);
+      this.tabUserDetails.Location = new System.Drawing.Point(3, 3);
+      this.tabUserDetails.Name = "tabUserDetails";
+      this.tabUserDetails.SelectedIndex = 0;
+      this.tabUserDetails.Size = new System.Drawing.Size(496, 501);
+      this.tabUserDetails.TabIndex = 1;
+      // 
+      // tabUserInformation
+      // 
+      this.tabUserInformation.Controls.Add(this.txtUserName);
+      this.tabUserInformation.Controls.Add(this.txtUserLastActivity);
+      this.tabUserInformation.Controls.Add(this.txtUserRole);
+      this.tabUserInformation.Controls.Add(this.label1);
+      this.tabUserInformation.Controls.Add(this.txtUserEmail);
+      this.tabUserInformation.Controls.Add(this.label2);
+      this.tabUserInformation.Controls.Add(this.txtUserPriority);
+      this.tabUserInformation.Controls.Add(this.label3);
+      this.tabUserInformation.Controls.Add(this.txtUserCalculatedJobs);
+      this.tabUserInformation.Controls.Add(this.label4);
+      this.tabUserInformation.Controls.Add(this.txtUserExecutionTime);
+      this.tabUserInformation.Controls.Add(this.label6);
+      this.tabUserInformation.Controls.Add(this.label8);
+      this.tabUserInformation.Controls.Add(this.label7);
+      this.tabUserInformation.Location = new System.Drawing.Point(4, 22);
+      this.tabUserInformation.Name = "tabUserInformation";
+      this.tabUserInformation.Padding = new System.Windows.Forms.Padding(3);
+      this.tabUserInformation.Size = new System.Drawing.Size(488, 475);
+      this.tabUserInformation.TabIndex = 0;
+      this.tabUserInformation.Text = "User Information";
+      this.tabUserInformation.UseVisualStyleBackColor = true;
+      // 
+      // txtUserName
+      // 
+      this.txtUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserName.Location = new System.Drawing.Point(163, 14);
+      this.txtUserName.Name = "txtUserName";
+      this.txtUserName.Size = new System.Drawing.Size(319, 20);
+      this.txtUserName.TabIndex = 17;
+      this.txtUserName.Text = "ascheibe";
+      // 
+      // txtUserLastActivity
+      // 
+      this.txtUserLastActivity.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserLastActivity.Location = new System.Drawing.Point(163, 40);
+      this.txtUserLastActivity.Name = "txtUserLastActivity";
+      this.txtUserLastActivity.Size = new System.Drawing.Size(319, 20);
+      this.txtUserLastActivity.TabIndex = 16;
+      this.txtUserLastActivity.Text = "11.1.2010";
+      // 
+      // txtUserRole
+      // 
+      this.txtUserRole.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserRole.Location = new System.Drawing.Point(163, 66);
+      this.txtUserRole.Name = "txtUserRole";
+      this.txtUserRole.Size = new System.Drawing.Size(319, 20);
+      this.txtUserRole.TabIndex = 15;
+      this.txtUserRole.Text = "Hive Slave";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(15, 21);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(58, 13);
+      this.label1.TabIndex = 0;
+      this.label1.Text = "User name";
+      // 
+      // txtUserEmail
+      // 
+      this.txtUserEmail.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserEmail.Location = new System.Drawing.Point(163, 92);
+      this.txtUserEmail.Name = "txtUserEmail";
+      this.txtUserEmail.Size = new System.Drawing.Size(319, 20);
+      this.txtUserEmail.TabIndex = 14;
+      this.txtUserEmail.Text = "ascheibe@mail.com";
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(15, 47);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(64, 13);
+      this.label2.TabIndex = 1;
+      this.label2.Text = "Last Activity";
+      // 
+      // txtUserPriority
+      // 
+      this.txtUserPriority.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserPriority.Location = new System.Drawing.Point(163, 118);
+      this.txtUserPriority.Name = "txtUserPriority";
+      this.txtUserPriority.Size = new System.Drawing.Size(319, 20);
+      this.txtUserPriority.TabIndex = 13;
+      this.txtUserPriority.Text = "10";
+      // 
+      // label3
+      // 
+      this.label3.AutoSize = true;
+      this.label3.Location = new System.Drawing.Point(15, 73);
+      this.label3.Name = "label3";
+      this.label3.Size = new System.Drawing.Size(29, 13);
+      this.label3.TabIndex = 2;
+      this.label3.Text = "Role";
+      // 
+      // txtUserCalculatedJobs
+      // 
+      this.txtUserCalculatedJobs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserCalculatedJobs.Location = new System.Drawing.Point(163, 144);
+      this.txtUserCalculatedJobs.Name = "txtUserCalculatedJobs";
+      this.txtUserCalculatedJobs.Size = new System.Drawing.Size(319, 20);
+      this.txtUserCalculatedJobs.TabIndex = 12;
+      this.txtUserCalculatedJobs.Text = "125";
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(15, 99);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(32, 13);
+      this.label4.TabIndex = 3;
+      this.label4.Text = "Email";
+      // 
+      // txtUserExecutionTime
+      // 
+      this.txtUserExecutionTime.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtUserExecutionTime.Location = new System.Drawing.Point(163, 170);
+      this.txtUserExecutionTime.Name = "txtUserExecutionTime";
+      this.txtUserExecutionTime.Size = new System.Drawing.Size(319, 20);
+      this.txtUserExecutionTime.TabIndex = 11;
+      this.txtUserExecutionTime.Text = "15d 3h 5m";
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(15, 125);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(63, 13);
+      this.label6.TabIndex = 8;
+      this.label6.Text = "User Priority";
+      // 
+      // label8
+      // 
+      this.label8.AutoSize = true;
+      this.label8.Location = new System.Drawing.Point(15, 177);
+      this.label8.Name = "label8";
+      this.label8.Size = new System.Drawing.Size(116, 13);
+      this.label8.TabIndex = 10;
+      this.label8.Text = "Overall Execution Time";
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(15, 151);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(82, 13);
+      this.label7.TabIndex = 9;
+      this.label7.Text = "Calculated Jobs";
+      // 
+      // tabUserJobs
+      // 
+      this.tabUserJobs.Controls.Add(this.updateControl2);
+      this.tabUserJobs.Controls.Add(this.hiveExperimentManagerView);
+      this.tabUserJobs.Location = new System.Drawing.Point(4, 22);
+      this.tabUserJobs.Name = "tabUserJobs";
+      this.tabUserJobs.Padding = new System.Windows.Forms.Padding(3);
+      this.tabUserJobs.Size = new System.Drawing.Size(488, 475);
+      this.tabUserJobs.TabIndex = 1;
+      this.tabUserJobs.Text = "Experiments";
+      this.tabUserJobs.UseVisualStyleBackColor = true;
+      // 
+      // updateControl2
+      // 
+      this.updateControl2.Location = new System.Drawing.Point(7, 4);
+      this.updateControl2.Name = "updateControl2";
+      this.updateControl2.Size = new System.Drawing.Size(75, 24);
+      this.updateControl2.TabIndex = 1;
+      this.updateControl2.UpdateAction = null;
+      // 
+      // hiveExperimentManagerView
+      // 
+      this.hiveExperimentManagerView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.hiveExperimentManagerView.Caption = "HiveExperimentManagerBaseView";
+      this.hiveExperimentManagerView.Content = null;
+      this.hiveExperimentManagerView.Location = new System.Drawing.Point(4, 26);
+      this.hiveExperimentManagerView.Name = "hiveExperimentManagerView";
+      this.hiveExperimentManagerView.ReadOnly = false;
+      this.hiveExperimentManagerView.Size = new System.Drawing.Size(484, 449);
+      this.hiveExperimentManagerView.TabIndex = 0;
+      // 
+      // tabStatistics
+      // 
+      this.tabStatistics.Controls.Add(this.label5);
+      this.tabStatistics.Location = new System.Drawing.Point(4, 22);
+      this.tabStatistics.Name = "tabStatistics";
+      this.tabStatistics.Padding = new System.Windows.Forms.Padding(3);
+      this.tabStatistics.Size = new System.Drawing.Size(734, 520);
+      this.tabStatistics.TabIndex = 2;
+      this.tabStatistics.Text = "Statistics";
+      this.tabStatistics.UseVisualStyleBackColor = true;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(141, 221);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(386, 13);
+      this.label5.TabIndex = 0;
+      this.label5.Text = "Show some global statistics, e.g. Overall execution time, nr of calculated jobs, " +
+          "....";
+      // 
+      // HiveAdministrationView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabAdmin);
+      this.Name = "HiveAdministrationView";
+      this.Size = new System.Drawing.Size(745, 546);
+      this.Load += new System.EventHandler(this.HiveAdministrationView_Load);
+      this.tabAdmin.ResumeLayout(false);
+      this.tabSlaves.ResumeLayout(false);
+      this.tabUsers.ResumeLayout(false);
+      this.splitUsers.Panel1.ResumeLayout(false);
+      this.splitUsers.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitUsers)).EndInit();
+      this.splitUsers.ResumeLayout(false);
+      this.tabUserDetails.ResumeLayout(false);
+      this.tabUserInformation.ResumeLayout(false);
+      this.tabUserInformation.PerformLayout();
+      this.tabUserJobs.ResumeLayout(false);
+      this.tabStatistics.ResumeLayout(false);
+      this.tabStatistics.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitUsers;
+    private System.Windows.Forms.ListView lstUsers;
+    private System.Windows.Forms.Label label3;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.TabPage tabStatistics;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label8;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.TextBox txtUserName;
+    private System.Windows.Forms.TextBox txtUserLastActivity;
+    private System.Windows.Forms.TextBox txtUserRole;
+    private System.Windows.Forms.TextBox txtUserEmail;
+    private System.Windows.Forms.TextBox txtUserPriority;
+    private System.Windows.Forms.TextBox txtUserCalculatedJobs;
+    private System.Windows.Forms.TextBox txtUserExecutionTime;
+    private System.Windows.Forms.TabControl tabUserDetails;
+    private System.Windows.Forms.TabPage tabUserInformation;
+    private System.Windows.Forms.TabPage tabUserJobs;
+    private HiveExperimentManagerView hiveExperimentManagerView;
+    private System.ComponentModel.IContainer components;
+    private System.Windows.Forms.ImageList imageListUsers;
+    private UpdateControl updateControl2;
+    private System.Windows.Forms.TabPage tabSlaves;
+    private ResourcesView resourcesView;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.cs	(revision 6373)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  [View("HiveAdministrationView")]
+  [Content(typeof(HiveAdministrationClient), IsDefaultView = true)]
+  public partial class HiveAdministrationView : ItemView {
+    public new HiveAdministrationClient Content {
+      get { return (HiveAdministrationClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HiveAdministrationView() {
+      InitializeComponent();
+    }
+
+    #region Register Content Events
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers on the Content here
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers on the Content here
+    }
+    #endregion
+
+    private void UpdateResources() {
+      IItemList<Resource> resources = new ItemList<Resource>();
+
+      foreach (SlaveGroup g in Content.SlaveGroups) {
+        resources.Add(g);
+      }
+      foreach (Slave g in Content.Slaves) {
+        resources.Add(g);
+      }
+      resourcesView.Content = resources;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        resourcesView.Content = null;
+
+      } else {
+        //updateSlaveGroups.UpdateAction = new Action(Content.UpdateSlaveGroups);  //??
+        UpdateResources();
+
+        ShowUsers();
+      }
+    }
+
+    private void ShowUsers() {
+      lstUsers.SmallImageList.Images.Add(HeuristicLab.Common.Resources.VSImageLibrary.User);
+
+      foreach (string user in Content.Users) {
+        ListViewItem lvi = new ListViewItem();
+        lvi.Tag = user;
+        lvi.Text = user;
+        lvi.ImageIndex = 0;
+        lstUsers.Items.Add(lvi);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Put code here to enable or disable controls based on whether the Content is/not null or the view is ReadOnly
+    }
+
+    private void HiveAdministrationView_Load(object sender, System.EventArgs e) {
+      if (Content != null) {
+
+      }
+    }
+
+    #region Event Handlers
+    // TODO: Put event handlers here
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAdministrationView.resx	(revision 6373)
@@ -0,0 +1,123 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageListUsers.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>46, 23</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAppointment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAppointment.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/HiveAppointment.cs	(revision 6373)
@@ -0,0 +1,135 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Xml.Serialization;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+
+  public class HiveAppointment : Calendar.Appointment {
+    private Guid recurringId = Guid.Empty;
+
+    [XmlIgnore]
+    public bool Changed { get; set; }
+
+    public HiveAppointment()
+      : base() {
+      Changed = false;
+    }
+
+    [XmlIgnore]
+    public int Layer {
+      get { return base.Layer; }
+      set { base.Layer = value; }
+    }
+
+    [XmlIgnore]
+    public string Group {
+      get { return base.Group; }
+      set { base.Group = value; }
+    }
+
+    [XmlAttribute("Locked")]
+    public bool Locked {
+      get { return base.Locked; }
+      set { base.Locked = value; }
+    }
+
+    [XmlIgnore]
+    public Color Color {
+      get { return base.Color; }
+      set { base.Color = value; }
+    }
+
+    [XmlIgnore]
+    public Color TextColor {
+      get { return base.TextColor; }
+      set { base.TextColor = value; }
+    }
+
+    [XmlIgnore]
+    public Color BorderColor {
+      get { return base.BorderColor; }
+      set { base.BorderColor = value; }
+    }
+
+    [XmlIgnore]
+    public bool DrawBorder {
+      get { return base.DrawBorder; }
+      set { base.DrawBorder = value; }
+    }
+
+    [XmlAttribute("AllDayEvent")]
+    public bool AllDayEvent {
+      get { return base.AllDayEvent; }
+      set { base.AllDayEvent = value; Changed = true; }
+    }
+
+    [XmlAttribute("Recurring")]
+    public bool Recurring {
+      get { return base.Recurring; }
+      set { base.Recurring = value; Changed = true; }
+    }
+
+    [XmlAttribute("RecurringId")]
+    public Guid RecurringId {
+      get { return recurringId; }
+      set { recurringId = value; Changed = true; }
+    }
+
+    [XmlAttribute("EndDate")]
+    public DateTime EndDate {
+      get { return base.EndDate; }
+      set { base.EndDate = value; Changed = true; }
+    }
+
+    [XmlAttribute("StartDate")]
+    public DateTime StartDate {
+      get { return base.StartDate; }
+      set { base.StartDate = value; Changed = true; }
+    }
+
+    [XmlIgnore]
+    public int AppointmentId {
+      get { return base.AppointmentId; }
+      set { base.AppointmentId = value; }
+    }
+
+    [XmlElement("Subject")]
+    public string Subject {
+      get { return base.Subject; }
+      set { base.Subject = value; }
+    }
+
+    [XmlIgnore]
+    public string Location {
+      get { return base.Location; }
+      set { base.Location = value; }
+    }
+
+    [XmlIgnore]
+    public string Note {
+      get { return base.Note; }
+      set { base.Note = value; }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/MenuItems/AdministrationMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/MenuItems/AdministrationMenuItem.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/MenuItems/AdministrationMenuItem.cs	(revision 6373)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Clients.Hive.Administration;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimizer.MenuItems {
+  public class AdministrationMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&Administration (dev)"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&Hive" }; }
+    }
+    public override void Execute() {
+      MainFormManager.MainForm.ShowContent(new HiveAdministrationClient());
+    }
+    public override int Position {
+      get { return 10000; }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.Designer.cs	(revision 6373)
@@ -0,0 +1,313 @@
+﻿namespace HeuristicLab.Clients.Hive.Administration.Views {
+  partial class Recurrence {
+    /// <summary>
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary>
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Windows Form Designer generated code
+
+    /// <summary>
+    /// Required method for Designer support - do not modify
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.gbAppointment = new System.Windows.Forms.GroupBox();
+      this.chbade = new System.Windows.Forms.CheckBox();
+      this.dtpEnd = new System.Windows.Forms.DateTimePicker();
+      this.dtpToTime = new System.Windows.Forms.DateTimePicker();
+      this.label5 = new System.Windows.Forms.Label();
+      this.dtpStart = new System.Windows.Forms.DateTimePicker();
+      this.dtpFromTime = new System.Windows.Forms.DateTimePicker();
+      this.label6 = new System.Windows.Forms.Label();
+      this.txtDays = new System.Windows.Forms.TextBox();
+      this.label4 = new System.Windows.Forms.Label();
+      this.label7 = new System.Windows.Forms.Label();
+      this.btSaveRecurrence = new System.Windows.Forms.Button();
+      this.btCancelRecurrence = new System.Windows.Forms.Button();
+      this.gbWeekly = new System.Windows.Forms.GroupBox();
+      this.cbSunday = new System.Windows.Forms.CheckBox();
+      this.cbSaturday = new System.Windows.Forms.CheckBox();
+      this.cbFriday = new System.Windows.Forms.CheckBox();
+      this.cbThursday = new System.Windows.Forms.CheckBox();
+      this.cbWednesday = new System.Windows.Forms.CheckBox();
+      this.cbTuesday = new System.Windows.Forms.CheckBox();
+      this.cbMonday = new System.Windows.Forms.CheckBox();
+      this.gbAppointment.SuspendLayout();
+      this.gbWeekly.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // gbAppointment
+      // 
+      this.gbAppointment.Controls.Add(this.chbade);
+      this.gbAppointment.Controls.Add(this.dtpEnd);
+      this.gbAppointment.Controls.Add(this.dtpToTime);
+      this.gbAppointment.Controls.Add(this.label5);
+      this.gbAppointment.Controls.Add(this.dtpStart);
+      this.gbAppointment.Controls.Add(this.dtpFromTime);
+      this.gbAppointment.Controls.Add(this.label6);
+      this.gbAppointment.Location = new System.Drawing.Point(2, 2);
+      this.gbAppointment.Name = "gbAppointment";
+      this.gbAppointment.Size = new System.Drawing.Size(386, 109);
+      this.gbAppointment.TabIndex = 39;
+      this.gbAppointment.TabStop = false;
+      this.gbAppointment.Text = "Appointment";
+      // 
+      // chbade
+      // 
+      this.chbade.AutoSize = true;
+      this.chbade.Location = new System.Drawing.Point(113, 86);
+      this.chbade.Name = "chbade";
+      this.chbade.Size = new System.Drawing.Size(90, 17);
+      this.chbade.TabIndex = 39;
+      this.chbade.Text = "All Day Event";
+      this.chbade.UseVisualStyleBackColor = true;
+      // 
+      // dtpEnd
+      // 
+      this.dtpEnd.Format = System.Windows.Forms.DateTimePickerFormat.Short;
+      this.dtpEnd.Location = new System.Drawing.Point(113, 56);
+      this.dtpEnd.Name = "dtpEnd";
+      this.dtpEnd.Size = new System.Drawing.Size(91, 20);
+      this.dtpEnd.TabIndex = 29;
+      // 
+      // dtpToTime
+      // 
+      this.dtpToTime.CustomFormat = "HH:00";
+      this.dtpToTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpToTime.Location = new System.Drawing.Point(226, 56);
+      this.dtpToTime.Name = "dtpToTime";
+      this.dtpToTime.ShowUpDown = true;
+      this.dtpToTime.Size = new System.Drawing.Size(73, 20);
+      this.dtpToTime.TabIndex = 38;
+      // 
+      // label5
+      // 
+      this.label5.AutoSize = true;
+      this.label5.Location = new System.Drawing.Point(58, 60);
+      this.label5.Name = "label5";
+      this.label5.Size = new System.Drawing.Size(55, 13);
+      this.label5.TabIndex = 27;
+      this.label5.Text = "End Date:";
+      // 
+      // dtpStart
+      // 
+      this.dtpStart.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpStart.Location = new System.Drawing.Point(113, 19);
+      this.dtpStart.Name = "dtpStart";
+      this.dtpStart.Size = new System.Drawing.Size(89, 20);
+      this.dtpStart.TabIndex = 28;
+      // 
+      // dtpFromTime
+      // 
+      this.dtpFromTime.CustomFormat = "HH:00";
+      this.dtpFromTime.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpFromTime.Location = new System.Drawing.Point(226, 19);
+      this.dtpFromTime.Name = "dtpFromTime";
+      this.dtpFromTime.ShowUpDown = true;
+      this.dtpFromTime.Size = new System.Drawing.Size(73, 20);
+      this.dtpFromTime.TabIndex = 30;
+      // 
+      // label6
+      // 
+      this.label6.AutoSize = true;
+      this.label6.Location = new System.Drawing.Point(58, 23);
+      this.label6.Name = "label6";
+      this.label6.Size = new System.Drawing.Size(58, 13);
+      this.label6.TabIndex = 25;
+      this.label6.Text = "Start Date:";
+      // 
+      // txtDays
+      // 
+      this.txtDays.Location = new System.Drawing.Point(160, 13);
+      this.txtDays.Name = "txtDays";
+      this.txtDays.Size = new System.Drawing.Size(30, 20);
+      this.txtDays.TabIndex = 24;
+      this.txtDays.Text = "1";
+      this.txtDays.Visible = false;
+      // 
+      // label4
+      // 
+      this.label4.AutoSize = true;
+      this.label4.Location = new System.Drawing.Point(120, 16);
+      this.label4.Name = "label4";
+      this.label4.Size = new System.Drawing.Size(34, 13);
+      this.label4.TabIndex = 23;
+      this.label4.Text = "Every";
+      this.label4.Visible = false;
+      // 
+      // label7
+      // 
+      this.label7.AutoSize = true;
+      this.label7.Location = new System.Drawing.Point(196, 16);
+      this.label7.Name = "label7";
+      this.label7.Size = new System.Drawing.Size(59, 13);
+      this.label7.TabIndex = 25;
+      this.label7.Text = "week(s) on";
+      this.label7.Visible = false;
+      // 
+      // btSaveRecurrence
+      // 
+      this.btSaveRecurrence.Location = new System.Drawing.Point(2, 217);
+      this.btSaveRecurrence.Name = "btSaveRecurrence";
+      this.btSaveRecurrence.Size = new System.Drawing.Size(147, 23);
+      this.btSaveRecurrence.TabIndex = 43;
+      this.btSaveRecurrence.Text = "Save";
+      this.btSaveRecurrence.UseVisualStyleBackColor = true;
+      this.btSaveRecurrence.Click += new System.EventHandler(this.btSaveRecurrence_Click);
+      // 
+      // btCancelRecurrence
+      // 
+      this.btCancelRecurrence.Location = new System.Drawing.Point(241, 217);
+      this.btCancelRecurrence.Name = "btCancelRecurrence";
+      this.btCancelRecurrence.Size = new System.Drawing.Size(147, 23);
+      this.btCancelRecurrence.TabIndex = 44;
+      this.btCancelRecurrence.Text = "Cancel";
+      this.btCancelRecurrence.UseVisualStyleBackColor = true;
+      this.btCancelRecurrence.Click += new System.EventHandler(this.btCancelRecurrence_Click);
+      // 
+      // gbWeekly
+      // 
+      this.gbWeekly.Controls.Add(this.label7);
+      this.gbWeekly.Controls.Add(this.cbSunday);
+      this.gbWeekly.Controls.Add(this.txtDays);
+      this.gbWeekly.Controls.Add(this.cbSaturday);
+      this.gbWeekly.Controls.Add(this.cbFriday);
+      this.gbWeekly.Controls.Add(this.cbThursday);
+      this.gbWeekly.Controls.Add(this.label4);
+      this.gbWeekly.Controls.Add(this.cbWednesday);
+      this.gbWeekly.Controls.Add(this.cbTuesday);
+      this.gbWeekly.Controls.Add(this.cbMonday);
+      this.gbWeekly.Location = new System.Drawing.Point(2, 111);
+      this.gbWeekly.Name = "gbWeekly";
+      this.gbWeekly.Size = new System.Drawing.Size(386, 100);
+      this.gbWeekly.TabIndex = 42;
+      this.gbWeekly.TabStop = false;
+      this.gbWeekly.Text = "Days of week";
+      // 
+      // cbSunday
+      // 
+      this.cbSunday.AutoSize = true;
+      this.cbSunday.Location = new System.Drawing.Point(199, 65);
+      this.cbSunday.Name = "cbSunday";
+      this.cbSunday.Size = new System.Drawing.Size(62, 17);
+      this.cbSunday.TabIndex = 6;
+      this.cbSunday.Text = "Sunday";
+      this.cbSunday.UseVisualStyleBackColor = true;
+      // 
+      // cbSaturday
+      // 
+      this.cbSaturday.AutoSize = true;
+      this.cbSaturday.Location = new System.Drawing.Point(122, 65);
+      this.cbSaturday.Name = "cbSaturday";
+      this.cbSaturday.Size = new System.Drawing.Size(68, 17);
+      this.cbSaturday.TabIndex = 5;
+      this.cbSaturday.Text = "Saturday";
+      this.cbSaturday.UseVisualStyleBackColor = true;
+      // 
+      // cbFriday
+      // 
+      this.cbFriday.AutoSize = true;
+      this.cbFriday.Location = new System.Drawing.Point(37, 65);
+      this.cbFriday.Name = "cbFriday";
+      this.cbFriday.Size = new System.Drawing.Size(54, 17);
+      this.cbFriday.TabIndex = 4;
+      this.cbFriday.Text = "Friday";
+      this.cbFriday.UseVisualStyleBackColor = true;
+      // 
+      // cbThursday
+      // 
+      this.cbThursday.AutoSize = true;
+      this.cbThursday.Location = new System.Drawing.Point(289, 40);
+      this.cbThursday.Name = "cbThursday";
+      this.cbThursday.Size = new System.Drawing.Size(70, 17);
+      this.cbThursday.TabIndex = 3;
+      this.cbThursday.Text = "Thursday";
+      this.cbThursday.UseVisualStyleBackColor = true;
+      // 
+      // cbWednesday
+      // 
+      this.cbWednesday.AutoSize = true;
+      this.cbWednesday.Location = new System.Drawing.Point(199, 42);
+      this.cbWednesday.Name = "cbWednesday";
+      this.cbWednesday.Size = new System.Drawing.Size(86, 17);
+      this.cbWednesday.TabIndex = 2;
+      this.cbWednesday.Text = "Wednesday ";
+      this.cbWednesday.UseVisualStyleBackColor = true;
+      // 
+      // cbTuesday
+      // 
+      this.cbTuesday.AutoSize = true;
+      this.cbTuesday.Location = new System.Drawing.Point(123, 42);
+      this.cbTuesday.Name = "cbTuesday";
+      this.cbTuesday.Size = new System.Drawing.Size(67, 17);
+      this.cbTuesday.TabIndex = 1;
+      this.cbTuesday.Text = "Tuesday";
+      this.cbTuesday.UseVisualStyleBackColor = true;
+      // 
+      // cbMonday
+      // 
+      this.cbMonday.AutoSize = true;
+      this.cbMonday.Location = new System.Drawing.Point(37, 42);
+      this.cbMonday.Name = "cbMonday";
+      this.cbMonday.Size = new System.Drawing.Size(64, 17);
+      this.cbMonday.TabIndex = 0;
+      this.cbMonday.Text = "Monday";
+      this.cbMonday.UseVisualStyleBackColor = true;
+      // 
+      // Recurrence
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.ClientSize = new System.Drawing.Size(393, 243);
+      this.Controls.Add(this.gbWeekly);
+      this.Controls.Add(this.btCancelRecurrence);
+      this.Controls.Add(this.btSaveRecurrence);
+      this.Controls.Add(this.gbAppointment);
+      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+      this.Name = "Recurrence";
+      this.Text = "Recurrence";
+      this.gbAppointment.ResumeLayout(false);
+      this.gbAppointment.PerformLayout();
+      this.gbWeekly.ResumeLayout(false);
+      this.gbWeekly.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.GroupBox gbAppointment;
+    private System.Windows.Forms.TextBox txtDays;
+    private System.Windows.Forms.Label label4;
+    private System.Windows.Forms.DateTimePicker dtpEnd;
+    private System.Windows.Forms.DateTimePicker dtpStart;
+    private System.Windows.Forms.Label label5;
+    private System.Windows.Forms.Label label6;
+    private System.Windows.Forms.Label label7;
+    private System.Windows.Forms.Button btSaveRecurrence;
+    private System.Windows.Forms.Button btCancelRecurrence;
+    private System.Windows.Forms.DateTimePicker dtpFromTime;
+    private System.Windows.Forms.DateTimePicker dtpToTime;
+    private System.Windows.Forms.CheckBox chbade;
+    private System.Windows.Forms.GroupBox gbWeekly;
+    private System.Windows.Forms.CheckBox cbSunday;
+    private System.Windows.Forms.CheckBox cbSaturday;
+    private System.Windows.Forms.CheckBox cbFriday;
+    private System.Windows.Forms.CheckBox cbThursday;
+    private System.Windows.Forms.CheckBox cbWednesday;
+    private System.Windows.Forms.CheckBox cbTuesday;
+    private System.Windows.Forms.CheckBox cbMonday;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.cs	(revision 6373)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+
+  public enum RecurrenceMode {
+    Daily,
+    Weekly
+  }
+
+  public partial class Recurrence : Form {
+
+    public ScheduleView.OnDialogClosedDelegate dialogClosedDelegate;
+
+    public Recurrence() {
+      InitializeComponent();
+    }
+
+    private void btCancelRecurrence_Click(object sender, EventArgs e) {
+      this.Close();
+    }
+
+    private void btSaveRecurrence_Click(object sender, EventArgs e) {
+      DateTime dateFrom, dateTo;
+      RecurrenceMode mode = RecurrenceMode.Daily;
+      int incWeek = 0;
+      HashSet<DayOfWeek> days = new HashSet<DayOfWeek>();
+
+      days = GetDays();
+
+      //check if valid
+      if (InputIsValid()) {
+        //set entity
+
+        dateFrom = DateTime.Parse(dtpStart.Text + " " + dtpFromTime.Text);
+        dateTo = DateTime.Parse(dtpEnd.Text + " " + dtpToTime.Text);
+
+        if (int.TryParse(txtDays.Text, out incWeek))
+          mode = RecurrenceMode.Weekly;
+        else
+          mode = RecurrenceMode.Daily;
+
+        RecurrentEvent recurrentEvent = new RecurrentEvent() {
+          DateFrom = dateFrom,
+          DateTo = dateTo,
+          AllDay = chbade.Checked,
+          WeekDays = days,
+          IncWeeks = incWeek,
+        };
+
+        //fire delegate and close the dialog
+        dialogClosedDelegate(recurrentEvent);
+        this.Close();
+      } else
+        MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+    }
+
+    private HashSet<DayOfWeek> GetDays() {
+      HashSet<DayOfWeek> days = new HashSet<DayOfWeek>();
+
+      if (cbMonday.Checked)
+        days.Add(DayOfWeek.Monday);
+      if (cbTuesday.Checked)
+        days.Add(DayOfWeek.Tuesday);
+      if (cbWednesday.Checked)
+        days.Add(DayOfWeek.Wednesday);
+      if (cbThursday.Checked)
+        days.Add(DayOfWeek.Thursday);
+      if (cbFriday.Checked)
+        days.Add(DayOfWeek.Friday);
+      if (cbSaturday.Checked)
+        days.Add(DayOfWeek.Saturday);
+      if (cbSunday.Checked)
+        days.Add(DayOfWeek.Sunday);
+
+      return days;
+    }
+
+    private bool InputIsValid() {
+      DateTime dateFrom, dateTo;
+      int i = 0;
+
+      dateFrom = DateTime.Parse(dtpStart.Text + " " + dtpFromTime.Text);
+      dateTo = DateTime.Parse(dtpEnd.Text + " " + dtpToTime.Text);
+
+      if (dateFrom < dateTo && dateFrom.TimeOfDay < dateTo.TimeOfDay && int.TryParse(txtDays.Text, out i))
+        return true;
+      else
+        return false;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/Recurrence.resx	(revision 6373)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/RecurrentEvent.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/RecurrentEvent.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/RecurrentEvent.cs	(revision 6373)
@@ -0,0 +1,33 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  public class RecurrentEvent {
+    public DateTime DateFrom { get; set; }
+    public DateTime DateTo { get; set; }
+    public bool AllDay { get; set; }
+    public int IncWeeks { get; set; }
+    public HashSet<DayOfWeek> WeekDays { get; set; }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.Designer.cs	(revision 6373)
@@ -0,0 +1,305 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.Hive.Administration.Views.Common;
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  partial class ResourcesView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ResourcesView));
+      this.imageListSlaveGroups = new System.Windows.Forms.ImageList(this.components);
+      this.splitSlaves = new System.Windows.Forms.SplitContainer();
+      this.btnSave = new System.Windows.Forms.Button();
+      this.btnRemoveGroup = new System.Windows.Forms.Button();
+      this.btnAddGroup = new System.Windows.Forms.Button();
+      this.treeSlaveGroup = new System.Windows.Forms.TreeView();
+      this.tabSlaveGroup = new System.Windows.Forms.TabControl();
+      this.tabDetails = new System.Windows.Forms.TabPage();
+      this.tabSchedule = new System.Windows.Forms.TabPage();
+      this.tabJobs = new System.Windows.Forms.TabPage();
+      this.updateSlaveGroup = new UpdateControl();
+      this.slaveView = new SlaveView();
+      this.updateScheduleControl = new UpdateControl();
+      this.scheduleView = new ScheduleView();
+      this.updateJobs = new UpdateControl();
+      this.hiveJobListViewSlaves = new HeuristicLab.Clients.Hive.Views.HiveJobListView();
+      ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).BeginInit();
+      this.splitSlaves.Panel1.SuspendLayout();
+      this.splitSlaves.Panel2.SuspendLayout();
+      this.splitSlaves.SuspendLayout();
+      this.tabSlaveGroup.SuspendLayout();
+      this.tabDetails.SuspendLayout();
+      this.tabSchedule.SuspendLayout();
+      this.tabJobs.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // imageListSlaveGroups
+      // 
+      this.imageListSlaveGroups.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
+      this.imageListSlaveGroups.ImageSize = new System.Drawing.Size(16, 16);
+      this.imageListSlaveGroups.TransparentColor = System.Drawing.Color.Transparent;
+      // 
+      // splitSlaves
+      // 
+      this.splitSlaves.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitSlaves.Location = new System.Drawing.Point(3, 3);
+      this.splitSlaves.Name = "splitSlaves";
+      // 
+      // splitSlaves.Panel1
+      // 
+      this.splitSlaves.Panel1.Controls.Add(this.updateSlaveGroup);
+      this.splitSlaves.Panel1.Controls.Add(this.btnSave);
+      this.splitSlaves.Panel1.Controls.Add(this.btnRemoveGroup);
+      this.splitSlaves.Panel1.Controls.Add(this.btnAddGroup);
+      this.splitSlaves.Panel1.Controls.Add(this.treeSlaveGroup);
+      // 
+      // splitSlaves.Panel2
+      // 
+      this.splitSlaves.Panel2.Controls.Add(this.tabSlaveGroup);
+      this.splitSlaves.Size = new System.Drawing.Size(847, 547);
+      this.splitSlaves.SplitterDistance = 249;
+      this.splitSlaves.TabIndex = 3;
+      // 
+      // btnSave
+      // 
+      this.btnSave.Image = ((System.Drawing.Image)(resources.GetObject("btnSave.Image")));
+      this.btnSave.Location = new System.Drawing.Point(63, 3);
+      this.btnSave.Name = "btnSave";
+      this.btnSave.Size = new System.Drawing.Size(24, 24);
+      this.btnSave.TabIndex = 5;
+      this.btnSave.UseVisualStyleBackColor = true;
+      this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+      // 
+      // btnRemoveGroup
+      // 
+      this.btnRemoveGroup.Image = ((System.Drawing.Image)(resources.GetObject("btnRemoveGroup.Image")));
+      this.btnRemoveGroup.Location = new System.Drawing.Point(33, 3);
+      this.btnRemoveGroup.Name = "btnRemoveGroup";
+      this.btnRemoveGroup.Size = new System.Drawing.Size(24, 24);
+      this.btnRemoveGroup.TabIndex = 2;
+      this.btnRemoveGroup.UseVisualStyleBackColor = true;
+      this.btnRemoveGroup.Click += new System.EventHandler(this.btnRemoveGroup_Click);
+      // 
+      // btnAddGroup
+      // 
+      this.btnAddGroup.Image = ((System.Drawing.Image)(resources.GetObject("btnAddGroup.Image")));
+      this.btnAddGroup.Location = new System.Drawing.Point(3, 3);
+      this.btnAddGroup.Name = "btnAddGroup";
+      this.btnAddGroup.Size = new System.Drawing.Size(24, 24);
+      this.btnAddGroup.TabIndex = 1;
+      this.btnAddGroup.UseVisualStyleBackColor = true;
+      this.btnAddGroup.Click += new System.EventHandler(this.btnAddGroup_Click);
+      // 
+      // treeSlaveGroup
+      // 
+      this.treeSlaveGroup.AllowDrop = true;
+      this.treeSlaveGroup.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.treeSlaveGroup.ImageIndex = 0;
+      this.treeSlaveGroup.ImageList = this.imageListSlaveGroups;
+      this.treeSlaveGroup.Location = new System.Drawing.Point(3, 33);
+      this.treeSlaveGroup.Name = "treeSlaveGroup";
+      this.treeSlaveGroup.SelectedImageIndex = 0;
+      this.treeSlaveGroup.Size = new System.Drawing.Size(243, 511);
+      this.treeSlaveGroup.TabIndex = 0;
+      this.treeSlaveGroup.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeSlaveGroup_ItemDrag);
+      this.treeSlaveGroup.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeSlaveGroup_NodeMouseClick);
+      this.treeSlaveGroup.DragDrop += new System.Windows.Forms.DragEventHandler(this.treeSlaveGroup_DragDrop);
+      this.treeSlaveGroup.DragEnter += new System.Windows.Forms.DragEventHandler(this.treeSlaveGroup_DragEnter);
+      this.treeSlaveGroup.DragOver += new System.Windows.Forms.DragEventHandler(this.treeSlaveGroup_DragOver);
+      this.treeSlaveGroup.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.treeSlaveGroup_QueryContinueDrag);
+      // 
+      // tabSlaveGroup
+      // 
+      this.tabSlaveGroup.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabSlaveGroup.Controls.Add(this.tabDetails);
+      this.tabSlaveGroup.Controls.Add(this.tabSchedule);
+      this.tabSlaveGroup.Controls.Add(this.tabJobs);
+      this.tabSlaveGroup.Location = new System.Drawing.Point(3, 3);
+      this.tabSlaveGroup.Name = "tabSlaveGroup";
+      this.tabSlaveGroup.SelectedIndex = 0;
+      this.tabSlaveGroup.Size = new System.Drawing.Size(585, 541);
+      this.tabSlaveGroup.TabIndex = 1;
+      // 
+      // tabDetails
+      // 
+      this.tabDetails.Controls.Add(this.slaveView);
+      this.tabDetails.Location = new System.Drawing.Point(4, 22);
+      this.tabDetails.Name = "tabDetails";
+      this.tabDetails.Padding = new System.Windows.Forms.Padding(3);
+      this.tabDetails.Size = new System.Drawing.Size(577, 515);
+      this.tabDetails.TabIndex = 0;
+      this.tabDetails.Text = "Details";
+      this.tabDetails.UseVisualStyleBackColor = true;
+      // 
+      // tabSchedule
+      // 
+      this.tabSchedule.Controls.Add(this.updateScheduleControl);
+      this.tabSchedule.Controls.Add(this.scheduleView);
+      this.tabSchedule.Location = new System.Drawing.Point(4, 22);
+      this.tabSchedule.Name = "tabSchedule";
+      this.tabSchedule.Padding = new System.Windows.Forms.Padding(3);
+      this.tabSchedule.Size = new System.Drawing.Size(577, 515);
+      this.tabSchedule.TabIndex = 1;
+      this.tabSchedule.Text = "Schedule";
+      this.tabSchedule.UseVisualStyleBackColor = true;
+      // 
+      // tabJobs
+      // 
+      this.tabJobs.Controls.Add(this.updateJobs);
+      this.tabJobs.Controls.Add(this.hiveJobListViewSlaves);
+      this.tabJobs.Location = new System.Drawing.Point(4, 22);
+      this.tabJobs.Name = "tabJobs";
+      this.tabJobs.Padding = new System.Windows.Forms.Padding(3);
+      this.tabJobs.Size = new System.Drawing.Size(577, 515);
+      this.tabJobs.TabIndex = 2;
+      this.tabJobs.Text = "Jobs";
+      this.tabJobs.UseVisualStyleBackColor = true;
+      // 
+      // updateSlaveGroup
+      // 
+      this.updateSlaveGroup.Location = new System.Drawing.Point(94, 3);
+      this.updateSlaveGroup.Name = "updateSlaveGroup";
+      this.updateSlaveGroup.Size = new System.Drawing.Size(75, 24);
+      this.updateSlaveGroup.TabIndex = 6;
+      this.updateSlaveGroup.UpdateAction = null;
+      // 
+      // slaveView
+      // 
+      this.slaveView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.slaveView.Caption = "SlaveView";
+      this.slaveView.Content = null;
+      this.slaveView.Location = new System.Drawing.Point(7, 7);
+      this.slaveView.Name = "slaveView";
+      this.slaveView.ReadOnly = false;
+      this.slaveView.Size = new System.Drawing.Size(564, 210);
+      this.slaveView.TabIndex = 0;
+      // 
+      // updateScheduleControl
+      // 
+      this.updateScheduleControl.Location = new System.Drawing.Point(6, 6);
+      this.updateScheduleControl.Name = "updateScheduleControl";
+      this.updateScheduleControl.Size = new System.Drawing.Size(75, 24);
+      this.updateScheduleControl.TabIndex = 5;
+      this.updateScheduleControl.UpdateAction = null;
+      // 
+      // scheduleView
+      // 
+      this.scheduleView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.scheduleView.Caption = "ScheduleView";
+      this.scheduleView.Content = null;
+      this.scheduleView.Location = new System.Drawing.Point(3, 36);
+      this.scheduleView.Name = "scheduleView";
+      this.scheduleView.ReadOnly = false;
+      this.scheduleView.ResourceId = new System.Guid("00000000-0000-0000-0000-000000000000");
+      this.scheduleView.Size = new System.Drawing.Size(568, 473);
+      this.scheduleView.TabIndex = 0;
+      // 
+      // updateJobs
+      // 
+      this.updateJobs.Location = new System.Drawing.Point(7, 3);
+      this.updateJobs.Name = "updateJobs";
+      this.updateJobs.Size = new System.Drawing.Size(75, 24);
+      this.updateJobs.TabIndex = 1;
+      this.updateJobs.UpdateAction = null;
+      // 
+      // hiveJobListViewSlaves
+      // 
+      this.hiveJobListViewSlaves.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.hiveJobListViewSlaves.Caption = "JobItemList View";
+      this.hiveJobListViewSlaves.Content = null;
+      this.hiveJobListViewSlaves.Location = new System.Drawing.Point(7, 26);
+      this.hiveJobListViewSlaves.Name = "hiveJobListViewSlaves";
+      this.hiveJobListViewSlaves.ReadOnly = false;
+      this.hiveJobListViewSlaves.Size = new System.Drawing.Size(573, 557);
+      this.hiveJobListViewSlaves.TabIndex = 0;
+      // 
+      // ResourcesView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitSlaves);
+      this.Name = "ResourcesView";
+      this.Size = new System.Drawing.Size(853, 553);
+      this.splitSlaves.Panel1.ResumeLayout(false);
+      this.splitSlaves.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).EndInit();
+      this.splitSlaves.ResumeLayout(false);
+      this.tabSlaveGroup.ResumeLayout(false);
+      this.tabDetails.ResumeLayout(false);
+      this.tabSchedule.ResumeLayout(false);
+      this.tabJobs.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitSlaves;
+    private System.Windows.Forms.Button btnRemoveGroup;
+    private System.Windows.Forms.Button btnAddGroup;
+    private System.Windows.Forms.TreeView treeSlaveGroup;
+    private System.Windows.Forms.TabControl tabSlaveGroup;
+    private System.Windows.Forms.TabPage tabDetails;
+    private System.Windows.Forms.TabPage tabSchedule;
+    private System.Windows.Forms.TabPage tabJobs;
+    private UpdateControl updateJobs;
+    private HeuristicLab.Clients.Hive.Views.HiveJobListView hiveJobListViewSlaves;
+    private SlaveView slaveView;
+    private System.Windows.Forms.ImageList imageListSlaveGroups;
+    private ScheduleView scheduleView;
+    private UpdateControl updateScheduleControl;
+    private System.Windows.Forms.Button btnSave;
+    private UpdateControl updateSlaveGroup;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.cs	(revision 6373)
@@ -0,0 +1,260 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Clients.Hive.Views;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  [View("ResourcesView")]
+  [Content(typeof(IItemList<Resource>), IsDefaultView = true)]
+  public partial class ResourcesView : ItemView {
+    public new IItemList<Resource> Content {
+      get { return (IItemList<Resource>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ResourcesView() {
+      InitializeComponent();
+      treeSlaveGroup.ImageList.Images.Add(HiveImageLibrary.Slave);
+      treeSlaveGroup.ImageList.Images.Add(HiveImageLibrary.SlaveGroup);
+      updateScheduleControl.UpdateAction = new Action(UpdateSchedule);
+      updateSlaveGroup.UpdateAction = new Action(UpdateSlaveGroups);
+    }
+
+    #region Register Content Events
+    protected override void DeregisterContentEvents() {
+      Content.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Resource>>(Content_ItemsAdded);
+      Content.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Resource>>(Content_ItemsRemoved);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Resource>>(Content_ItemsAdded);
+      Content.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<Collections.IndexedItem<Resource>>(Content_ItemsRemoved);
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        slaveView.Content = null;
+        treeSlaveGroup.Nodes.Clear();
+      } else {
+        treeSlaveGroup.Nodes.Clear();
+
+        //rebuild
+        TreeNode ungrp = new TreeNode("UNGROUPED");
+        ungrp.ImageIndex = treeSlaveGroup.ImageList.Images.Count - 1;
+        ungrp.SelectedImageIndex = ungrp.ImageIndex;
+        var newGroup = new SlaveGroup();
+        newGroup.Name = "UNGROUPED";
+        newGroup.Id = Guid.NewGuid();
+        newGroup.Description = "Contains slaves which are in no group";
+        ungrp.Tag = newGroup;
+
+        foreach (Resource g in Content) {
+          if (g.GetType() == typeof(SlaveGroup)) {
+            TreeNode tn = new TreeNode();
+            tn.ImageIndex = treeSlaveGroup.ImageList.Images.Count - 1;
+            tn.SelectedImageIndex = tn.ImageIndex;
+
+            tn.Tag = g;
+            tn.Text = g.Name;
+            foreach (Resource r in Content.Where(s => s.ParentResourceId != null && s.ParentResourceId == g.Id)) {
+              var stn = new TreeNode(r.Name);
+              stn.ImageIndex = 0;
+              stn.SelectedImageIndex = stn.ImageIndex;
+              stn.Tag = r;
+              tn.Nodes.Add(stn);
+            }
+            treeSlaveGroup.Nodes.Add(tn);
+
+          } else if (g.GetType() == typeof(Slave)) {
+            if (g.ParentResourceId == null) {
+              var stn = new TreeNode(g.Name);
+              stn.ImageIndex = 0;
+              stn.SelectedImageIndex = stn.ImageIndex;
+              stn.Tag = g;
+              ungrp.Nodes.Add(stn);
+            }
+          }
+        }
+        treeSlaveGroup.Nodes.Add(ungrp);
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Put code here to enable or disable controls based on whether the Content is/not null or the view is ReadOnly
+    }
+
+    private void treeSlaveGroup_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
+      if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
+        slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
+      }
+
+      slaveView.Content = (Resource)e.Node.Tag;
+
+      if (e.Node.Tag.GetType() == typeof(Slave)) {
+        scheduleView.ResourceId = ((Slave)e.Node.Tag).Id;
+      } else if (e.Node.Tag is SlaveGroup) {
+        slaveView.Content.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
+      }
+    }
+
+    void SlaveViewContent_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {
+      OnContentChanged();
+    }
+
+    private void btnAddGroup_Click(object sender, EventArgs e) {
+      SlaveGroup newGroup = new SlaveGroup();
+      newGroup.Name = "New Group";
+      Content.Add(newGroup);
+    }
+
+    void Content_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Resource>> e) {
+      OnContentChanged();
+    }
+
+    void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<Resource>> e) {
+      OnContentChanged();
+    }
+
+    private void btnRemoveGroup_Click(object sender, EventArgs e) {
+      //TODO: display some warning?
+      if (treeSlaveGroup.SelectedNode != null && treeSlaveGroup.SelectedNode.Tag != null) {
+        Resource res = (Resource)treeSlaveGroup.SelectedNode.Tag;
+        Content.Remove(res);
+
+        if (res is Slave) {
+          ServiceLocator.Instance.CallHiveService(service => service.DeleteSlave(res.Id));
+        } else if (res is SlaveGroup) {
+          //only delete empty groups
+          if (Content.Where(s => s.ParentResourceId == res.Id).Count() < 0) {
+            ServiceLocator.Instance.CallHiveService(service => service.DeleteSlaveGroup(res.Id));
+          } else {
+            MessageBox.Show("Only empty groups can be deleted.");
+          }
+        }
+      }
+    }
+
+    private void btnSave_Click(object sender, EventArgs e) {
+      foreach (Resource res in Content) {
+        if (res is SlaveGroup && res.Id == Guid.Empty) {
+          SlaveGroup slaveGroup = (SlaveGroup)res;
+          ServiceLocator.Instance.CallHiveService(service => service.AddSlaveGroup(slaveGroup));
+        }
+        if (res.Id != Guid.Empty && res.Modified) {
+          if (res is SlaveGroup) {
+            ServiceLocator.Instance.CallHiveService(service => service.UpdateSlaveGroup((SlaveGroup)res));
+          } else if (res is Slave) {
+            ServiceLocator.Instance.CallHiveService(service => service.UpdateSlave((Slave)res));
+          }
+        }
+      }
+    }
+
+    private void treeSlaveGroup_DragDrop(object sender, DragEventArgs e) {
+      if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false)) {
+        Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
+        TreeNode destNode = ((TreeView)sender).GetNodeAt(pt);
+        TreeNode newNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
+
+        if (destNode.TreeView == newNode.TreeView) {
+          SlaveGroup sgrp = null;
+          if (destNode.Tag != null && destNode.Tag is SlaveGroup) {
+            sgrp = (SlaveGroup)destNode.Tag;
+          }
+          if (destNode.Parent != null && destNode.Parent.Tag is SlaveGroup) {
+            sgrp = (SlaveGroup)destNode.Parent.Tag;
+          }
+
+          if (sgrp != null) {
+            if (newNode.Tag != null && newNode.Tag is Slave) {
+              Slave slave = (Slave)newNode.Tag;
+              if (slave.ParentResourceId != sgrp.Id) {
+                slave.ParentResourceId = sgrp.Id;
+                OnContentChanged();
+              }
+            }
+          }
+        }
+      }
+    }
+
+    private void treeSlaveGroup_ItemDrag(object sender, ItemDragEventArgs e) {
+      TreeNode sourceNode = (TreeNode)e.Item;
+      DoDragDrop(sourceNode, DragDropEffects.All);
+    }
+
+    private void treeSlaveGroup_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.Move;
+    }
+
+    private void treeSlaveGroup_DragOver(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.Move;
+    }
+
+    private void treeSlaveGroup_QueryContinueDrag(object sender, QueryContinueDragEventArgs e) {
+      e.Action = DragAction.Continue;
+    }
+
+    void ResetView() {
+      treeSlaveGroup.Nodes.Clear();
+      if (slaveView.Content != null && slaveView.Content is SlaveGroup) {
+        slaveView.Content.PropertyChanged -= new System.ComponentModel.PropertyChangedEventHandler(SlaveViewContent_PropertyChanged);
+      }
+      slaveView.Content = null;
+      scheduleView.ResourceId = Guid.Empty;
+    }
+
+    private void UpdateSlaveGroups() {
+      this.Invoke(new Action(ResetView));
+      Content.Clear();
+      IItemList<Resource> resources = new ItemList<Resource>();
+
+      ServiceLocator.Instance.CallHiveService(service => {
+        service.GetSlaveGroups().ForEach(g => resources.Add(g));
+        service.GetSlaves().ForEach(s => resources.Add(s));
+      });
+      Content = resources;
+    }
+
+    private void UpdateSchedule() {
+      Guid resourceId = scheduleView.ResourceId;
+      if (resourceId != null) {
+        ServiceLocator.Instance.CallHiveService(service => {
+          var appointments = service.GetScheduleForResource(resourceId);
+          ItemList<Appointment> ias = new ItemList<Appointment>();
+          appointments.ForEach(a => ias.Add(a));
+          scheduleView.Invoke(new Action(() => scheduleView.Content = ias));
+        });
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ResourcesView.resx	(revision 6373)
@@ -0,0 +1,302 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="imageListSlaveGroups.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="btnSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        AElFTkSuQmCC
+</value>
+  </data>
+  <data name="btnRemoveGroup.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        w6/9DUORY3pvwx7IAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="btnAddGroup.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        ugHE5lCKcyMAN07j92U5+iMAAAAASUVORK5CYII=
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>71</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.Designer.cs	(revision 6373)
@@ -0,0 +1,269 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  partial class ScheduleView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      Calendar.DrawTool drawTool2 = new Calendar.DrawTool();
+      this.dvOnline = new Calendar.DayView();
+      this.txttimeTo = new System.Windows.Forms.DateTimePicker();
+      this.txttimeFrom = new System.Windows.Forms.DateTimePicker();
+      this.dtpTo = new System.Windows.Forms.DateTimePicker();
+      this.groupBox1 = new System.Windows.Forms.GroupBox();
+      this.dtpFrom = new System.Windows.Forms.DateTimePicker();
+      this.chbade = new System.Windows.Forms.CheckBox();
+      this.btnRecurrence = new System.Windows.Forms.Button();
+      this.btbDelete = new System.Windows.Forms.Button();
+      this.label2 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.btCreate = new System.Windows.Forms.Button();
+      this.btnSaveCal = new System.Windows.Forms.Button();
+      this.btnClearCal = new System.Windows.Forms.Button();
+      this.mcOnline = new System.Windows.Forms.MonthCalendar();
+      this.groupBox1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dvOnline
+      // 
+      drawTool2.DayView = this.dvOnline;
+      this.dvOnline.ActiveTool = drawTool2;
+      this.dvOnline.AmPmDisplay = false;
+      this.dvOnline.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)));
+      this.dvOnline.AppointmentDuration = Calendar.AppointmentSlotDuration.SixtyMinutes;
+      this.dvOnline.AppointmentHeightMode = Calendar.AppHeightDrawMode.TrueHeightAll;
+      this.dvOnline.DayHeadersHeight = 15;
+      this.dvOnline.DaysToShow = 7;
+      this.dvOnline.DrawAllAppBorder = false;
+      this.dvOnline.EnableDurationDisplay = false;
+      this.dvOnline.EnableRoundedCorners = false;
+      this.dvOnline.EnableShadows = false;
+      this.dvOnline.EnableTimeIndicator = false;
+      this.dvOnline.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F);
+      this.dvOnline.Location = new System.Drawing.Point(9, 176);
+      this.dvOnline.MinHalfHourApp = false;
+      this.dvOnline.Name = "dvOnline";
+      this.dvOnline.SelectionEnd = new System.DateTime(((long)(0)));
+      this.dvOnline.SelectionStart = new System.DateTime(((long)(0)));
+      this.dvOnline.Size = new System.Drawing.Size(823, 354);
+      this.dvOnline.StartDate = new System.DateTime(((long)(0)));
+      this.dvOnline.TabIndex = 54;
+      this.dvOnline.OnSelectionChanged += new System.EventHandler<System.EventArgs>(this.dvOnline_OnSelectionChanged);
+      // 
+      // txttimeTo
+      // 
+      this.txttimeTo.CustomFormat = "HH:00";
+      this.txttimeTo.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.txttimeTo.Location = new System.Drawing.Point(164, 45);
+      this.txttimeTo.Name = "txttimeTo";
+      this.txttimeTo.ShowUpDown = true;
+      this.txttimeTo.Size = new System.Drawing.Size(73, 20);
+      this.txttimeTo.TabIndex = 40;
+      // 
+      // txttimeFrom
+      // 
+      this.txttimeFrom.CustomFormat = "HH:00";
+      this.txttimeFrom.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.txttimeFrom.Location = new System.Drawing.Point(164, 12);
+      this.txttimeFrom.Name = "txttimeFrom";
+      this.txttimeFrom.ShowUpDown = true;
+      this.txttimeFrom.Size = new System.Drawing.Size(73, 20);
+      this.txttimeFrom.TabIndex = 39;
+      // 
+      // dtpTo
+      // 
+      this.dtpTo.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpTo.Location = new System.Drawing.Point(72, 45);
+      this.dtpTo.Name = "dtpTo";
+      this.dtpTo.Size = new System.Drawing.Size(89, 20);
+      this.dtpTo.TabIndex = 33;
+      // 
+      // groupBox1
+      // 
+      this.groupBox1.Controls.Add(this.txttimeTo);
+      this.groupBox1.Controls.Add(this.txttimeFrom);
+      this.groupBox1.Controls.Add(this.dtpTo);
+      this.groupBox1.Controls.Add(this.dtpFrom);
+      this.groupBox1.Controls.Add(this.chbade);
+      this.groupBox1.Controls.Add(this.btnRecurrence);
+      this.groupBox1.Controls.Add(this.btbDelete);
+      this.groupBox1.Controls.Add(this.label2);
+      this.groupBox1.Controls.Add(this.label1);
+      this.groupBox1.Controls.Add(this.btCreate);
+      this.groupBox1.Location = new System.Drawing.Point(373, 4);
+      this.groupBox1.Name = "groupBox1";
+      this.groupBox1.Size = new System.Drawing.Size(254, 161);
+      this.groupBox1.TabIndex = 56;
+      this.groupBox1.TabStop = false;
+      // 
+      // dtpFrom
+      // 
+      this.dtpFrom.Format = System.Windows.Forms.DateTimePickerFormat.Custom;
+      this.dtpFrom.Location = new System.Drawing.Point(72, 12);
+      this.dtpFrom.Name = "dtpFrom";
+      this.dtpFrom.Size = new System.Drawing.Size(89, 20);
+      this.dtpFrom.TabIndex = 32;
+      // 
+      // chbade
+      // 
+      this.chbade.AutoSize = true;
+      this.chbade.Location = new System.Drawing.Point(135, 70);
+      this.chbade.Name = "chbade";
+      this.chbade.Size = new System.Drawing.Size(90, 17);
+      this.chbade.TabIndex = 31;
+      this.chbade.Text = "All Day Event";
+      this.chbade.UseVisualStyleBackColor = true;
+      this.chbade.CheckedChanged += new System.EventHandler(this.chbade_CheckedChanged);
+      // 
+      // btnRecurrence
+      // 
+      this.btnRecurrence.Location = new System.Drawing.Point(135, 129);
+      this.btnRecurrence.Name = "btnRecurrence";
+      this.btnRecurrence.Size = new System.Drawing.Size(113, 26);
+      this.btnRecurrence.TabIndex = 30;
+      this.btnRecurrence.Text = "Recurrence";
+      this.btnRecurrence.UseVisualStyleBackColor = true;
+      this.btnRecurrence.Click += new System.EventHandler(this.btnRecurrence_Click);
+      // 
+      // btbDelete
+      // 
+      this.btbDelete.Location = new System.Drawing.Point(8, 129);
+      this.btbDelete.Name = "btbDelete";
+      this.btbDelete.Size = new System.Drawing.Size(114, 26);
+      this.btbDelete.TabIndex = 25;
+      this.btbDelete.Text = "Delete";
+      this.btbDelete.UseVisualStyleBackColor = true;
+      this.btbDelete.Click += new System.EventHandler(this.btbDelete_Click);
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(16, 46);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(55, 13);
+      this.label2.TabIndex = 23;
+      this.label2.Text = "End Time:";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(16, 15);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(58, 13);
+      this.label1.TabIndex = 21;
+      this.label1.Text = "Start Time:";
+      // 
+      // btCreate
+      // 
+      this.btCreate.Location = new System.Drawing.Point(6, 93);
+      this.btCreate.Name = "btCreate";
+      this.btCreate.Size = new System.Drawing.Size(242, 26);
+      this.btCreate.TabIndex = 20;
+      this.btCreate.Text = "Save Appointment";
+      this.btCreate.UseVisualStyleBackColor = true;
+      this.btCreate.Click += new System.EventHandler(this.btCreate_Click);
+      // 
+      // btnSaveCal
+      // 
+      this.btnSaveCal.Location = new System.Drawing.Point(633, 40);
+      this.btnSaveCal.Name = "btnSaveCal";
+      this.btnSaveCal.Size = new System.Drawing.Size(199, 23);
+      this.btnSaveCal.TabIndex = 57;
+      this.btnSaveCal.Text = "Save Calendar";
+      this.btnSaveCal.UseVisualStyleBackColor = true;
+      this.btnSaveCal.Click += new System.EventHandler(this.btnSaveCal_Click);
+      // 
+      // btnClearCal
+      // 
+      this.btnClearCal.Location = new System.Drawing.Point(633, 9);
+      this.btnClearCal.Name = "btnClearCal";
+      this.btnClearCal.Size = new System.Drawing.Size(199, 23);
+      this.btnClearCal.TabIndex = 58;
+      this.btnClearCal.Text = "Clear Calendar";
+      this.btnClearCal.UseVisualStyleBackColor = true;
+      this.btnClearCal.Click += new System.EventHandler(this.btnClearCal_Click);
+      // 
+      // mcOnline
+      // 
+      this.mcOnline.CalendarDimensions = new System.Drawing.Size(2, 1);
+      this.mcOnline.Location = new System.Drawing.Point(4, 9);
+      this.mcOnline.Name = "mcOnline";
+      this.mcOnline.TabIndex = 55;
+      this.mcOnline.DateChanged += new System.Windows.Forms.DateRangeEventHandler(this.mcOnline_DateChanged);
+      // 
+      // ScheduleView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dvOnline);
+      this.Controls.Add(this.groupBox1);
+      this.Controls.Add(this.btnSaveCal);
+      this.Controls.Add(this.btnClearCal);
+      this.Controls.Add(this.mcOnline);
+      this.Name = "ScheduleView";
+      this.Size = new System.Drawing.Size(842, 540);
+      this.groupBox1.ResumeLayout(false);
+      this.groupBox1.PerformLayout();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DateTimePicker txttimeTo;
+    private Calendar.DayView dvOnline;
+    private System.Windows.Forms.DateTimePicker txttimeFrom;
+    private System.Windows.Forms.DateTimePicker dtpTo;
+    private System.Windows.Forms.GroupBox groupBox1;
+    private System.Windows.Forms.DateTimePicker dtpFrom;
+    private System.Windows.Forms.CheckBox chbade;
+    private System.Windows.Forms.Button btnRecurrence;
+    private System.Windows.Forms.Button btbDelete;
+    private System.Windows.Forms.Label label2;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.Button btCreate;
+    private System.Windows.Forms.Button btnSaveCal;
+    private System.Windows.Forms.Button btnClearCal;
+    private System.Windows.Forms.MonthCalendar mcOnline;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.cs	(revision 6373)
@@ -0,0 +1,343 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using System.Xml.Serialization;
+using Calendar;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  [View("ScheduleView")]
+  [Content(typeof(IItemList<Appointment>), IsDefaultView = true)]
+  public partial class ScheduleView : ItemView {
+    public new IItemList<Appointment> Content {
+      get { return (IItemList<Appointment>)base.Content; }
+      set { base.Content = value; }
+    }
+
+    [XmlArray("Appointments")]
+    [XmlArrayItem("HiveAppointment", typeof(HiveAppointment))]
+    public List<HiveAppointment> offlineTimes = new List<HiveAppointment>();
+
+
+    //delegate fired, if a dialog is being closed
+    public delegate void OnDialogClosedDelegate(RecurrentEvent e);
+
+    public Guid ResourceId { get; set; }
+
+    public ScheduleView() {
+      InitializeComponent();
+      InitCalender();
+    }
+
+    private void InitCalender() {
+      dvOnline.StartDate = DateTime.Now;
+      dvOnline.OnNewAppointment += new EventHandler<NewAppointmentEventArgs>(dvOnline_OnNewAppointment);
+      dvOnline.OnResolveAppointments += new EventHandler<ResolveAppointmentsEventArgs>(dvOnline_OnResolveAppointments);
+    }
+
+    private void dvOnline_OnResolveAppointments(object sender, ResolveAppointmentsEventArgs e) {
+      List<HiveAppointment> apps = new List<HiveAppointment>();
+
+      foreach (HiveAppointment app in offlineTimes) {
+        if (app.StartDate >= e.StartDate && app.StartDate <= e.EndDate) {
+          apps.Add(app);
+        }
+      }
+
+      e.Appointments.Clear();
+      foreach (HiveAppointment app in apps) {
+        e.Appointments.Add(app);
+      }
+    }
+
+    private void dvOnline_OnNewAppointment(object sender, NewAppointmentEventArgs e) {
+      HiveAppointment Appointment = new HiveAppointment();
+
+      Appointment.StartDate = e.StartDate;
+      Appointment.EndDate = e.EndDate;
+      offlineTimes.Add(Appointment);
+    }
+
+    private void UpdateCalendarFromContent() {
+      offlineTimes.Clear();
+      foreach (Appointment app in Content) {
+        offlineTimes.Add(new HiveAppointment {
+          AllDayEvent = app.AllDayEvent,
+          EndDate = app.EndDate,
+          StartDate = app.StartDate,
+          Recurring = app.Recurring,
+          RecurringId = app.RecurringId,
+          BorderColor = Color.Red,
+          Locked = true,
+          Subject = "Offline",
+          Changed = false
+        });
+      }
+      dvOnline.Invalidate();
+    }
+
+    private bool CreateAppointment() {
+      DateTime from, to;
+
+      if (!string.IsNullOrEmpty(dtpFrom.Text) && !string.IsNullOrEmpty(dtpTo.Text)) {
+        if (chbade.Checked) {
+          //whole day appointment, only dates are visible
+          if (DateTime.TryParse(dtpFrom.Text, out from) && DateTime.TryParse(dtpTo.Text, out to) && from <= to)
+            offlineTimes.Add(CreateAppointment(from, to.AddDays(1), true));
+          else
+            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        } else if (!string.IsNullOrEmpty(txttimeFrom.Text) && !string.IsNullOrEmpty(txttimeTo.Text)) {
+          //Timeframe appointment
+          if (DateTime.TryParse(dtpFrom.Text + " " + txttimeFrom.Text, out from) && DateTime.TryParse(dtpTo.Text + " " + txttimeTo.Text, out to) && from < to) {
+            if (from.Date == to.Date)
+              offlineTimes.Add(CreateAppointment(from, to, false));
+            else {
+              //more than 1 day selected
+              while (from.Date != to.Date) {
+                offlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
+                from = from.AddDays(1);
+              }
+              offlineTimes.Add(CreateAppointment(from, new DateTime(from.Year, from.Month, from.Day, to.Hour, to.Minute, 0, 0), false));
+            }
+          } else
+            MessageBox.Show("Incorrect date format", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        }
+        dvOnline.Invalidate();
+        return true;
+      } else {
+        MessageBox.Show("Error in create appointment, please fill out all textboxes!", "Schedule Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+        return false;
+      }
+    }
+
+    private HiveAppointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay) {
+      HiveAppointment app = new HiveAppointment();
+      app.StartDate = startDate;
+      app.EndDate = endDate;
+      app.AllDayEvent = allDay;
+      app.BorderColor = Color.Red;
+      app.Locked = true;
+      app.Subject = "Offline";
+      app.Recurring = false;
+      return app;
+    }
+
+    private HiveAppointment CreateAppointment(DateTime startDate, DateTime endDate, bool allDay, bool recurring, Guid recurringId) {
+      HiveAppointment app = new HiveAppointment();
+      app.StartDate = startDate;
+      app.EndDate = endDate;
+      app.AllDayEvent = allDay;
+      app.BorderColor = Color.Red;
+      app.Locked = true;
+      app.Subject = "Offline";
+      app.Recurring = recurring;
+      app.RecurringId = recurringId;
+      return app;
+    }
+
+    private void DeleteRecurringAppointment(Guid recurringId) {
+      offlineTimes.RemoveAll(a => a.RecurringId.ToString() == ((HiveAppointment)dvOnline.SelectedAppointment).RecurringId.ToString());
+    }
+
+    private void ChangeRecurrenceAppointment(Guid recurringId) {
+      int hourfrom = int.Parse(txttimeFrom.Text.Substring(0, txttimeFrom.Text.IndexOf(':')));
+      int hourTo = int.Parse(txttimeTo.Text.Substring(0, txttimeTo.Text.IndexOf(':')));
+      List<HiveAppointment> recurringAppointments = offlineTimes.Where(appointment => ((HiveAppointment)appointment).RecurringId == recurringId).ToList();
+      recurringAppointments.ForEach(appointment => appointment.StartDate = new DateTime(appointment.StartDate.Year, appointment.StartDate.Month, appointment.StartDate.Day, hourfrom, 0, 0));
+      recurringAppointments.ForEach(appointment => appointment.EndDate = new DateTime(appointment.EndDate.Year, appointment.EndDate.Month, appointment.EndDate.Day, hourTo, 0, 0));
+
+      DeleteRecurringAppointment(recurringId);
+      offlineTimes.AddRange(recurringAppointments);
+    }
+
+    public void DialogClosed(RecurrentEvent e) {
+      CreateDailyRecurrenceAppointments(e.DateFrom, e.DateTo, e.AllDay, e.IncWeeks, e.WeekDays);
+    }
+
+    private void CreateDailyRecurrenceAppointments(DateTime dateFrom, DateTime dateTo, bool allDay, int incWeek, HashSet<DayOfWeek> daysOfWeek) {
+      DateTime incDate = dateFrom;
+      Guid guid = Guid.NewGuid();
+
+      while (incDate.Date <= dateTo.Date) {
+        if (daysOfWeek.Contains(incDate.Date.DayOfWeek))
+          offlineTimes.Add(CreateAppointment(incDate, new DateTime(incDate.Year, incDate.Month, incDate.Day, dateTo.Hour, dateTo.Minute, 0), allDay, true, guid));
+        incDate = incDate.AddDays(1);
+      }
+
+      dvOnline.Invalidate();
+    }
+
+    private void btbDelete_Click(object sender, EventArgs e) {
+      HiveAppointment selectedAppointment = (HiveAppointment)dvOnline.SelectedAppointment;
+      if (dvOnline.SelectedAppointment != null) {
+        if (!selectedAppointment.Recurring)
+          DeleteAppointment();
+        else {
+          DialogResult res = MessageBox.Show("Delete all events in this series?", "Delete recurrences", MessageBoxButtons.YesNo);
+          if (res != DialogResult.Yes)
+            DeleteAppointment();
+          else
+            DeleteRecurringAppointment(selectedAppointment.RecurringId);
+        }
+      }
+      dvOnline.Invalidate();
+    }
+
+    private void DeleteAppointment() {
+      offlineTimes.Remove((HiveAppointment)dvOnline.SelectedAppointment);
+    }
+
+    #region Register Content Events
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers on the Content here
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers on the Content here
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Put code here when content is null
+      } else {
+        UpdateCalendarFromContent();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Put code here to enable or disable controls based on whether the Content is/not null or the view is ReadOnly
+    }
+
+    private void btnClearCal_Click(object sender, System.EventArgs e) {
+      offlineTimes.Clear();
+    }
+
+    private void chbade_CheckedChanged(object sender, EventArgs e) {
+      txttimeFrom.Visible = !chbade.Checked;
+      txttimeTo.Visible = !chbade.Checked;
+    }
+
+    private void dvOnline_OnSelectionChanged(object sender, EventArgs e) {
+      //btCreate.Enabled = true;
+      if (dvOnline.Selection == SelectionType.DateRange) {
+        dtpFrom.Text = dvOnline.SelectionStart.ToShortDateString();
+        dtpTo.Text = dvOnline.SelectionEnd.Date.ToShortDateString();
+        txttimeFrom.Text = dvOnline.SelectionStart.ToShortTimeString();
+        txttimeTo.Text = dvOnline.SelectionEnd.ToShortTimeString();
+
+        btCreate.Text = "Save";
+      }
+
+      if (dvOnline.Selection == SelectionType.Appointment) {
+
+        dtpFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortDateString();
+        dtpTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortDateString();
+        txttimeFrom.Text = dvOnline.SelectedAppointment.StartDate.ToShortTimeString();
+        txttimeTo.Text = dvOnline.SelectedAppointment.EndDate.ToShortTimeString();
+
+        if (dvOnline.SelectedAppointment.Recurring)
+          //btCreate.Enabled = false;
+          //also change the caption of the save button
+          btCreate.Text = "Save changes";
+      }
+
+      if (dvOnline.Selection == SelectionType.None) {
+        //also change the caption of the save button
+        btCreate.Text = "Save";
+      }
+    }
+
+    private void mcOnline_DateChanged(object sender, DateRangeEventArgs e) {
+      dvOnline.StartDate = mcOnline.SelectionStart;
+    }
+
+    private void btCreate_Click(object sender, EventArgs e) {
+      if (dvOnline.Selection != SelectionType.Appointment) {
+        CreateAppointment();
+      } else {
+        //now we want to change an existing appointment
+        if (!dvOnline.SelectedAppointment.Recurring) {
+          if (CreateAppointment())
+            DeleteAppointment();
+        } else {
+          //change recurring appointment
+          //check, if only selected appointment has to change or whole recurrence
+          DialogResult res = MessageBox.Show("Change all events in this series?", "Change recurrences", MessageBoxButtons.YesNo);
+          if (res != DialogResult.Yes) {
+            if (CreateAppointment())
+              DeleteAppointment();
+          } else
+            ChangeRecurrenceAppointment(((HiveAppointment)dvOnline.SelectedAppointment).RecurringId);
+        }
+      }
+      dvOnline.Invalidate();
+    }
+
+    private void btnRecurrence_Click(object sender, EventArgs e) {
+      Recurrence recurrence = new Recurrence();
+      recurrence.dialogClosedDelegate = new OnDialogClosedDelegate(this.DialogClosed);
+      recurrence.Show();
+    }
+
+    private void btnSaveCal_Click(object sender, EventArgs e) {
+      List<Appointment> appointments = new List<Appointment>();
+      foreach (HiveAppointment app in offlineTimes) {
+        if (app.Changed) {
+          Appointment apdto = new Appointment {
+            AllDayEvent = app.AllDayEvent,
+            EndDate = app.EndDate,
+            Recurring = app.Recurring,
+            RecurringId = app.RecurringId,
+            StartDate = app.StartDate,
+            ResourceId = ResourceId
+          };
+          appointments.Add(apdto);
+        }
+      }
+
+      if (appointments.Count > 0) {
+        //TODO: find a sane way to do this
+        ServiceLocator.Instance.CallHiveService(service => {
+          foreach (Appointment app in appointments) {
+            service.AddAppointment(app);
+          }
+        });
+
+        //TODO: refresh Content
+      }
+    }
+
+    #region Event Handlers
+    // TODO: Put event handlers here
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/ScheduleView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.Designer.cs	(revision 6373)
@@ -0,0 +1,280 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  partial class SlaveView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.txtSlaveState = new System.Windows.Forms.TextBox();
+      this.txtOS = new System.Windows.Forms.TextBox();
+      this.label15 = new System.Windows.Forms.Label();
+      this.label14 = new System.Windows.Forms.Label();
+      this.txtDetailsDescription = new System.Windows.Forms.TextBox();
+      this.label13 = new System.Windows.Forms.Label();
+      this.txtName = new System.Windows.Forms.TextBox();
+      this.txtCPU = new System.Windows.Forms.TextBox();
+      this.txtMemory = new System.Windows.Forms.TextBox();
+      this.txtLastHeartbeat = new System.Windows.Forms.TextBox();
+      this.label12 = new System.Windows.Forms.Label();
+      this.label11 = new System.Windows.Forms.Label();
+      this.label10 = new System.Windows.Forms.Label();
+      this.label9 = new System.Windows.Forms.Label();
+      this.label1 = new System.Windows.Forms.Label();
+      this.txtFreeMemory = new System.Windows.Forms.TextBox();
+      this.txtId = new System.Windows.Forms.TextBox();
+      this.label2 = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // txtSlaveState
+      // 
+      this.txtSlaveState.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtSlaveState.Location = new System.Drawing.Point(120, 186);
+      this.txtSlaveState.Name = "txtSlaveState";
+      this.txtSlaveState.Size = new System.Drawing.Size(249, 20);
+      this.txtSlaveState.TabIndex = 27;
+      // 
+      // txtOS
+      // 
+      this.txtOS.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtOS.Location = new System.Drawing.Point(120, 160);
+      this.txtOS.Name = "txtOS";
+      this.txtOS.Size = new System.Drawing.Size(249, 20);
+      this.txtOS.TabIndex = 26;
+      // 
+      // label15
+      // 
+      this.label15.AutoSize = true;
+      this.label15.Location = new System.Drawing.Point(3, 193);
+      this.label15.Name = "label15";
+      this.label15.Size = new System.Drawing.Size(32, 13);
+      this.label15.TabIndex = 25;
+      this.label15.Text = "State";
+      // 
+      // label14
+      // 
+      this.label14.AutoSize = true;
+      this.label14.Location = new System.Drawing.Point(3, 167);
+      this.label14.Name = "label14";
+      this.label14.Size = new System.Drawing.Size(90, 13);
+      this.label14.TabIndex = 24;
+      this.label14.Text = "Operating System";
+      // 
+      // txtDetailsDescription
+      // 
+      this.txtDetailsDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtDetailsDescription.Location = new System.Drawing.Point(120, 56);
+      this.txtDetailsDescription.Name = "txtDetailsDescription";
+      this.txtDetailsDescription.Size = new System.Drawing.Size(249, 20);
+      this.txtDetailsDescription.TabIndex = 23;
+      // 
+      // label13
+      // 
+      this.label13.AutoSize = true;
+      this.label13.Location = new System.Drawing.Point(3, 63);
+      this.label13.Name = "label13";
+      this.label13.Size = new System.Drawing.Size(60, 13);
+      this.label13.TabIndex = 22;
+      this.label13.Text = "Description";
+      // 
+      // txtName
+      // 
+      this.txtName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtName.Location = new System.Drawing.Point(120, 4);
+      this.txtName.Name = "txtName";
+      this.txtName.Size = new System.Drawing.Size(249, 20);
+      this.txtName.TabIndex = 21;
+      this.txtName.TextChanged += new System.EventHandler(this.txtName_TextChanged_1);
+      // 
+      // txtCPU
+      // 
+      this.txtCPU.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtCPU.Location = new System.Drawing.Point(120, 82);
+      this.txtCPU.Name = "txtCPU";
+      this.txtCPU.Size = new System.Drawing.Size(249, 20);
+      this.txtCPU.TabIndex = 20;
+      // 
+      // txtMemory
+      // 
+      this.txtMemory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtMemory.Location = new System.Drawing.Point(120, 108);
+      this.txtMemory.Name = "txtMemory";
+      this.txtMemory.Size = new System.Drawing.Size(249, 20);
+      this.txtMemory.TabIndex = 19;
+      // 
+      // txtLastHeartbeat
+      // 
+      this.txtLastHeartbeat.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtLastHeartbeat.Location = new System.Drawing.Point(120, 212);
+      this.txtLastHeartbeat.Name = "txtLastHeartbeat";
+      this.txtLastHeartbeat.Size = new System.Drawing.Size(249, 20);
+      this.txtLastHeartbeat.TabIndex = 18;
+      // 
+      // label12
+      // 
+      this.label12.AutoSize = true;
+      this.label12.Location = new System.Drawing.Point(3, 219);
+      this.label12.Name = "label12";
+      this.label12.Size = new System.Drawing.Size(77, 13);
+      this.label12.TabIndex = 17;
+      this.label12.Text = "Last Heartbeat";
+      // 
+      // label11
+      // 
+      this.label11.AutoSize = true;
+      this.label11.Location = new System.Drawing.Point(3, 115);
+      this.label11.Name = "label11";
+      this.label11.Size = new System.Drawing.Size(44, 13);
+      this.label11.TabIndex = 16;
+      this.label11.Text = "Memory";
+      // 
+      // label10
+      // 
+      this.label10.AutoSize = true;
+      this.label10.Location = new System.Drawing.Point(3, 89);
+      this.label10.Name = "label10";
+      this.label10.Size = new System.Drawing.Size(29, 13);
+      this.label10.TabIndex = 15;
+      this.label10.Text = "CPU";
+      // 
+      // label9
+      // 
+      this.label9.AutoSize = true;
+      this.label9.Location = new System.Drawing.Point(3, 11);
+      this.label9.Name = "label9";
+      this.label9.Size = new System.Drawing.Size(35, 13);
+      this.label9.TabIndex = 14;
+      this.label9.Text = "Name";
+      // 
+      // label1
+      // 
+      this.label1.AutoSize = true;
+      this.label1.Location = new System.Drawing.Point(3, 141);
+      this.label1.Name = "label1";
+      this.label1.Size = new System.Drawing.Size(67, 13);
+      this.label1.TabIndex = 28;
+      this.label1.Text = "Free memory";
+      // 
+      // txtFreeMemory
+      // 
+      this.txtFreeMemory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtFreeMemory.Location = new System.Drawing.Point(120, 134);
+      this.txtFreeMemory.Name = "txtFreeMemory";
+      this.txtFreeMemory.Size = new System.Drawing.Size(249, 20);
+      this.txtFreeMemory.TabIndex = 29;
+      // 
+      // txtId
+      // 
+      this.txtId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.txtId.Location = new System.Drawing.Point(120, 30);
+      this.txtId.Name = "txtId";
+      this.txtId.Size = new System.Drawing.Size(249, 20);
+      this.txtId.TabIndex = 30;
+      // 
+      // label2
+      // 
+      this.label2.AutoSize = true;
+      this.label2.Location = new System.Drawing.Point(3, 37);
+      this.label2.Name = "label2";
+      this.label2.Size = new System.Drawing.Size(16, 13);
+      this.label2.TabIndex = 31;
+      this.label2.Text = "Id";
+      // 
+      // SlaveView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.label2);
+      this.Controls.Add(this.txtId);
+      this.Controls.Add(this.txtFreeMemory);
+      this.Controls.Add(this.label1);
+      this.Controls.Add(this.txtSlaveState);
+      this.Controls.Add(this.txtOS);
+      this.Controls.Add(this.label15);
+      this.Controls.Add(this.label14);
+      this.Controls.Add(this.txtDetailsDescription);
+      this.Controls.Add(this.label13);
+      this.Controls.Add(this.txtName);
+      this.Controls.Add(this.txtCPU);
+      this.Controls.Add(this.txtMemory);
+      this.Controls.Add(this.txtLastHeartbeat);
+      this.Controls.Add(this.label12);
+      this.Controls.Add(this.label11);
+      this.Controls.Add(this.label10);
+      this.Controls.Add(this.label9);
+      this.Name = "SlaveView";
+      this.Size = new System.Drawing.Size(372, 236);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox txtSlaveState;
+    private System.Windows.Forms.TextBox txtOS;
+    private System.Windows.Forms.Label label15;
+    private System.Windows.Forms.Label label14;
+    private System.Windows.Forms.TextBox txtDetailsDescription;
+    private System.Windows.Forms.Label label13;
+    private System.Windows.Forms.TextBox txtName;
+    private System.Windows.Forms.TextBox txtCPU;
+    private System.Windows.Forms.TextBox txtMemory;
+    private System.Windows.Forms.TextBox txtLastHeartbeat;
+    private System.Windows.Forms.Label label12;
+    private System.Windows.Forms.Label label11;
+    private System.Windows.Forms.Label label10;
+    private System.Windows.Forms.Label label9;
+    private System.Windows.Forms.Label label1;
+    private System.Windows.Forms.TextBox txtFreeMemory;
+    private System.Windows.Forms.TextBox txtId;
+    private System.Windows.Forms.Label label2;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.cs	(revision 6373)
@@ -0,0 +1,119 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Hive.Administration.Views {
+  [View("SlaveView")]
+  [Content(typeof(Resource), IsDefaultView = true)]
+  public partial class SlaveView : ItemView {
+    public new Resource Content {
+      get { return (Resource)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public SlaveView() {
+      InitializeComponent();
+    }
+
+    #region Register Content Events
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+    }
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        ShowSlaveUI(true);
+        txtName.Clear();
+        txtCPU.Clear();
+        txtDetailsDescription.Clear();
+        txtMemory.Clear();
+        txtOS.Clear();
+        txtSlaveState.Clear();
+        txtLastHeartbeat.Clear();
+        txtFreeMemory.Clear();
+        txtId.Clear();
+      } else {
+        if (Content.GetType() == typeof(Slave)) {
+          ShowSlaveUI(true);
+          Slave ct = (Slave)Content;
+          txtName.Text = ct.Name;
+          txtCPU.Text = ct.Cores.ToString() + " Cores @ " + ct.CpuSpeed.ToString() + " Mhz, Arch.: " + ct.CpuArchitecture.ToString();
+          txtDetailsDescription.Text = ct.Description;
+          txtMemory.Text = ct.Memory.ToString();
+          txtOS.Text = ct.OperatingSystem;
+          txtSlaveState.Text = ct.SlaveState.ToString();
+          txtLastHeartbeat.Text = ct.LastHeartbeat.ToString();
+          txtFreeMemory.Text = ct.FreeMemory.ToString();
+          txtId.Text = ct.Id.ToString();
+        } else if (Content.GetType() == typeof(SlaveGroup)) {
+          SlaveGroup ct = (SlaveGroup)Content;
+          txtName.Text = ct.Name;
+          ShowSlaveUI(false);
+        } else
+          throw new Exception("Unknown Resource in SlaveView");
+
+      }
+    }
+
+    void txtName_TextChanged(object sender, EventArgs e) {
+      throw new NotImplementedException();
+    }
+
+    private void ShowSlaveUI(bool show) {
+      label2.Visible = show;
+      label1.Visible = show;
+      label10.Visible = show;
+      label11.Visible = show;
+      label12.Visible = show;
+      label13.Visible = show;
+      label14.Visible = show;
+      label15.Visible = show;
+      txtCPU.Visible = show;
+      txtDetailsDescription.Visible = show;
+      txtMemory.Visible = show;
+      txtOS.Visible = show;
+      txtSlaveState.Visible = show;
+      txtLastHeartbeat.Visible = show;
+      txtFreeMemory.Visible = show;
+      txtId.Visible = show;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+
+    private void txtName_TextChanged_1(object sender, EventArgs e) {
+      if (Content != null && Content is SlaveGroup) {
+        Content.Name = txtName.Text;
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Administration/3.4/Views/SlaveView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj	(revision 6373)
@@ -0,0 +1,228 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{DBFD7205-61AF-40EF-8776-3052DEF91CF3}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.Clients.Hive.ExperimentManager</RootNamespace>
+    <AssemblyName>HeuristicLab.Clients.Hive.ExperimentManager-3.4</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <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' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup>
+    <SignAssembly>true</SignAssembly>
+  </PropertyGroup>
+  <PropertyGroup>
+    <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x86</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x64\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
+    <OutputPath>bin\x64\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>x64</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\Plugin.dll.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Core.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.MainForm.WindowsForms-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimizer-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimizer-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Windows.Forms.DataVisualization" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Xml.Linq" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Views\HiveExperimentListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\HiveExperimentListView.Designer.cs">
+      <DependentUpon>HiveExperimentListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Views\HiveExperimentManagerView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\HiveExperimentManagerView.Designer.cs">
+      <DependentUpon>HiveExperimentManagerView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="MenuItems\ExperimentManagerMenuItem.cs" />
+    <Compile Include="Views\RefreshableHiveExperimentView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="Views\RefreshableHiveExperimentView.Designer.cs">
+      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HeuristicLabClientsHiveExperimentManagerPlugin.cs" />
+    <None Include="HeuristicLabClientsHiveExperimentManagerPlugin.cs.frame" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <None Include="Properties\AssemblyInfo.frame" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="HeuristicLab.snk" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.Views\3.4\HeuristicLab.Clients.Hive.Views-3.4.csproj">
+      <Project>{E1D6C801-892A-406A-B606-F158E36DD3C3}</Project>
+      <Name>HeuristicLab.Clients.Hive.Views-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj">
+      <Project>{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}</Project>
+      <Name>HeuristicLab.Clients.Hive-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
+      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
+      <Name>HeuristicLab.Hive-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Services.Hive.Common\3.4\HeuristicLab.Services.Hive.Common-3.4.csproj">
+      <Project>{14424A16-48D4-445E-80BF-DDF617548BBB}</Project>
+      <Name>HeuristicLab.Services.Hive.Common-3.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Views\HiveExperimentManagerView.resx">
+      <DependentUpon>HiveExperimentManagerView.cs</DependentUpon>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Views\RefreshableHiveExperimentView.resx">
+      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
+    </EmbeddedResource>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <PropertyGroup>
+    <PostBuildEvent>set ProjectName=$(ProjectName)
+set TargetPath=$(TargetPath)
+call $(SolutionDir)/CopyAssembly.cmd</PostBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLabClientsHiveExperimentManagerPlugin.cs.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLabClientsHiveExperimentManagerPlugin.cs.frame	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/HeuristicLabClientsHiveExperimentManagerPlugin.cs.frame	(revision 6373)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager {
+  [Plugin("HeuristicLab.Clients.Hive.ExperimentManager", "3.4.0.$WCREV$")]
+  [PluginFile("HeuristicLab.Clients.Hive.ExperimentManager-3.4.dll", PluginFileType.Assembly)]
+  public class HeuristicLabClientsHiveExperimentManagerPlugin : PluginBase {
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/MenuItems/ExperimentManagerMenuItem.cs	(revision 6373)
@@ -0,0 +1,41 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using HeuristicLab.Clients.Hive;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Optimizer.MenuItems {
+  public class ExperimentManagerMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
+    public override string Name {
+      get { return "&Experiment Manager (dev)"; }
+    }
+    public override IEnumerable<string> Structure {
+      get { return new string[] { "&Services", "&Hive" }; }
+    }
+    public override void Execute() {
+      MainFormManager.MainForm.ShowContent(HiveClient.Instance);
+    }
+    public override int Position {
+      get { return 10000; }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Properties/AssemblyInfo.frame
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Properties/AssemblyInfo.frame	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Properties/AssemblyInfo.frame	(revision 6373)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("HeuristicLab.Clients.Hive.ExperimentManager")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("HEAL")]
+[assembly: AssemblyProduct("HeuristicLab")]
+[assembly: AssemblyCopyright("(c) 2002-2011 HEAL")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("7c14407e-6980-465b-ba3a-4a916d48989b")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers 
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.$WCREV$")]
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.Designer.cs	(revision 6373)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  partial class HiveExperimentListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentListView.cs	(revision 6373)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  [View("HiveExperimentList View")]
+  [Content(typeof(ItemCollection<RefreshableHiveExperiment>), false)]
+  public partial class HiveExperimentListView : ItemCollectionView<RefreshableHiveExperiment> {
+
+    public HiveExperimentListView() {
+      InitializeComponent();
+    }
+
+    protected override RefreshableHiveExperiment CreateItem() {
+      return new RefreshableHiveExperiment();
+    }
+
+    protected override void removeButton_Click(object sender, EventArgs e) {
+      DialogResult result = MessageBox.Show("This action will permanently delete this experiment (also on the hive server). Continue?", "Delete Experiment", MessageBoxButtons.OKCancel);
+      if (result == DialogResult.OK) {
+        base.removeButton_Click(sender, e);
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.Designer.cs	(revision 6373)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  partial class HiveExperimentManagerView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HiveExperimentManagerView));
+      this.hiveExperimentListView = new HiveExperimentListView();
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.SuspendLayout();
+      // 
+      // hiveExperimentListView
+      // 
+      this.hiveExperimentListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.hiveExperimentListView.Caption = "HiveExperimentList View";
+      this.hiveExperimentListView.Content = null;
+      this.hiveExperimentListView.Location = new System.Drawing.Point(3, 33);
+      this.hiveExperimentListView.Name = "hiveExperimentListView";
+      this.hiveExperimentListView.ReadOnly = false;
+      this.hiveExperimentListView.Size = new System.Drawing.Size(729, 488);
+      this.hiveExperimentListView.TabIndex = 0;
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Location = new System.Drawing.Point(3, 3);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 1;
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // HiveExperimentManagerView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.hiveExperimentListView);
+      this.Name = "HiveExperimentManagerView";
+      this.Size = new System.Drawing.Size(735, 524);
+      this.ResumeLayout(false);
+
+    }
+    #endregion
+
+    private HiveExperimentListView hiveExperimentListView;
+    private System.Windows.Forms.Button refreshButton;
+
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.cs	(revision 6373)
@@ -0,0 +1,127 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Collections;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("Hive Experiment Manager View")]
+  [Content(typeof(HiveClient), true)]
+  public partial class HiveExperimentManagerView : AsynchronousContentView {
+
+    public new HiveClient Content {
+      get { return (HiveClient)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public HiveExperimentManagerView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.Refreshing += new EventHandler(Content_Refreshing);
+      Content.Refreshed += new EventHandler(Content_Refreshed);
+      Content.HiveExperimentsChanged += new EventHandler(Content_HiveExperimentsChanged);
+
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.Refreshing -= new EventHandler(Content_Refreshing);
+      Content.Refreshed -= new EventHandler(Content_Refreshed);
+      Content.HiveExperimentsChanged -= new EventHandler(Content_HiveExperimentsChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        hiveExperimentListView.Content = null;
+      } else {
+        hiveExperimentListView.Content = Content.HiveExperiments;
+        if (Content != null)
+          Content.RefreshAsync(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Refresh failed.", ex)));
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      refreshButton.Enabled = Content != null;
+      hiveExperimentListView.Enabled = Content != null;
+    }
+
+    private void Content_Refreshing(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshing), sender, e);
+      } else {
+        Cursor = Cursors.AppStarting;
+        refreshButton.Enabled = false;
+        hiveExperimentListView.Enabled = false;
+      }
+    }
+    private void Content_Refreshed(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_Refreshed), sender, e);
+      } else {
+        hiveExperimentListView.Content = Content.HiveExperiments;
+        refreshButton.Enabled = true;
+        hiveExperimentListView.Enabled = true;
+        Cursor = Cursors.Default;
+      }
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      Content.RefreshAsync(new Action<Exception>((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Refresh failed.", ex)));
+    }
+
+    protected override void OnClosing(FormClosingEventArgs e) {
+      base.OnClosing(e);
+      if (Content != null && Content.HiveExperiments != null) {
+        foreach (var exp in Content.HiveExperiments.OfType<RefreshableHiveExperiment>()) {
+          if (exp.RefreshAutomatically) {
+            exp.RefreshAutomatically = false; // stop result polling
+          }
+        }
+      }
+    }
+
+    private void HiveExperiments_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<RefreshableHiveExperiment> e) {
+      foreach (var item in e.Items) {
+        HiveClient.Delete(item);
+      }
+    }
+
+    private void Content_HiveExperimentsChanged(object sender, EventArgs e) {
+      Content.HiveExperiments.ItemsRemoved += new CollectionItemsChangedEventHandler<RefreshableHiveExperiment>(HiveExperiments_ItemsRemoved);
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/HiveExperimentManagerView.resx	(revision 6373)
@@ -0,0 +1,185 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="refreshButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>57</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.Designer.cs	(revision 6373)
@@ -0,0 +1,414 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Clients.Hive.Views.ExperimentManager;
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  partial class RefreshableHiveExperimentView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RefreshableHiveExperimentView));
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.jobsTabPage = new System.Windows.Forms.TabPage();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.logView = new HeuristicLab.Core.Views.LogView();
+      this.startButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.resetButton = new System.Windows.Forms.Button();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.resourceIdsLabel = new System.Windows.Forms.Label();
+      this.resourceNamesTextBox = new System.Windows.Forms.TextBox();
+      this.useLocalPluginsCheckBox = new System.Windows.Forms.CheckBox();
+      this.nameLabel = new System.Windows.Forms.Label();
+      this.nameTextBox = new System.Windows.Forms.TextBox();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.refreshButton = new System.Windows.Forms.Button();
+      this.refreshAutomaticallyCheckBox = new System.Windows.Forms.CheckBox();
+      this.infoGroupBox = new System.Windows.Forms.GroupBox();
+      this.finishedTextBox = new System.Windows.Forms.TextBox();
+      this.calculatingTextBox = new System.Windows.Forms.TextBox();
+      this.jobsTextBox = new System.Windows.Forms.TextBox();
+      this.finishedLabel = new System.Windows.Forms.Label();
+      this.calculatingLabel = new System.Windows.Forms.Label();
+      this.jobsLabel = new System.Windows.Forms.Label();
+      this.jobsTreeView = new HeuristicLab.Clients.Hive.Views.ExperimentManager.HiveJobItemTreeView();
+      this.tabControl.SuspendLayout();
+      this.jobsTabPage.SuspendLayout();
+      this.logTabPage.SuspendLayout();
+      this.infoGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.jobsTabPage);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 78);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(821, 520);
+      this.tabControl.TabIndex = 4;
+      // 
+      // jobsTabPage
+      // 
+      this.jobsTabPage.Controls.Add(this.jobsTreeView);
+      this.jobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.jobsTabPage.Name = "jobsTabPage";
+      this.jobsTabPage.Size = new System.Drawing.Size(813, 494);
+      this.jobsTabPage.TabIndex = 5;
+      this.jobsTabPage.Text = "Jobs";
+      this.jobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Controls.Add(this.logView);
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Size = new System.Drawing.Size(813, 494);
+      this.logTabPage.TabIndex = 3;
+      this.logTabPage.Text = "Log";
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logView
+      // 
+      this.logView.Caption = "Log View";
+      this.logView.Content = null;
+      this.logView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.logView.Location = new System.Drawing.Point(0, 0);
+      this.logView.Name = "logView";
+      this.logView.ReadOnly = false;
+      this.logView.Size = new System.Drawing.Size(813, 494);
+      this.logView.TabIndex = 0;
+      // 
+      // startButton
+      // 
+      this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.startButton.Image = ((System.Drawing.Image)(resources.GetObject("startButton.Image")));
+      this.startButton.Location = new System.Drawing.Point(0, 604);
+      this.startButton.Name = "startButton";
+      this.startButton.Size = new System.Drawing.Size(24, 24);
+      this.startButton.TabIndex = 5;
+      this.toolTip.SetToolTip(this.startButton, "Start/Resume Experiment");
+      this.startButton.UseVisualStyleBackColor = true;
+      this.startButton.Click += new System.EventHandler(this.startButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(60, 604);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 7;
+      this.toolTip.SetToolTip(this.stopButton, "Stop Experiment");
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // resetButton
+      // 
+      this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.resetButton.Enabled = false;
+      this.resetButton.Image = ((System.Drawing.Image)(resources.GetObject("resetButton.Image")));
+      this.resetButton.Location = new System.Drawing.Point(90, 604);
+      this.resetButton.Name = "resetButton";
+      this.resetButton.Size = new System.Drawing.Size(24, 24);
+      this.resetButton.TabIndex = 8;
+      this.toolTip.SetToolTip(this.resetButton, "Reset Experiment");
+      this.resetButton.UseVisualStyleBackColor = true;
+      this.resetButton.Click += new System.EventHandler(this.resetButton_Click);
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(595, 611);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(83, 13);
+      this.executionTimeLabel.TabIndex = 9;
+      this.executionTimeLabel.Text = "&Execution Time:";
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(684, 608);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.ReadOnly = true;
+      this.executionTimeTextBox.Size = new System.Drawing.Size(137, 20);
+      this.executionTimeTextBox.TabIndex = 10;
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Enabled = false;
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(30, 604);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 6;
+      this.toolTip.SetToolTip(this.pauseButton, "Pause Experiment");
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // resourceIdsLabel
+      // 
+      this.resourceIdsLabel.AutoSize = true;
+      this.resourceIdsLabel.Location = new System.Drawing.Point(4, 56);
+      this.resourceIdsLabel.Name = "resourceIdsLabel";
+      this.resourceIdsLabel.Size = new System.Drawing.Size(70, 13);
+      this.resourceIdsLabel.TabIndex = 12;
+      this.resourceIdsLabel.Text = "ResourceIds:";
+      // 
+      // resourceNamesTextBox
+      // 
+      this.resourceNamesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.resourceNamesTextBox.Location = new System.Drawing.Point(73, 53);
+      this.resourceNamesTextBox.Name = "resourceNamesTextBox";
+      this.resourceNamesTextBox.Size = new System.Drawing.Size(494, 20);
+      this.resourceNamesTextBox.TabIndex = 14;
+      this.resourceNamesTextBox.Validated += new System.EventHandler(this.resourceNamesTextBox_Validated);
+      // 
+      // useLocalPluginsCheckBox
+      // 
+      this.useLocalPluginsCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.useLocalPluginsCheckBox.AutoSize = true;
+      this.useLocalPluginsCheckBox.Location = new System.Drawing.Point(573, 56);
+      this.useLocalPluginsCheckBox.Name = "useLocalPluginsCheckBox";
+      this.useLocalPluginsCheckBox.Size = new System.Drawing.Size(105, 17);
+      this.useLocalPluginsCheckBox.TabIndex = 19;
+      this.useLocalPluginsCheckBox.Text = "UseLocalPlugins";
+      this.useLocalPluginsCheckBox.UseVisualStyleBackColor = true;
+      this.useLocalPluginsCheckBox.CheckedChanged += new System.EventHandler(this.useLocalPluginsCheckBox_CheckedChanged);
+      // 
+      // nameLabel
+      // 
+      this.nameLabel.AutoSize = true;
+      this.nameLabel.Location = new System.Drawing.Point(1, 27);
+      this.nameLabel.Name = "nameLabel";
+      this.nameLabel.Size = new System.Drawing.Size(38, 13);
+      this.nameLabel.TabIndex = 20;
+      this.nameLabel.Text = "Name:";
+      // 
+      // nameTextBox
+      // 
+      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.nameTextBox.Location = new System.Drawing.Point(73, 27);
+      this.nameTextBox.Name = "nameTextBox";
+      this.nameTextBox.Size = new System.Drawing.Size(605, 20);
+      this.nameTextBox.TabIndex = 21;
+      this.nameTextBox.Validated += new System.EventHandler(this.nameTextBox_Validated);
+      // 
+      // refreshButton
+      // 
+      this.refreshButton.Image = ((System.Drawing.Image)(resources.GetObject("refreshButton.Image")));
+      this.refreshButton.Location = new System.Drawing.Point(3, 0);
+      this.refreshButton.Name = "refreshButton";
+      this.refreshButton.Size = new System.Drawing.Size(24, 24);
+      this.refreshButton.TabIndex = 22;
+      this.toolTip.SetToolTip(this.refreshButton, "Refresh Data");
+      this.refreshButton.UseVisualStyleBackColor = true;
+      this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
+      // 
+      // refreshAutomaticallyCheckBox
+      // 
+      this.refreshAutomaticallyCheckBox.AutoSize = true;
+      this.refreshAutomaticallyCheckBox.Location = new System.Drawing.Point(30, 5);
+      this.refreshAutomaticallyCheckBox.Name = "refreshAutomaticallyCheckBox";
+      this.refreshAutomaticallyCheckBox.Size = new System.Drawing.Size(128, 17);
+      this.refreshAutomaticallyCheckBox.TabIndex = 24;
+      this.refreshAutomaticallyCheckBox.Text = "&Refresh Automatically";
+      this.refreshAutomaticallyCheckBox.UseVisualStyleBackColor = true;
+      this.refreshAutomaticallyCheckBox.CheckedChanged += new System.EventHandler(this.refreshAutomaticallyCheckBox_CheckedChanged);
+      // 
+      // infoGroupBox
+      // 
+      this.infoGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.infoGroupBox.Controls.Add(this.finishedTextBox);
+      this.infoGroupBox.Controls.Add(this.calculatingTextBox);
+      this.infoGroupBox.Controls.Add(this.jobsTextBox);
+      this.infoGroupBox.Controls.Add(this.finishedLabel);
+      this.infoGroupBox.Controls.Add(this.calculatingLabel);
+      this.infoGroupBox.Controls.Add(this.jobsLabel);
+      this.infoGroupBox.Location = new System.Drawing.Point(684, 5);
+      this.infoGroupBox.Name = "infoGroupBox";
+      this.infoGroupBox.Size = new System.Drawing.Size(133, 89);
+      this.infoGroupBox.TabIndex = 25;
+      this.infoGroupBox.TabStop = false;
+      this.infoGroupBox.Text = "Info";
+      // 
+      // finishedTextBox
+      // 
+      this.finishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.finishedTextBox.Location = new System.Drawing.Point(74, 64);
+      this.finishedTextBox.Name = "finishedTextBox";
+      this.finishedTextBox.Size = new System.Drawing.Size(53, 20);
+      this.finishedTextBox.TabIndex = 5;
+      // 
+      // calculatingTextBox
+      // 
+      this.calculatingTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.calculatingTextBox.Location = new System.Drawing.Point(74, 40);
+      this.calculatingTextBox.Name = "calculatingTextBox";
+      this.calculatingTextBox.Size = new System.Drawing.Size(53, 20);
+      this.calculatingTextBox.TabIndex = 4;
+      // 
+      // jobsTextBox
+      // 
+      this.jobsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobsTextBox.Location = new System.Drawing.Point(74, 16);
+      this.jobsTextBox.Name = "jobsTextBox";
+      this.jobsTextBox.Size = new System.Drawing.Size(53, 20);
+      this.jobsTextBox.TabIndex = 3;
+      // 
+      // finishedLabel
+      // 
+      this.finishedLabel.AutoSize = true;
+      this.finishedLabel.Location = new System.Drawing.Point(6, 67);
+      this.finishedLabel.Name = "finishedLabel";
+      this.finishedLabel.Size = new System.Drawing.Size(49, 13);
+      this.finishedLabel.TabIndex = 2;
+      this.finishedLabel.Text = "Finished:";
+      // 
+      // calculatingLabel
+      // 
+      this.calculatingLabel.AutoSize = true;
+      this.calculatingLabel.Location = new System.Drawing.Point(6, 43);
+      this.calculatingLabel.Name = "calculatingLabel";
+      this.calculatingLabel.Size = new System.Drawing.Size(62, 13);
+      this.calculatingLabel.TabIndex = 1;
+      this.calculatingLabel.Text = "Calculating:";
+      // 
+      // jobsLabel
+      // 
+      this.jobsLabel.AutoSize = true;
+      this.jobsLabel.Location = new System.Drawing.Point(6, 19);
+      this.jobsLabel.Name = "jobsLabel";
+      this.jobsLabel.Size = new System.Drawing.Size(32, 13);
+      this.jobsLabel.TabIndex = 0;
+      this.jobsLabel.Text = "Jobs:";
+      // 
+      // jobsTreeView
+      // 
+      this.jobsTreeView.AllowDrop = true;
+      this.jobsTreeView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobsTreeView.Caption = "ItemTree View";
+      this.jobsTreeView.Content = null;
+      this.jobsTreeView.Location = new System.Drawing.Point(2, 3);
+      this.jobsTreeView.Name = "jobsTreeView";
+      this.jobsTreeView.ReadOnly = false;
+      this.jobsTreeView.Size = new System.Drawing.Size(808, 488);
+      this.jobsTreeView.TabIndex = 0;
+      this.jobsTreeView.DragDrop += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragDrop);
+      this.jobsTreeView.DragEnter += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragEnter);
+      this.jobsTreeView.DragOver += new System.Windows.Forms.DragEventHandler(this.jobsTreeView_DragOver);
+      // 
+      // RefreshableHiveExperimentView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.infoGroupBox);
+      this.Controls.Add(this.refreshAutomaticallyCheckBox);
+      this.Controls.Add(this.refreshButton);
+      this.Controls.Add(this.nameTextBox);
+      this.Controls.Add(this.nameLabel);
+      this.Controls.Add(this.tabControl);
+      this.Controls.Add(this.startButton);
+      this.Controls.Add(this.executionTimeTextBox);
+      this.Controls.Add(this.executionTimeLabel);
+      this.Controls.Add(this.resourceNamesTextBox);
+      this.Controls.Add(this.pauseButton);
+      this.Controls.Add(this.resourceIdsLabel);
+      this.Controls.Add(this.stopButton);
+      this.Controls.Add(this.useLocalPluginsCheckBox);
+      this.Controls.Add(this.resetButton);
+      this.Name = "RefreshableHiveExperimentView";
+      this.Size = new System.Drawing.Size(821, 628);
+      this.tabControl.ResumeLayout(false);
+      this.jobsTabPage.ResumeLayout(false);
+      this.logTabPage.ResumeLayout(false);
+      this.infoGroupBox.ResumeLayout(false);
+      this.infoGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+    #endregion
+
+    private System.Windows.Forms.TabControl tabControl;
+    private System.Windows.Forms.Button startButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.Button resetButton;
+    private System.Windows.Forms.Label executionTimeLabel;
+    private System.Windows.Forms.TextBox executionTimeTextBox;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Label resourceIdsLabel;
+    private System.Windows.Forms.TextBox resourceNamesTextBox;
+    private System.Windows.Forms.TabPage logTabPage;
+    private Core.Views.LogView logView;
+    private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
+    private System.Windows.Forms.TabPage jobsTabPage;
+    private HiveJobItemTreeView jobsTreeView;
+    private System.Windows.Forms.Label nameLabel;
+    private System.Windows.Forms.TextBox nameTextBox;
+    private System.Windows.Forms.ToolTip toolTip;
+    private System.Windows.Forms.Button refreshButton;
+    private System.Windows.Forms.CheckBox refreshAutomaticallyCheckBox;
+    private System.Windows.Forms.GroupBox infoGroupBox;
+    private System.Windows.Forms.TextBox finishedTextBox;
+    private System.Windows.Forms.TextBox calculatingTextBox;
+    private System.Windows.Forms.TextBox jobsTextBox;
+    private System.Windows.Forms.Label finishedLabel;
+    private System.Windows.Forms.Label calculatingLabel;
+    private System.Windows.Forms.Label jobsLabel;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.cs	(revision 6373)
@@ -0,0 +1,380 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Threading;
+using System.Windows.Forms;
+using HeuristicLab.Clients.Hive.Views;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.ExperimentManager.Views {
+  /// <summary>
+  /// The base class for visual representations of items.
+  /// </summary>
+  [View("Hive Experiment View")]
+  [Content(typeof(RefreshableHiveExperiment), true)]
+  public sealed partial class RefreshableHiveExperimentView : ItemView {
+    private ProgressView progressView;
+
+    public new RefreshableHiveExperiment Content {
+      get { return (RefreshableHiveExperiment)base.Content; }
+      set { base.Content = value; }
+    }
+
+    /// <summary>
+    /// Initializes a new instance of <see cref="ItemBaseView"/>.
+    /// </summary>
+    public RefreshableHiveExperimentView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.RefreshAutomaticallyChanged += new EventHandler(Content_RefreshAutomaticallyChanged);
+      Content.HiveExperimentChanged += new EventHandler(Content_HiveExperimentChanged);
+      Content.IsControllableChanged += new EventHandler(Content_IsControllableChanged);
+      Content.JobStatisticsChanged += new EventHandler(Content_JobStatisticsChanged);
+      Content.ExceptionOccured += new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.RefreshAutomaticallyChanged -= new EventHandler(Content_RefreshAutomaticallyChanged);
+      Content.HiveExperimentChanged -= new EventHandler(Content_HiveExperimentChanged);
+      Content.IsControllableChanged -= new EventHandler(Content_IsControllableChanged);
+      Content.JobStatisticsChanged -= new EventHandler(Content_JobStatisticsChanged);
+      Content.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(Content_ExceptionOccured);
+      base.DeregisterContentEvents();
+    }
+
+    private void RegisterHiveExperimentEvents() {
+      Content.HiveExperiment.ExecutionStateChanged += new EventHandler(Content_ExecutionStateChanged);
+      Content.HiveExperiment.ExecutionTimeChanged += new EventHandler(Content_ExecutionTimeChanged);
+      Content.HiveExperiment.HiveJobsChanged += new EventHandler(Content_HiveJobChanged);
+      Content.HiveExperiment.IsProgressingChanged += new EventHandler(Content_IsProgressingChanged);
+    }
+    private void DeregisterHiveExperimentEvents() {
+      Content.HiveExperiment.ExecutionStateChanged -= new EventHandler(Content_ExecutionStateChanged);
+      Content.HiveExperiment.ExecutionTimeChanged -= new EventHandler(Content_ExecutionTimeChanged);
+      Content.HiveExperiment.HiveJobsChanged -= new EventHandler(Content_HiveJobChanged);
+      Content.HiveExperiment.IsProgressingChanged -= new EventHandler(Content_IsProgressingChanged);
+    }
+
+    private void RegisterHiveJobEvents() {
+      Content.HiveExperiment.HiveJobs.ItemsAdded += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.CollectionReset += new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+    private void DeregisterHiveJobEvents() {
+      Content.HiveExperiment.HiveJobs.ItemsAdded -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.ItemsRemoved -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+      Content.HiveExperiment.HiveJobs.CollectionReset -= new Collections.CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset);
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        nameTextBox.Text = string.Empty;
+        executionTimeTextBox.Text = string.Empty;
+        resourceNamesTextBox.Text = string.Empty;
+        useLocalPluginsCheckBox.Checked = false;
+        logView.Content = null;
+        //includeJobsCheckBox.Checked = false;
+        refreshAutomaticallyCheckBox.Checked = false;
+        logView.Content = null;
+      } else {
+        nameTextBox.Text = Content.HiveExperiment.Name;
+        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+        resourceNamesTextBox.Text = Content.HiveExperiment.ResourceNames;
+        useLocalPluginsCheckBox.Checked = Content.HiveExperiment.UseLocalPlugins;
+        //includeJobsCheckBox.Checked = Content.IncludeJobs;
+        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
+        logView.Content = Content.Log;
+      }
+      Content_JobStatisticsChanged(this, EventArgs.Empty);
+      Content_HiveExperimentChanged(this, EventArgs.Empty);
+      Content_HiveJobChanged(this, EventArgs.Empty);
+      Content_IsProgressingChanged(this, EventArgs.Empty);
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      executionTimeTextBox.Enabled = Content != null;
+      jobsTextBox.ReadOnly = true;
+      calculatingTextBox.ReadOnly = true;
+      finishedTextBox.ReadOnly = true;
+
+      if (Content != null) {
+        bool alreadyUploaded = Content.Id != Guid.Empty;
+        bool jobsLoaded = Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.All(x => x.Job.Id != Guid.Empty);
+
+        this.nameTextBox.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.resourceNamesTextBox.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+        this.jobsTreeView.ReadOnly = !Content.IsControllable || Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded;
+
+        this.useLocalPluginsCheckBox.Enabled = Content.IsControllable && !(Content.HiveExperiment.ExecutionState != ExecutionState.Prepared || alreadyUploaded);
+        this.refreshAutomaticallyCheckBox.Enabled = Content.IsControllable && alreadyUploaded && jobsLoaded && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        this.refreshButton.Enabled = Content.IsControllable && alreadyUploaded;
+        this.Locked = !Content.IsControllable || Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+      }
+      SetEnabledStateOfExecutableButtons();
+    }
+
+    protected override void OnClosed(FormClosedEventArgs e) {
+      if (Content != null) {
+        if (Content.RefreshAutomatically)
+          Content.StopResultPolling();
+      }
+      base.OnClosed(e);
+    }
+
+    #region Content Events
+    private void HiveJobs_ItemsAdded_Removed_Reset(object sender, CollectionItemsChangedEventArgs<HiveJob> e) {
+      if (InvokeRequired)
+        Invoke(new CollectionItemsChangedEventHandler<HiveJob>(HiveJobs_ItemsAdded_Removed_Reset), sender, e);
+      else {
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_ExecutionStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionStateChanged), sender, e);
+      else
+        SetEnabledStateOfControls();
+    }
+    private void Content_Prepared(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Prepared), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        Locked = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Started(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Started), sender, e);
+      else {
+        nameTextBox.Enabled = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Paused(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Paused), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_Stopped(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_Stopped), sender, e);
+      else {
+        nameTextBox.Enabled = true;
+        Locked = false;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_ExecutionTimeChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ExecutionTimeChanged), sender, e);
+      else
+        executionTimeTextBox.Text = Content.HiveExperiment.ExecutionTime.ToString();
+    }
+    private void Content_RefreshAutomaticallyChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_RefreshAutomaticallyChanged), sender, e);
+      else {
+        refreshAutomaticallyCheckBox.Checked = Content.RefreshAutomatically;
+        SetEnabledStateOfControls();
+      }
+    }
+    private void Content_HiveJobChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_HiveJobChanged), sender, e);
+      else {
+        if (Content != null && Content.HiveExperiment.HiveJobs != null) {
+          jobsTreeView.Content = Content.HiveExperiment.HiveJobs;
+          RegisterHiveJobEvents();
+        } else {
+          jobsTreeView.Content = null;
+        }
+        SetEnabledStateOfControls();
+      }
+    }
+
+    private void Content_HiveExperimentChanged(object sender, EventArgs e) {
+      if (Content.HiveExperiment != null) {
+        RegisterHiveExperimentEvents();
+        Content_IsProgressingChanged(sender, e);
+      }
+    }
+    private void Content_IsControllableChanged(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
+    }
+    private void Content_JobStatisticsChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_JobStatisticsChanged), sender, e);
+      else {
+        if (Content != null) {
+          jobsTextBox.Text = Content.HiveExperiment.JobCount.ToString();
+          calculatingTextBox.Text = Content.HiveExperiment.CalculatingCount.ToString();
+          finishedTextBox.Text = Content.HiveExperiment.FinishedCount.ToString();
+        } else {
+          jobsTextBox.Text = "0";
+          calculatingTextBox.Text = "0";
+          finishedTextBox.Text = "0";
+        }
+      }
+    }
+    private void Content_ExceptionOccured(object sender, EventArgs<Exception> e) {
+      if (Content.IsControllable) {
+        // show error dialog only if Controllable (otherwise it should continue trying without an error dialog (e.g. HiveEngine))
+        ErrorHandling.ShowErrorDialog(this, e.Value);
+      }
+    }
+    #endregion
+
+    #region Control events
+    private void startButton_Click(object sender, EventArgs e) {
+      HiveClient.StartExperiment((Exception ex) => ErrorHandling.ShowErrorDialog(this, "Start failed.", ex), Content);
+    }
+    private void pauseButton_Click(object sender, EventArgs e) {
+      HiveClient.PauseExperiment(Content.HiveExperiment);
+    }
+    private void stopButton_Click(object sender, EventArgs e) {
+      HiveClient.StopExperiment(Content.HiveExperiment);
+    }
+    private void resetButton_Click(object sender, EventArgs e) { }
+
+    private void nameTextBox_Validated(object sender, EventArgs e) {
+      if (Content.HiveExperiment.Name != nameTextBox.Text)
+        Content.HiveExperiment.Name = nameTextBox.Text;
+    }
+
+    private void resourceNamesTextBox_Validated(object sender, EventArgs e) {
+      if (Content.HiveExperiment.ResourceNames != resourceNamesTextBox.Text)
+        Content.HiveExperiment.ResourceNames = resourceNamesTextBox.Text;
+    }
+
+    private void includeJobsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      //if (Content != null) Content.IncludeJobs = includeJobsCheckBox.Checked;
+    }
+
+    private void refreshAutomaticallyCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) {
+        Content.RefreshAutomatically = refreshAutomaticallyCheckBox.Checked;
+      }
+    }
+
+    private void useLocalPluginsCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null) Content.HiveExperiment.UseLocalPlugins = useLocalPluginsCheckBox.Checked;
+    }
+
+    private void refreshButton_Click(object sender, EventArgs e) {
+      var invoker = new Action<HiveExperiment>(HiveClient.LoadExperiment);
+      invoker.BeginInvoke(Content.HiveExperiment, (ar) => {
+        try {
+          invoker.EndInvoke(ar);
+        }
+        catch (Exception ex) {
+          ThreadPool.QueueUserWorkItem(delegate(object exception) { ErrorHandling.ShowErrorDialog(this, (Exception)exception); }, ex);
+        }
+      }, null);
+    }
+    #endregion
+
+    #region Helpers
+    private void SetEnabledStateOfExecutableButtons() {
+      if (Content == null) {
+        startButton.Enabled = pauseButton.Enabled = stopButton.Enabled = resetButton.Enabled = false;
+      } else {
+        startButton.Enabled = Content.IsControllable && Content.HiveExperiment.HiveJobs != null && Content.HiveExperiment.HiveJobs.Count > 0 && Content.HiveExperiment.ExecutionState == ExecutionState.Prepared;
+        pauseButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        stopButton.Enabled = Content.IsControllable && Content.HiveExperiment.ExecutionState == ExecutionState.Started;
+        resetButton.Enabled = false;
+      }
+    }
+    #endregion
+
+    #region Progress reporting
+    private void Content_IsProgressingChanged(object sender, EventArgs e) {
+      if (this.InvokeRequired) {
+        Invoke(new EventHandler(Content_IsProgressingChanged), sender, e);
+      } else {
+        if (Content != null && Content.HiveExperiment.IsProgressing) {
+          SetProgressView();
+        } else {
+          FinishProgressView();
+        }
+      }
+    }
+
+    private void SetProgressView() {
+      if (progressView == null) {
+        progressView = new ProgressView(this, Content.HiveExperiment.Progress);
+      }
+      progressView.Progress = Content.HiveExperiment.Progress;
+    }
+
+    private void FinishProgressView() {
+      if (progressView != null) {
+        progressView.Finish();
+        progressView = null;
+        SetEnabledStateOfControls();
+      }
+    }
+    #endregion
+
+    #region Drag & Drop
+    private void jobsTreeView_DragOver(object sender, DragEventArgs e) {
+      jobsTreeView_DragEnter(sender, e);
+    }
+
+    private void jobsTreeView_DragEnter(object sender, DragEventArgs e) {
+      e.Effect = DragDropEffects.None;
+      var obj = e.Data.GetData(Constants.DragDropDataFormat);
+      if (obj is IOptimizer) {
+        e.Effect = DragDropEffects.Copy;
+      }
+    }
+
+    private void jobsTreeView_DragDrop(object sender, DragEventArgs e) {
+      if (e.Effect != DragDropEffects.None) {
+        var obj = e.Data.GetData(Constants.DragDropDataFormat);
+
+        var optimizer = obj as IOptimizer;
+        if (optimizer != null) {
+          Content.HiveExperiment.HiveJobs.Add(new OptimizerHiveJob(optimizer));
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.ExperimentManager/3.4/Views/RefreshableHiveExperimentView.resx	(revision 6373)
@@ -0,0 +1,234 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="startButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
+        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
+        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
+        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
+        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
+        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
+        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
+        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
+        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="resetButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAX9JREFUOE9j+P//PwMlmCLNIIupa0Dv5r//Ybht7bf/jSs+/69d/P5/xbxX/0tmP/9f
+        MP3x/9JZj4EWI7yN4oKuDb/+bzr57f/KQ1/+L9jz6f/lBz//965997956RuwIXnTX/zXDV2F2wCQrSsO
+        fvk/b9en/7ee/AIp/N+w5M3/0rkv/+dMff4/qffZf1W/RbgNADl5zo5P/x++/AHWDAIls1/+z5ry/H9C
+        79P/Ya2P/8u5zcJtAMi/Nx99hmtGZhy7/Oa/V+3D/2J2k3AbAPJn87I3/09deQnXG9355H9g0yMw36H0
+        /n9+s27cBoBCuhxoSM605/93HrkL1hTQ8Oi/W9UDMNss7+5/ToNW3AaAoikb6N9EoH/D2x7/n7Puwn/X
+        ivv/bYrvgQ3Qy7j1n1WnEbcBoDiO63n6P7Tl0X+fuof/ncrv/7cuvPffJPsO2AD1JCIMsEza9h+EjWM2
+        /NcKXv5fwWMuOOB4TTr/s+k24XcB0BKSkzbJGtAtodgAAJMl+qgyDSjjAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
+        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
+        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="refreshButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>25</value>
+  </metadata>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.Designer.cs	(revision 6373)
@@ -0,0 +1,73 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class GanttChart {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // chart
+      // 
+      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      chartArea1.Name = "ChartArea1";
+      this.chart.ChartAreas.Add(chartArea1);
+      legend1.Name = "Legend";
+      this.chart.Legends.Add(legend1);
+      this.chart.Location = new System.Drawing.Point(0, 0);
+      this.chart.Name = "chart";
+      series1.ChartArea = "ChartArea1";
+      series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.RangeBar;
+      series1.CustomProperties = "DrawingStyle=Cylinder";
+      series1.IsVisibleInLegend = false;
+      series1.Legend = "Legend";
+      series1.Name = "Series1";
+      series1.YValuesPerPoint = 2;
+      series1.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Time;
+      this.chart.Series.Add(series1);
+      this.chart.Size = new System.Drawing.Size(687, 347);
+      this.chart.TabIndex = 0;
+      this.chart.Text = "chart";
+      // 
+      // GanttChart
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.chart);
+      this.Name = "GanttChart";
+      this.Size = new System.Drawing.Size(687, 347);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private Visualization.ChartControlsExtensions.EnhancedChart chart;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.cs	(revision 6373)
@@ -0,0 +1,52 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  public partial class GanttChart : UserControl {
+
+    private IDictionary<string, Color> categories = new Dictionary<string, Color>();
+    private IDictionary<string, int> rowNames = new Dictionary<string, int>();
+
+    public GanttChart() {
+      InitializeComponent();
+    }
+
+    public void AddCategory(string name, Color color) {
+      categories[name] = color;
+      chart.Legends[0].CustomItems.Add(color, name);
+    }
+
+    public void AddData(string rowName, string category, DateTime start, DateTime end, string tooltip, bool showLabel = true) {
+      AddRowName(rowName);
+      var point = CreateDataPoint(rowNames[rowName], rowName, start, end, showLabel ? category : string.Empty, categories[category]);
+      point.ToolTip = tooltip;
+      chart.Series[0].Points.Add(point);
+    }
+
+    private void AddRowName(string rowName) {
+      if (!rowNames.ContainsKey(rowName)) {
+        int nextId = rowNames.Count == 0 ? 1 : rowNames.Values.Max() + 1;
+        rowNames.Add(rowName, nextId);
+      }
+    }
+
+    private static DataPoint CreateDataPoint(double x, string axisLabel, DateTime start, DateTime end, string text, Color color) {
+      var point = new DataPoint(x, new double[] { start.ToOADate(), end.ToOADate() });
+      point.Color = color;
+      point.Label = text;
+      point.AxisLabel = axisLabel;
+      return point;
+    }
+
+    public void Reset() {
+      chart.Series[0].Points.Clear();
+      categories.Clear();
+      chart.Legends[0].CustomItems.Clear();
+      rowNames.Clear();
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/GanttChart/GanttChart.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HeuristicLab.Clients.Hive.Views-3.4.csproj	(revision 6373)
@@ -125,105 +125,73 @@
   </ItemGroup>
   <ItemGroup>
-    <Compile Include="Administration\HiveAppointment.cs" />
-    <Compile Include="Administration\Recurrence.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Include="Administration\Recurrence.designer.cs">
-      <DependentUpon>Recurrence.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Administration\RecurrentEvent.cs" />
-    <Compile Include="Administration\ResourcesView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Administration\ResourcesView.Designer.cs">
-      <DependentUpon>ResourcesView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Administration\ScheduleView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Administration\ScheduleView.Designer.cs">
-      <DependentUpon>ScheduleView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Administration\SlaveView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Administration\SlaveView.Designer.cs">
-      <DependentUpon>SlaveView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Common\UpdateControl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Common\UpdateControl.Designer.cs">
-      <DependentUpon>UpdateControl.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\OptimizerHiveJobView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\OptimizerHiveJobView.designer.cs">
-      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\RefreshableHiveExperimentView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\RefreshableHiveExperimentView.Designer.cs">
-      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveItemView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveItemView.Designer.cs">
+    <Compile Include="HiveJobs\ControllableHiveJobView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveJobs\ControllableHiveJobView.designer.cs">
+      <DependentUpon>ControllableHiveJobView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HiveItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveItemView.Designer.cs">
       <DependentUpon>HiveItemView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\StateLogListList.cs" />
-    <Compile Include="ExperimentManager\TreeView\NewExperimentTreeNodeAction.cs" />
-    <Compile Include="ExperimentManager\TreeView\DeleteJobTreeNodeAction.cs" />
-    <Compile Include="ExperimentManager\TreeView\HiveJobItemTreeView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\TreeView\HiveJobItemTreeView.Designer.cs">
+    <Compile Include="HiveJobs\HiveJobListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveJobs\HiveJobListView.designer.cs">
+      <DependentUpon>HiveJobListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="HiveJobs\HiveJobView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="HiveJobs\HiveJobView.designer.cs">
+      <DependentUpon>HiveJobView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="StateLog\StateLogListList.cs" />
+    <Compile Include="TreeView\NewExperimentTreeNodeAction.cs" />
+    <Compile Include="TreeView\DeleteJobTreeNodeAction.cs" />
+    <Compile Include="TreeView\HiveJobItemTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TreeView\HiveJobItemTreeView.Designer.cs">
       <DependentUpon>HiveJobItemTreeView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\TreeView\ItemTreeView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\TreeView\ItemTreeView.designer.cs">
+    <Compile Include="TreeView\ItemTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TreeView\ItemTreeView.designer.cs">
       <DependentUpon>ItemTreeView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\StateLogGanttChartListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\StateLogGanttChartListView.designer.cs">
+    <Compile Include="StateLog\StateLogGanttChartListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StateLog\StateLogGanttChartListView.designer.cs">
       <DependentUpon>StateLogGanttChartListView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\GanttChart.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\GanttChart.Designer.cs">
+    <Compile Include="GanttChart\GanttChart.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="GanttChart\GanttChart.Designer.cs">
       <DependentUpon>GanttChart.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\StateLogGanttChartView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\StateLogGanttChartView.designer.cs">
+    <Compile Include="StateLog\StateLogGanttChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StateLog\StateLogGanttChartView.designer.cs">
       <DependentUpon>StateLogGanttChartView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\StateLogList.cs" />
-    <Compile Include="ExperimentManager\StateLogListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\StateLogListView.designer.cs">
+    <Compile Include="StateLog\StateLogList.cs" />
+    <Compile Include="StateLog\StateLogListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StateLog\StateLogListView.designer.cs">
       <DependentUpon>StateLogListView.cs</DependentUpon>
     </Compile>
-    <Compile Include="ExperimentManager\StateLogView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\StateLogView.designer.cs">
+    <Compile Include="StateLog\StateLogView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="StateLog\StateLogView.designer.cs">
       <DependentUpon>StateLogView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveExperimentManagerView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveExperimentManagerView.Designer.cs">
-      <DependentUpon>HiveExperimentManagerView.cs</DependentUpon>
     </Compile>
     <Compile Include="HiveImageLibrary.Designer.cs">
@@ -238,30 +206,4 @@
     </Compile>
     <None Include="HeuristicLabClientsHiveViewsPlugin.cs.frame" />
-    <Compile Include="Administration\HiveAdministrationView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="Administration\HiveAdministrationView.Designer.cs">
-      <DependentUpon>HiveAdministrationView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="Administration\MenuItems\AdministrationMenuItem.cs" />
-    <Compile Include="ExperimentManager\HiveExperimentListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveExperimentListView.Designer.cs">
-      <DependentUpon>HiveExperimentListView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveJobListView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveJobListView.designer.cs">
-      <DependentUpon>HiveJobListView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveJobView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="ExperimentManager\HiveJobView.designer.cs">
-      <DependentUpon>HiveJobView.cs</DependentUpon>
-    </Compile>
-    <Compile Include="ExperimentManager\MenuItems\ExperimentManagerMenuItem.cs" />
     <Compile Include="HeuristicLabClientsHiveViewsPlugin.cs" />
     <Compile Include="Progress\ProgressView.cs">
@@ -278,49 +220,24 @@
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="Administration\HiveAdministrationView.resx">
-      <DependentUpon>HiveAdministrationView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Administration\Recurrence.resx">
-      <DependentUpon>Recurrence.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Administration\ResourcesView.resx">
-      <DependentUpon>ResourcesView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Administration\ScheduleView.resx">
-      <DependentUpon>ScheduleView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Administration\SlaveView.resx">
-      <DependentUpon>SlaveView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="Common\UpdateControl.resx">
-      <DependentUpon>UpdateControl.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\OptimizerHiveJobView.resx">
-      <DependentUpon>OptimizerHiveJobView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\RefreshableHiveExperimentView.resx">
-      <DependentUpon>RefreshableHiveExperimentView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\TreeView\ItemTreeView.resx">
+    <EmbeddedResource Include="HiveJobs\ControllableHiveJobView.resx">
+      <DependentUpon>ControllableHiveJobView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="HiveJobs\HiveJobView.resx">
+      <DependentUpon>HiveJobView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="TreeView\ItemTreeView.resx">
       <DependentUpon>ItemTreeView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\StateLogGanttChartListView.resx">
+    <EmbeddedResource Include="StateLog\StateLogGanttChartListView.resx">
       <DependentUpon>StateLogGanttChartListView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\GanttChart.resx">
+    <EmbeddedResource Include="GanttChart\GanttChart.resx">
       <DependentUpon>GanttChart.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\StateLogGanttChartView.resx">
+    <EmbeddedResource Include="StateLog\StateLogGanttChartView.resx">
       <DependentUpon>StateLogGanttChartView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\StateLogView.resx">
+    <EmbeddedResource Include="StateLog\StateLogView.resx">
       <DependentUpon>StateLogView.cs</DependentUpon>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\HiveExperimentManagerView.resx">
-      <DependentUpon>HiveExperimentManagerView.cs</DependentUpon>
-      <SubType>Designer</SubType>
-    </EmbeddedResource>
-    <EmbeddedResource Include="ExperimentManager\HiveJobView.resx">
-      <DependentUpon>HiveJobView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="HiveImageLibrary.resx">
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.Designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.Designer.cs	(revision 6373)
@@ -0,0 +1,58 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class HiveItemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      this.storeButton = new System.Windows.Forms.Button();
+      this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+      this.SuspendLayout();
+      // 
+      // storeButton
+      // 
+      this.storeButton.Image = HeuristicLab.Common.Resources.VSImageLibrary.PublishToWeb;
+      this.storeButton.Location = new System.Drawing.Point(0, 0);
+      this.storeButton.Name = "storeButton";
+      this.storeButton.Size = new System.Drawing.Size(24, 24);
+      this.storeButton.TabIndex = 0;
+      this.toolTip.SetToolTip(this.storeButton, "Store Data");
+      this.storeButton.UseVisualStyleBackColor = true;
+      this.storeButton.Click += new System.EventHandler(this.storeButton_Click);
+      // 
+      // HiveItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.storeButton);
+      this.Name = "HiveItemView";
+      this.Size = new System.Drawing.Size(354, 308);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.Button storeButton;
+    protected System.Windows.Forms.ToolTip toolTip;
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveItemView.cs	(revision 6373)
@@ -0,0 +1,62 @@
+﻿using System;
+using System.ComponentModel;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("HiveItem View")]
+  [Content(typeof(HiveItem), IsDefaultView = false)]
+  [Content(typeof(IHiveItem), IsDefaultView = false)]
+  public partial class HiveItemView : ItemView {
+    public new IHiveItem Content {
+      get { return (IHiveItem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public HiveItemView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.PropertyChanged -= new PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.ModifiedChanged -= new EventHandler(Content_ModifiedChanged);
+      base.DeregisterContentEvents();
+    }
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.PropertyChanged += new PropertyChangedEventHandler(Content_PropertyChanged);
+      Content.ModifiedChanged += new EventHandler(Content_ModifiedChanged);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      storeButton.Enabled = (Content != null) && !ReadOnly && Content.Modified;
+    }
+
+    private void Content_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (InvokeRequired)
+        Invoke(new PropertyChangedEventHandler(Content_PropertyChanged), sender, e);
+      else {
+        OnContentPropertyChanged(e.PropertyName);
+      }
+    }
+    protected virtual void OnContentPropertyChanged(string propertyName) { }
+    protected virtual void Content_ModifiedChanged(object sender, EventArgs e) {
+      if (InvokeRequired)
+        Invoke(new EventHandler(Content_ModifiedChanged), sender, e);
+      else
+        SetEnabledStateOfControls();
+    }
+
+    protected virtual void storeButton_Click(object sender, EventArgs e) {
+      try {
+        Content.Store();
+      }
+      catch (Exception ex) {
+        ErrorHandling.ShowErrorDialog(this, "Store failed.", ex);
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.cs	(revision 6373)
@@ -0,0 +1,76 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Windows.Forms;
+using HeuristicLab.Clients.Hive.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("HiveJob View")]
+  [Content(typeof(HiveJob<>), true)]
+  public partial class ControllableHiveJobView : HiveJobView {
+    public new OptimizerHiveJob Content {
+      get { return (OptimizerHiveJob)base.Content; }
+      set {
+        if (base.Content != value) {
+          base.Content = value;
+        }
+      }
+    }
+
+    public ControllableHiveJobView() {
+      InitializeComponent();
+    }
+
+    protected override void Job_ItemChanged(object sender, EventArgs e) {
+      if (Content != null && Content.Job != null && Content.ItemJob.Item != null) {
+        runCollectionViewHost.Content = Content.ItemJob.Item.Runs;
+      } else {
+        runCollectionViewHost.Content = null;
+      }
+    }
+    #region Content Events
+    #endregion
+
+    #region Child Control Events
+    private void restartButton_Click(object sender, EventArgs e) {
+      Content.Restart();
+    }
+
+    private void pauseButton_Click(object sender, EventArgs e) {
+      Content.Pause();
+    }
+
+    private void stopButton_Click(object sender, EventArgs e) {
+      Content.Stop();
+    }
+    #endregion
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+
+      this.restartButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Paused || Content.Job.State == JobState.Failed || Content.Job.State == JobState.Aborted);
+      this.pauseButton.Enabled = Content != null && !Content.Job.Command.HasValue && Content.Job.State == JobState.Calculating;
+      this.stopButton.Enabled = Content != null && !Content.Job.Command.HasValue && (Content.Job.State == JobState.Calculating || Content.Job.State == JobState.Waiting || Content.Job.State == JobState.Paused);
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.designer.cs	(revision 6373)
@@ -0,0 +1,164 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class ControllableHiveJobView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ControllableHiveJobView));
+      this.restartButton = new System.Windows.Forms.Button();
+      this.pauseButton = new System.Windows.Forms.Button();
+      this.stopButton = new System.Windows.Forms.Button();
+      this.runsTabPage = new System.Windows.Forms.TabPage();
+      this.runCollectionViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.stateLogTabPage.SuspendLayout();
+      this.detailsTabPage.SuspendLayout();
+      this.optimizerGroupBox.SuspendLayout();
+      this.configurationGroupBox.SuspendLayout();
+      this.jobStatusGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.runsTabPage.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // detailsTabPage
+      // 
+      this.detailsTabPage.Controls.Add(this.restartButton);
+      this.detailsTabPage.Controls.Add(this.pauseButton);
+      this.detailsTabPage.Controls.Add(this.stopButton);
+      this.detailsTabPage.Controls.SetChildIndex(this.jobIdTextBox, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.jobIdLabel, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.optimizerGroupBox, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.splitContainer1, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.stopButton, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.pauseButton, 0);
+      this.detailsTabPage.Controls.SetChildIndex(this.restartButton, 0);
+      // 
+      // tabControl
+      // 
+      this.tabControl.Controls.Add(this.runsTabPage);
+      this.tabControl.Controls.SetChildIndex(this.runsTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.stateLogTabPage, 0);
+      this.tabControl.Controls.SetChildIndex(this.detailsTabPage, 0);
+      // 
+      // showItemButton
+      // 
+      this.modifyItemButton.Text = "Modify Optimizer";
+      // 
+      // splitContainer1
+      // 
+      // 
+      // restartButton
+      // 
+      this.restartButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.restartButton.Image = ((System.Drawing.Image)(resources.GetObject("restartButton.Image")));
+      this.restartButton.Location = new System.Drawing.Point(3, 348);
+      this.restartButton.Name = "restartButton";
+      this.restartButton.Size = new System.Drawing.Size(24, 24);
+      this.restartButton.TabIndex = 34;
+      this.restartButton.UseVisualStyleBackColor = true;
+      this.restartButton.Click += new System.EventHandler(this.restartButton_Click);
+      // 
+      // pauseButton
+      // 
+      this.pauseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.pauseButton.Enabled = false;
+      this.pauseButton.Image = ((System.Drawing.Image)(resources.GetObject("pauseButton.Image")));
+      this.pauseButton.Location = new System.Drawing.Point(33, 348);
+      this.pauseButton.Name = "pauseButton";
+      this.pauseButton.Size = new System.Drawing.Size(24, 24);
+      this.pauseButton.TabIndex = 35;
+      this.pauseButton.UseVisualStyleBackColor = true;
+      this.pauseButton.Click += new System.EventHandler(this.pauseButton_Click);
+      // 
+      // stopButton
+      // 
+      this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.stopButton.Image = ((System.Drawing.Image)(resources.GetObject("stopButton.Image")));
+      this.stopButton.Location = new System.Drawing.Point(63, 348);
+      this.stopButton.Name = "stopButton";
+      this.stopButton.Size = new System.Drawing.Size(24, 24);
+      this.stopButton.TabIndex = 36;
+      this.stopButton.UseVisualStyleBackColor = true;
+      this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
+      // 
+      // runsTabPage
+      // 
+      this.runsTabPage.Controls.Add(this.runCollectionViewHost);
+      this.runsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.runsTabPage.Name = "runsTabPage";
+      this.runsTabPage.Size = new System.Drawing.Size(563, 375);
+      this.runsTabPage.TabIndex = 6;
+      this.runsTabPage.Text = "Runs";
+      this.runsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // runCollectionViewHost
+      // 
+      this.runCollectionViewHost.Caption = "View";
+      this.runCollectionViewHost.Content = null;
+      this.runCollectionViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.runCollectionViewHost.Enabled = false;
+      this.runCollectionViewHost.Location = new System.Drawing.Point(0, 0);
+      this.runCollectionViewHost.Name = "runCollectionViewHost";
+      this.runCollectionViewHost.ReadOnly = false;
+      this.runCollectionViewHost.Size = new System.Drawing.Size(563, 375);
+      this.runCollectionViewHost.TabIndex = 1;
+      this.runCollectionViewHost.ViewsLabelVisible = true;
+      this.runCollectionViewHost.ViewType = null;
+      // 
+      // OptimizerHiveJobView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Name = "OptimizerHiveJobView";
+      this.stateLogTabPage.ResumeLayout(false);
+      this.detailsTabPage.ResumeLayout(false);
+      this.detailsTabPage.PerformLayout();
+      this.optimizerGroupBox.ResumeLayout(false);
+      this.optimizerGroupBox.PerformLayout();
+      this.configurationGroupBox.ResumeLayout(false);
+      this.configurationGroupBox.PerformLayout();
+      this.jobStatusGroupBox.ResumeLayout(false);
+      this.jobStatusGroupBox.PerformLayout();
+      this.tabControl.ResumeLayout(false);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.runsTabPage.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button restartButton;
+    private System.Windows.Forms.Button pauseButton;
+    private System.Windows.Forms.Button stopButton;
+    private System.Windows.Forms.TabPage runsTabPage;
+    private MainForm.WindowsForms.ViewHost runCollectionViewHost;
+
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/ControllableHiveJobView.resx	(revision 6373)
@@ -0,0 +1,154 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="stopButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAWtJREFUOE/Nkz9IAmEYxl0KGqKtMVpaIiEoipYIgnByCSGhSQiCNBqCMiqwsr8clChF
+        YmYSSikeWEbZH2qwEhKhwhAXjQwKEbw0zyue7nO7hgtyqOEbf7/ne5+XVwJAUsorCSbB/0xAeT+xSBcw
+        685B52QwYU9jdOMFw+ZnDK0+YtCUyHzvSzACge/jH7hLcAg8FHB4w8IbZOEKsLD4s5AqdnheWLpAQJKj
+        TxyCUa4IOi/yWPPlsOJlMGePoU6+JS4g376NczgKsdg+y8PIg3pnBmPWV6ipMGq61sUFZOarCAf3JZ98
+        8I75XQKnoDEmoRg5RXW7QVxACvOHWdhO8lim36C1ptFvSEI5E4NsYA9VLUviAtK255qFcT+LSXsKahMP
+        66OQa0Po7HOholEvLiCr2jxmMG2LQEOFoBw/55M96FA50NpjRlmDTlxA9tym8qGpl0Z9twO1Mktx7srm
+        BZRLp34W/Oao/v4WvgBcI/R+TmAaZAAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="pauseButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAAL5JREFUOE9j+P//PwMlmCLNIIsHoQG9m//+79rw63/e1EefQE5E56OHF4YXQJqvPvzz
+        Xzd0FVDtfwZ0PkED2tZ++3/r6e//qn6LwAag8wka0Lji8//LD3//l3ObBTYAnU/QgNrF7/+fuP77v5jd
+        JLAB6HyCBlTMe/V/94Wf//nNusEGoPMJGlAy+/n/9Sd//uc0aAUbgM4naEDB9Mf/F+z5/J9VpxFsADqf
+        oAGg+GfTbYIbgM4naACpGWvg8wIAkX3yJyVePz4AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="restartButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAK/wAA
+        Cv8BNGKaggAAALBJREFUOE9j+P//PwMlGKvmsv3ZbsQaitWAhBkR/4k1BKcBlmX6RBmC1YCoKUH/N9xa
+        /J8YQ7AaEDzBG2Q7UYZgNcCnyxlsAAhHLQrA6xKsBjg2W/zP2BAL1mzbrP9fp1jhv0QaN4hWQ48drAaY
+        1+ihaOZPYMGqGWQYVgP0SpXhNuPTjNMAlXwpsLMJacZpgHSGIFGacRogksyJ089EBSK20MaVNyjKiTi9
+        QGxOBKkDACT9xOni1RbMAAAAAElFTkSuQmCC
+</value>
+  </data>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.cs	(revision 6373)
@@ -0,0 +1,49 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("JobItemList View")]
+  [Content(typeof(IItemList<HiveJob>), false)]
+  public partial class HiveJobListView : ItemListView<HiveJob> {
+
+    public HiveJobListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Jobs";
+    }
+
+    protected override HiveJob CreateItem() {
+      return null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.addButton.Enabled = false;
+      this.moveDownButton.Enabled = false;
+      this.moveUpButton.Enabled = false;
+      this.removeButton.Enabled = false;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobListView.designer.cs	(revision 6373)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class HiveJobListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.cs	(revision 6373)
@@ -0,0 +1,202 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("HiveJob View")]
+  [Content(typeof(HiveJob), true)]
+  [Content(typeof(HiveJob<>), false)]
+  public partial class HiveJobView : ItemView {
+    public new HiveJob Content {
+      get { return (HiveJob)base.Content; }
+      set {
+        if (base.Content != value) {
+          base.Content = value;
+        }
+      }
+    }
+
+    public HiveJobView() {
+      InitializeComponent();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ItemJobChanged += new EventHandler(Content_JobItemChanged);
+      Content.JobChanged += new EventHandler(Content_JobChanged);
+      Content.JobStateChanged += new EventHandler(Content_JobStateChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.ItemJobChanged -= new EventHandler(Content_JobItemChanged);
+      Content.JobChanged -= new EventHandler(Content_JobChanged);
+      Content.JobStateChanged -= new EventHandler(Content_JobStateChanged);
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null && Content.Job != null) {
+        computeInParallelCheckBox.Checked = Content.ItemJob.ComputeInParallel;
+      } else {
+        computeInParallelCheckBox.Checked = false;
+      }
+      Content_JobItemChanged(this, EventArgs.Empty);
+      Content_JobChanged(this, EventArgs.Empty);
+      Content_JobStateChanged(this, EventArgs.Empty);
+    }
+
+    protected virtual void RegisterJobEvents() {
+      if (Content != null && Content.Job != null) {
+        Content.ItemJob.ComputeInParallelChanged += new EventHandler(OptimizerJob_ComputeInParallelChanged);
+        Content.ItemJob.ItemChanged += new EventHandler(Job_ItemChanged);
+      }
+    }
+
+    protected virtual void DeregisterJobEvents() {
+      if (Content != null && Content.Job != null) {
+        Content.ItemJob.ComputeInParallelChanged -= new EventHandler(OptimizerJob_ComputeInParallelChanged);
+        Content.ItemJob.ItemChanged -= new EventHandler(Job_ItemChanged);
+      }
+    }
+
+    #region Content Events
+    protected virtual void Content_JobChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_JobChanged), sender, e);
+      } else {
+        if (Content != null && Content.Job != null) {
+          this.jobIdTextBox.Text = Content.Job.Id.ToString();
+          this.dateCreatedTextBox.Text = Content.Job.DateCreated.HasValue ? Content.Job.DateCreated.ToString() : string.Empty;
+          this.priorityTextBox.Text = Content.Job.Priority.ToString();
+          this.coresNeededTextBox.Text = Content.Job.CoresNeeded.ToString();
+          this.memoryNeededTextBox.Text = Content.Job.MemoryNeeded.ToString();
+        } else {
+          this.jobIdTextBox.Text = string.Empty;
+          this.dateCreatedTextBox.Text = string.Empty;
+          this.priorityTextBox.Text = string.Empty;
+          this.coresNeededTextBox.Text = string.Empty;
+          this.memoryNeededTextBox.Text = string.Empty;
+        }
+      }
+    }
+
+    protected virtual void Content_JobItemChanged(object sender, EventArgs e) {
+      RegisterJobEvents();
+      Job_ItemChanged(this, e);
+    }
+
+    protected virtual void Job_ItemChanged(object sender, EventArgs e) {
+      if (Content != null && Content.Job != null && Content.ItemJob.Item != null) {
+        optimizerItemView.Content = Content.ItemJob.Item;
+      } else {
+        optimizerItemView.Content = null;
+      }
+    }
+
+    protected virtual void Content_JobStateChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(Content_JobStateChanged), sender, e);
+      } else {
+        if (Content != null && Content.Job != null) {
+          this.stateTextBox.Text = Content.Job.State.ToString();
+          this.commandTextBox.Text = Content.Job.Command.ToString();
+          this.executionTimeTextBox.Text = Content.Job.ExecutionTime.ToString();
+          this.dateFinishedTextBox.Text = Content.Job.DateFinished.ToString();
+          this.exceptionTextBox.Text = Content.Job.CurrentStateLog != null ? Content.Job.CurrentStateLog.Exception : string.Empty;
+          this.lastUpdatedTextBox.Text = Content.Job.LastJobDataUpdate.ToString();
+          if (Content.ItemJob.ComputeInParallel) {
+            this.stateLogViewHost.Content = new StateLogListList(
+                this.Content.ChildHiveJobs.Select(child => new StateLogList(child.Job.StateLog)
+              ));
+          } else {
+            this.stateLogViewHost.Content = new StateLogList(Content.Job.StateLog);
+          }
+        } else {
+          this.stateTextBox.Text = string.Empty;
+          this.commandTextBox.Text = string.Empty;
+          this.executionTimeTextBox.Text = string.Empty;
+          this.dateCalculatedText.Text = string.Empty;
+          this.dateFinishedTextBox.Text = string.Empty;
+          this.exceptionTextBox.Text = string.Empty;
+          this.stateLogViewHost.Content = null;
+          this.lastUpdatedTextBox.Text = string.Empty;
+        }
+        SetEnabledStateOfControls();
+      }
+    }
+
+    protected virtual void OptimizerJob_ComputeInParallelChanged(object sender, EventArgs e) {
+      if (InvokeRequired) {
+        Invoke(new EventHandler(OptimizerJob_ComputeInParallelChanged), sender, e);
+      } else {
+        computeInParallelCheckBox.Checked = Content.ItemJob.ComputeInParallel;
+      }
+    }
+    #endregion
+
+    #region Child Control Events
+    protected virtual void computeInParallelCheckBox_CheckedChanged(object sender, EventArgs e) {
+      if (Content != null && Content.ItemJob != null) {
+        this.Content.ItemJob.ComputeInParallel = this.computeInParallelCheckBox.Checked;
+      }
+    }
+
+    protected virtual void exceptionTextBox_DoubleClick(object sender, EventArgs e) {
+      using (TextDialog dialog = new TextDialog("Exception", exceptionTextBox.Text, ReadOnly || !Content.CanChangeDescription)) {
+        if (dialog.ShowDialog(this) == DialogResult.OK)
+          Content.Description = dialog.Content;
+      }
+    }
+
+    protected virtual void modifyItemButton_Click(object sender, EventArgs e) {
+      MainFormManager.MainForm.ShowContent(Content.ItemJob.Item);
+    }
+    #endregion
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.jobIdTextBox.ReadOnly = true;
+      this.stateTextBox.ReadOnly = true;
+      this.commandTextBox.ReadOnly = true;
+      this.executionTimeTextBox.ReadOnly = true;
+      this.dateCreatedTextBox.ReadOnly = true;
+      this.dateCalculatedText.ReadOnly = true;
+      this.dateFinishedTextBox.ReadOnly = true;
+      this.exceptionTextBox.ReadOnly = true;
+      this.lastUpdatedTextBox.ReadOnly = true;
+
+      this.priorityTextBox.ReadOnly = this.ReadOnly;
+      this.coresNeededTextBox.ReadOnly = this.ReadOnly;
+      this.memoryNeededTextBox.ReadOnly = this.ReadOnly;
+      this.computeInParallelCheckBox.Enabled = !this.ReadOnly && this.Content != null && this.Content.ItemJob != null && this.Content.ItemJob.IsParallelizable;
+
+      this.modifyItemButton.Enabled = (Content != null && Content.ItemJob.Item != null && (Content.Job.State == JobState.Paused || Content.Job.State == JobState.Offline || Content.Job.State == JobState.Finished || Content.Job.State == JobState.Failed || Content.Job.State == JobState.Aborted));
+
+      optimizerItemView.ReadOnly = true;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.designer.cs	(revision 6373)
@@ -0,0 +1,525 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class HiveJobView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.stateLogTabPage = new System.Windows.Forms.TabPage();
+      this.stateLogViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.detailsTabPage = new System.Windows.Forms.TabPage();
+      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.configurationGroupBox = new System.Windows.Forms.GroupBox();
+      this.priorityTextBox = new System.Windows.Forms.TextBox();
+      this.priorityLabel = new System.Windows.Forms.Label();
+      this.coresNeededTextBox = new System.Windows.Forms.TextBox();
+      this.memoryNeededTextBox = new System.Windows.Forms.TextBox();
+      this.memoryNeededLabel = new System.Windows.Forms.Label();
+      this.coresNeededLabel = new System.Windows.Forms.Label();
+      this.computeInParallelLabel = new System.Windows.Forms.Label();
+      this.computeInParallelCheckBox = new System.Windows.Forms.CheckBox();
+      this.jobStatusGroupBox = new System.Windows.Forms.GroupBox();
+      this.stateTextBox = new System.Windows.Forms.TextBox();
+      this.dateCalculatedLabel = new System.Windows.Forms.Label();
+      this.stateLabel = new System.Windows.Forms.Label();
+      this.dateCalculatedText = new System.Windows.Forms.TextBox();
+      this.dateFinishedTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeTextBox = new System.Windows.Forms.TextBox();
+      this.dateCreatedTextBox = new System.Windows.Forms.TextBox();
+      this.executionTimeLabel = new System.Windows.Forms.Label();
+      this.exceptionLabel = new System.Windows.Forms.Label();
+      this.dateCreatedLabel = new System.Windows.Forms.Label();
+      this.dateFinishedLabel = new System.Windows.Forms.Label();
+      this.exceptionTextBox = new System.Windows.Forms.TextBox();
+      this.optimizerGroupBox = new System.Windows.Forms.GroupBox();
+      this.modifyItemButton = new System.Windows.Forms.Button();
+      this.lastUpdatedTextBox = new System.Windows.Forms.TextBox();
+      this.lastUpdatedLabel = new System.Windows.Forms.Label();
+      this.optimizerItemView = new HeuristicLab.Core.Views.ItemView();
+      this.jobIdLabel = new System.Windows.Forms.Label();
+      this.jobIdTextBox = new System.Windows.Forms.TextBox();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.commandTextBox = new System.Windows.Forms.TextBox();
+      this.commandLabel = new System.Windows.Forms.Label();
+      this.stateLogTabPage.SuspendLayout();
+      this.detailsTabPage.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.configurationGroupBox.SuspendLayout();
+      this.jobStatusGroupBox.SuspendLayout();
+      this.optimizerGroupBox.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // stateLogTabPage
+      // 
+      this.stateLogTabPage.Controls.Add(this.stateLogViewHost);
+      this.stateLogTabPage.Location = new System.Drawing.Point(4, 22);
+      this.stateLogTabPage.Name = "stateLogTabPage";
+      this.stateLogTabPage.Size = new System.Drawing.Size(563, 375);
+      this.stateLogTabPage.TabIndex = 5;
+      this.stateLogTabPage.Text = "State";
+      this.stateLogTabPage.UseVisualStyleBackColor = true;
+      // 
+      // stateLogViewHost
+      // 
+      this.stateLogViewHost.Caption = "View";
+      this.stateLogViewHost.Content = null;
+      this.stateLogViewHost.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.stateLogViewHost.Enabled = false;
+      this.stateLogViewHost.Location = new System.Drawing.Point(0, 0);
+      this.stateLogViewHost.Name = "stateLogViewHost";
+      this.stateLogViewHost.ReadOnly = false;
+      this.stateLogViewHost.Size = new System.Drawing.Size(563, 375);
+      this.stateLogViewHost.TabIndex = 0;
+      this.stateLogViewHost.ViewsLabelVisible = true;
+      this.stateLogViewHost.ViewType = null;
+      // 
+      // detailsTabPage
+      // 
+      this.detailsTabPage.Controls.Add(this.splitContainer1);
+      this.detailsTabPage.Controls.Add(this.optimizerGroupBox);
+      this.detailsTabPage.Controls.Add(this.jobIdLabel);
+      this.detailsTabPage.Controls.Add(this.jobIdTextBox);
+      this.detailsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.detailsTabPage.Name = "detailsTabPage";
+      this.detailsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.detailsTabPage.Size = new System.Drawing.Size(563, 375);
+      this.detailsTabPage.TabIndex = 0;
+      this.detailsTabPage.Text = "Details";
+      this.detailsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.Location = new System.Drawing.Point(6, 110);
+      this.splitContainer1.Name = "splitContainer1";
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.configurationGroupBox);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.jobStatusGroupBox);
+      this.splitContainer1.Size = new System.Drawing.Size(551, 178);
+      this.splitContainer1.SplitterDistance = 275;
+      this.splitContainer1.TabIndex = 33;
+      // 
+      // configurationGroupBox
+      // 
+      this.configurationGroupBox.Controls.Add(this.priorityTextBox);
+      this.configurationGroupBox.Controls.Add(this.priorityLabel);
+      this.configurationGroupBox.Controls.Add(this.coresNeededTextBox);
+      this.configurationGroupBox.Controls.Add(this.memoryNeededTextBox);
+      this.configurationGroupBox.Controls.Add(this.memoryNeededLabel);
+      this.configurationGroupBox.Controls.Add(this.coresNeededLabel);
+      this.configurationGroupBox.Controls.Add(this.computeInParallelLabel);
+      this.configurationGroupBox.Controls.Add(this.computeInParallelCheckBox);
+      this.configurationGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.configurationGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.configurationGroupBox.Name = "configurationGroupBox";
+      this.configurationGroupBox.Size = new System.Drawing.Size(275, 178);
+      this.configurationGroupBox.TabIndex = 27;
+      this.configurationGroupBox.TabStop = false;
+      this.configurationGroupBox.Text = "Configuration";
+      // 
+      // priorityTextBox
+      // 
+      this.priorityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.priorityTextBox.Location = new System.Drawing.Point(108, 66);
+      this.priorityTextBox.Name = "priorityTextBox";
+      this.priorityTextBox.Size = new System.Drawing.Size(161, 20);
+      this.priorityTextBox.TabIndex = 41;
+      // 
+      // priorityLabel
+      // 
+      this.priorityLabel.AutoSize = true;
+      this.priorityLabel.Location = new System.Drawing.Point(7, 66);
+      this.priorityLabel.Name = "priorityLabel";
+      this.priorityLabel.Size = new System.Drawing.Size(41, 13);
+      this.priorityLabel.TabIndex = 42;
+      this.priorityLabel.Text = "Priority:";
+      // 
+      // coresNeededTextBox
+      // 
+      this.coresNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.coresNeededTextBox.Location = new System.Drawing.Point(108, 20);
+      this.coresNeededTextBox.Name = "coresNeededTextBox";
+      this.coresNeededTextBox.Size = new System.Drawing.Size(161, 20);
+      this.coresNeededTextBox.TabIndex = 37;
+      // 
+      // memoryNeededTextBox
+      // 
+      this.memoryNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.memoryNeededTextBox.Location = new System.Drawing.Point(108, 42);
+      this.memoryNeededTextBox.Name = "memoryNeededTextBox";
+      this.memoryNeededTextBox.Size = new System.Drawing.Size(161, 20);
+      this.memoryNeededTextBox.TabIndex = 38;
+      // 
+      // memoryNeededLabel
+      // 
+      this.memoryNeededLabel.AutoSize = true;
+      this.memoryNeededLabel.Location = new System.Drawing.Point(7, 42);
+      this.memoryNeededLabel.Name = "memoryNeededLabel";
+      this.memoryNeededLabel.Size = new System.Drawing.Size(85, 13);
+      this.memoryNeededLabel.TabIndex = 40;
+      this.memoryNeededLabel.Text = "MemoryNeeded:";
+      // 
+      // coresNeededLabel
+      // 
+      this.coresNeededLabel.AutoSize = true;
+      this.coresNeededLabel.Location = new System.Drawing.Point(7, 20);
+      this.coresNeededLabel.Name = "coresNeededLabel";
+      this.coresNeededLabel.Size = new System.Drawing.Size(75, 13);
+      this.coresNeededLabel.TabIndex = 39;
+      this.coresNeededLabel.Text = "CoresNeeded:";
+      // 
+      // computeInParallelLabel
+      // 
+      this.computeInParallelLabel.AutoSize = true;
+      this.computeInParallelLabel.Location = new System.Drawing.Point(7, 93);
+      this.computeInParallelLabel.Name = "computeInParallelLabel";
+      this.computeInParallelLabel.Size = new System.Drawing.Size(95, 13);
+      this.computeInParallelLabel.TabIndex = 36;
+      this.computeInParallelLabel.Text = "ComputeInParallel:";
+      // 
+      // computeInParallelCheckBox
+      // 
+      this.computeInParallelCheckBox.AutoSize = true;
+      this.computeInParallelCheckBox.Location = new System.Drawing.Point(108, 92);
+      this.computeInParallelCheckBox.Name = "computeInParallelCheckBox";
+      this.computeInParallelCheckBox.Size = new System.Drawing.Size(15, 14);
+      this.computeInParallelCheckBox.TabIndex = 35;
+      this.computeInParallelCheckBox.UseVisualStyleBackColor = true;
+      this.computeInParallelCheckBox.CheckedChanged += new System.EventHandler(this.computeInParallelCheckBox_CheckedChanged);
+      // 
+      // jobStatusGroupBox
+      // 
+      this.jobStatusGroupBox.Controls.Add(this.commandTextBox);
+      this.jobStatusGroupBox.Controls.Add(this.commandLabel);
+      this.jobStatusGroupBox.Controls.Add(this.stateTextBox);
+      this.jobStatusGroupBox.Controls.Add(this.dateCalculatedLabel);
+      this.jobStatusGroupBox.Controls.Add(this.stateLabel);
+      this.jobStatusGroupBox.Controls.Add(this.dateCalculatedText);
+      this.jobStatusGroupBox.Controls.Add(this.dateFinishedTextBox);
+      this.jobStatusGroupBox.Controls.Add(this.executionTimeTextBox);
+      this.jobStatusGroupBox.Controls.Add(this.dateCreatedTextBox);
+      this.jobStatusGroupBox.Controls.Add(this.executionTimeLabel);
+      this.jobStatusGroupBox.Controls.Add(this.exceptionLabel);
+      this.jobStatusGroupBox.Controls.Add(this.dateCreatedLabel);
+      this.jobStatusGroupBox.Controls.Add(this.dateFinishedLabel);
+      this.jobStatusGroupBox.Controls.Add(this.exceptionTextBox);
+      this.jobStatusGroupBox.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.jobStatusGroupBox.Location = new System.Drawing.Point(0, 0);
+      this.jobStatusGroupBox.Name = "jobStatusGroupBox";
+      this.jobStatusGroupBox.Size = new System.Drawing.Size(272, 178);
+      this.jobStatusGroupBox.TabIndex = 24;
+      this.jobStatusGroupBox.TabStop = false;
+      this.jobStatusGroupBox.Text = "Job Status";
+      // 
+      // stateTextBox
+      // 
+      this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stateTextBox.Location = new System.Drawing.Point(95, 19);
+      this.stateTextBox.Name = "stateTextBox";
+      this.stateTextBox.Size = new System.Drawing.Size(171, 20);
+      this.stateTextBox.TabIndex = 2;
+      // 
+      // dateCalculatedLabel
+      // 
+      this.dateCalculatedLabel.AutoSize = true;
+      this.dateCalculatedLabel.Location = new System.Drawing.Point(7, 108);
+      this.dateCalculatedLabel.Name = "dateCalculatedLabel";
+      this.dateCalculatedLabel.Size = new System.Drawing.Size(83, 13);
+      this.dateCalculatedLabel.TabIndex = 23;
+      this.dateCalculatedLabel.Text = "DateCalculated:";
+      // 
+      // stateLabel
+      // 
+      this.stateLabel.AutoSize = true;
+      this.stateLabel.Location = new System.Drawing.Point(7, 19);
+      this.stateLabel.Name = "stateLabel";
+      this.stateLabel.Size = new System.Drawing.Size(35, 13);
+      this.stateLabel.TabIndex = 0;
+      this.stateLabel.Text = "State:";
+      // 
+      // dateCalculatedText
+      // 
+      this.dateCalculatedText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCalculatedText.Location = new System.Drawing.Point(95, 108);
+      this.dateCalculatedText.Name = "dateCalculatedText";
+      this.dateCalculatedText.Size = new System.Drawing.Size(171, 20);
+      this.dateCalculatedText.TabIndex = 22;
+      // 
+      // dateFinishedTextBox
+      // 
+      this.dateFinishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateFinishedTextBox.Location = new System.Drawing.Point(95, 130);
+      this.dateFinishedTextBox.Name = "dateFinishedTextBox";
+      this.dateFinishedTextBox.Size = new System.Drawing.Size(171, 20);
+      this.dateFinishedTextBox.TabIndex = 6;
+      // 
+      // executionTimeTextBox
+      // 
+      this.executionTimeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.executionTimeTextBox.Location = new System.Drawing.Point(95, 64);
+      this.executionTimeTextBox.Name = "executionTimeTextBox";
+      this.executionTimeTextBox.Size = new System.Drawing.Size(171, 20);
+      this.executionTimeTextBox.TabIndex = 4;
+      // 
+      // dateCreatedTextBox
+      // 
+      this.dateCreatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCreatedTextBox.Location = new System.Drawing.Point(95, 86);
+      this.dateCreatedTextBox.Name = "dateCreatedTextBox";
+      this.dateCreatedTextBox.Size = new System.Drawing.Size(171, 20);
+      this.dateCreatedTextBox.TabIndex = 5;
+      // 
+      // executionTimeLabel
+      // 
+      this.executionTimeLabel.AutoSize = true;
+      this.executionTimeLabel.Location = new System.Drawing.Point(7, 64);
+      this.executionTimeLabel.Name = "executionTimeLabel";
+      this.executionTimeLabel.Size = new System.Drawing.Size(80, 13);
+      this.executionTimeLabel.TabIndex = 13;
+      this.executionTimeLabel.Text = "ExecutionTime:";
+      // 
+      // exceptionLabel
+      // 
+      this.exceptionLabel.AutoSize = true;
+      this.exceptionLabel.Location = new System.Drawing.Point(7, 152);
+      this.exceptionLabel.Name = "exceptionLabel";
+      this.exceptionLabel.Size = new System.Drawing.Size(57, 13);
+      this.exceptionLabel.TabIndex = 19;
+      this.exceptionLabel.Text = "Exception:";
+      // 
+      // dateCreatedLabel
+      // 
+      this.dateCreatedLabel.AutoSize = true;
+      this.dateCreatedLabel.Location = new System.Drawing.Point(7, 86);
+      this.dateCreatedLabel.Name = "dateCreatedLabel";
+      this.dateCreatedLabel.Size = new System.Drawing.Size(70, 13);
+      this.dateCreatedLabel.TabIndex = 14;
+      this.dateCreatedLabel.Text = "DateCreated:";
+      // 
+      // dateFinishedLabel
+      // 
+      this.dateFinishedLabel.AutoSize = true;
+      this.dateFinishedLabel.Location = new System.Drawing.Point(7, 130);
+      this.dateFinishedLabel.Name = "dateFinishedLabel";
+      this.dateFinishedLabel.Size = new System.Drawing.Size(72, 13);
+      this.dateFinishedLabel.TabIndex = 15;
+      this.dateFinishedLabel.Text = "DateFinished:";
+      // 
+      // exceptionTextBox
+      // 
+      this.exceptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.exceptionTextBox.Location = new System.Drawing.Point(95, 152);
+      this.exceptionTextBox.Name = "exceptionTextBox";
+      this.exceptionTextBox.Size = new System.Drawing.Size(171, 20);
+      this.exceptionTextBox.TabIndex = 10;
+      this.exceptionTextBox.DoubleClick += new System.EventHandler(this.exceptionTextBox_DoubleClick);
+      // 
+      // optimizerGroupBox
+      // 
+      this.optimizerGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerGroupBox.Controls.Add(this.modifyItemButton);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedTextBox);
+      this.optimizerGroupBox.Controls.Add(this.lastUpdatedLabel);
+      this.optimizerGroupBox.Controls.Add(this.optimizerItemView);
+      this.optimizerGroupBox.Location = new System.Drawing.Point(6, 29);
+      this.optimizerGroupBox.Name = "optimizerGroupBox";
+      this.optimizerGroupBox.Size = new System.Drawing.Size(551, 75);
+      this.optimizerGroupBox.TabIndex = 28;
+      this.optimizerGroupBox.TabStop = false;
+      this.optimizerGroupBox.Text = "JobItem";
+      // 
+      // modifyItemButton
+      // 
+      this.modifyItemButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.modifyItemButton.Location = new System.Drawing.Point(78, 45);
+      this.modifyItemButton.Name = "modifyItemButton";
+      this.modifyItemButton.Size = new System.Drawing.Size(467, 23);
+      this.modifyItemButton.TabIndex = 3;
+      this.modifyItemButton.Text = "Modify Item";
+      this.modifyItemButton.UseVisualStyleBackColor = true;
+      this.modifyItemButton.Click += new System.EventHandler(this.modifyItemButton_Click);
+      // 
+      // lastUpdatedTextBox
+      // 
+      this.lastUpdatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lastUpdatedTextBox.Location = new System.Drawing.Point(78, 19);
+      this.lastUpdatedTextBox.Name = "lastUpdatedTextBox";
+      this.lastUpdatedTextBox.Size = new System.Drawing.Size(467, 20);
+      this.lastUpdatedTextBox.TabIndex = 2;
+      // 
+      // lastUpdatedLabel
+      // 
+      this.lastUpdatedLabel.AutoSize = true;
+      this.lastUpdatedLabel.Location = new System.Drawing.Point(3, 22);
+      this.lastUpdatedLabel.Name = "lastUpdatedLabel";
+      this.lastUpdatedLabel.Size = new System.Drawing.Size(71, 13);
+      this.lastUpdatedLabel.TabIndex = 1;
+      this.lastUpdatedLabel.Text = "LastUpdated:";
+      // 
+      // optimizerItemView
+      // 
+      this.optimizerItemView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.optimizerItemView.Caption = "NamedItem View";
+      this.optimizerItemView.Content = null;
+      this.optimizerItemView.Location = new System.Drawing.Point(6, 20);
+      this.optimizerItemView.Name = "optimizerItemView";
+      this.optimizerItemView.ReadOnly = false;
+      this.optimizerItemView.Size = new System.Drawing.Size(539, 51);
+      this.optimizerItemView.TabIndex = 0;
+      // 
+      // jobIdLabel
+      // 
+      this.jobIdLabel.AutoSize = true;
+      this.jobIdLabel.Location = new System.Drawing.Point(3, 6);
+      this.jobIdLabel.Name = "jobIdLabel";
+      this.jobIdLabel.Size = new System.Drawing.Size(36, 13);
+      this.jobIdLabel.TabIndex = 25;
+      this.jobIdLabel.Text = "JobId:";
+      // 
+      // jobIdTextBox
+      // 
+      this.jobIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobIdTextBox.Location = new System.Drawing.Point(91, 6);
+      this.jobIdTextBox.Name = "jobIdTextBox";
+      this.jobIdTextBox.Size = new System.Drawing.Size(466, 20);
+      this.jobIdTextBox.TabIndex = 26;
+      // 
+      // tabControl
+      // 
+      this.tabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.tabControl.Controls.Add(this.detailsTabPage);
+      this.tabControl.Controls.Add(this.stateLogTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(571, 401);
+      this.tabControl.TabIndex = 25;
+      // 
+      // commandTextBox
+      // 
+      this.commandTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.commandTextBox.Location = new System.Drawing.Point(95, 41);
+      this.commandTextBox.Name = "commandTextBox";
+      this.commandTextBox.Size = new System.Drawing.Size(171, 20);
+      this.commandTextBox.TabIndex = 24;
+      // 
+      // commandLabel
+      // 
+      this.commandLabel.AutoSize = true;
+      this.commandLabel.Location = new System.Drawing.Point(7, 41);
+      this.commandLabel.Name = "commandLabel";
+      this.commandLabel.Size = new System.Drawing.Size(57, 13);
+      this.commandLabel.TabIndex = 25;
+      this.commandLabel.Text = "Command:";
+      // 
+      // HiveJobView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "HiveJobView";
+      this.Size = new System.Drawing.Size(577, 407);
+      this.stateLogTabPage.ResumeLayout(false);
+      this.detailsTabPage.ResumeLayout(false);
+      this.detailsTabPage.PerformLayout();
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
+      this.splitContainer1.ResumeLayout(false);
+      this.configurationGroupBox.ResumeLayout(false);
+      this.configurationGroupBox.PerformLayout();
+      this.jobStatusGroupBox.ResumeLayout(false);
+      this.jobStatusGroupBox.PerformLayout();
+      this.optimizerGroupBox.ResumeLayout(false);
+      this.optimizerGroupBox.PerformLayout();
+      this.tabControl.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TabPage stateLogTabPage;
+    protected MainForm.WindowsForms.ViewHost stateLogViewHost;
+    protected System.Windows.Forms.TabPage detailsTabPage;
+    protected System.Windows.Forms.GroupBox optimizerGroupBox;
+    protected Core.Views.ItemView optimizerItemView;
+    protected System.Windows.Forms.GroupBox configurationGroupBox;
+    protected System.Windows.Forms.TextBox priorityTextBox;
+    protected System.Windows.Forms.Label priorityLabel;
+    protected System.Windows.Forms.TextBox coresNeededTextBox;
+    protected System.Windows.Forms.TextBox memoryNeededTextBox;
+    protected System.Windows.Forms.Label memoryNeededLabel;
+    protected System.Windows.Forms.Label coresNeededLabel;
+    protected System.Windows.Forms.Label computeInParallelLabel;
+    protected System.Windows.Forms.CheckBox computeInParallelCheckBox;
+    protected System.Windows.Forms.Label jobIdLabel;
+    protected System.Windows.Forms.TextBox jobIdTextBox;
+    protected System.Windows.Forms.GroupBox jobStatusGroupBox;
+    protected System.Windows.Forms.TextBox stateTextBox;
+    protected System.Windows.Forms.Label stateLabel;
+    protected System.Windows.Forms.TextBox dateFinishedTextBox;
+    protected System.Windows.Forms.TextBox executionTimeTextBox;
+    protected System.Windows.Forms.Label executionTimeLabel;
+    protected System.Windows.Forms.Label exceptionLabel;
+    protected System.Windows.Forms.Label dateFinishedLabel;
+    protected System.Windows.Forms.TextBox exceptionTextBox;
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.Button modifyItemButton;
+    protected System.Windows.Forms.TextBox lastUpdatedTextBox;
+    protected System.Windows.Forms.Label lastUpdatedLabel;
+    protected System.Windows.Forms.Label dateCalculatedLabel;
+    protected System.Windows.Forms.TextBox dateCalculatedText;
+    protected System.Windows.Forms.TextBox dateCreatedTextBox;
+    protected System.Windows.Forms.Label dateCreatedLabel;
+    protected System.Windows.Forms.SplitContainer splitContainer1;
+    protected System.Windows.Forms.TextBox commandTextBox;
+    protected System.Windows.Forms.Label commandLabel;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/HiveJobs/HiveJobView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.cs	(revision 6373)
@@ -0,0 +1,115 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("StateLogGanttChartList View")]
+  [Content(typeof(StateLogListList), true)]
+  public sealed partial class StateLogGanttChartListView : ItemView {
+    public new StateLogListList Content {
+      get { return (StateLogListList)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public StateLogGanttChartListView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // Add code when content has been changed and is null
+        ganttChart.Reset();
+      } else {
+        // Add code when content has been changed and is not null
+        ganttChart.Reset();
+        SetupCategories(ganttChart);
+        if (Content.Count > 0) {
+          DateTime maxValue = Content.Max(x => x.Count > 0 ? x.Max(y => y.DateTime) : DateTime.MinValue);
+          DateTime upperLimit;
+          if (Content.All(x => x.Count > 0 ? (x.Last().State == JobState.Finished || x.Last().State == JobState.Failed || x.Last().State == JobState.Aborted) : true)) {
+            upperLimit = DateTime.FromOADate(Math.Min(DateTime.Now.AddSeconds(10).ToOADate(), maxValue.AddSeconds(10).ToOADate()));
+          } else {
+            upperLimit = DateTime.Now;
+          }
+
+          for (int i = 0; i < Content.Count; i++) {
+            for (int j = 0; j < Content[i].Count - 1; j++) {
+              if (Content[i][j].State != JobState.Offline)
+                AddData(ganttChart, i.ToString(), Content[i][j], Content[i][j + 1], upperLimit);
+            }
+            if (Content[i].Count > 0) {
+              AddData(ganttChart, i.ToString(), Content[i][Content[i].Count - 1], null, upperLimit);
+            }
+          }
+        }
+      }
+    }
+
+    public static void SetupCategories(GanttChart ganttChart) {
+      ganttChart.AddCategory(JobState.Offline.ToString(), Color.Gainsboro);
+      ganttChart.AddCategory(JobState.Waiting.ToString(), Color.NavajoWhite);
+      ganttChart.AddCategory(JobState.Paused.ToString(), Color.PaleVioletRed);
+      ganttChart.AddCategory(JobState.Transferring.ToString(), Color.CornflowerBlue);
+      ganttChart.AddCategory(JobState.Calculating.ToString(), Color.DarkGreen);
+      ganttChart.AddCategory(JobState.Finished.ToString(), Color.White);
+      ganttChart.AddCategory(JobState.Aborted.ToString(), Color.Orange);
+      ganttChart.AddCategory(JobState.Failed.ToString(), Color.Red);
+    }
+
+    public static void AddData(GanttChart ganttChart, string name, StateLog from, StateLog to, DateTime upperLimit) {
+      DateTime until = to != null ? to.DateTime : upperLimit;
+      TimeSpan duration = until - from.DateTime;
+      string tooltip = string.Format("State: {0} " + Environment.NewLine + " Duration: {1} " + Environment.NewLine + " {2} - {3}", from.State, duration, from.DateTime, until);
+      if (!string.IsNullOrEmpty(from.Exception))
+        tooltip += Environment.NewLine + from.Exception;
+      ganttChart.AddData(name, from.State.ToString(), from.DateTime, until, tooltip, false);
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.designer.cs	(revision 6373)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class StateLogGanttChartListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.ganttChart = new HeuristicLab.Clients.Hive.Views.GanttChart();
+      this.SuspendLayout();
+      // 
+      // ganttChart
+      // 
+      this.ganttChart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.ganttChart.Location = new System.Drawing.Point(0, 0);
+      this.ganttChart.Name = "ganttChart";
+      this.ganttChart.Size = new System.Drawing.Size(493, 293);
+      this.ganttChart.TabIndex = 0;
+      // 
+      // StateLogGanttChartListView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ganttChart);
+      this.Name = "StateLogGanttChartListView";
+      this.Size = new System.Drawing.Size(493, 293);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private GanttChart ganttChart;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartListView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.cs	(revision 6373)
@@ -0,0 +1,88 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("StateLogGanttChart View")]
+  [Content(typeof(StateLogList), IsDefaultView = true)]
+  public sealed partial class StateLogGanttChartView : ItemView {
+    public new StateLogList Content {
+      get { return (StateLogList)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public StateLogGanttChartView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // Add code when content has been changed and is null
+        ganttChart.Reset();
+      } else {
+        // Add code when content has been changed and is not null
+        ganttChart.Reset();
+        StateLogGanttChartListView.SetupCategories(ganttChart);
+        if (Content.Count > 0) {
+          DateTime upperLimit;
+          if (Content.Last().State == JobState.Finished || Content.Last().State == JobState.Failed || Content.Last().State == JobState.Aborted) {
+            upperLimit = DateTime.FromOADate(Math.Min(Content.Max(x => x.DateTime).ToOADate(), DateTime.Now.AddSeconds(10).ToOADate()));
+          } else {
+            upperLimit = DateTime.Now;
+          }
+
+          for (int i = 0; i < Content.Count - 1; i++) {
+            StateLogGanttChartListView.AddData(ganttChart, i.ToString(), Content[i], Content[i + 1], upperLimit);
+          }
+          StateLogGanttChartListView.AddData(ganttChart, (Content.Count - 1).ToString(), Content[Content.Count - 1], null, upperLimit);
+        }
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+    // Put event handlers of child controls here.
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.designer.cs	(revision 6373)
@@ -0,0 +1,55 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class StateLogGanttChartView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.ganttChart = new HeuristicLab.Clients.Hive.Views.GanttChart();
+      this.SuspendLayout();
+      // 
+      // ganttChart
+      // 
+      this.ganttChart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.ganttChart.Location = new System.Drawing.Point(0, 0);
+      this.ganttChart.Name = "ganttChart";
+      this.ganttChart.Size = new System.Drawing.Size(533, 302);
+      this.ganttChart.TabIndex = 0;
+      // 
+      // StateLogGanttChartView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.ganttChart);
+      this.Name = "StateLogGanttChartView";
+      this.Size = new System.Drawing.Size(533, 302);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private GanttChart ganttChart;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogGanttChartView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogList.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogList.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogList.cs	(revision 6373)
@@ -0,0 +1,22 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [StorableClass]
+  public class StateLogList : ItemList<StateLog> {
+
+    [StorableConstructor]
+    protected StateLogList(bool deserializing) : base(deserializing) { }
+    public StateLogList() : base() { }
+    protected StateLogList(StateLogList original, Cloner cloner) : base(original, cloner) { }
+    public StateLogList(IEnumerable<StateLog> collection)
+      : base(collection) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StateLogList(this, cloner);
+    }
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListList.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListList.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListList.cs	(revision 6373)
@@ -0,0 +1,22 @@
+﻿using System.Collections.Generic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [StorableClass]
+  public class StateLogListList : ItemList<StateLogList> {
+
+    [StorableConstructor]
+    protected StateLogListList(bool deserializing) : base(deserializing) { }
+    public StateLogListList() : base() { }
+    protected StateLogListList(StateLogListList original, Cloner cloner) : base(original, cloner) { }
+    public StateLogListList(IEnumerable<StateLogList> collection)
+      : base(collection) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StateLogListList(this, cloner);
+    }
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.cs	(revision 6373)
@@ -0,0 +1,48 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using HeuristicLab.Core;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("StateLog View")]
+  [Content(typeof(IItemList<StateLog>), false)]
+  public partial class StateLogListView : ItemListView<StateLog> {
+
+    public StateLogListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "StateLog";
+    }
+
+    protected override StateLog CreateItem() {
+      return null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.addButton.Enabled = false;
+      this.moveDownButton.Enabled = false;
+      this.moveUpButton.Enabled = false;
+      this.removeButton.Enabled = false;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogListView.designer.cs	(revision 6373)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class StateLogListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.cs	(revision 6373)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+
+namespace HeuristicLab.Clients.Hive.Views {
+  [View("StateLog View")]
+  [Content(typeof(StateLog), IsDefaultView = true)]
+  public sealed partial class StateLogView : ItemView {
+    public new StateLog Content {
+      get { return (StateLog)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public StateLogView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // Deregister your event handlers here
+
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // Register your event handlers here
+
+    }
+
+    #region Event Handlers (Content)
+    // Put event handlers of the content here
+
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // Add code when content has been changed and is null
+        stateTextBox.Text = string.Empty;
+        dateTextBox.Text = string.Empty;
+        exceptionTextBox.Text = string.Empty;
+        userIdTextBox.Text = string.Empty;
+        slaveIdTextBox.Text = string.Empty;
+      } else {
+        // Add code when content has been changed and is not null
+        stateTextBox.Text = Content.State.ToString();
+        dateTextBox.Text = Content.DateTime.ToString();
+        exceptionTextBox.Text = Content.Exception;
+        userIdTextBox.Text = Content.UserId.ToString();
+        slaveIdTextBox.Text = Content.SlaveId.ToString();
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // Enable or disable controls based on whether the content is null or the view is set readonly
+      stateTextBox.ReadOnly = true;
+      dateTextBox.ReadOnly = true;
+      exceptionTextBox.ReadOnly = true;
+      userIdTextBox.ReadOnly = true;
+      slaveIdTextBox.ReadOnly = true;
+    }
+
+    #region Event Handlers (child controls)
+    // Put event handlers of child controls here.
+
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.designer.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.designer.cs	(revision 6373)
@@ -0,0 +1,163 @@
+﻿namespace HeuristicLab.Clients.Hive.Views {
+  partial class StateLogView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.stateLabel = new System.Windows.Forms.Label();
+      this.stateTextBox = new System.Windows.Forms.TextBox();
+      this.dateLabel = new System.Windows.Forms.Label();
+      this.dateTextBox = new System.Windows.Forms.TextBox();
+      this.exceptionTextBox = new System.Windows.Forms.TextBox();
+      this.userIdTextBox = new System.Windows.Forms.TextBox();
+      this.slaveIdTextBox = new System.Windows.Forms.TextBox();
+      this.slaveIdLabel = new System.Windows.Forms.Label();
+      this.userIdLabel = new System.Windows.Forms.Label();
+      this.exceptionLabel = new System.Windows.Forms.Label();
+      this.SuspendLayout();
+      // 
+      // stateLabel
+      // 
+      this.stateLabel.AutoSize = true;
+      this.stateLabel.Location = new System.Drawing.Point(3, 11);
+      this.stateLabel.Name = "stateLabel";
+      this.stateLabel.Size = new System.Drawing.Size(35, 13);
+      this.stateLabel.TabIndex = 0;
+      this.stateLabel.Text = "State:";
+      // 
+      // stateTextBox
+      // 
+      this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stateTextBox.Location = new System.Drawing.Point(72, 4);
+      this.stateTextBox.Name = "stateTextBox";
+      this.stateTextBox.Size = new System.Drawing.Size(451, 20);
+      this.stateTextBox.TabIndex = 1;
+      // 
+      // dateLabel
+      // 
+      this.dateLabel.AutoSize = true;
+      this.dateLabel.Location = new System.Drawing.Point(3, 33);
+      this.dateLabel.Name = "dateLabel";
+      this.dateLabel.Size = new System.Drawing.Size(33, 13);
+      this.dateLabel.TabIndex = 2;
+      this.dateLabel.Text = "Date:";
+      // 
+      // dateTextBox
+      // 
+      this.dateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateTextBox.Location = new System.Drawing.Point(72, 30);
+      this.dateTextBox.Name = "dateTextBox";
+      this.dateTextBox.Size = new System.Drawing.Size(451, 20);
+      this.dateTextBox.TabIndex = 3;
+      // 
+      // exceptionTextBox
+      // 
+      this.exceptionTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.exceptionTextBox.Location = new System.Drawing.Point(72, 56);
+      this.exceptionTextBox.Name = "exceptionTextBox";
+      this.exceptionTextBox.Size = new System.Drawing.Size(451, 20);
+      this.exceptionTextBox.TabIndex = 4;
+      // 
+      // userIdTextBox
+      // 
+      this.userIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userIdTextBox.Location = new System.Drawing.Point(72, 82);
+      this.userIdTextBox.Name = "userIdTextBox";
+      this.userIdTextBox.Size = new System.Drawing.Size(451, 20);
+      this.userIdTextBox.TabIndex = 5;
+      // 
+      // slaveIdTextBox
+      // 
+      this.slaveIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.slaveIdTextBox.Location = new System.Drawing.Point(72, 108);
+      this.slaveIdTextBox.Name = "slaveIdTextBox";
+      this.slaveIdTextBox.Size = new System.Drawing.Size(451, 20);
+      this.slaveIdTextBox.TabIndex = 6;
+      // 
+      // slaveIdLabel
+      // 
+      this.slaveIdLabel.AutoSize = true;
+      this.slaveIdLabel.Location = new System.Drawing.Point(3, 111);
+      this.slaveIdLabel.Name = "slaveIdLabel";
+      this.slaveIdLabel.Size = new System.Drawing.Size(46, 13);
+      this.slaveIdLabel.TabIndex = 7;
+      this.slaveIdLabel.Text = "SlaveId:";
+      // 
+      // userIdLabel
+      // 
+      this.userIdLabel.AutoSize = true;
+      this.userIdLabel.Location = new System.Drawing.Point(3, 85);
+      this.userIdLabel.Name = "userIdLabel";
+      this.userIdLabel.Size = new System.Drawing.Size(41, 13);
+      this.userIdLabel.TabIndex = 8;
+      this.userIdLabel.Text = "UserId:";
+      // 
+      // exceptionLabel
+      // 
+      this.exceptionLabel.AutoSize = true;
+      this.exceptionLabel.Location = new System.Drawing.Point(3, 59);
+      this.exceptionLabel.Name = "exceptionLabel";
+      this.exceptionLabel.Size = new System.Drawing.Size(57, 13);
+      this.exceptionLabel.TabIndex = 9;
+      this.exceptionLabel.Text = "Exception:";
+      // 
+      // StateLogView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.exceptionLabel);
+      this.Controls.Add(this.userIdLabel);
+      this.Controls.Add(this.slaveIdLabel);
+      this.Controls.Add(this.slaveIdTextBox);
+      this.Controls.Add(this.userIdTextBox);
+      this.Controls.Add(this.exceptionTextBox);
+      this.Controls.Add(this.dateTextBox);
+      this.Controls.Add(this.dateLabel);
+      this.Controls.Add(this.stateTextBox);
+      this.Controls.Add(this.stateLabel);
+      this.Name = "StateLogView";
+      this.Size = new System.Drawing.Size(523, 192);
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label stateLabel;
+    private System.Windows.Forms.TextBox stateTextBox;
+    private System.Windows.Forms.Label dateLabel;
+    private System.Windows.Forms.TextBox dateTextBox;
+    private System.Windows.Forms.TextBox exceptionTextBox;
+    private System.Windows.Forms.TextBox userIdTextBox;
+    private System.Windows.Forms.TextBox slaveIdTextBox;
+    private System.Windows.Forms.Label slaveIdLabel;
+    private System.Windows.Forms.Label userIdLabel;
+    private System.Windows.Forms.Label exceptionLabel;
+
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.resx
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.resx	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/StateLog/StateLogView.resx	(revision 6373)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloader.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloader.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloader.cs	(revision 6373)
@@ -0,0 +1,99 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+using HeuristicLab.Hive;
+
+namespace HeuristicLab.Clients.Hive {
+  /// <summary>
+  /// Downloads and deserializes jobs. It avoids too many jobs beeing downloaded or deserialized at the same time to avoid memory problems
+  /// </summary>
+  public class ConcurrentJobDownloader<T> where T : class, IJob {
+    private bool abort = false;
+    // use semaphore to ensure only few concurrenct connections and few SerializedJob objects in memory
+    private Semaphore downloadSemaphore;
+    private Semaphore deserializeSemaphore;
+    
+    public ConcurrentJobDownloader(int concurrentDownloads, int concurrentDeserializations) {
+      downloadSemaphore = new Semaphore(concurrentDownloads, concurrentDownloads);
+      deserializeSemaphore = new Semaphore(concurrentDeserializations, concurrentDeserializations);
+      TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);
+    }
+
+    public void DownloadJob(Job job, Action<Job, T> onFinishedAction) {
+      Task<T> task = Task<JobData>.Factory.StartNew((x) => DownloadJob(x), job.Id)
+                                     .ContinueWith((x) => DeserializeJob(x.Result));
+      task.ContinueWith((x) => OnJobFinished(job, x, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnRanToCompletion);
+      task.ContinueWith((x) => OnJobFailed(job, x, onFinishedAction), TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.OnlyOnFaulted);
+    }
+
+    private void OnJobFinished(Job job, Task<T> task, Action<Job, T> onFinishedAction) {
+      onFinishedAction(job, task.Result);
+    }
+    private void OnJobFailed(Job job, Task<T> task, Action<Job, T> onFinishedAction) {
+      task.Exception.Flatten().Handle((e) => { return true; });
+      OnExceptionOccured(task.Exception.Flatten());
+      onFinishedAction(job, null);
+    }
+
+    protected JobData DownloadJob(object jobId) {
+      downloadSemaphore.WaitOne();
+      deserializeSemaphore.WaitOne();
+      JobData result;
+      try {
+        if (abort) return null;
+        result = ServiceLocator.Instance.CallHiveService(s => s.GetJobData((Guid)jobId));
+      }
+      finally {
+        downloadSemaphore.Release();
+      }
+      return result;
+    }
+
+    protected T DeserializeJob(JobData jobData) {
+      try {
+        if (abort || jobData == null) return null;
+        Job job = ServiceLocator.Instance.CallHiveService(s => s.GetJob(jobData.JobId));
+        if (job == null) return null;
+        var deserializedJob = PersistenceUtil.Deserialize<T>(jobData.Data);
+        jobData.Data = null; // reduce memory consumption.
+        return deserializedJob;
+      }
+      finally {
+        deserializeSemaphore.Release();
+      }
+    }
+
+    private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) {
+      e.SetObserved(); // avoid crash of process because task crashes. first exception found is handled in Results property
+      OnExceptionOccured(new HiveException("Unobserved Exception in ConcurrentJobDownloader", e.Exception));
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
+    private void OnExceptionOccured(Exception exception) {
+      var handler = ExceptionOccured;
+      if (handler != null) handler(this, new EventArgs<Exception>(exception));
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloaderException.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloaderException.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ConcurrentJobDownloaderException.cs	(revision 6373)
@@ -0,0 +1,29 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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;
+
+namespace HeuristicLab.Clients.Hive {
+  public class ConcurrentJobDownloaderException : Exception {
+    public ConcurrentJobDownloaderException(string message, Exception innerException)
+      : base(message, innerException) { }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HeuristicLab.Clients.Hive-3.4.csproj	(revision 6373)
@@ -112,5 +112,7 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="HiveClient.cs" />
     <Compile Include="Jobs\ItemJob.cs" />
+    <Compile Include="RefreshableHiveExperiment.cs" />
     <Compile Include="ThreadSafeLog.cs" />
     <None Include="app_f005pc.config" />
@@ -118,20 +120,17 @@
     <None Include="app.config" />
     <None Include="HeuristicLabClientsHivePlugin.cs.frame" />
-    <Compile Include="Administration\HiveAdministrationClient.cs" />
     <Compile Include="Exceptions\AddJobToHiveException.cs" />
     <Compile Include="Exceptions\JobResultPollingException.cs" />
     <Compile Include="Exceptions\OptimizerNotFoundException.cs" />
-    <Compile Include="ExperimentManager\ConcurrentJobDownloader.cs" />
-    <Compile Include="ExperimentManager\EngineHiveJob.cs" />
-    <Compile Include="ExperimentManager\ExperimentManagerClient.cs" />
+    <Compile Include="ConcurrentJobDownloader.cs" />
+    <Compile Include="HiveJobs\EngineHiveJob.cs" />
     <Compile Include="Exceptions\HiveException.cs" />
-    <Compile Include="ExperimentManager\HiveJobDownloader.cs" />
-    <Compile Include="ExperimentManager\ConcurrentJobDownloaderException.cs" />
-    <Compile Include="ExperimentManager\TreeView\IItemTree.cs" />
-    <Compile Include="ExperimentManager\TreeView\IItemTreeAction.cs" />
-    <Compile Include="ExperimentManager\OptimizerHiveJob.cs">
+    <Compile Include="HiveJobDownloader.cs" />
+    <Compile Include="ConcurrentJobDownloaderException.cs" />
+    <Compile Include="TreeView\IItemTree.cs" />
+    <Compile Include="TreeView\IItemTreeAction.cs" />
+    <Compile Include="HiveJobs\OptimizerHiveJob.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="ExperimentManager\PluginClient.cs" />
     <Compile Include="Exceptions\ResourceNotFoundException.cs" />
     <Compile Include="IServiceLocator.cs" />
@@ -139,8 +138,8 @@
     <Compile Include="Jobs\OptimizerJob.cs" />
     <Compile Include="HeuristicLabClientsHivePlugin.cs" />
-    <Compile Include="ExperimentManager\HiveJob.cs" />
-    <Compile Include="ExperimentManager\JobResultPoller.cs" />
-    <Compile Include="PersistenceUtil.cs" />
-    <Compile Include="PluginUtil.cs" />
+    <Compile Include="HiveJobs\HiveJob.cs" />
+    <Compile Include="JobResultPoller.cs" />
+    <Compile Include="Util\PersistenceUtil.cs" />
+    <Compile Include="Util\PluginUtil.cs" />
     <Compile Include="Progress\IProgress.cs" />
     <Compile Include="Progress\IProgressReporter.cs" />
@@ -158,5 +157,4 @@
     <Compile Include="ServiceClients\HiveItem.cs" />
     <Compile Include="ServiceClients\JobData.cs" />
-    <Compile Include="ExperimentManager\RefreshableHiveExperiment.cs" />
     <Compile Include="ServiceClients\Plugin.cs" />
     <Compile Include="ServiceClients\PluginData.cs" />
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveClient.cs	(revision 6373)
@@ -0,0 +1,397 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Configuration;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+  [Item("HiveClient", "Hive client.")]
+  public sealed class HiveClient : IContent {
+    private static HiveClient instance;
+    public static HiveClient Instance {
+      get {
+        if (instance == null) instance = new HiveClient();
+        return instance;
+      }
+    }
+
+    #region Properties
+    private ItemCollection<RefreshableHiveExperiment> hiveExperiments;
+    public ItemCollection<RefreshableHiveExperiment> HiveExperiments {
+      get { return hiveExperiments; }
+      set {
+        if (value != hiveExperiments) {
+          hiveExperiments = value;
+          OnHiveExperimentsChanged();
+        }
+      }
+    }
+
+    private List<Plugin> onlinePlugins;
+    public List<Plugin> OnlinePlugins {
+      get { return onlinePlugins; }
+      set { onlinePlugins = value; }
+    }
+
+    private List<Plugin> alreadyUploadedPlugins;
+    public List<Plugin> AlreadyUploadedPlugins {
+      get { return alreadyUploadedPlugins; }
+      set { alreadyUploadedPlugins = value; }
+    }
+    #endregion
+
+    public HiveClient() { }
+
+    #region Refresh
+    public void Refresh() {
+      OnRefreshing();
+
+      try {
+        hiveExperiments = new HiveItemCollection<RefreshableHiveExperiment>();
+        var he = ServiceLocator.Instance.CallHiveService<IEnumerable<HiveExperiment>>(s => s.GetHiveExperiments());
+        hiveExperiments.AddRange(he.Select(x => new RefreshableHiveExperiment(x)).OrderBy(x => x.HiveExperiment.Name));
+      }
+      catch {
+        hiveExperiments = null;
+        throw;
+      }
+      finally {
+        OnRefreshed();
+      }
+    }
+    public void RefreshAsync(Action<Exception> exceptionCallback) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          Refresh();
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) exceptionCallback(ex);
+      }, null);
+    }
+    #endregion
+
+    #region Store
+    public static void Store(IHiveItem item) {
+      if (item.Id == Guid.Empty) {
+        if (item is RefreshableHiveExperiment) {
+          HiveClient.Instance.UploadExperiment((RefreshableHiveExperiment)item);
+        }
+      } else {
+        if (item is HiveExperiment)
+          ServiceLocator.Instance.CallHiveService(s => s.UpdateHiveExperiment((HiveExperiment)item));
+      }
+    }
+    public static void StoreAsync(Action<Exception> exceptionCallback, IHiveItem item) {
+      var call = new Func<Exception>(delegate() {
+        try {
+          Store(item);
+        }
+        catch (Exception ex) {
+          return ex;
+        }
+        return null;
+      });
+      call.BeginInvoke(delegate(IAsyncResult result) {
+        Exception ex = call.EndInvoke(result);
+        if (ex != null) exceptionCallback(ex);
+      }, null);
+    }
+    #endregion
+
+    #region Delete
+    public static void Delete(IHiveItem item) {
+      if (item is HiveExperiment)
+        ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(item.Id));
+      if (item is RefreshableHiveExperiment)
+        ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(item.Id));
+      item.Id = Guid.Empty;
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler Refreshing;
+    private void OnRefreshing() {
+      EventHandler handler = Refreshing;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler Refreshed;
+    private void OnRefreshed() {
+      var handler = Refreshed;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler HiveExperimentsChanged;
+    private void OnHiveExperimentsChanged() {
+      var handler = HiveExperimentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
+
+    public static void StartExperiment(Action<Exception> exceptionCallback, RefreshableHiveExperiment refreshableHiveExperiment) {
+      HiveClient.StoreAsync(
+        new Action<Exception>((Exception ex) => {
+          refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Prepared;
+          exceptionCallback(ex);
+        }), refreshableHiveExperiment);
+      refreshableHiveExperiment.HiveExperiment.ExecutionState = ExecutionState.Started;
+    }
+
+    public static void PauseExperiment(HiveExperiment hiveExperiment) {
+      ServiceLocator.Instance.CallHiveService(service => {
+        foreach (HiveJob job in hiveExperiment.GetAllHiveJobs()) {
+          if (job.Job.State != JobState.Finished && job.Job.State != JobState.Aborted && job.Job.State != JobState.Failed)
+            service.PauseJob(job.Job.Id);
+        }
+      });
+      hiveExperiment.ExecutionState = ExecutionState.Paused;
+    }
+
+    public static void StopExperiment(HiveExperiment hiveExperiment) {
+      ServiceLocator.Instance.CallHiveService(service => {
+        foreach (HiveJob job in hiveExperiment.GetAllHiveJobs()) {
+          if (job.Job.State != JobState.Finished && job.Job.State != JobState.Aborted && job.Job.State != JobState.Failed)
+            service.StopJob(job.Job.Id);
+        }
+      });
+      // execution state does not need to be set. it will be set to Stopped, when all jobs have been downloaded
+    }
+
+    #region Upload Experiment
+    private void UploadExperiment(RefreshableHiveExperiment refreshableHiveExperiment) {
+      try {
+        refreshableHiveExperiment.HiveExperiment.Progress = new Progress("Connecting to server...");
+        refreshableHiveExperiment.HiveExperiment.IsProgressing = true;
+        ServiceLocator.Instance.CallHiveService(service => {
+          IEnumerable<string> resourceNames = ToResourceNameList(refreshableHiveExperiment.HiveExperiment.ResourceNames);
+          var resourceIds = new List<Guid>();
+          foreach (var resourceName in resourceNames) {
+            Guid resourceId = service.GetResourceId(resourceName);
+            if (resourceId == Guid.Empty) {
+              throw new ResourceNotFoundException(string.Format("Could not find the resource '{0}'", resourceName));
+            }
+            resourceIds.Add(resourceId);
+          }
+
+          foreach (OptimizerHiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs.OfType<OptimizerHiveJob>()) {
+            hiveJob.SetIndexInParentOptimizerList(null);
+          }
+
+          // upload HiveExperiment
+          refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading HiveExperiment...";
+          refreshableHiveExperiment.HiveExperiment.Id = service.AddHiveExperiment(refreshableHiveExperiment.HiveExperiment);
+
+          int totalJobCount = refreshableHiveExperiment.HiveExperiment.GetAllHiveJobs().Count();
+          int jobCount = 0;
+
+          // upload plugins
+          refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading plugins...";
+          this.OnlinePlugins = service.GetPlugins();
+          this.AlreadyUploadedPlugins = new List<Plugin>();
+          Plugin configFilePlugin = UploadConfigurationFile(service);
+          this.alreadyUploadedPlugins.Add(configFilePlugin);
+
+          // upload jobs
+          refreshableHiveExperiment.HiveExperiment.Progress.Status = "Uploading jobs...";
+
+          foreach (HiveJob hiveJob in refreshableHiveExperiment.HiveExperiment.HiveJobs) {
+            UploadJobWithChildren(refreshableHiveExperiment.HiveExperiment.Progress, service, hiveJob, null, resourceIds, ref jobCount, totalJobCount, configFilePlugin.Id, refreshableHiveExperiment.HiveExperiment.UseLocalPlugins, refreshableHiveExperiment.HiveExperiment.Id, refreshableHiveExperiment.Log);
+          }
+
+          if (refreshableHiveExperiment.RefreshAutomatically) refreshableHiveExperiment.StartResultPolling();
+        });
+      }
+      finally {
+        refreshableHiveExperiment.HiveExperiment.IsProgressing = false;
+      }
+    }
+
+    /// <summary>
+    /// Uploads the local configuration file as plugin
+    /// </summary>
+    private static Plugin UploadConfigurationFile(IHiveService service) {
+      string exeFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "HeuristicLab 3.3.exe");
+      string configFileName = Path.GetFileName(ConfigurationManager.OpenExeConfiguration(exeFilePath).FilePath);
+      string configFilePath = ConfigurationManager.OpenExeConfiguration(exeFilePath).FilePath;
+
+      Plugin configPlugin = new Plugin() { Name = "Configuration", IsLocal = true, Version = new Version() };
+      PluginData configFile = new PluginData() { FileName = configFileName, Data = File.ReadAllBytes(configFilePath) };
+      configPlugin.Id = service.AddPlugin(configPlugin, new List<PluginData> { configFile });
+      return configPlugin;
+    }
+
+    /// <summary>
+    /// Uploads the given job and all its child-jobs while setting the proper parentJobId values for the childs
+    /// </summary>
+    /// <param name="service"></param>
+    /// <param name="hiveJob"></param>
+    /// <param name="parentHiveJob">shall be null if its the root job</param>
+    /// <param name="groups"></param>
+    private void UploadJobWithChildren(IProgress progress, IHiveService service, HiveJob hiveJob, HiveJob parentHiveJob, IEnumerable<Guid> groups, ref int jobCount, int totalJobCount, Guid configPluginId, bool useLocalPlugins, Guid hiveExperimentId, ILog log) {
+      jobCount++;
+      progress.Status = string.Format("Serializing job {0} of {1}", jobCount, totalJobCount);
+      JobData jobData;
+      List<IPluginDescription> plugins;
+
+      if (hiveJob.ItemJob.ComputeInParallel &&
+        (hiveJob.ItemJob.Item is Optimization.Experiment || hiveJob.ItemJob.Item is Optimization.BatchRun)) {
+        hiveJob.Job.IsParentJob = true;
+        hiveJob.Job.FinishWhenChildJobsFinished = true;
+        jobData = hiveJob.GetAsJobData(true, out plugins);
+      } else {
+        hiveJob.Job.IsParentJob = false;
+        hiveJob.Job.FinishWhenChildJobsFinished = false;
+        jobData = hiveJob.GetAsJobData(false, out plugins);
+      }
+
+      TryAndRepeat(() => {
+        hiveJob.Job.PluginsNeededIds = PluginUtil.GetPluginDependencies(service, this.onlinePlugins, this.alreadyUploadedPlugins, plugins, useLocalPlugins);
+      }, -1, "Failed to upload plugins");
+      hiveJob.Job.PluginsNeededIds.Add(configPluginId);
+      hiveJob.Job.HiveExperimentId = hiveExperimentId;
+
+      progress.Status = string.Format("Uploading job {0} of {1} ({2} kb, {3} objects)", jobCount, totalJobCount, jobData.Data.Count() / 1024, hiveJob.ItemJob.GetObjectGraphObjects().Count());
+      progress.ProgressValue = (double)jobCount / totalJobCount;
+
+      log.LogMessage(progress.Status);
+      TryAndRepeat(() => {
+        if (parentHiveJob != null) {
+          hiveJob.Job.Id = service.AddChildJob(parentHiveJob.Job.Id, hiveJob.Job, jobData);
+        } else {
+          hiveJob.Job.Id = service.AddJob(hiveJob.Job, jobData, groups.ToList());
+        }
+      }, -1, "Failed to add job");
+
+      foreach (HiveJob child in hiveJob.ChildHiveJobs) {
+        UploadJobWithChildren(progress, service, child, hiveJob, groups, ref jobCount, totalJobCount, configPluginId, useLocalPlugins, hiveExperimentId, log);
+      }
+    }
+    #endregion
+
+    #region Download Experiment
+    public static void LoadExperiment(HiveExperiment hiveExperiment) {
+      hiveExperiment.Progress = new Progress();
+      try {
+        hiveExperiment.IsProgressing = true;
+        int totalJobCount = 0;
+        IEnumerable<LightweightJob> allJobs;
+
+        hiveExperiment.Progress.Status = "Connecting to Server...";
+        // fetch all Job objects to create the full tree of tree of HiveJob objects
+        hiveExperiment.Progress.Status = "Downloading list of jobs...";
+        allJobs = ServiceLocator.Instance.CallHiveService(s => s.GetLightweightExperimentJobs(hiveExperiment.Id));
+        totalJobCount = allJobs.Count();
+
+        HiveJobDownloader downloader = new HiveJobDownloader(allJobs.Select(x => x.Id));
+        downloader.StartAsync();
+
+        while (!downloader.IsFinished) {
+          hiveExperiment.Progress.ProgressValue = downloader.FinishedCount / (double)totalJobCount;
+          hiveExperiment.Progress.Status = string.Format("Downloading/deserializing jobs... ({0}/{1} finished)", downloader.FinishedCount, totalJobCount);
+          Thread.Sleep(500);
+
+          if (downloader.IsFaulted) {
+            throw downloader.Exception;
+          }
+        }
+        IDictionary<Guid, HiveJob> allHiveJobs = downloader.Results;
+
+        hiveExperiment.HiveJobs = new ItemCollection<HiveJob>(allHiveJobs.Values.Where(x => !x.Job.ParentJobId.HasValue));
+
+        if (hiveExperiment.IsFinished()) {
+          hiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
+        } else {
+          hiveExperiment.ExecutionState = Core.ExecutionState.Started;
+        }
+
+        // build child-job tree
+        foreach (HiveJob hiveJob in hiveExperiment.HiveJobs) {
+          BuildHiveJobTree(hiveJob, allJobs, allHiveJobs);
+        }
+
+        hiveExperiment.OnLoaded();
+      }
+      finally {
+        hiveExperiment.IsProgressing = false;
+      }
+    }
+
+    private static void BuildHiveJobTree(HiveJob parentHiveJob, IEnumerable<LightweightJob> allJobs, IDictionary<Guid, HiveJob> allHiveJobs) {
+      IEnumerable<LightweightJob> childJobs = from job in allJobs
+                                              where job.ParentJobId.HasValue && job.ParentJobId.Value == parentHiveJob.Job.Id
+                                              orderby job.DateCreated ascending
+                                              select job;
+      foreach (LightweightJob job in childJobs) {
+        HiveJob childHiveJob = allHiveJobs[job.Id];
+        parentHiveJob.AddChildHiveJob(childHiveJob);
+        BuildHiveJobTree(childHiveJob, allJobs, allHiveJobs);
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Converts a string which can contain Ids separated by ';' to a enumerable
+    /// </summary>
+    private static IEnumerable<string> ToResourceNameList(string resourceNames) {
+      if (!string.IsNullOrEmpty(resourceNames)) {
+        return resourceNames.Split(';');
+      } else {
+        return new List<string>();
+      }
+    }
+
+    public static ItemJob LoadItemJob(Guid jobId) {
+      JobData jobData = ServiceLocator.Instance.CallHiveService(s => s.GetJobData(jobId));
+      try {
+        return PersistenceUtil.Deserialize<ItemJob>(jobData.Data);
+      }
+      catch {
+        return null;
+      }
+    }
+
+    /// <summary>
+    /// Executes the action. If it throws an exception it is repeated until repetition-count is reached.
+    /// If repetitions is -1, it is repeated infinitely.
+    /// </summary>
+    public static void TryAndRepeat(Action action, int repetitions, string errorMessage) {
+      while (true) {
+        try { action(); return; }
+        catch (Exception e) {
+          if (repetitions == 0)
+            throw new HiveException(errorMessage, e);
+          repetitions--;
+        }
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobDownloader.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobDownloader.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobDownloader.cs	(revision 6373)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Clients.Hive.Jobs;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Clients.Hive {
+  public class HiveJobDownloader {
+    private IEnumerable<Guid> jobIds;
+    private ConcurrentJobDownloader<ItemJob> jobDownloader;
+    private IDictionary<Guid, HiveJob> results;
+    private bool exceptionOccured = false;
+    private Exception currentException;
+
+    public bool IsFinished {
+      get {
+        return results.Count == jobIds.Count();
+      }
+    }
+
+    public bool IsFaulted {
+      get {
+        return exceptionOccured;
+      }
+    }
+
+    public Exception Exception {
+      get {
+        return currentException;
+      }
+    }
+    
+    public int FinishedCount {
+      get {
+        return results.Count;
+      }
+    }
+
+    public IDictionary<Guid, HiveJob> Results {
+      get {
+        return results;
+      }
+    }
+
+    public HiveJobDownloader(IEnumerable<Guid> jobIds) {
+      this.jobIds = jobIds;
+      this.jobDownloader = new ConcurrentJobDownloader<ItemJob>(2, 2);
+      this.jobDownloader.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobDownloader_ExceptionOccured);
+      this.results = new Dictionary<Guid, HiveJob>();
+    }
+    
+    public void StartAsync() {
+      foreach (Guid jobId in jobIds) {
+        Job job = ServiceLocator.Instance.CallHiveService(s => s.GetJob(jobId));
+
+        jobDownloader.DownloadJob(job,
+          (localJob, itemJob) => {
+            if (localJob != null && itemJob != null) {
+              HiveJob hiveJob;
+              if (itemJob is OptimizerJob) {
+                hiveJob = new OptimizerHiveJob((OptimizerJob)itemJob);
+              } else {
+                hiveJob = new HiveJob(itemJob, true);
+              }
+              hiveJob.Job = localJob;
+              this.results.Add(localJob.Id, hiveJob);
+            }
+          });
+      }      
+    }
+
+    private void jobDownloader_ExceptionOccured(object sender, EventArgs<Exception> e) {
+      OnExceptionOccured(e.Value);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
+    private void OnExceptionOccured(Exception exception) {
+      this.exceptionOccured = true;
+      this.currentException = exception;
+      var handler = ExceptionOccured;
+      if (handler != null) handler(this, new EventArgs<Exception>(exception));
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/EngineHiveJob.cs	(revision 6373)
@@ -0,0 +1,74 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+  public class EngineHiveJob : HiveJob<EngineJob> {
+    private IScope parentScopeClone;
+
+    #region Constructors and cloning
+    public EngineHiveJob() { }
+    public EngineHiveJob(EngineJob engineJob, IScope parentScopeClone)
+      : base(engineJob) {
+      this.parentScopeClone = parentScopeClone;
+    }
+
+    protected EngineHiveJob(EngineHiveJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.parentScopeClone = cloner.Clone(original.parentScopeClone);
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new EngineHiveJob(this, cloner);
+    }
+    #endregion
+
+    public override JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
+      plugins = new List<IPluginDescription>();
+      if (this.itemJob == null)
+        return null;
+
+      JobData jobData = new JobData();
+      IEnumerable<Type> usedTypes;
+
+      // clone operation and remove unnecessary scopes; don't do this earlier to avoid memory problems
+      lock (locker) {
+        ((IAtomicOperation)ItemJob.InitialOperation).Scope.Parent = parentScopeClone;
+        ItemJob.InitialOperation = (IOperation)ItemJob.InitialOperation.Clone();
+        ((IAtomicOperation)ItemJob.InitialOperation).Scope.ClearParentScopes();
+        jobData.Data = PersistenceUtil.Serialize(ItemJob, out usedTypes);
+      }
+
+      // add type objects from object graph to work around ticket #1527
+      var typeObjects = ItemJob.GetObjectGraphObjects().OfType<Type>();
+      usedTypes = new List<Type>(usedTypes).Union(typeObjects);
+
+      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+      
+      return jobData;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/HiveJob.cs	(revision 6373)
@@ -0,0 +1,439 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+
+  [Item("Hive Job", "Represents a hive job.")]
+  [StorableClass]
+  public class HiveJob : NamedItem, IItemTree<HiveJob> {
+    protected static object locker = new object();
+
+    public override Image ItemImage {
+      get {
+        if (job.Id == Guid.Empty) { // not yet uploaded
+          return HeuristicLab.Common.Resources.VSImageLibrary.Event;
+        } else {
+          if (job.State == JobState.Waiting) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePrepared;
+          else if (job.State == JobState.Calculating) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
+          else if (job.State == JobState.Transferring) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStarted;
+          else if (job.State == JobState.Paused) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutablePaused;
+          else if (job.State == JobState.Aborted) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
+          else if (job.State == JobState.Failed) return HeuristicLab.Common.Resources.VSImageLibrary.Error;
+          else if (job.State == JobState.Finished) return HeuristicLab.Common.Resources.VSImageLibrary.ExecutableStopped;
+          else return HeuristicLab.Common.Resources.VSImageLibrary.Event;
+        }
+      }
+    }
+
+    [Storable]
+    protected Job job;
+    public Job Job {
+      get { return job; }
+      set {
+        if (job != value) {
+          DeregisterJobEvents();
+          job = value;
+          RegisterJobEvents();
+          IsFinishedJobDownloaded = false;
+          OnJobChanged();
+          OnToStringChanged();
+          OnItemImageChanged();
+        }
+
+      }
+    }
+
+    [Storable]
+    protected ItemJob itemJob;
+    public ItemJob ItemJob {
+      get { return itemJob; }
+      set {
+        if (itemJob != null && syncJobsWithOptimizers) {
+          this.childHiveJobs.Clear();
+        }
+        if (itemJob != value) {
+          DergisterItemJobEvents();
+          itemJob = value;
+          RegisterItemJobEvents();
+          OnItemJobChanged();
+          IsFinishedJobDownloaded = true;
+        }
+      }
+    }
+
+    // job downloaded since last status change
+    [Storable]
+    private bool isFinishedJobDownloaded = false;
+    public bool IsFinishedJobDownloaded {
+      get { return isFinishedJobDownloaded; }
+      set {
+        if (value != isFinishedJobDownloaded) {
+          this.isFinishedJobDownloaded = value;
+          OnIsFinishedJobDownloadedChanged();
+        }
+      }
+    }
+
+    public bool IsDownloading { get; set; }
+
+    [Storable]
+    protected ItemList<HiveJob> childHiveJobs;
+    public virtual ReadOnlyItemList<HiveJob> ChildHiveJobs {
+      get { return childHiveJobs.AsReadOnly(); }
+    }
+
+    [Storable]
+    protected bool syncJobsWithOptimizers = true;
+
+    #region Constructors and Cloning
+    public HiveJob() {
+      this.Job = new Job() {
+        CoresNeeded = 1,
+        MemoryNeeded = 0
+      };
+      job.State = JobState.Offline;
+      this.childHiveJobs = new ItemList<HiveJob>();
+      syncJobsWithOptimizers = true;
+      RegisterChildHiveJobEvents();
+    }
+
+    public HiveJob(ItemJob itemJob, bool autoCreateChildHiveJobs)
+      : this() {
+      this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
+      this.ItemJob = itemJob;
+      this.syncJobsWithOptimizers = true;
+    }
+
+    public HiveJob(Job job, JobData jobData, bool autoCreateChildHiveJobs) {
+      this.syncJobsWithOptimizers = autoCreateChildHiveJobs;
+      this.Job = job;
+      try {
+        this.ItemJob = PersistenceUtil.Deserialize<ItemJob>(jobData.Data);
+      }
+      catch {
+        this.ItemJob = null;
+      }
+      this.childHiveJobs = new ItemList<HiveJob>();
+      this.syncJobsWithOptimizers = true;
+      RegisterChildHiveJobEvents();
+    }
+
+    protected HiveJob(HiveJob original, Cloner cloner)
+      : base(original, cloner) {
+      this.Job = cloner.Clone(original.job);
+      this.ItemJob = cloner.Clone(original.ItemJob);
+      this.childHiveJobs = cloner.Clone(original.childHiveJobs);
+      this.syncJobsWithOptimizers = original.syncJobsWithOptimizers;
+      this.isFinishedJobDownloaded = original.isFinishedJobDownloaded;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveJob(this, cloner);
+    }
+    #endregion
+
+    protected virtual void UpdateChildHiveJobs() { }
+
+    protected virtual void RegisterItemJobEvents() {
+      if (ItemJob != null) {
+        ItemJob.ComputeInParallelChanged += new EventHandler(ItemJob_ComputeInParallelChanged);
+        ItemJob.ToStringChanged += new EventHandler(ItemJob_ToStringChanged);
+      }
+    }
+    protected virtual void DergisterItemJobEvents() {
+      if (ItemJob != null) {
+        ItemJob.ComputeInParallelChanged -= new EventHandler(ItemJob_ComputeInParallelChanged);
+        ItemJob.ToStringChanged -= new EventHandler(ItemJob_ToStringChanged);
+      }
+    }
+
+    protected virtual void RegisterChildHiveJobEvents() {
+      this.childHiveJobs.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsAdded);
+      this.childHiveJobs.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsRemoved);
+      this.childHiveJobs.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnCollectionReset);
+    }
+    protected virtual void DeregisterChildHiveJobEvents() {
+      this.childHiveJobs.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsAdded);
+      this.childHiveJobs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnItemsRemoved);
+      this.childHiveJobs.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<HiveJob>>(OnCollectionReset);
+    }
+
+    protected virtual void ItemJob_ToStringChanged(object sender, EventArgs e) {
+      this.OnToStringChanged();
+    }
+
+    protected virtual void ItemJob_ComputeInParallelChanged(object sender, EventArgs e) {
+      if (ItemJob != null && syncJobsWithOptimizers) {
+        this.UpdateChildHiveJobs();
+      }
+    }
+
+    public virtual void AddChildHiveJob(HiveJob hiveJob) {
+      this.childHiveJobs.Add(hiveJob);
+    }
+
+    public override string ToString() {
+      if (itemJob != null && itemJob.Item != null) {
+        return itemJob.ToString();
+      } else {
+        return Job.Id.ToString();
+      }
+    }
+
+    public virtual void UpdateFromLightweightJob(LightweightJob lightweightJob) {
+      if (lightweightJob != null) {
+        job.Id = lightweightJob.Id;
+        job.ParentJobId = lightweightJob.ParentJobId;
+        job.ExecutionTime = lightweightJob.ExecutionTime;
+        job.State = lightweightJob.State;
+        job.StateLog = new List<StateLog>(lightweightJob.StateLog);
+        job.Command = lightweightJob.Command;
+
+        OnJobStateChanged();
+        OnToStringChanged();
+        OnItemImageChanged();
+      }
+    }
+
+    /// <summary>
+    /// Creates a JobData object containing the Job and the IJob-Object as byte[]
+    /// </summary>
+    /// <param name="withoutChildOptimizers">
+    ///   if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
+    /// </param>
+    public virtual JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
+      plugins = new List<IPluginDescription>();
+      if (this.itemJob == null)
+        return null;
+
+      IEnumerable<Type> usedTypes;
+      byte[] jobByteArray = PersistenceUtil.Serialize(this.ItemJob, out usedTypes);
+
+      JobData jobData = new JobData() {
+        JobId = job.Id,
+        Data = jobByteArray
+      };
+
+      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+
+      return jobData;
+    }
+
+    #region Events
+    public event EventHandler JobChanged;
+    private void OnJobChanged() {
+      EventHandler handler = JobChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobStateChanged;
+    private void OnJobStateChanged() {
+      EventHandler handler = JobStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ItemJobChanged;
+    private void OnItemJobChanged() {
+      ItemJob_ComputeInParallelChanged(this, EventArgs.Empty);
+      var handler = ItemJobChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler IsFinishedJobDownloadedChanged;
+    private void OnIsFinishedJobDownloadedChanged() {
+      var handler = IsFinishedJobDownloadedChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    private void RegisterJobEvents() {
+      if (job != null)
+        job.PropertyChanged += new PropertyChangedEventHandler(job_PropertyChanged);
+    }
+
+    private void DeregisterJobEvents() {
+      if (job != null)
+        job.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(job_PropertyChanged);
+    }
+
+    private void job_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      if (e.PropertyName == "State") {
+        IsFinishedJobDownloaded = false;
+      }
+    }
+    #endregion
+
+    /// <summary>
+    /// Returns a list of HiveJobs including this and all its child-jobs recursively
+    /// </summary>
+    public IEnumerable<HiveJob> GetAllHiveJobs() {
+      var jobs = new List<HiveJob>();
+      jobs.Add(this);
+      foreach (HiveJob child in this.ChildHiveJobs) {
+        jobs.AddRange(child.GetAllHiveJobs());
+      }
+      return jobs;
+    }
+
+    public HiveJob GetParentByJobId(Guid jobId) {
+      if (this.ChildHiveJobs.SingleOrDefault(j => j.job.Id == jobId) != null)
+        return this;
+      foreach (HiveJob child in this.childHiveJobs) {
+        HiveJob result = child.GetParentByJobId(jobId);
+        if (result != null)
+          return result;
+      }
+      return null;
+    }
+
+    /// <summary>
+    /// Searches for an HiveJob object with the correct jobId recursively
+    /// </summary>
+    public HiveJob GetHiveJobByJobId(Guid jobId) {
+      if (this.Job.Id == jobId) {
+        return this;
+      } else {
+        foreach (HiveJob child in this.ChildHiveJobs) {
+          HiveJob result = child.GetHiveJobByJobId(jobId);
+          if (result != null)
+            return result;
+        }
+      }
+      return null;
+    }
+
+    public void RemoveByJobId(Guid jobId) {
+      IEnumerable<HiveJob> jobs = ChildHiveJobs.Where(j => j.Job.Id == jobId).ToList(); // if Guid.Empty needs to be removed, there could be more than one with this jobId
+      foreach (HiveJob j in jobs) {
+        this.childHiveJobs.Remove(j);
+      }
+      foreach (HiveJob child in ChildHiveJobs) {
+        child.RemoveByJobId(jobId);
+      }
+    }
+
+    public IEnumerable<IItemTree<HiveJob>> GetChildItems() {
+      return this.childHiveJobs;
+    }
+
+    #region INotifyObservableCollectionItemsChanged<IItemTree> Members
+
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> CollectionReset;
+    private void OnCollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = CollectionReset;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> ItemsAdded;
+    private void OnItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = ItemsAdded;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    public event CollectionItemsChangedEventHandler<IItemTree<HiveJob>> ItemsRemoved;
+    private void OnItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      var handler = ItemsRemoved;
+      if (handler != null) handler(this, ToCollectionItemsChangedEventArgs(e));
+    }
+
+    private static CollectionItemsChangedEventArgs<IItemTree<HiveJob>> ToCollectionItemsChangedEventArgs(CollectionItemsChangedEventArgs<IndexedItem<HiveJob>> e) {
+      return new CollectionItemsChangedEventArgs<IItemTree<HiveJob>>(e.Items.Select(x => x.Value), e.OldItems == null ? null : e.OldItems.Select(x => x.Value));
+    }
+    #endregion
+
+    public void Pause() {
+      if (this.Job.IsParentJob) {
+        foreach (var child in ChildHiveJobs) {
+          ServiceLocator.Instance.CallHiveService(s => s.PauseJob(child.job.Id));
+        }
+      } else {
+        ServiceLocator.Instance.CallHiveService(s => s.PauseJob(this.job.Id));
+      }
+    }
+
+    public void Stop() {
+      if (this.Job.IsParentJob) {
+        foreach (var child in ChildHiveJobs) {
+          ServiceLocator.Instance.CallHiveService(s => s.StopJob(child.job.Id));
+        }
+      } else {
+        ServiceLocator.Instance.CallHiveService(s => s.StopJob(this.job.Id));
+      }
+    }
+
+    public void Restart() {
+      ServiceLocator.Instance.CallHiveService(service => {
+        JobData jobData = new JobData();
+        jobData.JobId = this.job.Id;
+        jobData.Data = PersistenceUtil.Serialize(this.itemJob);
+        service.UpdateJobData(this.Job, jobData);
+        service.RestartJob(this.job.Id);
+        Job job = service.GetJob(this.job.Id);
+        this.job.LastJobDataUpdate = job.LastJobDataUpdate;
+      });
+    }
+
+    public ICollection<IItemTreeNodeAction<HiveJob>> Actions {
+      get {
+        return new List<IItemTreeNodeAction<HiveJob>>();
+      }
+    }
+
+    public virtual void IntegrateChild(ItemJob job, Guid childJobId) { }
+
+    /// <summary>
+    /// Delete ItemJob
+    /// </summary>
+    public void ClearData() {
+      this.ItemJob.Item = null;
+    }
+  }
+
+  [Item("Hive Job", "Represents a hive job.")]
+  [StorableClass]
+  public class HiveJob<T> : HiveJob where T : ItemJob {
+
+    public new T ItemJob {
+      get { return (T)base.ItemJob; }
+      internal set { base.ItemJob = value; }
+    }
+
+    #region Constructors and Cloning
+    public HiveJob() : base() { }
+    public HiveJob(T itemJob) : base(itemJob, true) { }
+    protected HiveJob(HiveJob original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveJob<T>(this, cloner);
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/HiveJobs/OptimizerHiveJob.cs	(revision 6373)
@@ -0,0 +1,362 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Clients.Hive.Jobs;
+using HeuristicLab.Collections;
+using HeuristicLab.Common;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+  public class OptimizerHiveJob : HiveJob<OptimizerJob> {
+
+    #region Constructors and Cloning
+    public OptimizerHiveJob() { }
+    public OptimizerHiveJob(IOptimizer optimizer)
+      : this() {
+      this.ItemJob = new OptimizerJob(optimizer);
+    }
+    public OptimizerHiveJob(OptimizerJob optimizerJob)
+      : this() {
+      this.ItemJob = optimizerJob;
+    }
+    protected OptimizerHiveJob(OptimizerHiveJob original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new OptimizerHiveJob(this, cloner);
+    }
+    #endregion
+
+    /// <summary>
+    /// if this.Optimizer is an experiment
+    ///   Uses the child-optimizers of this.HiveJob and creates HiveJob-childs
+    /// if this.Optimizer is a batchrun
+    ///   Creates a number of child-jobs according to repetitions
+    /// </summary>
+    protected override void UpdateChildHiveJobs() {
+      base.UpdateChildHiveJobs();
+      if (Job != null && syncJobsWithOptimizers) {
+        if (!ItemJob.ComputeInParallel) {
+          this.childHiveJobs.Clear();
+        } else {
+          if (ItemJob.Item is Optimization.Experiment) {
+            Optimization.Experiment experiment = (Optimization.Experiment)ItemJob.Item;
+            foreach (IOptimizer childOpt in experiment.Optimizers) {
+              this.childHiveJobs.Add(new OptimizerHiveJob(childOpt));
+            }
+          } else if (ItemJob.Item is Optimization.BatchRun) {
+            Optimization.BatchRun batchRun = ItemJob.OptimizerAsBatchRun;
+            if (batchRun.Optimizer != null) {
+              while (this.childHiveJobs.Count < batchRun.Repetitions) {
+                this.childHiveJobs.Add(new OptimizerHiveJob(batchRun.Optimizer));
+              }
+              while (this.childHiveJobs.Count > batchRun.Repetitions) {
+                this.childHiveJobs.Remove(this.childHiveJobs.Last());
+              }
+            }
+          }
+        }
+      }
+    }
+
+    protected override void RegisterItemJobEvents() {
+      base.RegisterItemJobEvents();
+      if (ItemJob != null) {
+        if (ItemJob.Item is Optimization.Experiment) {
+          Optimization.Experiment experiment = ItemJob.OptimizerAsExperiment;
+          experiment.Optimizers.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+          experiment.Optimizers.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+          experiment.Optimizers.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+          experiment.Optimizers.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+        } else if (ItemJob.Item is Optimization.BatchRun) {
+          Optimization.BatchRun batchRun = ItemJob.OptimizerAsBatchRun;
+          batchRun.RepetitionsChanged += new EventHandler(batchRun_RepetitionsChanged);
+          batchRun.OptimizerChanged += new EventHandler(batchRun_OptimizerChanged);
+        }
+      }
+    }
+    protected override void DergisterItemJobEvents() {
+      base.DergisterItemJobEvents();
+      if (ItemJob != null) {
+        if (ItemJob.Item is Optimization.Experiment) {
+          Optimization.Experiment experiment = ItemJob.OptimizerAsExperiment;
+          experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsAdded);
+          experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsReplaced);
+          experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_ItemsRemoved);
+          experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<IOptimizer>>(Optimizers_CollectionReset);
+        } else if (ItemJob.Item is Optimization.BatchRun) {
+          Optimization.BatchRun batchRun = ItemJob.OptimizerAsBatchRun;
+          batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged);
+          batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged);
+        }
+      }
+    }
+
+    private void batchRun_OptimizerChanged(object sender, EventArgs e) {
+      if (syncJobsWithOptimizers) {
+        UpdateChildHiveJobs();
+      }
+    }
+
+    private void batchRun_RepetitionsChanged(object sender, EventArgs e) {
+      if (syncJobsWithOptimizers) {
+        UpdateChildHiveJobs();
+      }
+    }
+
+    private void Optimizers_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+            this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
+          }
+        }
+      }
+    }
+    private void Optimizers_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
+        foreach (var item in e.OldItems) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+        foreach (var item in e.Items) {
+          if (GetChildByOptimizer(item.Value) == null && item.Value.Name != "Placeholder") {
+            this.childHiveJobs.Add(new OptimizerHiveJob(item.Value));
+          }
+        }
+      }
+    }
+    private void Optimizers_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+      }
+    }
+    private void Optimizers_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<IOptimizer>> e) {
+      if (syncJobsWithOptimizers && this.ItemJob.ComputeInParallel) {
+        foreach (var item in e.Items) {
+          this.childHiveJobs.Remove(this.GetChildByOptimizer(item.Value));
+        }
+      }
+    }
+
+    /// <summary>
+    /// if this.Optimizer is Experiment
+    ///   replace the child-optimizer in the experiment
+    /// if this.Optimizer is BatchRun
+    ///   add the runs from the optimizerJob to the batchrun and replace the Optimizer
+    /// </summary>
+    public override void IntegrateChild(ItemJob job, Guid childJobId) {
+      var optimizerJob = (OptimizerJob)job;
+      syncJobsWithOptimizers = false; // don't sync with optimizers during this method
+
+      if (this.ItemJob != null && this.ItemJob.Item != null) {
+        if (this.ItemJob.Item is Optimization.Experiment) {
+          UpdateOptimizerInExperiment(this.ItemJob.OptimizerAsExperiment, optimizerJob);
+        } else if (this.ItemJob.Item is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.ItemJob.OptimizerAsBatchRun, optimizerJob);
+        }
+      }
+
+      OptimizerHiveJob child = (OptimizerHiveJob)this.ChildHiveJobs.Single(j => j.Job.Id == childJobId);
+      if (!optimizerJob.ComputeInParallel) {
+        child.syncJobsWithOptimizers = false;
+        child.ItemJob = optimizerJob;
+        child.syncJobsWithOptimizers = true;
+      }
+      syncJobsWithOptimizers = true;
+    }
+
+    /// <summary>
+    /// Adds the runs from the optimizerJob to the batchrun and replaces the Optimizer 
+    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+    /// </summary>
+    private void UpdateOptimizerInBatchRun(BatchRun batchRun, OptimizerJob optimizerJob) {
+      if (batchRun.Optimizer == null) {
+        batchRun.Optimizer = (IOptimizer)optimizerJob.Item; // only set the first optimizer as Optimizer. if every time the Optimizer would be set, the runs would be cleared each time
+      }
+      foreach (IRun run in optimizerJob.Item.Runs) {
+        if (!batchRun.Runs.Contains(run)) {
+          run.Name = GetNewRunName(run, batchRun.Runs);
+          batchRun.Runs.Add(run);
+        }
+      }
+    }
+
+    /// <summary>
+    /// replace the child-optimizer in the experiment
+    /// Sideeffect: the optimizerJob.Optimizer will be prepared (scopes are deleted and executionstate will be reset)
+    /// </summary>
+    private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerJob optimizerJob) {
+      if (optimizerJob.IndexInParentOptimizerList < 0)
+        throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Job is invalid and the optimizer-tree cannot be reassembled.");
+
+      while (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList) {
+        experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerJob at the correct position
+      }
+      if (experiment.Optimizers.Count < optimizerJob.IndexInParentOptimizerList + 1) {
+        experiment.Optimizers.Add(optimizerJob.Item);
+      } else {
+        // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder)
+        // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted
+        if (!optimizerJob.ComputeInParallel || experiment.Optimizers[optimizerJob.IndexInParentOptimizerList].Name == "Placeholder") {
+          experiment.Optimizers[optimizerJob.IndexInParentOptimizerList] = optimizerJob.Item;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Sets the IndexInParentOptimizerList property of the OptimizerJob
+    /// according to the position in the OptimizerList of the parentHiveJob.Job
+    /// Recursively updates all the child-jobs as well
+    /// </summary>
+    internal void SetIndexInParentOptimizerList(OptimizerHiveJob parentHiveJob) {
+      if (parentHiveJob != null) {
+        if (parentHiveJob.ItemJob.Item is Optimization.Experiment) {
+          this.ItemJob.IndexInParentOptimizerList = parentHiveJob.ItemJob.OptimizerAsExperiment.Optimizers.IndexOf(this.ItemJob.Item);
+        } else if (parentHiveJob.ItemJob.Item is Optimization.BatchRun) {
+          this.ItemJob.IndexInParentOptimizerList = 0;
+        } else {
+          throw new NotSupportedException("Only Experiment and BatchRuns are supported");
+        }
+      }
+      foreach (OptimizerHiveJob child in childHiveJobs) {
+        child.SetIndexInParentOptimizerList(this);
+      }
+    }
+
+    public override void AddChildHiveJob(HiveJob hiveJob) {
+      base.AddChildHiveJob(hiveJob);
+      var optimizerHiveJob = (OptimizerHiveJob)hiveJob;
+      syncJobsWithOptimizers = false;
+      if (this.ItemJob != null && optimizerHiveJob.ItemJob != null) {
+        // if job is in state Paused, it has to preserve its ResultCollection, which is cleared when a optimizer is added to an experiment
+        OptimizerJob optimizerJobClone = null;
+        if (optimizerHiveJob.Job.State == JobState.Paused) {
+          optimizerJobClone = (OptimizerJob)optimizerHiveJob.ItemJob.Clone();
+        }
+
+        if (this.ItemJob.Item is Optimization.Experiment) {
+          if (!this.ItemJob.OptimizerAsExperiment.Optimizers.Contains(optimizerHiveJob.ItemJob.Item)) {
+            UpdateOptimizerInExperiment(this.ItemJob.OptimizerAsExperiment, optimizerHiveJob.ItemJob);
+          }
+        } else if (this.ItemJob.Item is Optimization.BatchRun) {
+          UpdateOptimizerInBatchRun(this.ItemJob.OptimizerAsBatchRun, optimizerHiveJob.ItemJob);
+        }
+
+        if (optimizerHiveJob.Job.State == JobState.Paused) {
+          optimizerHiveJob.ItemJob = optimizerJobClone;
+        }
+      }
+      syncJobsWithOptimizers = true;
+    }
+
+    /// <summary>
+    /// Creates a JobData object containing the Job and the IJob-Object as byte[]
+    /// </summary>
+    /// <param name="withoutChildOptimizers">
+    ///   if true the Child-Optimizers will not be serialized (if the job contains an Experiment)
+    /// </param>
+    public override JobData GetAsJobData(bool withoutChildOptimizers, out List<IPluginDescription> plugins) {
+      plugins = new List<IPluginDescription>();
+      if (this.itemJob == null) // || this.jobItem.Optimizer == null
+        return null;
+
+      IEnumerable<Type> usedTypes;
+      byte[] jobByteArray;
+      if (withoutChildOptimizers && this.ItemJob.Item is Optimization.Experiment) {
+        OptimizerJob clonedJob = (OptimizerJob)this.ItemJob.Clone(); // use a cloned job, so that the childHiveJob don't get confused
+        clonedJob.OptimizerAsExperiment.Optimizers.Clear();
+        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
+      } else if (withoutChildOptimizers && this.ItemJob.Item is Optimization.BatchRun) {
+        OptimizerJob clonedJob = (OptimizerJob)this.ItemJob.Clone();
+        clonedJob.OptimizerAsBatchRun.Optimizer = null;
+        jobByteArray = PersistenceUtil.Serialize(clonedJob, out usedTypes);
+      } else if (this.ItemJob.Item is IAlgorithm) {
+        ((IAlgorithm)this.ItemJob.Item).StoreAlgorithmInEachRun = false; // avoid storing the algorithm in runs to reduce size
+        jobByteArray = PersistenceUtil.Serialize(this.ItemJob, out usedTypes);
+      } else {
+        jobByteArray = PersistenceUtil.Serialize(this.ItemJob, out usedTypes);
+      }
+
+      JobData jobData = new JobData() {
+        JobId = job.Id,
+        Data = jobByteArray
+      };
+
+      PluginUtil.CollectDeclaringPlugins(plugins, usedTypes);
+
+      return jobData;
+    }
+
+    public OptimizerHiveJob GetChildByOptimizerJob(OptimizerJob optimizerJob) {
+      foreach (OptimizerHiveJob child in ChildHiveJobs) {
+        if (child.ItemJob == optimizerJob)
+          return child;
+      }
+      return null;
+    }
+
+    public HiveJob<OptimizerJob> GetChildByOptimizer(IOptimizer optimizer) {
+      foreach (OptimizerHiveJob child in ChildHiveJobs) {
+        if (child.ItemJob.Item == optimizer)
+          return child;
+      }
+      return null;
+    }
+
+    #region Helpers
+    /// <summary>
+    /// Parses the run numbers out of runs and renames the run to the next number
+    /// </summary>
+    private static string GetNewRunName(IRun run, RunCollection runs) {
+      int idx = run.Name.IndexOf("Run ") + 4;
+
+      if (idx == -1 || runs.Count == 0)
+        return run.Name;
+
+      int maxRunNumber = int.MinValue;
+      foreach (IRun r in runs) {
+        int number = GetRunNumber(r.Name);
+        maxRunNumber = Math.Max(maxRunNumber, number);
+      }
+
+      return run.Name.Substring(0, idx) + (maxRunNumber + 1).ToString();
+    }
+
+    /// <summary>
+    /// Parses the number of a Run out of its name. Example "Genetic Algorithm Run 3" -> 3
+    /// </summary>
+    private static int GetRunNumber(string runName) {
+      int idx = runName.IndexOf("Run ") + 4;
+      if (idx == -1) {
+        return 0;
+      } else {
+        return int.Parse(runName.Substring(idx, runName.Length - idx));
+      }
+    }
+    #endregion
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/JobResultPoller.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/JobResultPoller.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/JobResultPoller.cs	(revision 6373)
@@ -0,0 +1,144 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.Threading;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Clients.Hive {
+  public class JobResultPoller {
+    private bool stopRequested { get; set; }
+    private AutoResetEvent waitHandle;
+    private Thread thread;
+
+    private Guid hiveExperimentId;
+    public Guid HiveExperimentId {
+      get { return hiveExperimentId; }
+      set { hiveExperimentId = value; }
+    }
+
+    private TimeSpan interval;
+    public TimeSpan Interval {
+      get { return interval; }
+      set { interval = value; }
+    }
+
+    private bool isPolling;
+    public bool IsPolling {
+      get { return isPolling; }
+      set {
+        if (isPolling != value) {
+          isPolling = value;
+          OnIsPollingChanged();
+        }
+      }
+    }
+
+    private bool autoResumeOnException = false;
+    public bool AutoResumeOnException {
+      get { return autoResumeOnException; }
+      set { autoResumeOnException = value; }
+    }
+
+
+    public JobResultPoller(Guid hiveExperimentId, TimeSpan interval) {
+      this.isPolling = false;
+      this.hiveExperimentId = hiveExperimentId;
+      this.interval = interval;
+    }
+
+    public void Start() {
+      IsPolling = true;
+      stopRequested = false;
+      thread = new Thread(RunPolling);
+      thread.Start();
+    }
+
+    public void Stop() {
+      stopRequested = true;
+      waitHandle.Set();
+      IsPolling = false;
+      thread = null;
+    }
+
+    private void RunPolling() {
+      while (true) {
+        IsPolling = true;
+        try {
+          waitHandle = new AutoResetEvent(false);
+          while (!stopRequested) {
+            OnPollingStarted();
+            FetchJobResults();
+            OnPollingFinished();
+            waitHandle.WaitOne(Interval);
+          }
+          waitHandle.Close();
+        }
+        catch (Exception e) {
+          OnExceptionOccured(e);
+        }
+        finally {
+          IsPolling = false;
+        }
+        if (stopRequested) return;
+        if (!autoResumeOnException) return;
+      }
+    }
+
+    public IEnumerable<LightweightJob> FetchJobResults() {
+      return ServiceLocator.Instance.CallHiveService(service => {
+        var responses = new List<LightweightJob>();
+        responses.AddRange(service.GetLightweightExperimentJobs(hiveExperimentId));
+        OnJobResultsReceived(responses);
+        return responses;
+      });
+    }
+
+    public event EventHandler<EventArgs<IEnumerable<LightweightJob>>> JobResultsReceived;
+    private void OnJobResultsReceived(IEnumerable<LightweightJob> lightweightJobs) {
+      var handler = JobResultsReceived;
+      if (handler != null) handler(this, new EventArgs<IEnumerable<LightweightJob>>(lightweightJobs));
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
+    private void OnExceptionOccured(Exception e) {
+      var handler = ExceptionOccured;
+      if (handler != null) handler(this, new EventArgs<Exception>(e));
+    }
+
+    public event EventHandler IsPollingChanged;
+    private void OnIsPollingChanged() {
+      var handler = IsPollingChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PollingStarted;
+    private void OnPollingStarted() {
+      var handler = PollingStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    public event EventHandler PollingFinished;
+    private void OnPollingFinished() {
+      var handler = PollingFinished;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/ItemJob.cs	(revision 6373)
@@ -62,11 +62,4 @@
     }
 
-    [Storable]
-    private bool collectChildJobs;
-    public bool CollectChildJobs {
-      get { return collectChildJobs; }
-      set { collectChildJobs = value; }
-    }
-
     #region Constructors and Cloning
     public ItemJob() { }
@@ -77,5 +70,4 @@
       : base(original, cloner) {
       this.ComputeInParallel = original.ComputeInParallel;
-      this.CollectChildJobs = original.CollectChildJobs;
       this.Item = cloner.Clone(original.Item);
     }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Jobs/OptimizerJob.cs	(revision 6373)
@@ -66,5 +66,4 @@
       : base(original, cloner) {
       this.IndexInParentOptimizerList = original.IndexInParentOptimizerList;
-      this.CollectChildJobs = original.CollectChildJobs;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PersistenceUtil.cs	(revision 6372)
+++ 	(revision )
@@ -1,53 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.IO;
-using HeuristicLab.Persistence.Core;
-using HeuristicLab.Persistence.Default.Xml;
-
-namespace HeuristicLab.Clients.Hive {
-  public static class PersistenceUtil {
-    public static byte[] Serialize(object obj, out IEnumerable<Type> types) {
-      MemoryStream memStream = new MemoryStream();
-      XmlGenerator.Serialize(obj, memStream, ConfigurationService.Instance.GetConfiguration(new XmlFormat()), false, out types);
-      byte[] jobByteArray = memStream.ToArray();
-      memStream.Dispose();
-      return jobByteArray;
-    }
-
-    public static byte[] Serialize(object obj) {
-      MemoryStream memStream = new MemoryStream();
-      XmlGenerator.Serialize(obj, memStream);
-      byte[] jobByteArray = memStream.ToArray();
-      memStream.Dispose();
-      return jobByteArray;
-    }
-
-    public static T Deserialize<T>(byte[] sjob) {
-      MemoryStream memStream = new MemoryStream(sjob);
-      T job = XmlParser.Deserialize<T>(memStream);
-      memStream.Dispose();
-      return job;
-    }
-  }
-}
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PluginUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/PluginUtil.cs	(revision 6372)
+++ 	(revision )
@@ -1,105 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2011 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.IO;
-using System.Linq;
-using System.ServiceModel;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.Clients.Hive {
-  public static class PluginUtil {
-
-    /// <summary>
-    /// Checks if plugins are available on Hive Server. If not they are uploaded. Ids are returned.
-    /// </summary>
-    /// <param name="service">An active service-proxy</param>
-    /// <param name="onlinePlugins">List of plugins which are available online</param>
-    /// <param name="alreadyUploadedPlugins">List of plugins which have been uploaded from this HiveExperiment</param>
-    /// <param name="neededPlugins">List of plugins which need to be uploaded</param>
-    /// <param name="useLocalPlugins">If true, the plugins which are already online are ignored. All local plugins are uploaded, but only once.</param>
-    /// <returns></returns>
-    public static List<Guid> GetPluginDependencies(IHiveService service, List<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins, IEnumerable<IPluginDescription> neededPlugins, bool useLocalPlugins) {
-      var pluginIds = new List<Guid>();
-      foreach (var neededPlugin in neededPlugins) {
-        Plugin foundPlugin = alreadyUploadedPlugins.FirstOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
-        if (foundPlugin == null) {
-          foundPlugin = onlinePlugins.FirstOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
-          if (useLocalPlugins || foundPlugin == null) {
-            Plugin p = CreatePlugin(neededPlugin, useLocalPlugins);
-            List<PluginData> pd = CreatePluginDatas(neededPlugin);
-            try {
-              p.Id = service.AddPlugin(p, pd);
-              alreadyUploadedPlugins.Add(p);
-              pluginIds.Add(p.Id);
-            }
-            catch (FaultException<PluginAlreadyExistsFault> fault) {
-              onlinePlugins.Add(service.GetPlugin(fault.Detail.Id));
-            }
-          } else {
-            pluginIds.Add(foundPlugin.Id);
-          }
-        } else {
-          pluginIds.Add(foundPlugin.Id);
-        }
-      }
-      return pluginIds;
-    }
-
-    public static Plugin CreatePlugin(IPluginDescription plugin, bool useLocalPlugins) {
-      return new Plugin() { Name = plugin.Name, Version = plugin.Version, IsLocal = useLocalPlugins };
-    }
-
-    public static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
-      List<PluginData> pluginDatas = new List<PluginData>();
-
-      foreach (IPluginFile pf in plugin.Files) {
-        PluginData pluginData = new PluginData();
-
-        pluginData.Data = File.ReadAllBytes(pf.Name);
-        pluginData.FileName = Path.GetFileName(pf.Name);
-        pluginDatas.Add(pluginData);
-      }
-      return pluginDatas;
-    }
-
-    public static void CollectDeclaringPlugins(List<IPluginDescription> plugins, IEnumerable<Type> usedTypes) {
-      foreach (Type type in usedTypes) {
-        var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
-        if (plugin != null && !plugins.Contains(plugin)) {
-          plugins.Add(plugin);
-          CollectPluginDependencies(plugins, plugin);
-        }
-      }
-    }
-
-    public static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
-      if (plugin == null) return;
-      foreach (var dependency in plugin.Dependencies) {
-        if (!plugins.Contains(dependency)) {
-          plugins.Add(dependency);
-          CollectPluginDependencies(plugins, dependency);
-        }
-      }
-    }
-  }
-}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/RefreshableHiveExperiment.cs	(revision 6373)
@@ -0,0 +1,400 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Clients.Hive {
+  public class RefreshableHiveExperiment : IHiveItem, IDeepCloneable, IContent, IProgressReporter {
+    private JobResultPoller jobResultPoller;
+    private ConcurrentJobDownloader<ItemJob> jobDownloader;
+    private static object locker = new object();
+
+    private HiveExperiment hiveExperiment;
+    public HiveExperiment HiveExperiment {
+      get { return hiveExperiment; }
+      set {
+        if (value != hiveExperiment) {
+          if (value == null)
+            throw new ArgumentNullException();
+
+          if (hiveExperiment != null) DergisterHiveExperimentEvents();
+          hiveExperiment = value;
+          if (hiveExperiment != null) RegisterHiveExperimentEvents();
+          OnHiveExperimentChanged();
+        }
+      }
+    }
+
+    private bool refreshAutomatically;
+    public bool RefreshAutomatically {
+      get { return refreshAutomatically; }
+      set {
+        lock (locker) {
+          if (refreshAutomatically != value) {
+            refreshAutomatically = value;
+            OnRefreshAutomaticallyChanged();
+          }
+          if (RefreshAutomatically) {
+            if (hiveExperiment.HiveJobs != null && hiveExperiment.HiveJobs.Count > 0 && (jobResultPoller == null || !jobResultPoller.IsPolling)) {
+              StartResultPolling();
+            }
+          } else {
+            StopResultPolling();
+          }
+        }
+      }
+    }
+
+    // if true, all control buttons should be enabled. otherwise disabled (used for HiveEngine)
+    private bool isControllable = true;
+    public bool IsControllable {
+      get { return isControllable; }
+      set {
+        if (value != isControllable) {
+          isControllable = value;
+          OnIsControllableChanged();
+        }
+      }
+    }
+
+    private ILog log;
+    public ILog Log {
+      get { return log; }
+      set { log = value; }
+    }
+    private static object logLocker = new object();
+    
+
+    #region Constructors and Cloning
+    public RefreshableHiveExperiment() {
+      this.refreshAutomatically = true;
+      this.HiveExperiment = new HiveExperiment();
+      this.log = new Log();
+      this.jobDownloader = new ConcurrentJobDownloader<ItemJob>(2, 2);
+      this.jobDownloader.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobDownloader_ExceptionOccured);
+    }
+    public RefreshableHiveExperiment(HiveExperiment hiveExperiment) {
+      this.refreshAutomatically = true;
+      this.HiveExperiment = hiveExperiment;
+      this.log = new Log();
+      this.jobDownloader = new ConcurrentJobDownloader<ItemJob>(2, 2);
+      this.jobDownloader.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobDownloader_ExceptionOccured);
+    }
+    protected RefreshableHiveExperiment(RefreshableHiveExperiment original, Cloner cloner) {
+      cloner.RegisterClonedObject(original, this);
+      this.HiveExperiment = original.HiveExperiment;
+      this.IsControllable = original.IsControllable;
+      this.Log = cloner.Clone(original.Log);
+      this.RefreshAutomatically = false; // do not start results polling automatically
+      this.jobDownloader = new ConcurrentJobDownloader<ItemJob>(2, 2);
+      this.jobDownloader.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobDownloader_ExceptionOccured);
+    }
+    public IDeepCloneable Clone(Cloner cloner) {
+      return new RefreshableHiveExperiment(this, cloner);
+    }
+    public object Clone() {
+      return this.Clone(new Cloner());
+    }
+    #endregion
+
+    private void hiveExperiment_HiveJobsChanged(object sender, EventArgs e) {
+      if (jobResultPoller != null && jobResultPoller.IsPolling) {
+        jobResultPoller.Stop();
+        DeregisterResultPollingEvents();
+      }
+      if (hiveExperiment.HiveJobs != null && hiveExperiment.HiveJobs.Count > 0 && hiveExperiment.GetAllHiveJobs().All(x => x.Job.Id != Guid.Empty)) {
+        if (this.RefreshAutomatically)
+          StartResultPolling();
+      }
+    }
+
+    #region JobResultPoller Events
+
+    public void StartResultPolling() {
+      if (jobResultPoller == null) {
+        jobResultPoller = new JobResultPoller(hiveExperiment.Id, /*ApplicationConstants.ResultPollingInterval*/new TimeSpan(0, 0, 5)); //TODO: find a better place for ApplicationConstants
+        RegisterResultPollingEvents();
+        jobResultPoller.AutoResumeOnException = !IsControllable;
+      }
+
+      if (!jobResultPoller.IsPolling) {
+        jobResultPoller.Start();
+      }
+    }
+
+    public void StopResultPolling() {
+      if (jobResultPoller != null && jobResultPoller.IsPolling) {
+        jobResultPoller.Stop();
+      }
+    }
+
+    private void RegisterResultPollingEvents() {
+      jobResultPoller.ExceptionOccured += new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
+      jobResultPoller.JobResultsReceived += new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
+      jobResultPoller.IsPollingChanged += new EventHandler(jobResultPoller_IsPollingChanged);
+    }
+    private void DeregisterResultPollingEvents() {
+      jobResultPoller.ExceptionOccured -= new EventHandler<EventArgs<Exception>>(jobResultPoller_ExceptionOccured);
+      jobResultPoller.JobResultsReceived -= new EventHandler<EventArgs<IEnumerable<LightweightJob>>>(jobResultPoller_JobResultReceived);
+      jobResultPoller.IsPollingChanged -= new EventHandler(jobResultPoller_IsPollingChanged);
+    }
+    private void jobResultPoller_IsPollingChanged(object sender, EventArgs e) {
+      if (this.refreshAutomatically != jobResultPoller.IsPolling) {
+        this.refreshAutomatically = jobResultPoller.IsPolling;
+        OnRefreshAutomaticallyChanged();
+      }
+    }
+    private void jobResultPoller_JobResultReceived(object sender, EventArgs<IEnumerable<LightweightJob>> e) {
+      foreach (LightweightJob lightweightJob in e.Value) {
+        HiveJob hiveJob = GetHiveJobById(lightweightJob.Id);
+        if (hiveJob != null) {
+          // lastJobDataUpdate equals DateTime.MinValue right after it was uploaded. When the first results are polled, this value is updated
+          if (hiveJob.Job.State == JobState.Offline && lightweightJob.State != JobState.Finished && lightweightJob.State != JobState.Failed && lightweightJob.State != JobState.Aborted) {
+            hiveJob.Job.LastJobDataUpdate = lightweightJob.LastJobDataUpdate;
+          }
+
+          hiveJob.UpdateFromLightweightJob(lightweightJob);
+
+          if (!hiveJob.IsFinishedJobDownloaded && !hiveJob.IsDownloading && hiveJob.Job.LastJobDataUpdate < lightweightJob.LastJobDataUpdate) {
+            LogMessage(string.Format("Downloading job {0}", lightweightJob.Id));
+            hiveJob.IsDownloading = true;
+            jobDownloader.DownloadJob(hiveJob.Job, (localJob, itemJob) => {
+              LogMessage(string.Format("Finished downloading job {0}", localJob.Id));
+              HiveJob localHiveJob = GetHiveJobById(localJob.Id);
+
+              if (itemJob == null) {
+                localHiveJob.IsDownloading = false;
+              }
+
+              if (itemJob == null) {
+                // something bad happened to this job. bad job, BAAAD job!
+              } else {
+                // if the job is paused, download but don't integrate into parent optimizer (to avoid Prepare)
+
+                if (localJob.State == JobState.Paused) {
+                  localHiveJob.ItemJob = itemJob;
+                } else {
+                  if (localJob.ParentJobId.HasValue) {
+                    HiveJob parentHiveJob = GetHiveJobById(localJob.ParentJobId.Value);
+                    parentHiveJob.IntegrateChild(itemJob, localJob.Id);
+                  } else {
+                    localHiveJob.ItemJob = itemJob;
+                  }
+                }
+                localHiveJob.IsDownloading = false;
+                localHiveJob.Job.LastJobDataUpdate = localJob.LastJobDataUpdate;
+              }
+            });
+          }
+        }
+      }
+      GC.Collect(); // force GC, because .NET is too lazy here (deserialization takes a lot of memory)
+      if (AllJobsFinished()) {
+        hiveExperiment.ExecutionState = Core.ExecutionState.Stopped;
+        StopResultPolling();
+      }
+      UpdateTotalExecutionTime();
+      UpdateStatistics();
+    }
+
+    // synchronized logging
+    private void LogException(Exception exception) {
+      lock (logLocker) {
+        this.log.LogException(exception);
+      }
+    }
+    // synchronized logging
+    private void LogMessage(string message) {
+      lock (logLocker) {
+        this.log.LogMessage(message);
+      }
+    }
+
+    public HiveJob GetHiveJobById(Guid jobId) {
+      foreach (HiveJob job in hiveExperiment.HiveJobs) {
+        var hj = job.GetHiveJobByJobId(jobId);
+        if (hj != null)
+          return hj;
+      }
+      return null;
+    }
+    private void UpdateStatistics() {
+      var jobs = hiveExperiment.GetAllHiveJobs();
+      hiveExperiment.JobCount = jobs.Count();
+      hiveExperiment.CalculatingCount = jobs.Count(j => j.Job.State == JobState.Calculating);
+      hiveExperiment.FinishedCount = jobs.Count(j => j.Job.State == JobState.Finished);
+      OnJobStatisticsChanged();
+    }
+
+    public bool AllJobsFinished() {
+      return hiveExperiment.GetAllHiveJobs().All(j => (j.Job.State == JobState.Finished
+                                                   || j.Job.State == JobState.Aborted
+                                                   || j.Job.State == JobState.Failed)
+                                                   && j.IsFinishedJobDownloaded);
+    }
+
+    private void jobResultPoller_ExceptionOccured(object sender, EventArgs<Exception> e) {
+      OnExceptionOccured(e.Value);
+    }
+    private void jobDownloader_ExceptionOccured(object sender, EventArgs<Exception> e) {
+      OnExceptionOccured(e.Value);
+    }
+    public void UpdateTotalExecutionTime() {
+      hiveExperiment.ExecutionTime = TimeSpan.FromMilliseconds(hiveExperiment.GetAllHiveJobs().Sum(x => x.Job.ExecutionTime.TotalMilliseconds));
+    }
+    #endregion
+
+    private void RegisterHiveExperimentEvents() {
+      hiveExperiment.HiveJobsChanged += new EventHandler(hiveExperiment_HiveJobsChanged);
+      hiveExperiment.ToStringChanged += new EventHandler(hiveExperiment_ToStringChanged);
+      hiveExperiment.PropertyChanged += new PropertyChangedEventHandler(hiveExperiment_PropertyChanged);
+      hiveExperiment.ItemImageChanged += new EventHandler(hiveExperiment_ItemImageChanged);
+      hiveExperiment.ModifiedChanged += new EventHandler(hiveExperiment_ModifiedChanged);
+      hiveExperiment.IsProgressingChanged += new EventHandler(hiveExperiment_IsProgressingChanged);
+      hiveExperiment.Loaded += new EventHandler(hiveExperiment_Loaded);
+    }
+
+    private void DergisterHiveExperimentEvents() {
+      hiveExperiment.HiveJobsChanged -= new EventHandler(hiveExperiment_HiveJobsChanged);
+      hiveExperiment.ToStringChanged -= new EventHandler(hiveExperiment_ToStringChanged);
+      hiveExperiment.PropertyChanged -= new PropertyChangedEventHandler(hiveExperiment_PropertyChanged);
+      hiveExperiment.ItemImageChanged -= new EventHandler(hiveExperiment_ItemImageChanged);
+      hiveExperiment.ModifiedChanged -= new EventHandler(hiveExperiment_ModifiedChanged);
+      hiveExperiment.IsProgressingChanged -= new EventHandler(hiveExperiment_IsProgressingChanged);
+      hiveExperiment.Loaded -= new EventHandler(hiveExperiment_Loaded);
+    }
+
+    private void hiveExperiment_Loaded(object sender, EventArgs e) {
+      this.UpdateTotalExecutionTime();
+
+      if (hiveExperiment.ExecutionState != ExecutionState.Stopped) {
+        this.RefreshAutomatically = true;
+      }
+    }
+
+    #region Events
+    public event EventHandler RefreshAutomaticallyChanged;
+    private void OnRefreshAutomaticallyChanged() {
+      var handler = RefreshAutomaticallyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler HiveExperimentChanged;
+    private void OnHiveExperimentChanged() {
+      var handler = HiveExperimentChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ModifiedChanged;
+    private void hiveExperiment_ModifiedChanged(object sender, EventArgs e) {
+      var handler = ModifiedChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public event EventHandler ItemImageChanged;
+    private void hiveExperiment_ItemImageChanged(object sender, EventArgs e) {
+      var handler = ItemImageChanged;
+      if (handler != null) handler(this, e);
+    }
+
+    public event PropertyChangedEventHandler PropertyChanged;
+    private void hiveExperiment_PropertyChanged(object sender, PropertyChangedEventArgs e) {
+      var handler = PropertyChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public event EventHandler ToStringChanged;
+    private void hiveExperiment_ToStringChanged(object sender, EventArgs e) {
+      var handler = ToStringChanged;
+      if (handler != null) handler(this, e);
+    }
+
+    public event EventHandler IsProgressingChanged;
+    private void hiveExperiment_IsProgressingChanged(object sender, EventArgs e) {
+      var handler = IsProgressingChanged;
+      if (handler != null) handler(sender, e);
+    }
+
+    public event EventHandler IsControllableChanged;
+    private void OnIsControllableChanged() {
+      var handler = IsControllableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler JobStatisticsChanged;
+    private void OnJobStatisticsChanged() {
+      var handler = JobStatisticsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
+    private void OnExceptionOccured(Exception exception) {
+      LogException(exception);
+      var handler = ExceptionOccured;
+      if (handler != null) handler(this, new EventArgs<Exception>(exception));
+    }
+    #endregion
+
+    public Guid Id {
+      get { return hiveExperiment.Id; }
+      set { hiveExperiment.Id = value; }
+    }
+    public bool Modified {
+      get { return hiveExperiment.Modified; }
+    }
+    public void Store() {
+      hiveExperiment.Store();
+    }
+    public string ItemDescription {
+      get { return hiveExperiment.ItemDescription; }
+    }
+    public Image ItemImage {
+      get { return hiveExperiment.ItemImage; }
+    }
+    public string ItemName {
+      get { return hiveExperiment.ItemName; }
+    }
+    public Version ItemVersion {
+      get { return hiveExperiment.ItemVersion; }
+    }
+
+
+    #region IProgressReporter Members
+    public IProgress Progress {
+      get { return HiveExperiment.Progress; }
+    }
+
+    public bool IsProgressing {
+      get { return HiveExperiment.IsProgressing; }
+    }
+    #endregion
+
+    public override string ToString() {
+      return HiveExperiment.ToString();
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItem.cs	(revision 6373)
@@ -86,5 +86,5 @@
 
     public void Store() {
-      ExperimentManagerClient.Store(this);
+      HiveClient.Store(this);
       Modified = false;
     }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/ServiceClients/HiveItemCollection.cs	(revision 6373)
@@ -37,5 +37,5 @@
       foreach (T item in items) {
         try {
-          ExperimentManagerClient.Delete(item);
+          HiveClient.Delete(item);
           removed.Add(item);
         }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PersistenceUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PersistenceUtil.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PersistenceUtil.cs	(revision 6373)
@@ -0,0 +1,53 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.IO;
+using HeuristicLab.Persistence.Core;
+using HeuristicLab.Persistence.Default.Xml;
+
+namespace HeuristicLab.Clients.Hive {
+  public static class PersistenceUtil {
+    public static byte[] Serialize(object obj, out IEnumerable<Type> types) {
+      MemoryStream memStream = new MemoryStream();
+      XmlGenerator.Serialize(obj, memStream, ConfigurationService.Instance.GetConfiguration(new XmlFormat()), false, out types);
+      byte[] jobByteArray = memStream.ToArray();
+      memStream.Dispose();
+      return jobByteArray;
+    }
+
+    public static byte[] Serialize(object obj) {
+      MemoryStream memStream = new MemoryStream();
+      XmlGenerator.Serialize(obj, memStream);
+      byte[] jobByteArray = memStream.ToArray();
+      memStream.Dispose();
+      return jobByteArray;
+    }
+
+    public static T Deserialize<T>(byte[] sjob) {
+      MemoryStream memStream = new MemoryStream(sjob);
+      T job = XmlParser.Deserialize<T>(memStream);
+      memStream.Dispose();
+      return job;
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PluginUtil.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PluginUtil.cs	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive/3.4/Util/PluginUtil.cs	(revision 6373)
@@ -0,0 +1,105 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2011 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.IO;
+using System.Linq;
+using System.ServiceModel;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Clients.Hive {
+  public static class PluginUtil {
+
+    /// <summary>
+    /// Checks if plugins are available on Hive Server. If not they are uploaded. Ids are returned.
+    /// </summary>
+    /// <param name="service">An active service-proxy</param>
+    /// <param name="onlinePlugins">List of plugins which are available online</param>
+    /// <param name="alreadyUploadedPlugins">List of plugins which have been uploaded from this HiveExperiment</param>
+    /// <param name="neededPlugins">List of plugins which need to be uploaded</param>
+    /// <param name="useLocalPlugins">If true, the plugins which are already online are ignored. All local plugins are uploaded, but only once.</param>
+    /// <returns></returns>
+    public static List<Guid> GetPluginDependencies(IHiveService service, List<Plugin> onlinePlugins, List<Plugin> alreadyUploadedPlugins, IEnumerable<IPluginDescription> neededPlugins, bool useLocalPlugins) {
+      var pluginIds = new List<Guid>();
+      foreach (var neededPlugin in neededPlugins) {
+        Plugin foundPlugin = alreadyUploadedPlugins.FirstOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
+        if (foundPlugin == null) {
+          foundPlugin = onlinePlugins.FirstOrDefault(p => p.Name == neededPlugin.Name && p.Version == neededPlugin.Version);
+          if (useLocalPlugins || foundPlugin == null) {
+            Plugin p = CreatePlugin(neededPlugin, useLocalPlugins);
+            List<PluginData> pd = CreatePluginDatas(neededPlugin);
+            try {
+              p.Id = service.AddPlugin(p, pd);
+              alreadyUploadedPlugins.Add(p);
+              pluginIds.Add(p.Id);
+            }
+            catch (FaultException<PluginAlreadyExistsFault> fault) {
+              onlinePlugins.Add(service.GetPlugin(fault.Detail.Id));
+            }
+          } else {
+            pluginIds.Add(foundPlugin.Id);
+          }
+        } else {
+          pluginIds.Add(foundPlugin.Id);
+        }
+      }
+      return pluginIds;
+    }
+
+    public static Plugin CreatePlugin(IPluginDescription plugin, bool useLocalPlugins) {
+      return new Plugin() { Name = plugin.Name, Version = plugin.Version, IsLocal = useLocalPlugins };
+    }
+
+    public static List<PluginData> CreatePluginDatas(IPluginDescription plugin) {
+      List<PluginData> pluginDatas = new List<PluginData>();
+
+      foreach (IPluginFile pf in plugin.Files) {
+        PluginData pluginData = new PluginData();
+
+        pluginData.Data = File.ReadAllBytes(pf.Name);
+        pluginData.FileName = Path.GetFileName(pf.Name);
+        pluginDatas.Add(pluginData);
+      }
+      return pluginDatas;
+    }
+
+    public static void CollectDeclaringPlugins(List<IPluginDescription> plugins, IEnumerable<Type> usedTypes) {
+      foreach (Type type in usedTypes) {
+        var plugin = ApplicationManager.Manager.GetDeclaringPlugin(type);
+        if (plugin != null && !plugins.Contains(plugin)) {
+          plugins.Add(plugin);
+          CollectPluginDependencies(plugins, plugin);
+        }
+      }
+    }
+
+    public static void CollectPluginDependencies(List<IPluginDescription> plugins, IPluginDescription plugin) {
+      if (plugin == null) return;
+      foreach (var dependency in plugin.Dependencies) {
+        if (!plugins.Contains(dependency)) {
+          plugins.Add(dependency);
+          CollectPluginDependencies(plugins, dependency);
+        }
+      }
+    }
+  }
+}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Hive 3.4.sln	(revision 6373)
@@ -97,5 +97,9 @@
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Slave.ConsoleClient-3.4", "HeuristicLab.Clients.Hive.Slave.ConsoleClient\HeuristicLab.Clients.Hive.Slave.ConsoleClient-3.4.csproj", "{464D70B8-2D91-485C-B622-22E4A4891C68}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveEngine-3.4.Tests", "HeuristicLab.HiveEngine\3.4\Tests\HeuristicLab.HiveEngine-3.4.Tests.csproj", "{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.HiveEngine-3.4.ConsoleTests", "HeuristicLab.HiveEngine\3.4\Tests\HeuristicLab.HiveEngine-3.4.ConsoleTests.csproj", "{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.ExperimentManager-3.4", "HeuristicLab.Clients.Hive.ExperimentManager\3.4\HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj", "{DBFD7205-61AF-40EF-8776-3052DEF91CF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeuristicLab.Clients.Hive.Administration-3.4", "HeuristicLab.Clients.Hive.Administration\3.4\HeuristicLab.Clients.Hive.Administration-3.4.csproj", "{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}"
 EndProject
 Global
@@ -442,4 +446,36 @@
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|x86.ActiveCfg = Release|x86
 		{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}.Release|x86.Build.0 = Release|x86
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|x64.ActiveCfg = Debug|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|x64.Build.0 = Debug|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|x86.ActiveCfg = Debug|x86
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Debug|x86.Build.0 = Debug|x86
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|Mixed Platforms.Build.0 = Release|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|x64.ActiveCfg = Release|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|x64.Build.0 = Release|x64
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|x86.ActiveCfg = Release|x86
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3}.Release|x86.Build.0 = Release|x86
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|x64.ActiveCfg = Debug|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|x64.Build.0 = Debug|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|x86.ActiveCfg = Debug|x86
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Debug|x86.Build.0 = Debug|x86
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|Mixed Platforms.Build.0 = Release|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|x64.ActiveCfg = Release|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|x64.Build.0 = Release|x64
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|x86.ActiveCfg = Release|x86
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8}.Release|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
@@ -464,4 +500,6 @@
 		{8D40A723-139D-40E4-8BBA-4CB309A9E4B9} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
 		{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
+		{DBFD7205-61AF-40EF-8776-3052DEF91CF3} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
+		{5211F1AD-BBA2-4C62-8749-DCA0A25CF5D8} = {E46F2FC8-8C15-48E5-96DB-FF2DB36BC509}
 		{A2061FFC-C564-4872-AA06-56B002DDEDBF} = {063D87A6-1085-49F6-A195-5D1890CBE994}
 		{02766ECC-D0F5-4115-9ECA-47409167B638} = {A2061FFC-C564-4872-AA06-56B002DDEDBF}
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HeuristicLab.HiveEngine.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HeuristicLab.HiveEngine.Views-3.4.csproj	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HeuristicLab.HiveEngine.Views-3.4.csproj	(revision 6373)
@@ -145,4 +145,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.ExperimentManager\3.4\HeuristicLab.Clients.Hive.ExperimentManager-3.4.csproj">
+      <Project>{DBFD7205-61AF-40EF-8776-3052DEF91CF3}</Project>
+      <Name>HeuristicLab.Clients.Hive.ExperimentManager-3.4</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Clients.Hive.Views\3.4\HeuristicLab.Clients.Hive.Views-3.4.csproj">
       <Project>{E1D6C801-892A-406A-B606-F158E36DD3C3}</Project>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine.Views/3.4/HiveEngineView.Designer.cs	(revision 6373)
@@ -1,3 +1,4 @@
-﻿namespace HeuristicLab.HiveEngine.Views {
+﻿using HeuristicLab.Clients.Hive.ExperimentManager.Views;
+namespace HeuristicLab.HiveEngine.Views {
   partial class HiveEngineView {
     /// <summary> 
@@ -32,5 +33,5 @@
       this.tabControl = new System.Windows.Forms.TabControl();
       this.jobsTabPage = new System.Windows.Forms.TabPage();
-      this.hiveExperimentListView = new HeuristicLab.Clients.Hive.Views.HiveExperimentListView();
+      this.hiveExperimentListView = new HiveExperimentListView();
       this.logTabPage = new System.Windows.Forms.TabPage();
       this.logView = new HeuristicLab.Core.Views.LogView();
@@ -230,5 +231,5 @@
     private System.Windows.Forms.CheckBox useLocalPluginsCheckBox;
     private HeuristicLab.Core.Views.LogView logView;
-    private Clients.Hive.Views.HiveExperimentListView hiveExperimentListView;
+    private HiveExperimentListView hiveExperimentListView;
   }
 }
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/HiveEngine.cs	(revision 6373)
@@ -288,5 +288,5 @@
             random.Reset(random.Next());
         }
-        ExperimentManagerClient.StartExperiment((e) => {
+        HiveClient.StartExperiment((e) => {
           LogException(e);
         }, refreshableHiveExperiment);
@@ -354,5 +354,5 @@
 
     private void DeleteHiveExperiment(Guid hiveExperimentId) {
-      ExperimentManagerClient.TryAndRepeat(() => {
+      HiveClient.TryAndRepeat(() => {
         ServiceLocator.Instance.CallHiveService(s => s.DeleteHiveExperiment(hiveExperimentId));
       }, 5, string.Format("Could not delete jobs"));
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/HeuristicLab.HiveEngine-3.4.ConsoleTests.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/HeuristicLab.HiveEngine-3.4.ConsoleTests.csproj	(revision 6373)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/HeuristicLab.HiveEngine-3.4.ConsoleTests.csproj	(revision 6373)
@@ -0,0 +1,157 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>HeuristicLab.HiveEngine.Test</RootNamespace>
+    <AssemblyName>HeuristicLab.HiveEngine.Test</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <PlatformTarget>x86</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DebugType>full</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.HiveEngine.Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <CodeAnalysisLogFile>bin\Release\HeuristicLab.HiveEngine.Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
+    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
+    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
+    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Collections-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Common.Resources-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Core-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Data-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Operators-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.MetaOptimization-3.3, Version=3.3.2.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.MetaOptimization.Views-3.3, Version=3.3.2.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization.Views-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.SequentialEngine-3.3">
+      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj">
+      <Project>{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}</Project>
+      <Name>HeuristicLab.Clients.Hive-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.HiveEngine-3.4.csproj">
+      <Project>{2C036542-5451-4A23-AFF6-87575C7BAFE7}</Project>
+      <Name>HeuristicLab.HiveEngine-3.4</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
+      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
+      <Name>HeuristicLab.Hive-3.4</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="app_services.config" />
+    <None Include="app.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
+set ProjectDir=$(ProjectDir)
+set SolutionDir=$(SolutionDir)
+set Outdir=$(Outdir)
+
+call PreBuildEvent.cmd</PreBuildEvent>
+  </PropertyGroup>
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
Index: anches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/HeuristicLab.HiveEngine-3.4.Tests.csproj
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/HeuristicLab.HiveEngine-3.4.Tests.csproj	(revision 6372)
+++ 	(revision )
@@ -1,157 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
-    <ProductVersion>8.0.30703</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{87D9FBB9-8E54-4770-9C84-B4B571D9EDD5}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>HeuristicLab.HiveEngine.Test</RootNamespace>
-    <AssemblyName>HeuristicLab.HiveEngine.Test</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile>
-    </TargetFrameworkProfile>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <PlatformTarget>x86</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <PlatformTarget>x86</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
-    <DebugSymbols>true</DebugSymbols>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DebugType>full</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Debug\HeuristicLab.HiveEngine.Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <Optimize>true</Optimize>
-    <DebugType>pdbonly</DebugType>
-    <PlatformTarget>AnyCPU</PlatformTarget>
-    <CodeAnalysisLogFile>bin\Release\HeuristicLab.HiveEngine.Test.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>
-    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>
-    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>
-    <ErrorReport>prompt</ErrorReport>
-    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRuleSetDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>
-    <CodeAnalysisIgnoreBuiltInRuleSets>true</CodeAnalysisIgnoreBuiltInRuleSets>
-    <CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
-    <CodeAnalysisIgnoreBuiltInRules>true</CodeAnalysisIgnoreBuiltInRules>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="HeuristicLab.Algorithms.GeneticAlgorithm-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Algorithms.GeneticAlgorithm-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Collections-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Collections-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Common-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Common.Resources-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Common.Resources-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Core-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Core-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Data-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Operators-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Operators-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Optimization-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Persistence-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Persistence-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Problems.MetaOptimization-3.3, Version=3.3.2.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Problems.MetaOptimization.Views-3.3, Version=3.3.2.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
-      <HintPath>..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.MetaOptimization.Views-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.Problems.TestFunctions-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.Problems.TestFunctions-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="HeuristicLab.SequentialEngine-3.3">
-      <HintPath>C:\Program Files\HeuristicLab 3.3\HeuristicLab.SequentialEngine-3.3.dll</HintPath>
-    </Reference>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Runtime.Serialization" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\HeuristicLab.Clients.Hive\3.4\HeuristicLab.Clients.Hive-3.4.csproj">
-      <Project>{B5EF1E5A-9F3D-40B9-B4B0-30AADF2E2CEB}</Project>
-      <Name>HeuristicLab.Clients.Hive-3.4</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\HeuristicLab.HiveEngine-3.4.csproj">
-      <Project>{2C036542-5451-4A23-AFF6-87575C7BAFE7}</Project>
-      <Name>HeuristicLab.HiveEngine-3.4</Name>
-    </ProjectReference>
-    <ProjectReference Include="..\..\..\HeuristicLab.Hive\3.4\HeuristicLab.Hive-3.4.csproj">
-      <Project>{F98A1740-9AC9-4D36-A582-6A2D0D06978D}</Project>
-      <Name>HeuristicLab.Hive-3.4</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="app_services.config" />
-    <None Include="app.config" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>set Path=%25Path%25;$(ProjectDir);$(SolutionDir)
-set ProjectDir=$(ProjectDir)
-set SolutionDir=$(SolutionDir)
-set Outdir=$(Outdir)
-
-call PreBuildEvent.cmd</PreBuildEvent>
-  </PropertyGroup>
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
Index: /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs
===================================================================
--- /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs	(revision 6372)
+++ /branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.HiveEngine/3.4/Tests/Program.cs	(revision 6373)
@@ -42,5 +42,5 @@
       #region Credentials
       ServiceLocator.Instance.Username = "cneumuel";
-      ServiceLocator.Instance.Password = "Stormlord105.";
+      ServiceLocator.Instance.Password = "";
       #endregion
 
