Index: /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 4042)
@@ -334,29 +334,42 @@
       if (e.Result.StatusMessage != ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOBS_LEFT) {
         Logger.Info("Received new job with id " + e.Result.Job.Id);      
-        bool sandboxed = false;
-        List<byte[]> files = new List<byte[]>();
+        bool sandboxed = false;        
         Logger.Debug("Fetching plugins for job " + e.Result.Job.Id);
-        foreach (CachedHivePluginInfoDto plugininfo in PluginCache.Instance.GetPlugins(e.Result.Job.PluginsNeeded))
-          files.AddRange(plugininfo.PluginFiles);
+
+        PluginCache.Instance.PreparePlugins(e.Result.Job.PluginsNeeded);
+
+//        foreach (CachedHivePluginInfoDto plugininfo in PluginCache.Instance.GetPlugins(e.Result.Job.PluginsNeeded))
+  //        files.AddRange(plugininfo.PluginFiles);
         Logger.Debug("Plugins fetched for job " + e.Result.Job.Id);
-        AppDomain appDomain = HeuristicLab.PluginInfrastructure.Sandboxing.SandboxManager.CreateAndInitSandbox(e.Result.Job.Id.ToString(), files);
-        appDomain.UnhandledException += new UnhandledExceptionEventHandler(appDomain_UnhandledException);
-        lock (engines) {
-          if (!jobs.ContainsKey(e.Result.Job.Id)) {
-            jobs.Add(e.Result.Job.Id, e.Result.Job);
-            appDomains.Add(e.Result.Job.Id, appDomain);
-            Logger.Debug("Creating AppDomain");
-            Executor engine = (Executor)appDomain.CreateInstanceAndUnwrap(typeof(Executor).Assembly.GetName().Name, typeof(Executor).FullName);
-            Logger.Debug("Created AppDomain");
-            engine.JobId = e.Result.Job.Id;
-            engine.Queue = MessageQueue.GetInstance();
-            Logger.Debug("Starting Engine for job " + e.Result.Job.Id);
-            engine.Start(e.Data);
-            engines.Add(e.Result.Job.Id, engine);
-
-            ClientStatusInfo.JobsFetched++;
-
-            Logger.Info("Increment FetchedJobs to:" + ClientStatusInfo.JobsFetched);
+        try {
+          AppDomain appDomain =
+            HeuristicLab.PluginInfrastructure.Sandboxing.SandboxManager.CreateAndInitSandbox(
+              e.Result.Job.Id.ToString(), null);
+          appDomain.UnhandledException += new UnhandledExceptionEventHandler(appDomain_UnhandledException);
+          lock (engines) {
+            if (!jobs.ContainsKey(e.Result.Job.Id)) {
+              jobs.Add(e.Result.Job.Id, e.Result.Job);
+              appDomains.Add(e.Result.Job.Id, appDomain);
+              Logger.Debug("Creating AppDomain");
+              Executor engine =
+                (Executor)
+                appDomain.CreateInstanceAndUnwrap(typeof (Executor).Assembly.GetName().Name, typeof (Executor).FullName);
+              Logger.Debug("Created AppDomain");
+              engine.JobId = e.Result.Job.Id;
+              engine.Queue = MessageQueue.GetInstance();
+              Logger.Debug("Starting Engine for job " + e.Result.Job.Id);
+              engine.Start(e.Data);
+              engines.Add(e.Result.Job.Id, engine);
+
+              ClientStatusInfo.JobsFetched++;
+
+              Logger.Info("Increment FetchedJobs to:" + ClientStatusInfo.JobsFetched);
+            }
           }
+        } catch(Exception exception) {
+          Logger.Error("Creating the Appdomain and loading the job failed for job " + e.Result.Job.Id);
+          Logger.Error("Error thrown is: ", exception);
+          CurrentlyFetching = false;
+          KillAppDomain(e.Result.Job.Id);
         }
       } else
@@ -482,10 +495,14 @@
       lock (engines) {
         try {
-          engines[id].Dispose();  
-          appDomains[id].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
-          AppDomain.Unload(appDomains[id]);
-          appDomains.Remove(id);
+          if(engines.ContainsKey(id))
+            engines[id].Dispose();
+          if (appDomains.ContainsKey(id)) {
+            appDomains[id].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
+            AppDomain.Unload(appDomains[id]);
+            appDomains.Remove(id);
+          }
           engines.Remove(id);
           jobs.Remove(id);
+          GC.Collect();
         }
         catch (Exception ex) {
Index: /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 4042)
@@ -8,4 +8,5 @@
 using HeuristicLab.Hive.Contracts.BusinessObjects;
 using HeuristicLab.Tracing;
+using System.IO;
 
 namespace HeuristicLab.Hive.Client.Core {
@@ -67,4 +68,25 @@
     }
 
+
+    internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) {
+      List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
+      foreach (HivePluginInfoDto requiredPlugin in requiredPlugins) {
+        if(ApplicationManager.Manager.Plugins.Count(ipd => ipd.Version.Major == requiredPlugin.Version.Major && ipd.Version.Minor >= requiredPlugin.Version.Minor) == 0) {
+          missingPlugins.Add(requiredPlugin);             
+        }
+      }
+
+      Logger.Debug("Requesting missing plugins");
+      List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);
+      Logger.Debug("Requested missing plugins");
+
+      foreach (CachedHivePluginInfoDto receivedPlugin in receivedPlugins) {
+        foreach (HivePluginFile hpf in receivedPlugin.PluginFiles) {
+          Logger.Info("writing file " + hpf.Name);
+          File.WriteAllBytes("C:\\temp\\" + hpf.Name.Split('\\').Last(), hpf.BinaryFile);
+        }        
+      }
+
+    }
   }
 }
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/CachedHivePluginInfoDto.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/CachedHivePluginInfoDto.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/CachedHivePluginInfoDto.cs	(revision 4042)
@@ -25,4 +25,5 @@
 using HeuristicLab.Hive.Contracts.BusinessObjects;
 using System.Runtime.Serialization;
+using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.PluginInfrastructure {
@@ -30,13 +31,13 @@
   [Serializable]
   public class CachedHivePluginInfoDto : HivePluginInfoDto {
-
-    private List<byte[]> pluginFiles = new List<byte[]>();
+    
     /// <summary>
     /// stores the plugin files in a list of byte arrays
     /// </summary>
     [DataMember]
-    public List<byte[]> PluginFiles {
-      get { return pluginFiles; }
-      set { pluginFiles = value; }
+    public List<HivePluginFile> PluginFiles { get; set; }
+
+    public CachedHivePluginInfoDto() {
+      PluginFiles = new List<HivePluginFile>();
     }
   }
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginFile.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginFile.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginFile.cs	(revision 4042)
@@ -0,0 +1,21 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Runtime.Serialization;
+
+namespace HeuristicLab.Hive.Contracts.BusinessObjects {
+  [Serializable]
+  [DataContract]
+  public class HivePluginFile {
+    [DataMember]
+    public byte[] BinaryFile { get; set; }
+    [DataMember]
+    public String Name { get; set; }  
+
+    public HivePluginFile(byte[] binaryFile, String name) {
+      BinaryFile = binaryFile;
+      Name = name;
+    }
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs	(revision 4042)
@@ -37,5 +37,5 @@
 
     [DataMember]
-    public String Version { get; set; }
+    public Version Version { get; set; }
 
     [DataMember]
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 4042)
@@ -91,4 +91,5 @@
     <Compile Include="BusinessObjects\CachedHivePluginInfoDto.cs" />
     <Compile Include="BusinessObjects\ClientGroupDto.cs" />
+    <Compile Include="BusinessObjects\HivePluginFile.cs" />
     <Compile Include="BusinessObjects\ResourceDto.cs" />
     <Compile Include="BusinessObjects\SerializedJob.cs" />
@@ -139,4 +140,8 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IExecutionEngineFacade.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IExecutionEngineFacade.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IExecutionEngineFacade.cs	(revision 4042)
@@ -37,5 +37,5 @@
     Response RequestSnapshot(Guid jobId);
     [OperationContract]
-    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested);
+    ResponseObject<SerializedJob> GetLastSerializedResult(Guid jobId, bool requested, bool snapshot);
     [OperationContract]
     Response AbortJob(Guid jobId);    
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs	(revision 4042)
@@ -48,5 +48,5 @@
     ResponseObject<JobDto> GetLastJobResultOf(Guid jobId);
     [OperationContract]
-    ResponseObject<SerializedJob> GetLastSerializedJobResultOf(Guid jobId, bool requested);
+    ResponseObject<SerializedJob> GetLastSerializedJobResultOf(Guid jobId, bool requested, bool snapshot);
     [OperationContract]
     ResponseList<JobResult> GetAllJobResults(Guid jobId);
Index: /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/MultiStream.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/MultiStream.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/MultiStream.cs	(revision 4042)
@@ -6,4 +6,5 @@
 using System.IO;
 using System.Collections;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Contracts {
@@ -102,9 +103,10 @@
 
     protected override void Dispose(bool disposing) {
-      if (!disposing) {
+      //if (!disposing) {
         foreach (Stream s in this.streamList) {
+          Console.WriteLine("DISPOSING STREAM");
           s.Dispose();
         }
-      }
+      //}
       
       base.Dispose(disposing);
Index: /branches/3.2/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 4042)
@@ -136,5 +136,5 @@
           lock (locker) {
             Logger.Debug("HiveEngine: Results-polling - GetLastResult");
-            response = executionEngineFacade.GetLastSerializedResult(jobId, false);
+            response = executionEngineFacade.GetLastSerializedResult(jobId, false, false);
             Logger.Debug("HiveEngine: Results-polling - Server: " + response.StatusMessage + " success: " + response.Success);
             // loop while 
@@ -144,5 +144,5 @@
             // 4. the result that we get from the server is a snapshot and not the final result
             if (abortRequested) return;
-            if (response.Success && response.Obj != null) {
+              if (response.Success && response.Obj != null && response.StatusMessage != ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE) {
               Logger.Debug("HiveEngine: Results-polling - Got result!");
               restoredJob = (Job)PersistenceManager.RestoreFromGZip(response.Obj.SerializedJobData);
@@ -171,5 +171,5 @@
           // job is finished already
           Logger.Debug("HiveEngine: Abort - GetLastResult(false)");
-          response = executionEngineFacade.GetLastSerializedResult(jobId, false);
+          response = executionEngineFacade.GetLastSerializedResult(jobId, false, false);
           Logger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
         } else {
@@ -179,5 +179,5 @@
             Thread.Sleep(SNAPSHOT_POLLING_INTERVAL_MS);
             Logger.Debug("HiveEngine: Abort - GetLastResult(true)");
-            response = executionEngineFacade.GetLastSerializedResult(jobId, true);
+            response = executionEngineFacade.GetLastSerializedResult(jobId, false, true);
             Logger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
             retryCount++;
@@ -264,5 +264,5 @@
           new HivePluginInfoDto();
         pluginInfo.Name = uniquePlugin.Name;
-        pluginInfo.Version = uniquePlugin.Version.ToString();
+        pluginInfo.Version = uniquePlugin.Version;
         pluginInfo.BuildDate = uniquePlugin.BuildDate;
         pluginsNeeded.Add(pluginInfo);
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/JobAdapter.cs	(revision 4042)
@@ -369,5 +369,5 @@
           //first check if pluginInfo already exists in the db
           HivePluginInfoDto found = PluginInfoAdapter.GetByNameVersionBuilddate(
-            pluginInfo.Name, pluginInfo.Version, pluginInfo.BuildDate);
+            pluginInfo.Name, pluginInfo.Version.ToString(), pluginInfo.BuildDate);
           if (found != null) {
             pluginInfo.Id = found.Id;
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.ADODataAccess/3.2/PluginInfoAdapter.cs	(revision 4042)
@@ -27,5 +27,5 @@
         row.PluginId = pluginInfo.Id;
         row.Name = pluginInfo.Name;
-        row.Version = pluginInfo.Version;
+        row.Version = pluginInfo.Version.ToString();
         row.BuildDate = pluginInfo.BuildDate;
 
@@ -48,5 +48,5 @@
 
         if (!row.IsVersionNull()) {
-          pluginInfo.Version = row.Version;
+          pluginInfo.Version = new Version(row.Version);
         } else {
           pluginInfo.Version = null;
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HeuristicLab.Hive.Server.Console-3.2.csproj	(revision 4042)
@@ -132,4 +132,14 @@
     </Compile>
     <Compile Include="HiveServerConsolePlugin.cs" />
+    <Compile Include="JobDataFetcher.cs" />
+    <Compile Include="JobListView.cs">
+      <SubType>Component</SubType>
+    </Compile>
+    <Compile Include="JobListViewControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobListViewControl.Designer.cs">
+      <DependentUpon>JobListViewControl.cs</DependentUpon>
+    </Compile>
     <Compile Include="LogonDlg.cs">
       <SubType>Form</SubType>
@@ -159,4 +169,10 @@
       <DependentUpon>HiveServerManagementConsole.cs</DependentUpon>
       <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="JobListView.resx">
+      <DependentUpon>JobListView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="JobListViewControl.resx">
+      <DependentUpon>JobListViewControl.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="LogonDlg.resx">
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 4042)
@@ -67,9 +67,28 @@
       this.tpJobControl = new System.Windows.Forms.TabPage();
       this.scJobControl = new System.Windows.Forms.SplitContainer();
-      this.lvJobControl = new System.Windows.Forms.ListView();
+      this.calculatingJobTabControl = new System.Windows.Forms.TabControl();
+      this.calculatingJobTabPage = new System.Windows.Forms.TabPage();
+      this.splitContainer5 = new System.Windows.Forms.SplitContainer();
+      this.cmb_calculatingJob_count = new System.Windows.Forms.ComboBox();
+      this.btn_calculatingJobs_next = new System.Windows.Forms.Button();
+      this.btn_calculatingJobs_prev = new System.Windows.Forms.Button();
+      this.lv_calculatingJobs = new System.Windows.Forms.ListView();
       this.contextMenuJob = new System.Windows.Forms.ContextMenuStrip(this.components);
-      this.menuItemAbortJob = new System.Windows.Forms.ToolStripMenuItem();
+      this.offlineItemAbortJob = new System.Windows.Forms.ToolStripMenuItem();
       this.menuItemGetSnapshot = new System.Windows.Forms.ToolStripMenuItem();
       this.ilSmallImgJob = new System.Windows.Forms.ImageList(this.components);
+      this.finishedJobsTabPage = new System.Windows.Forms.TabPage();
+      this.splitContainer2 = new System.Windows.Forms.SplitContainer();
+      this.cmb_finishedJob_count = new System.Windows.Forms.ComboBox();
+      this.btn_finishedJob_next = new System.Windows.Forms.Button();
+      this.btn_finishedJob_prev = new System.Windows.Forms.Button();
+      this.lv_finishedJobs = new System.Windows.Forms.ListView();
+      this.offlineJobsTabPage = new System.Windows.Forms.TabPage();
+      this.splitContainer4 = new System.Windows.Forms.SplitContainer();
+      this.cmb_offlineJob_count = new System.Windows.Forms.ComboBox();
+      this.btn_offlineJob_next = new System.Windows.Forms.Button();
+      this.btn_offlinejob_prev = new System.Windows.Forms.Button();
+      this.lv_offlineJobs = new System.Windows.Forms.ListView();
+      this.AbortContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
       this.ilSmallImgClient = new System.Windows.Forms.ImageList(this.components);
       this.tpClientControl = new System.Windows.Forms.TabPage();
@@ -85,4 +104,11 @@
       this.tcManagementConsole = new System.Windows.Forms.TabControl();
       this.checkBox1 = new System.Windows.Forms.CheckBox();
+      this.splitContainer3 = new System.Windows.Forms.SplitContainer();
+      this.comboBox1 = new System.Windows.Forms.ComboBox();
+      this.button1 = new System.Windows.Forms.Button();
+      this.button2 = new System.Windows.Forms.Button();
+      this.listView1 = new System.Windows.Forms.ListView();
+      this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+      this.calcToolStripAbortItem = new System.Windows.Forms.ToolStripMenuItem();
       this.menuStrip1.SuspendLayout();
       this.plClientDetails.SuspendLayout();
@@ -97,5 +123,19 @@
       this.scJobControl.Panel2.SuspendLayout();
       this.scJobControl.SuspendLayout();
+      this.calculatingJobTabControl.SuspendLayout();
+      this.calculatingJobTabPage.SuspendLayout();
+      this.splitContainer5.Panel1.SuspendLayout();
+      this.splitContainer5.Panel2.SuspendLayout();
+      this.splitContainer5.SuspendLayout();
       this.contextMenuJob.SuspendLayout();
+      this.finishedJobsTabPage.SuspendLayout();
+      this.splitContainer2.Panel1.SuspendLayout();
+      this.splitContainer2.Panel2.SuspendLayout();
+      this.splitContainer2.SuspendLayout();
+      this.offlineJobsTabPage.SuspendLayout();
+      this.splitContainer4.Panel1.SuspendLayout();
+      this.splitContainer4.Panel2.SuspendLayout();
+      this.splitContainer4.SuspendLayout();
+      this.AbortContextMenuStrip.SuspendLayout();
       this.tpClientControl.SuspendLayout();
       this.scClientControl.Panel1.SuspendLayout();
@@ -107,4 +147,7 @@
       this.contextMenuGroup.SuspendLayout();
       this.tcManagementConsole.SuspendLayout();
+      this.splitContainer3.Panel1.SuspendLayout();
+      this.splitContainer3.Panel2.SuspendLayout();
+      this.splitContainer3.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -480,5 +523,5 @@
       // scJobControl.Panel1
       // 
-      this.scJobControl.Panel1.Controls.Add(this.lvJobControl);
+      this.scJobControl.Panel1.Controls.Add(this.calculatingJobTabControl);
       // 
       // scJobControl.Panel2
@@ -489,34 +532,107 @@
       this.scJobControl.TabIndex = 0;
       // 
-      // lvJobControl
-      // 
-      this.lvJobControl.AllowDrop = true;
-      this.lvJobControl.ContextMenuStrip = this.contextMenuJob;
-      this.lvJobControl.Dock = System.Windows.Forms.DockStyle.Fill;
-      this.lvJobControl.LargeImageList = this.ilLargeImgJob;
-      this.lvJobControl.Location = new System.Drawing.Point(0, 0);
-      this.lvJobControl.MultiSelect = false;
-      this.lvJobControl.Name = "lvJobControl";
-      this.lvJobControl.Size = new System.Drawing.Size(454, 386);
-      this.lvJobControl.SmallImageList = this.ilSmallImgJob;
-      this.lvJobControl.TabIndex = 0;
-      this.lvJobControl.UseCompatibleStateImageBehavior = false;
-      this.lvJobControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lvJobControl_MouseUp);
-      this.lvJobControl.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lvJobControl_MouseMove);
-      this.lvJobControl.Click += new System.EventHandler(this.OnLVJobControlClicked);
+      // calculatingJobTabControl
+      // 
+      this.calculatingJobTabControl.Controls.Add(this.calculatingJobTabPage);
+      this.calculatingJobTabControl.Controls.Add(this.finishedJobsTabPage);
+      this.calculatingJobTabControl.Controls.Add(this.offlineJobsTabPage);
+      this.calculatingJobTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.calculatingJobTabControl.Location = new System.Drawing.Point(0, 0);
+      this.calculatingJobTabControl.Name = "calculatingJobTabControl";
+      this.calculatingJobTabControl.SelectedIndex = 0;
+      this.calculatingJobTabControl.Size = new System.Drawing.Size(454, 386);
+      this.calculatingJobTabControl.TabIndex = 0;
+      // 
+      // calculatingJobTabPage
+      // 
+      this.calculatingJobTabPage.Controls.Add(this.splitContainer5);
+      this.calculatingJobTabPage.Location = new System.Drawing.Point(4, 22);
+      this.calculatingJobTabPage.Name = "calculatingJobTabPage";
+      this.calculatingJobTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.calculatingJobTabPage.Size = new System.Drawing.Size(446, 360);
+      this.calculatingJobTabPage.TabIndex = 2;
+      this.calculatingJobTabPage.Text = "Calculating Jobs";
+      this.calculatingJobTabPage.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer5
+      // 
+      this.splitContainer5.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer5.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer5.Name = "splitContainer5";
+      this.splitContainer5.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer5.Panel1
+      // 
+      this.splitContainer5.Panel1.Controls.Add(this.cmb_calculatingJob_count);
+      this.splitContainer5.Panel1.Controls.Add(this.btn_calculatingJobs_next);
+      this.splitContainer5.Panel1.Controls.Add(this.btn_calculatingJobs_prev);
+      // 
+      // splitContainer5.Panel2
+      // 
+      this.splitContainer5.Panel2.Controls.Add(this.lv_calculatingJobs);
+      this.splitContainer5.Size = new System.Drawing.Size(440, 354);
+      this.splitContainer5.SplitterDistance = 28;
+      this.splitContainer5.TabIndex = 3;
+      // 
+      // cmb_calculatingJob_count
+      // 
+      this.cmb_calculatingJob_count.FormattingEnabled = true;
+      this.cmb_calculatingJob_count.Items.AddRange(new object[] {
+            "25",
+            "50",
+            "75",
+            "100"});
+      this.cmb_calculatingJob_count.Location = new System.Drawing.Point(165, 3);
+      this.cmb_calculatingJob_count.Name = "cmb_calculatingJob_count";
+      this.cmb_calculatingJob_count.Size = new System.Drawing.Size(48, 21);
+      this.cmb_calculatingJob_count.TabIndex = 2;
+      this.cmb_calculatingJob_count.SelectedIndexChanged += new System.EventHandler(this.cmb_count_SelectedIndexChanged);
+      // 
+      // btn_calculatingJobs_next
+      // 
+      this.btn_calculatingJobs_next.Location = new System.Drawing.Point(84, 3);
+      this.btn_calculatingJobs_next.Name = "btn_calculatingJobs_next";
+      this.btn_calculatingJobs_next.Size = new System.Drawing.Size(75, 23);
+      this.btn_calculatingJobs_next.TabIndex = 1;
+      this.btn_calculatingJobs_next.Text = "-->";
+      this.btn_calculatingJobs_next.UseVisualStyleBackColor = true;
+      this.btn_calculatingJobs_next.Click += new System.EventHandler(this.btn_next_Click);
+      // 
+      // btn_calculatingJobs_prev
+      // 
+      this.btn_calculatingJobs_prev.Location = new System.Drawing.Point(3, 3);
+      this.btn_calculatingJobs_prev.Name = "btn_calculatingJobs_prev";
+      this.btn_calculatingJobs_prev.Size = new System.Drawing.Size(75, 23);
+      this.btn_calculatingJobs_prev.TabIndex = 0;
+      this.btn_calculatingJobs_prev.Text = "<--";
+      this.btn_calculatingJobs_prev.UseVisualStyleBackColor = true;
+      this.btn_calculatingJobs_prev.Click += new System.EventHandler(this.btn_prev_Click);
+      // 
+      // lv_calculatingJobs
+      // 
+      this.lv_calculatingJobs.ContextMenuStrip = this.contextMenuJob;
+      this.lv_calculatingJobs.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lv_calculatingJobs.LargeImageList = this.ilLargeImgJob;
+      this.lv_calculatingJobs.Location = new System.Drawing.Point(0, 0);
+      this.lv_calculatingJobs.Name = "lv_calculatingJobs";
+      this.lv_calculatingJobs.Size = new System.Drawing.Size(440, 322);
+      this.lv_calculatingJobs.SmallImageList = this.ilSmallImgJob;
+      this.lv_calculatingJobs.TabIndex = 0;
+      this.lv_calculatingJobs.UseCompatibleStateImageBehavior = false;
+      this.lv_calculatingJobs.SelectedIndexChanged += new System.EventHandler(this.lv_Jobs_SelectedIndexChanged);
       // 
       // contextMenuJob
       // 
       this.contextMenuJob.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.menuItemAbortJob,
-            this.menuItemGetSnapshot});
+            this.menuItemGetSnapshot,
+            this.calcToolStripAbortItem});
       this.contextMenuJob.Name = "contextMenuJob";
       this.contextMenuJob.Size = new System.Drawing.Size(145, 48);
       // 
-      // menuItemAbortJob
-      // 
-      this.menuItemAbortJob.Name = "menuItemAbortJob";
-      this.menuItemAbortJob.Size = new System.Drawing.Size(144, 22);
-      this.menuItemAbortJob.Text = "Abort";
+      // offlineItemAbortJob
+      // 
+      this.offlineItemAbortJob.Name = "offlineItemAbortJob";
+      this.offlineItemAbortJob.Size = new System.Drawing.Size(152, 22);
+      this.offlineItemAbortJob.Text = "Abort";
       // 
       // menuItemGetSnapshot
@@ -533,4 +649,166 @@
       this.ilSmallImgJob.Images.SetKeyName(1, "Forward.png");
       this.ilSmallImgJob.Images.SetKeyName(2, "pause.png");
+      // 
+      // finishedJobsTabPage
+      // 
+      this.finishedJobsTabPage.Controls.Add(this.splitContainer2);
+      this.finishedJobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.finishedJobsTabPage.Name = "finishedJobsTabPage";
+      this.finishedJobsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.finishedJobsTabPage.Size = new System.Drawing.Size(446, 360);
+      this.finishedJobsTabPage.TabIndex = 0;
+      this.finishedJobsTabPage.Text = "Finished Jobs";
+      this.finishedJobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer2
+      // 
+      this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer2.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer2.Name = "splitContainer2";
+      this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer2.Panel1
+      // 
+      this.splitContainer2.Panel1.Controls.Add(this.cmb_finishedJob_count);
+      this.splitContainer2.Panel1.Controls.Add(this.btn_finishedJob_next);
+      this.splitContainer2.Panel1.Controls.Add(this.btn_finishedJob_prev);
+      // 
+      // splitContainer2.Panel2
+      // 
+      this.splitContainer2.Panel2.Controls.Add(this.lv_finishedJobs);
+      this.splitContainer2.Size = new System.Drawing.Size(440, 354);
+      this.splitContainer2.SplitterDistance = 28;
+      this.splitContainer2.TabIndex = 2;
+      // 
+      // cmb_finishedJob_count
+      // 
+      this.cmb_finishedJob_count.FormattingEnabled = true;
+      this.cmb_finishedJob_count.Items.AddRange(new object[] {
+            "25",
+            "50",
+            "75",
+            "100"});
+      this.cmb_finishedJob_count.Location = new System.Drawing.Point(165, 3);
+      this.cmb_finishedJob_count.Name = "cmb_finishedJob_count";
+      this.cmb_finishedJob_count.Size = new System.Drawing.Size(48, 21);
+      this.cmb_finishedJob_count.TabIndex = 2;
+      this.cmb_finishedJob_count.SelectedIndexChanged += new System.EventHandler(this.cmb_count_SelectedIndexChanged);
+      // 
+      // btn_finishedJob_next
+      // 
+      this.btn_finishedJob_next.Location = new System.Drawing.Point(84, 3);
+      this.btn_finishedJob_next.Name = "btn_finishedJob_next";
+      this.btn_finishedJob_next.Size = new System.Drawing.Size(75, 23);
+      this.btn_finishedJob_next.TabIndex = 1;
+      this.btn_finishedJob_next.Text = "-->";
+      this.btn_finishedJob_next.UseVisualStyleBackColor = true;
+      this.btn_finishedJob_next.Click += new System.EventHandler(this.btn_next_Click);
+      // 
+      // btn_finishedJob_prev
+      // 
+      this.btn_finishedJob_prev.Location = new System.Drawing.Point(3, 3);
+      this.btn_finishedJob_prev.Name = "btn_finishedJob_prev";
+      this.btn_finishedJob_prev.Size = new System.Drawing.Size(75, 23);
+      this.btn_finishedJob_prev.TabIndex = 0;
+      this.btn_finishedJob_prev.Text = "<--";
+      this.btn_finishedJob_prev.UseVisualStyleBackColor = true;
+      this.btn_finishedJob_prev.Click += new System.EventHandler(this.btn_prev_Click);
+      // 
+      // lv_finishedJobs
+      // 
+      this.lv_finishedJobs.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lv_finishedJobs.LargeImageList = this.ilLargeImgJob;
+      this.lv_finishedJobs.Location = new System.Drawing.Point(0, 0);
+      this.lv_finishedJobs.Name = "lv_finishedJobs";
+      this.lv_finishedJobs.Size = new System.Drawing.Size(440, 322);
+      this.lv_finishedJobs.SmallImageList = this.ilSmallImgJob;
+      this.lv_finishedJobs.TabIndex = 0;
+      this.lv_finishedJobs.UseCompatibleStateImageBehavior = false;
+      this.lv_finishedJobs.SelectedIndexChanged += new System.EventHandler(this.lv_Jobs_SelectedIndexChanged);
+      // 
+      // offlineJobsTabPage
+      // 
+      this.offlineJobsTabPage.Controls.Add(this.splitContainer4);
+      this.offlineJobsTabPage.Location = new System.Drawing.Point(4, 22);
+      this.offlineJobsTabPage.Name = "offlineJobsTabPage";
+      this.offlineJobsTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.offlineJobsTabPage.Size = new System.Drawing.Size(446, 360);
+      this.offlineJobsTabPage.TabIndex = 1;
+      this.offlineJobsTabPage.Text = "Offline Jobs";
+      this.offlineJobsTabPage.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer4
+      // 
+      this.splitContainer4.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer4.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer4.Name = "splitContainer4";
+      this.splitContainer4.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer4.Panel1
+      // 
+      this.splitContainer4.Panel1.Controls.Add(this.cmb_offlineJob_count);
+      this.splitContainer4.Panel1.Controls.Add(this.btn_offlineJob_next);
+      this.splitContainer4.Panel1.Controls.Add(this.btn_offlinejob_prev);
+      // 
+      // splitContainer4.Panel2
+      // 
+      this.splitContainer4.Panel2.Controls.Add(this.lv_offlineJobs);
+      this.splitContainer4.Size = new System.Drawing.Size(440, 354);
+      this.splitContainer4.SplitterDistance = 28;
+      this.splitContainer4.TabIndex = 3;
+      // 
+      // cmb_offlineJob_count
+      // 
+      this.cmb_offlineJob_count.FormattingEnabled = true;
+      this.cmb_offlineJob_count.Items.AddRange(new object[] {
+            "25",
+            "50",
+            "75",
+            "100"});
+      this.cmb_offlineJob_count.Location = new System.Drawing.Point(165, 3);
+      this.cmb_offlineJob_count.Name = "cmb_offlineJob_count";
+      this.cmb_offlineJob_count.Size = new System.Drawing.Size(48, 21);
+      this.cmb_offlineJob_count.TabIndex = 2;
+      this.cmb_offlineJob_count.SelectedIndexChanged += new System.EventHandler(this.cmb_count_SelectedIndexChanged);
+      // 
+      // btn_offlineJob_next
+      // 
+      this.btn_offlineJob_next.Location = new System.Drawing.Point(84, 3);
+      this.btn_offlineJob_next.Name = "btn_offlineJob_next";
+      this.btn_offlineJob_next.Size = new System.Drawing.Size(75, 23);
+      this.btn_offlineJob_next.TabIndex = 1;
+      this.btn_offlineJob_next.Text = "-->";
+      this.btn_offlineJob_next.UseVisualStyleBackColor = true;
+      this.btn_offlineJob_next.Click += new System.EventHandler(this.btn_next_Click);
+      // 
+      // btn_offlinejob_prev
+      // 
+      this.btn_offlinejob_prev.Location = new System.Drawing.Point(3, 3);
+      this.btn_offlinejob_prev.Name = "btn_offlinejob_prev";
+      this.btn_offlinejob_prev.Size = new System.Drawing.Size(75, 23);
+      this.btn_offlinejob_prev.TabIndex = 0;
+      this.btn_offlinejob_prev.Text = "<--";
+      this.btn_offlinejob_prev.UseVisualStyleBackColor = true;
+      this.btn_offlinejob_prev.Click += new System.EventHandler(this.btn_prev_Click);
+      // 
+      // lv_offlineJobs
+      // 
+      this.lv_offlineJobs.ContextMenuStrip = this.AbortContextMenuStrip;
+      this.lv_offlineJobs.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.lv_offlineJobs.LargeImageList = this.ilLargeImgJob;
+      this.lv_offlineJobs.Location = new System.Drawing.Point(0, 0);
+      this.lv_offlineJobs.Name = "lv_offlineJobs";
+      this.lv_offlineJobs.Size = new System.Drawing.Size(440, 322);
+      this.lv_offlineJobs.SmallImageList = this.ilSmallImgJob;
+      this.lv_offlineJobs.TabIndex = 0;
+      this.lv_offlineJobs.UseCompatibleStateImageBehavior = false;
+      this.lv_offlineJobs.SelectedIndexChanged += new System.EventHandler(this.lv_Jobs_SelectedIndexChanged);
+      // 
+      // AbortContextMenuStrip
+      // 
+      this.AbortContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.offlineItemAbortJob});
+      this.AbortContextMenuStrip.Name = "AbortContextMenuStrip";
+      this.AbortContextMenuStrip.Size = new System.Drawing.Size(105, 26);
       // 
       // ilSmallImgClient
@@ -675,4 +953,78 @@
       this.checkBox1.Text = "checkBox1";
       this.checkBox1.UseVisualStyleBackColor = true;
+      // 
+      // splitContainer3
+      // 
+      this.splitContainer3.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer3.Location = new System.Drawing.Point(3, 3);
+      this.splitContainer3.Name = "splitContainer3";
+      this.splitContainer3.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer3.Panel1
+      // 
+      this.splitContainer3.Panel1.Controls.Add(this.comboBox1);
+      this.splitContainer3.Panel1.Controls.Add(this.button1);
+      this.splitContainer3.Panel1.Controls.Add(this.button2);
+      // 
+      // splitContainer3.Panel2
+      // 
+      this.splitContainer3.Panel2.Controls.Add(this.listView1);
+      this.splitContainer3.Size = new System.Drawing.Size(440, 354);
+      this.splitContainer3.SplitterDistance = 28;
+      this.splitContainer3.TabIndex = 2;
+      // 
+      // comboBox1
+      // 
+      this.comboBox1.FormattingEnabled = true;
+      this.comboBox1.Items.AddRange(new object[] {
+            "25",
+            "50",
+            "75",
+            "100"});
+      this.comboBox1.Location = new System.Drawing.Point(165, 3);
+      this.comboBox1.Name = "comboBox1";
+      this.comboBox1.Size = new System.Drawing.Size(48, 21);
+      this.comboBox1.TabIndex = 2;
+      // 
+      // button1
+      // 
+      this.button1.Location = new System.Drawing.Point(84, 3);
+      this.button1.Name = "button1";
+      this.button1.Size = new System.Drawing.Size(75, 23);
+      this.button1.TabIndex = 1;
+      this.button1.Text = "-->";
+      this.button1.UseVisualStyleBackColor = true;
+      // 
+      // button2
+      // 
+      this.button2.Location = new System.Drawing.Point(3, 3);
+      this.button2.Name = "button2";
+      this.button2.Size = new System.Drawing.Size(75, 23);
+      this.button2.TabIndex = 0;
+      this.button2.Text = "<--";
+      this.button2.UseVisualStyleBackColor = true;
+      // 
+      // listView1
+      // 
+      this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listView1.LargeImageList = this.ilLargeImgJob;
+      this.listView1.Location = new System.Drawing.Point(0, 0);
+      this.listView1.Name = "listView1";
+      this.listView1.Size = new System.Drawing.Size(440, 322);
+      this.listView1.SmallImageList = this.ilSmallImgJob;
+      this.listView1.TabIndex = 0;
+      this.listView1.UseCompatibleStateImageBehavior = false;
+      // 
+      // toolStripMenuItem1
+      // 
+      this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+      this.toolStripMenuItem1.Size = new System.Drawing.Size(152, 22);
+      this.toolStripMenuItem1.Text = "Abort";
+      // 
+      // calcToolStripAbortItem
+      // 
+      this.calcToolStripAbortItem.Name = "calcToolStripAbortItem";
+      this.calcToolStripAbortItem.Size = new System.Drawing.Size(144, 22);
+      this.calcToolStripAbortItem.Text = "Abort";
       // 
       // HiveServerManagementConsole
@@ -703,5 +1055,19 @@
       this.scJobControl.Panel2.ResumeLayout(false);
       this.scJobControl.ResumeLayout(false);
+      this.calculatingJobTabControl.ResumeLayout(false);
+      this.calculatingJobTabPage.ResumeLayout(false);
+      this.splitContainer5.Panel1.ResumeLayout(false);
+      this.splitContainer5.Panel2.ResumeLayout(false);
+      this.splitContainer5.ResumeLayout(false);
       this.contextMenuJob.ResumeLayout(false);
+      this.finishedJobsTabPage.ResumeLayout(false);
+      this.splitContainer2.Panel1.ResumeLayout(false);
+      this.splitContainer2.Panel2.ResumeLayout(false);
+      this.splitContainer2.ResumeLayout(false);
+      this.offlineJobsTabPage.ResumeLayout(false);
+      this.splitContainer4.Panel1.ResumeLayout(false);
+      this.splitContainer4.Panel2.ResumeLayout(false);
+      this.splitContainer4.ResumeLayout(false);
+      this.AbortContextMenuStrip.ResumeLayout(false);
       this.tpClientControl.ResumeLayout(false);
       this.scClientControl.Panel1.ResumeLayout(false);
@@ -713,4 +1079,7 @@
       this.contextMenuGroup.ResumeLayout(false);
       this.tcManagementConsole.ResumeLayout(false);
+      this.splitContainer3.Panel1.ResumeLayout(false);
+      this.splitContainer3.Panel2.ResumeLayout(false);
+      this.splitContainer3.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -755,8 +1124,7 @@
     private System.Windows.Forms.TabPage tpJobControl;
     private System.Windows.Forms.SplitContainer scJobControl;
-    private System.Windows.Forms.ListView lvJobControl;
     private System.Windows.Forms.CheckBox checkBox1;
     private System.Windows.Forms.ContextMenuStrip contextMenuJob;
-    private System.Windows.Forms.ToolStripMenuItem menuItemAbortJob;
+    private System.Windows.Forms.ToolStripMenuItem offlineItemAbortJob;
     private System.Windows.Forms.ToolStripMenuItem menuItemGetSnapshot;
     private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
@@ -779,4 +1147,31 @@
     private System.Windows.Forms.ToolStripMenuItem projectToolStripMenuItem;
     private System.Windows.Forms.ToolStripMenuItem menuItemOpenCalendar;
+    private System.Windows.Forms.TabControl calculatingJobTabControl;
+    private System.Windows.Forms.TabPage finishedJobsTabPage;
+    private System.Windows.Forms.TabPage offlineJobsTabPage;
+    private System.Windows.Forms.TabPage calculatingJobTabPage;
+    private System.Windows.Forms.SplitContainer splitContainer2;
+    private System.Windows.Forms.Button btn_finishedJob_next;
+    private System.Windows.Forms.Button btn_finishedJob_prev;
+    private System.Windows.Forms.ComboBox cmb_finishedJob_count;
+    private System.Windows.Forms.ListView lv_finishedJobs;
+    private System.Windows.Forms.SplitContainer splitContainer3;
+    private System.Windows.Forms.ComboBox comboBox1;
+    private System.Windows.Forms.Button button1;
+    private System.Windows.Forms.Button button2;
+    private System.Windows.Forms.ListView listView1;
+    private System.Windows.Forms.SplitContainer splitContainer5;
+    private System.Windows.Forms.ComboBox cmb_calculatingJob_count;
+    private System.Windows.Forms.Button btn_calculatingJobs_next;
+    private System.Windows.Forms.Button btn_calculatingJobs_prev;
+    private System.Windows.Forms.ListView lv_calculatingJobs;
+    private System.Windows.Forms.SplitContainer splitContainer4;
+    private System.Windows.Forms.ComboBox cmb_offlineJob_count;
+    private System.Windows.Forms.Button btn_offlineJob_next;
+    private System.Windows.Forms.Button btn_offlinejob_prev;
+    private System.Windows.Forms.ListView lv_offlineJobs;
+    private System.Windows.Forms.ContextMenuStrip AbortContextMenuStrip;
+    private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
+    private System.Windows.Forms.ToolStripMenuItem calcToolStripAbortItem;
   }
 }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 4042)
@@ -44,4 +44,6 @@
   public delegate void closeForm(bool cf, bool error);
 
+  public delegate void updateListView(JobDataFetcher fetcher, ListView sender, int category);
+
   public partial class HiveServerManagementConsole : Form {
 
@@ -65,4 +67,10 @@
     private TreeNode hoverNode;
     private List<ListViewGroup> lvClientGroups;
+
+    private JobDataFetcher jdfFinished = null;
+    private JobDataFetcher jdfOffline = null;
+    private JobDataFetcher jdfCalculating = null;
+    
+      
     #endregion
 
@@ -85,22 +93,64 @@
       Init();
       AddClients();
-      AddJobs();
-      timerSyncronize.Start();
-    }
-
+      //AddJobs();
+      StartAutoUpdateTimers();
+      //timerSyncronize.Start();
+    }
+
+    private void StartAutoUpdateTimers() {
+      jdfCalculating.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
+      jdfOffline.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
+      jdfFinished.NewDataAvailable += new EventHandler(jdf_NewDataAvailable);
+      jdfFinished.Start();
+      jdfOffline.Start();
+      jdfCalculating.Start();
+    }
+
+    void jdf_NewDataAvailable(object sender, EventArgs e) {
+      JobDataFetcher fetcher = (JobDataFetcher) sender;
+      if (fetcher.PollStates.Contains(State.finished)) {
+        updateJobListView(fetcher, lv_finishedJobs, 0);
+      } else if(fetcher.PollStates.Contains(State.calculating)) {
+        updateJobListView(fetcher, lv_calculatingJobs, 1);
+      } else if (fetcher.PollStates.Contains(State.offline)) {
+        updateJobListView(fetcher, lv_offlineJobs, 2);
+      }
+    }
+
+    private void updateJobListView(JobDataFetcher fetcher, ListView listView, int category) {
+      if (listView.InvokeRequired) {
+        listView.Invoke(new updateListView(updateJobListView), new object[] { fetcher, listView, category });
+      } else {
+        listView.BeginUpdate();
+        listView.Items.Clear();
+        foreach (JobDto job in fetcher.CachedJobs) {
+          ListViewItem lvi = new ListViewItem(job.Id.ToString(), category);
+          lvi.Tag = job;
+          listView.Items.Add(lvi);
+        }
+        listView.EndUpdate();
+      }
+    }
+
+   
     private void Init() {
-      //adding context menu items for jobs
-      menuItemAbortJob.Click += (s, e) => {
-        IJobManager jobManager = ServiceLocator.GetJobManager();
-        if (lvJobControl.SelectedItems.Count == 1) {
-          jobManager.AbortJob(((JobDto)(lvJobControl.SelectedItems[0].Tag)).Id);
+
+      jdfFinished = new JobDataFetcher(new State[] {State.finished}, 50);
+      jdfCalculating = new JobDataFetcher(new State[] {State.calculating}, 50);
+      jdfOffline = new JobDataFetcher(new State[] {State.offline}, 50);
+
+      cmb_finishedJob_count.SelectedItem = "50";
+      cmb_offlineJob_count.SelectedItem = "50";
+      cmb_calculatingJob_count.SelectedItem = "50";
+      
+      calcToolStripAbortItem.Click += (s, e) => {
+        if(lv_calculatingJobs.SelectedItems.Count > 0) {
+          ServiceLocator.GetJobManager().AbortJob(((JobDto) lv_calculatingJobs.SelectedItems[0].Tag).Id);
         }
       };
 
-      //adding context menu items for jobs
-      menuItemGetSnapshot.Click += (s, e) => {
-        IJobManager jobManager = ServiceLocator.GetJobManager();
-        if (lvJobControl.SelectedItems.Count == 1) {
-          jobManager.RequestSnapshot(((JobDto)(lvJobControl.SelectedItems[0].Tag)).Id);
+      offlineItemAbortJob.Click += (s, e) => {
+        if (lv_offlineJobs.SelectedItems.Count > 0) {
+          ServiceLocator.GetJobManager().AbortJob(((JobDto)lv_offlineJobs.SelectedItems[0].Tag).Id);
         }
       };
@@ -256,72 +306,4 @@
 
 
-    /// <summary>
-    /// Adds Exceptionobs to ListView and TreeView
-    /// </summary>
-    private void AddJobs() {
-      try {
-        List<ListViewItem> jobObjects = new List<ListViewItem>();
-        IJobManager jobManager =
-          ServiceLocator.GetJobManager();
-        if (jobManager == null) {
-          Logger.Error("Jobmanager is null");
-          jobs = new ResponseList<JobDto>();
-        } else {
-          jobs = jobManager.GetAllJobs();
-        }
-
-
-        if (lvJobControl != null) lvJobControl.Items.Clear();
-
-        ListViewGroup lvJobCalculating = new ListViewGroup("calculating", HorizontalAlignment.Left);
-        ListViewGroup lvJobFinished = new ListViewGroup("finished", HorizontalAlignment.Left);
-        ListViewGroup lvJobPending = new ListViewGroup("pending", HorizontalAlignment.Left);
-
-        jobGroup = new List<ListViewGroup>();
-        jobGroup.Add(lvJobCalculating);
-        jobGroup.Add(lvJobFinished);
-        jobGroup.Add(lvJobPending);
-
-        if (jobs != null && jobs.List != null) {
-
-          foreach (JobDto job in jobs.List) {
-            if (job.State == State.calculating) {
-              ListViewItem lvi = new ListViewItem(job.Id.ToString(), 1, lvJobCalculating);
-              lvi.Tag = job;
-              jobObjects.Add(lvi);
-
-              lvi.ToolTipText = (job.Percentage * 100) + "% of job calculated";
-            } else if (job.State == State.finished) {
-              ListViewItem lvi = new ListViewItem(job.Id.ToString(), 0, lvJobFinished);
-              lvi.Tag = job;
-              jobObjects.Add(lvi);
-            } else if (job.State == State.offline || job.State == State.pending) {
-              ListViewItem lvi = new ListViewItem(job.Id.ToString(), 2, lvJobPending);
-              lvi.Tag = job;
-              jobObjects.Add(lvi);
-            }
-          } // Jobs
-          lvJobControl.BeginUpdate();
-          foreach (ListViewItem lvi in jobObjects) {
-            lvJobControl.Items.Add(lvi);
-          }
-          // actualization
-          lvJobControl.Groups.Add(lvJobCalculating);
-          lvJobControl.Groups.Add(lvJobFinished);
-          lvJobControl.Groups.Add(lvJobPending);
-          lvJobControl.EndUpdate();
-
-          if (currentJob != null) {
-            JobClicked();
-          }
-        }
-      }
-      catch (Exception ex) {
-        Logger.Error(ex);
-        closeFormEvent(true, true);
-        this.Close();
-      }
-    }
-
     private void AddClients() {
       lvClientGroups = new List<ListViewGroup>();
@@ -543,5 +525,5 @@
 
     private void RefreshJob(Changes change) {
-      if (change.ChangeType == Change.Update) {
+      /*if (change.ChangeType == Change.Update) {
         for (int i = 0; i < lvJobControl.Items.Count; i++) {
           if (lvJobControl.Items[i].Text == change.ID.ToString()) {
@@ -591,5 +573,5 @@
           }
         }
-      }
+      }                    */
     }
 
@@ -626,12 +608,14 @@
 
     private void OnLVJobControlClicked(object sender, EventArgs e) {
-      currentJob = (JobDto)lvJobControl.SelectedItems[0].Tag;
+      JobListView jlv = (JobListView) sender;
+      currentJob = (JobDto)jlv.SelectedItems[0].Tag;
       JobClicked();
     }
 
     private void lvJobControl_MouseMove(object sender, MouseEventArgs e) {
-      if ((lvJobControl.GetItemAt(e.X, e.Y) != null) &&
-        (lvJobControl.GetItemAt(e.X, e.Y).ToolTipText != null)) {
-        tt.SetToolTip(lvJobControl, lvJobControl.GetItemAt(e.X, e.Y).ToolTipText);
+      JobListView jlv = (JobListView) sender;
+      if ((jlv.GetItemAt(e.X, e.Y) != null) &&
+        (jlv.GetItemAt(e.X, e.Y).ToolTipText != null)) {
+        tt.SetToolTip(jlv, jlv.GetItemAt(e.X, e.Y).ToolTipText);
       }
     }
@@ -640,15 +624,16 @@
       // If the right mouse button was clicked and released,
       // display the shortcut menu assigned to the ListView. 
-      lvJobControl.ContextMenuStrip.Items.Clear();
-      ListViewHitTestInfo hitTestInfo = lvJobControl.HitTest(e.Location);
-      if (e.Button == MouseButtons.Right && hitTestInfo.Item != null && lvJobControl.SelectedItems.Count == 1) {
-        JobDto selectedJob = (JobDto)lvJobControl.SelectedItems[0].Tag;
+      JobListView jlv = (JobListView)sender;
+      jlv.ContextMenuStrip.Items.Clear();
+      ListViewHitTestInfo hitTestInfo = jlv.HitTest(e.Location);
+      if (e.Button == MouseButtons.Right && hitTestInfo.Item != null && jlv.SelectedItems.Count == 1) {
+        JobDto selectedJob = (JobDto)jlv.SelectedItems[0].Tag;
 
         if (selectedJob != null && selectedJob.State == State.calculating) {
-          lvJobControl.ContextMenuStrip.Items.Add(menuItemAbortJob);
-          lvJobControl.ContextMenuStrip.Items.Add(menuItemGetSnapshot);
-        }
-      }
-      lvJobControl.ContextMenuStrip.Show(new Point(e.X, e.Y));
+          jlv.ContextMenuStrip.Items.Add(offlineItemAbortJob);
+          jlv.ContextMenuStrip.Items.Add(menuItemGetSnapshot);
+        }
+      }
+      jlv.ContextMenuStrip.Show(new Point(e.X, e.Y));
     }
 
@@ -745,5 +730,5 @@
     private void largeIconsToolStripMenuItem_Click(object sender, EventArgs e) {
       lvClientControl.View = View.LargeIcon;
-      lvJobControl.View = View.LargeIcon;
+      //lvJobControl.View = View.LargeIcon;
       largeIconsToolStripMenuItem.CheckState = CheckState.Checked;
       smallIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
@@ -753,5 +738,5 @@
     private void smallIconsToolStripMenuItem_Click(object sender, EventArgs e) {
       lvClientControl.View = View.SmallIcon;
-      lvJobControl.View = View.SmallIcon;
+      //lvJobControl.View = View.SmallIcon;
       largeIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
       smallIconsToolStripMenuItem.CheckState = CheckState.Checked;
@@ -761,5 +746,5 @@
     private void listToolStripMenuItem_Click(object sender, EventArgs e) {
       lvClientControl.View = View.List;
-      lvJobControl.View = View.List;
+      //lvJobControl.View = View.List;
       largeIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
       smallIconsToolStripMenuItem.CheckState = CheckState.Unchecked;
@@ -859,6 +844,51 @@
     #endregion
 
-
-
+    private void btn_prev_Click(object sender, EventArgs e) {
+      if (sender == btn_finishedJob_prev)
+        jdfFinished.Backward();
+      else if (sender == btn_calculatingJobs_prev)
+        jdfCalculating.Backward();
+      else if (sender == btn_offlinejob_prev) {
+        jdfOffline.Backward();
+      }
+    }
+
+    private void btn_next_Click(object sender, EventArgs e) {
+      if (sender == btn_finishedJob_next)
+        jdfFinished.Forward();
+      else if (sender == btn_calculatingJobs_next)
+        jdfCalculating.Forward();
+      else if (sender == btn_offlineJob_next) {
+        jdfOffline.Forward();
+      }
+    }
+
+    private void cmb_count_SelectedIndexChanged(object sender, EventArgs e) {
+      ComboBox box = (ComboBox) sender;
+      if (box.SelectedItem != null) {
+        int val;
+        if (Int32.TryParse(box.SelectedItem.ToString(), out val)) {
+          if (box == cmb_offlineJob_count) {
+            jdfOffline.NrOfEntriesOnPage = val;
+          }
+          else if (box == cmb_finishedJob_count) {
+            jdfFinished.NrOfEntriesOnPage = val;
+          }
+          else if (box == cmb_calculatingJob_count) {
+            jdfCalculating.NrOfEntriesOnPage = val;
+          }
+        }
+      }
+    }
+
+    private void lv_Jobs_SelectedIndexChanged(object sender, EventArgs e) {
+      ListView lv = (ListView) sender;
+      if(lv.SelectedItems.Count > 0) {
+        foreach (ListViewItem lvi in lv.SelectedItems) {
+          currentJob = (JobDto) lvi.Tag;
+          JobClicked();          
+        }
+      }
+    }
   }
 }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 4042)
@@ -129,5 +129,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo
-        FwAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        FwAAAk1TRnQBSQFMAgEBBAEAAXQBAAF0AQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAAUADAAEBAQABCAYAASAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -239,5 +239,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAO
-        DgAAAk1TRnQBSQFMAgEBAwEAARQBAAEUAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DgAAAk1TRnQBSQFMAgEBAwEAAXQBAAF0AQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAASADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -308,32 +308,66 @@
     <value>462, 9</value>
   </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.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">
+  <metadata name="updaterWoker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>286, 48</value>
+  </metadata>
+  <metadata name="contextMenuJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>144, 48</value>
+  </metadata>
+  <metadata name="ilSmallImgJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 48</value>
+  </metadata>
+  <data name="ilSmallImgJob.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
     <value>
-        iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcQQAA
-        XEEBRtDlPgAAA3hJREFUSEu1ls1PE2EQxj229ouPVNErgZOJicZDjR68mHg1JgYvxov/gIlHxARBoxGU
-        KlJUVJDypVIQKkXBpIootoC0tLS0pZEIiILfikAfZ5Zuu9sWaDQ2edLt7vvOrzPzzsxuALBBquIeRR7p
-        CKmQVJSmeC3vyUu0FzNOD3NIFhJYpU8VuGBXpiVeK+6L2sgRQQKAbm4hTZ/pVcA8ooN9Ug/H7GY4Z3PS
-        Eq/lPbyXbbAttsm2RUB7CT3oDmXj+Ts9uiay0B7IQFtU7YFMPAxmoiMUl5WurRMrsoWz0DuZjb4pPWxk
-        g20RoF0A0EU+u2d2aWEZz8Adlxq3R9SodWlQ59bg7qgG9SSzR4tGrxZNYytqId3z6XDfr8MDUuu4Dhb6
-        Q7ZwJupHtGLI8hlQwG7xhpo3atwi4wz4F4g1lCGGqoABhWXPlbgxrBa0HqTBqyMPWHFPXk4dRXd4p8yT
-        8j4le1HIgCLjSyWuD6nWhNhC+zHz3Y6lyHcsR35h7qcDg+9PwjdvpFADT8J7ZeEyOVQMOCUAKghgGlSt
-        Cnk2eVwwstbncXiPLCfVzo1xwOV+JaqcqpSQNr8BXxYCGJw5ja7gflj82zEwfQIRLMp43QSQJt7kkAAu
-        EeBaFFAtCdVNSnpHYB+dpmwh6XeiJ8v94WKSMwxolpysKjlAIQBWg0hPVk/4ED4tePB5YUzQl99+fP0d
-        wKOJXULiRYgMUN6vQCURRUidK5dCchZDM+fou5RUgqH3JRSiAzJPuEZYXCMNkhphSNVrSYjKXyhwhQAi
-        pMW7OykEsz9eU6g2xWqEw9Xo3SoAUkGuJQKMdEOEJAI4oa0+AzgnHK5W3w54P5pgf3ssVu2JEBmgjDxg
-        gAhp9hiSPFiOLODjz2H8WJwWnoU+tQhJFxOf6IkMcLFPgYqBFQCrKQqY/+XF9Ld+GSyCJbhnK1Drzlqz
-        pVSSPbHQCs/bFbj0ShmDNI4a4J9rosLTC4k3u7fBFjxMST4I82huWi2lTNIqCoqp2RkH4pBKp07w5Kok
-        8asVYurmqAbb5EYaa9eVBLhMXkg9+RtInVsNkyM24fJjA4db9t2RjagZ5tMUD1e6kFqaI40eNRrcKrFV
-        rwycxJF5nbpg65gG1qCG2oQ2pk667gzKZaXfrK6QBm0+DW5QvlKOzCgkaeifp6HPWm/4rzv0/+dryx8H
-        ysmLkjulowAAAABJRU5ErkJggg==
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq
+        CQAAAk1TRnQBSQFMAgEBAwEAAXQBAAF0AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wMAAWwKNgE1AaEDAAHH
+        C6wBoQMAAWcLTQGhEgABUAE2AjcCNgY3AjYBoQEAAqwC2wfVAdsB1AGsAaEBAAFMAU0CWQJTBlkBUwFN
+        AaEQAAGhDjYBNQGhAawN1AGsAaEBTQFTAk0KUwFNEAABbA82AccO1AGsAYwBUwJNC1MBTRAAAWwGNgFX
+        CDYBxwTUAdwJ1AGsAWcCTQJTAZoB/wGaAVMC/wRTAU0QAAFsBTYBGwH/CDYBxwTUAv8B3AfUAawBZwFN
+        A1MBmgH/ARoBUwL/BFMBTRAAAWwENgFYAv8B9gc2AccE1AT/AdwF1AGsAWcEUwGaAf8BGgFTAv8EUwFN
+        EAABbAQ2Af8B9gE2Af8BnwY2AccE1Ab/AdsD1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAQ2AXkCNgFY
+        Af8BWAU2AccE1AT/AfQF1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAg2ARsB/wU2AccE1AP/B9QBrAFn
+        BFMBmgH/ARoBUwL/BFMBTRAAAWwJNgH/AZ8ENgHHBNQB/wnUAawBZwRTAXUBGgF6AVMCGgRTAU0QAAFs
+        DTYBNwE2AccO1AGsAWcOUwFNEAABhgw2AjcBNgHHAa0M1AHbAawBhg5TAU0RAAE2DDcBNgFsAQABrAHV
+        AdsI1ALbAawBxwEAAU0CeglTAXoBTQFnEQABoQM2BzcCNgFQAgABoQKsAbMH1AGzAqwCAAHEAk0JUwFN
+        AUwUAAGGCWwBoQUACscBoQUAAYYIZwGMAaESAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
+        AYAXAAP/AQABwAEBAcABAQHAAQECAAGAAQABgAEAAYBbAAGAAQABgAEAAYADAAGAAQEBgAEBAYABAQIA
+        AeABAwHgAQMB4AEDAgAL
 </value>
   </data>
-  <metadata name="contextMenuGroup.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>504, 38</value>
+  <metadata name="AbortContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>621, 9</value>
   </metadata>
   <metadata name="ilSmallImgClient.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 50</value>
+    <value>961, 9</value>
   </metadata>
   <data name="ilSmallImgClient.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
@@ -342,5 +376,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy
-        DAAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DAAAAk1TRnQBSQFMAgEBBAEAAXQBAAF0AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -398,60 +432,29 @@
 </value>
   </data>
-  <metadata name="contextMenuJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>246, 40</value>
-  </metadata>
-  <metadata name="ilSmallImgJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>137, 50</value>
-  </metadata>
-  <data name="ilSmallImgJob.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.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>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
-        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq
-        CQAAAk1TRnQBSQFMAgEBAwEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
-        AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
-        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
-        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
-        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
-        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
-        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
-        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
-        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
-        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
-        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
-        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
-        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
-        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
-        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
-        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
-        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
-        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
-        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
-        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
-        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
-        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
-        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
-        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
-        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
-        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
-        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
-        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
-        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wMAAWwKNgE1AaEDAAHH
-        C6wBoQMAAWcLTQGhEgABUAE2AjcCNgY3AjYBoQEAAqwC2wfVAdsB1AGsAaEBAAFMAU0CWQJTBlkBUwFN
-        AaEQAAGhDjYBNQGhAawN1AGsAaEBTQFTAk0KUwFNEAABbA82AccO1AGsAYwBUwJNC1MBTRAAAWwGNgFX
-        CDYBxwTUAdwJ1AGsAWcCTQJTAZoB/wGaAVMC/wRTAU0QAAFsBTYBGwH/CDYBxwTUAv8B3AfUAawBZwFN
-        A1MBmgH/ARoBUwL/BFMBTRAAAWwENgFYAv8B9gc2AccE1AT/AdwF1AGsAWcEUwGaAf8BGgFTAv8EUwFN
-        EAABbAQ2Af8B9gE2Af8BnwY2AccE1Ab/AdsD1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAQ2AXkCNgFY
-        Af8BWAU2AccE1AT/AfQF1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAg2ARsB/wU2AccE1AP/B9QBrAFn
-        BFMBmgH/ARoBUwL/BFMBTRAAAWwJNgH/AZ8ENgHHBNQB/wnUAawBZwRTAXUBGgF6AVMCGgRTAU0QAAFs
-        DTYBNwE2AccO1AGsAWcOUwFNEAABhgw2AjcBNgHHAa0M1AHbAawBhg5TAU0RAAE2DDcBNgFsAQABrAHV
-        AdsI1ALbAawBxwEAAU0CeglTAXoBTQFnEQABoQM2BzcCNgFQAgABoQKsAbMH1AGzAqwCAAHEAk0JUwFN
-        AUwUAAGGCWwBoQUACscBoQUAAYYIZwGMAaESAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
-        AYAXAAP/AQABwAEBAcABAQHAAQECAAGAAQABgAEAAYBbAAGAAQABgAEAAYADAAGAAQEBgAEBAYABAQIA
-        AeABAwHgAQMB4AEDAgAL
+        iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcPgAA
+        XD4BFAM/EwAAA3hJREFUSEu1ls1PE2EQxj229ouPVNErgZOJicZDjR68mHg1JgYvxov/gIlHxARBoxGU
+        KlJUVJDypVIQKkXBpIootoC0tLS0pZEIiILfikAfZ5Zuu9sWaDQ2edLt7vvOrzPzzsxuALBBquIeRR7p
+        CKmQVJSmeC3vyUu0FzNOD3NIFhJYpU8VuGBXpiVeK+6L2sgRQQKAbm4hTZ/pVcA8ooN9Ug/H7GY4Z3PS
+        Eq/lPbyXbbAttsm2RUB7CT3oDmXj+Ts9uiay0B7IQFtU7YFMPAxmoiMUl5WurRMrsoWz0DuZjb4pPWxk
+        g20RoF0A0EU+u2d2aWEZz8Adlxq3R9SodWlQ59bg7qgG9SSzR4tGrxZNYytqId3z6XDfr8MDUuu4Dhb6
+        Q7ZwJupHtGLI8hlQwG7xhpo3atwi4wz4F4g1lCGGqoABhWXPlbgxrBa0HqTBqyMPWHFPXk4dRXd4p8yT
+        8j4le1HIgCLjSyWuD6nWhNhC+zHz3Y6lyHcsR35h7qcDg+9PwjdvpFADT8J7ZeEyOVQMOCUAKghgGlSt
+        Cnk2eVwwstbncXiPLCfVzo1xwOV+JaqcqpSQNr8BXxYCGJw5ja7gflj82zEwfQIRLMp43QSQJt7kkAAu
+        EeBaFFAtCdVNSnpHYB+dpmwh6XeiJ8v94WKSMwxolpysKjlAIQBWg0hPVk/4ED4tePB5YUzQl99+fP0d
+        wKOJXULiRYgMUN6vQCURRUidK5dCchZDM+fou5RUgqH3JRSiAzJPuEZYXCMNkhphSNVrSYjKXyhwhQAi
+        pMW7OykEsz9eU6g2xWqEw9Xo3SoAUkGuJQKMdEOEJAI4oa0+AzgnHK5W3w54P5pgf3ssVu2JEBmgjDxg
+        gAhp9hiSPFiOLODjz2H8WJwWnoU+tQhJFxOf6IkMcLFPgYqBFQCrKQqY/+XF9Ld+GSyCJbhnK1Drzlqz
+        pVSSPbHQCs/bFbj0ShmDNI4a4J9rosLTC4k3u7fBFjxMST4I82huWi2lTNIqCoqp2RkH4pBKp07w5Kok
+        8asVYurmqAbb5EYaa9eVBLhMXkg9+RtInVsNkyM24fJjA4db9t2RjagZ5tMUD1e6kFqaI40eNRrcKrFV
+        rwycxJF5nbpg65gG1qCG2oQ2pk667gzKZaXfrK6QBm0+DW5QvlKOzCgkaeifp6HPWm/4rzv0/+dryx8H
+        ysmLkjulowAAAABJRU5ErkJggg==
 </value>
   </data>
-  <metadata name="updaterWoker.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>388, 41</value>
+  <metadata name="contextMenuGroup.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>803, 9</value>
   </metadata>
 </root>
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobDataFetcher.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobDataFetcher.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobDataFetcher.cs	(revision 4042)
@@ -0,0 +1,88 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using System.Timers;
+using HeuristicLab.Hive.Contracts;
+using System.Collections;
+using System.Threading;
+
+namespace HeuristicLab.Hive.Server.ServerConsole {
+  public class JobDataFetcher {
+    public List<State> PollStates { get; set; }    
+
+    public event EventHandler NewDataAvailable;
+
+    private System.Timers.Timer timer;
+
+    public List<JobDto> CachedJobs { get; set; }
+
+    public double Interval {
+      get { return timer.Interval; }
+      set { timer.Interval = value; }
+    }
+
+    private int _nrOfEntriesOnPage;
+    public int NrOfEntriesOnPage {
+      get {
+        return _nrOfEntriesOnPage;
+      }
+      set {
+        Console.WriteLine("Setting for " + PollStates + " changed to: " + value);        
+        _nrOfEntriesOnPage = value;        
+        Thread t = new Thread(new ThreadStart(DoUpdateRun));
+        t.Start();        
+      }
+    }    
+    public int CurrentPage { get; set; }
+
+    public JobDataFetcher(IEnumerable<State> states, int nrOfEntries) {
+      PollStates = new List<State>();
+      CachedJobs = new List<JobDto>();
+      NrOfEntriesOnPage = nrOfEntries;
+      CurrentPage = 0;
+      PollStates.AddRange(states);
+      timer = new System.Timers.Timer();
+      timer.Interval = 5000;
+      timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed);      
+    }
+
+    public void Start() {
+      timer.Start();
+    }
+
+    public void Forward() {
+      CurrentPage++;
+      DoUpdateRun();
+    }
+    public void Backward() {
+      if (CurrentPage != 0)
+        CurrentPage--;
+      DoUpdateRun();
+    } 
+
+    private void Timer_Elapsed(object sender, ElapsedEventArgs e) {
+      DoUpdateRun();
+    }
+
+    private void DoUpdateRun() {      
+      foreach (State stat in PollStates) {
+        ResponseList<JobDto> resList = ServiceLocator.GetJobManager().GetAllJobsWithFilter(stat, CurrentPage * NrOfEntriesOnPage,
+                                                            NrOfEntriesOnPage);
+        if (resList.Success) {
+          if (resList.List.Count == 0) {
+            if (CurrentPage > 0) {
+              CurrentPage--;
+            }
+          } else {
+            CachedJobs = new List<JobDto>();
+            CachedJobs.AddRange(resList.List);
+          }
+        }
+      }
+      if (NewDataAvailable != null)
+        NewDataAvailable(this, new EventArgs());
+    }
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.cs	(revision 4042)
@@ -0,0 +1,138 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Contracts.Interfaces;
+
+namespace HeuristicLab.Hive.Server.ServerConsole {
+  public class JobListView : ListView {
+    private ContextMenuStrip contextMenuJob;
+    private System.ComponentModel.IContainer components;
+    private ToolStripMenuItem menuItemAbortJob;
+    private ToolStripMenuItem menuItemGetSnapshot;
+    private ImageList ilLargeImgJob;
+    private ImageList ilSmallImgJob;
+
+    public int NrOfEntriesOnPage { 
+      get {
+        return jdf.NrOfEntriesOnPage;
+      } 
+      set {
+        jdf.NrOfEntriesOnPage = value;
+      }
+    }
+
+
+    private JobDataFetcher jdf;
+
+    public JobListView(IEnumerable<State> states, int nrOfEntries)
+      : base() {
+      InitializeComponent();
+      InitializeCustomControls();
+      jdf = new JobDataFetcher(states, nrOfEntries);
+      jdf.NewDataAvailable += new EventHandler(JdfNewDataAvailable);
+      jdf.Start();
+    }
+
+    private void JdfNewDataAvailable(object sender, EventArgs e) {
+      JobDataFetcher datafetcher = (JobDataFetcher) sender;
+      this.BeginUpdate();
+      if (datafetcher.PollStates.Contains(State.finished)) {
+        this.Items.Clear();
+        ListViewItem lviDummy = new ListViewItem("blahr", 0);
+        this.Items.Add(lviDummy);
+        foreach (JobDto job in datafetcher.CachedJobs) {
+          ListViewItem lvi = new ListViewItem(job.Id.ToString(), 0);
+          lvi.Tag = job;
+          this.Items.Add(lvi);
+        }
+      }
+      this.EndUpdate();
+    }
+
+    public void Forward() {
+      jdf.Forward();
+    }
+
+    public void Backward() {
+      jdf.Backward();
+    }
+
+    private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
+      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(JobListView));
+      this.contextMenuJob = new System.Windows.Forms.ContextMenuStrip(this.components);
+      this.menuItemAbortJob = new System.Windows.Forms.ToolStripMenuItem();
+      this.menuItemGetSnapshot = new System.Windows.Forms.ToolStripMenuItem();
+      this.ilLargeImgJob = new System.Windows.Forms.ImageList(this.components);
+      this.ilSmallImgJob = new System.Windows.Forms.ImageList(this.components);
+      this.contextMenuJob.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // contextMenuJob
+      // 
+      this.contextMenuJob.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.menuItemAbortJob,
+            this.menuItemGetSnapshot});
+      this.contextMenuJob.Name = "contextMenuJob";
+      this.contextMenuJob.Size = new System.Drawing.Size(145, 48);
+      // 
+      // menuItemAbortJob
+      // 
+      this.menuItemAbortJob.Name = "menuItemAbortJob";
+      this.menuItemAbortJob.Size = new System.Drawing.Size(144, 22);
+      this.menuItemAbortJob.Text = "Abort";
+      // 
+      // menuItemGetSnapshot
+      // 
+      this.menuItemGetSnapshot.Name = "menuItemGetSnapshot";
+      this.menuItemGetSnapshot.Size = new System.Drawing.Size(144, 22);
+      this.menuItemGetSnapshot.Text = "Get Snapshot";
+      // 
+      // ilLargeImgJob
+      // 
+      this.ilLargeImgJob.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilLargeImgJob.ImageStream")));
+      this.ilLargeImgJob.TransparentColor = System.Drawing.Color.Transparent;
+      this.ilLargeImgJob.Images.SetKeyName(0, "ok.png");
+      this.ilLargeImgJob.Images.SetKeyName(1, "Forward.png");
+      this.ilLargeImgJob.Images.SetKeyName(2, "pause.png");
+      // 
+      // ilSmallImgJob
+      // 
+      this.ilSmallImgJob.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("ilSmallImgJob.ImageStream")));
+      this.ilSmallImgJob.TransparentColor = System.Drawing.Color.Transparent;
+      this.ilSmallImgJob.Images.SetKeyName(0, "ok.png");
+      this.ilSmallImgJob.Images.SetKeyName(1, "Forward.png");
+      this.ilSmallImgJob.Images.SetKeyName(2, "pause.png");
+      // 
+      // JobListView
+      // 
+      this.LargeImageList = this.ilLargeImgJob;
+      this.SmallImageList = this.ilSmallImgJob;
+      this.contextMenuJob.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    private void InitializeCustomControls() {
+      menuItemAbortJob.Click += (s, e) => {
+                                  IJobManager jobManager = ServiceLocator.GetJobManager();
+                                  if (this.SelectedItems.Count == 1) {
+                                    jobManager.AbortJob(((JobDto) (this.SelectedItems[0].Tag)).Id);
+                                  }
+                                };
+
+      //adding context menu items for jobs
+      menuItemGetSnapshot.Click += (s, e) => {
+                                     IJobManager jobManager = ServiceLocator.GetJobManager();
+                                     if (this.SelectedItems.Count == 1) {
+                                       jobManager.RequestSnapshot(((JobDto) (this.SelectedItems[0].Tag)).Id);
+                                     }
+                                   };
+      
+      
+    }
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.resx
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.resx	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListView.resx	(revision 4042)
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="ilLargeImgJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>152, 21</value>
+  </metadata>
+  <data name="ilLargeImgJob.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAO
+        DgAAAk1TRnQBSQFMAgEBAwEAAVQBAAFUAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABgAMAASADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wYAAaEBhhJsAYYBoQoA
+        AaEUxwGhCgABoQGGAYwQZwGMAYYBoSgAAaEBbAE1FDYBNQFsAaEGAAGhAccWrAHHAaEGAAGhAWcWTQFn
+        AaElAAGhAVAYNgFQAaEEAAGhBKwCsw7UArMErAGhBAABxAFMA00SUwNNAUwBxCMAAaEBUAM2AzcENg03
+        AzYBUAGhAgABoQOsAdQD2w7VA9sB1AOsAaECAAGhAUwCTQFTA1kFUwxZAVMCTQFMAaEiAAFsHDYBbAIA
+        AccCrAHVFdQC1QKsAccCAAFnAk0DUwNNElMCTQFnIQABoQE1HDYBNQKhAqwa1AKsAqECTQJTBE0UUwJN
+        AaEgAAGGHjYBhgHHAawBrRrUAa0BrAHHAYYBTQJTBE0WUwFNAYYgAAFsHjYBbAHHAawc1AGsAccBjAFN
+        AVMETRdTAU0BjCAAAWweNgFsAccBrBzUAawBxwFnAU0BUwNNGFMBTQFnIAABbAw2AXkBVxA2AWwBxwGs
+        B9QC3BPUAawBxwFnBE0FUwGaA/8BmgJTAZoD/wGaCFMBTQFnIAABbAs2AVcB9gHDEDYBbAHHAawH1AHc
+        Af8B9AHcEdQBrAHHAWcDTQZTAZoD/wEaAlMBGgP/AZoIUwFNAWcgAAFsCzYBGwL/AZ8PNgFsAccBrAfU
+        AdwD/wH0AdwP1AGsAccBZwJNB1MBmgP/ARoCUwEaA/8BmghTAU0BZyAAAWwKNgGfBP8BeQ42AWwBxwGs
+        B9QB3AX/AfQB3A3UAawBxwFnAU0IUwGaA/8BGgJTARoD/wGaCFMBTQFnIAABbAk2AVgF/wH2AVgNNgFs
+        AccBrAfUAdwH/wH0AdwL1AGsAccBZwFNCFMBmgP/ARoCUwEaA/8BmghTAU0BZyAAAWwINgFXAfYC/wHC
+        AXkC/wHDDTYBbAHHAawH1AHcCf8B9AHcCdQBrAHHAWcBTQhTAZoD/wEaAlMBGgP/AZoIUwFNAWcgAAFs
+        CDYBnwL/AfYBVwE2AZ8C/wGfDDYBbAHHAawH1AHcC/8B9AHbB9QBrAHHAWcBTQhTAZoD/wEaAlMBGgP/
+        AZoIUwFNAWcgAAFsCDYBWAL/AXkDNgHDAv8BeQs2AWwBxwGsB9QBCQr/ARkB2wjUAawBxwFnAU0IUwGa
+        A/8BGgJTARoD/wGaCFMBTQFnIAABbAk2AXkBnwQ2AVgC/wH2AVgKNgFsAccBrAfUAQkI/wH0AdsK1AGs
+        AccBZwFNCFMBmgP/ARoCUwEaA/8BmghTAU0BZyAAAWwQNgF+Av8Bwwo2AWwBxwGsB9QBCQb/AfQB3AzU
+        AawBxwFnAU0IUwGaA/8BGgJTARoD/wGaCFMBTQFnIAABbBE2ARsC/wGfCTYBbAHHAawH1AEJBf8B3A7U
+        AawBxwFnAU0IUwGaA/8BGgJTARoD/wGaCFMBTQFnIAABbBE2AVcB9gL/AXkINgFsAccBrAfUAQkD/wHc
+        ENQBrAHHAWcBTQhTAZoD/wEaAlMBGgP/AZoIUwFNAWcgAAFsEjYBeQL/AZ8GNgE3ATYBbAHHAawH1AEJ
+        Af8BCRLUAawBxwFnAU0IUwF1AxoBegJTAXoDGgF6CFMBTQFnIAABbBM2AZ8B9gFYBTYCNwE2AWwBxwGs
+        B9QB2wHVE9QBrAHHAWcBTRxTAU0BZyAAAWwUNgFYBTYCNwI2AWwBxwGsHNQBrAHHAWcBTRxTAU0BZyAA
+        AWwZNgM3AjYBbAHHAawc1AGsAccBjAFNHFMBTQGMIAABhgI2ATcVNgQ3AjYBhgHHAawBrQHVGNQB2wGt
+        AawBxwGGAU0cUwFNAYYgAAGhATUBNgI3EzYENwI2ATUCoQKsAdQB2xbUAdsB1AKsAqECTQFTAXUWUwF1
+        AVMCTQGhIQABbAI2ATcBOxY3AjYBbAIAAccCrAHVAtsR1APbAdUCrAHHAgABZwJNA3oSUwJ6AXUCTQFn
+        IgABoQFQAjYBNxQ7AzYBUAGhAgABoQOsAdQU2wHUA6wBoQIAAaEBTAJNAVMUegFTAk0BTAGhIwABoQFQ
+        BTYONwU2AVABoQQAAaEErAKzDtQCswSsAaEEAAHEAUwDTRJTA00BTAHEJQABoQFsATUUNgE1AWwBoQYA
+        AaEBxxasAccBoQYAAaEBZxZNAWcBoSgAAaEBhhJsAYYBoQoAAaEUxwGhCgABoQGGAYwQZwGMAYYBoSUA
+        AUIBTQE+BwABPgMAASgDAAGAAwABIAMAAQEBAAEBBgABAhYAA/8BAAH4AgABHwH4AgABHwH4AgABHwQA
+        AeACAAEHAeACAAEHAeACAAEHBAABwAIAAQMBwAIAAQMBwAIAAQMEAAGAAgABAQGAAgABAQGAAgABAQQA
+        AYACAAEBAYACAAEBAYACAAEB/wBlAAGAAgABAQGAAgABAQGAAgABAQQAAYACAAEBAYACAAEBAYACAAEB
+        BAABwAIAAQMBwAIAAQMBwAIAAQMEAAHgAgABBwHgAgABBwHgAgABBwQAAfgCAAEfAfgCAAEfAfgCAAEf
+        BAAL
+</value>
+  </data>
+  <metadata name="ilSmallImgJob.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>280, 21</value>
+  </metadata>
+  <data name="ilSmallImgJob.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq
+        CQAAAk1TRnQBSQFMAgEBAwEAAVQBAAFUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
+        AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
+        AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
+        AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
+        AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
+        AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
+        ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
+        AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
+        AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
+        AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
+        AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
+        AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
+        AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
+        AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
+        AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
+        ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
+        Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
+        AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
+        AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
+        AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
+        ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
+        Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
+        AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
+        AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
+        AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
+        AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
+        AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
+        AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wMAAWwKNgE1AaEDAAHH
+        C6wBoQMAAWcLTQGhEgABUAE2AjcCNgY3AjYBoQEAAqwC2wfVAdsB1AGsAaEBAAFMAU0CWQJTBlkBUwFN
+        AaEQAAGhDjYBNQGhAawN1AGsAaEBTQFTAk0KUwFNEAABbA82AccO1AGsAYwBUwJNC1MBTRAAAWwGNgFX
+        CDYBxwTUAdwJ1AGsAWcCTQJTAZoB/wGaAVMC/wRTAU0QAAFsBTYBGwH/CDYBxwTUAv8B3AfUAawBZwFN
+        A1MBmgH/ARoBUwL/BFMBTRAAAWwENgFYAv8B9gc2AccE1AT/AdwF1AGsAWcEUwGaAf8BGgFTAv8EUwFN
+        EAABbAQ2Af8B9gE2Af8BnwY2AccE1Ab/AdsD1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAQ2AXkCNgFY
+        Af8BWAU2AccE1AT/AfQF1AGsAWcEUwGaAf8BGgFTAv8EUwFNEAABbAg2ARsB/wU2AccE1AP/B9QBrAFn
+        BFMBmgH/ARoBUwL/BFMBTRAAAWwJNgH/AZ8ENgHHBNQB/wnUAawBZwRTAXUBGgF6AVMCGgRTAU0QAAFs
+        DTYBNwE2AccO1AGsAWcOUwFNEAABhgw2AjcBNgHHAa0M1AHbAawBhg5TAU0RAAE2DDcBNgFsAQABrAHV
+        AdsI1ALbAawBxwEAAU0CeglTAXoBTQFnEQABoQM2BzcCNgFQAgABoQKsAbMH1AGzAqwCAAHEAk0JUwFN
+        AUwUAAGGCWwBoQUACscBoQUAAYYIZwGMAaESAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
+        AYAXAAP/AQABwAEBAcABAQHAAQECAAGAAQABgAEAAYBbAAGAAQABgAEAAYADAAGAAQEBgAEBAYABAQIA
+        AeABAwHgAQMB4AEDAgAL
+</value>
+  </data>
+  <metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>False</value>
+  </metadata>
+</root>
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.Designer.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.Designer.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.Designer.cs	(revision 4042)
@@ -0,0 +1,118 @@
+﻿namespace HeuristicLab.Hive.Server.ServerConsole {
+  partial class JobListViewControl {
+    /// <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.splitContainer1 = new System.Windows.Forms.SplitContainer();
+      this.comboBox1 = new System.Windows.Forms.ComboBox();
+      this.btn_finishedJob_next = new System.Windows.Forms.Button();
+      this.btn_finishedJob_prev = new System.Windows.Forms.Button();
+      this.listView1 = new JobListView(null, 5);
+      this.splitContainer1.Panel1.SuspendLayout();
+      this.splitContainer1.Panel2.SuspendLayout();
+      this.splitContainer1.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // splitContainer1
+      // 
+      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer1.Name = "splitContainer1";
+      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer1.Panel1
+      // 
+      this.splitContainer1.Panel1.Controls.Add(this.comboBox1);
+      this.splitContainer1.Panel1.Controls.Add(this.btn_finishedJob_next);
+      this.splitContainer1.Panel1.Controls.Add(this.btn_finishedJob_prev);
+      // 
+      // splitContainer1.Panel2
+      // 
+      this.splitContainer1.Panel2.Controls.Add(this.listView1);
+      this.splitContainer1.Size = new System.Drawing.Size(586, 479);
+      this.splitContainer1.SplitterDistance = 31;
+      this.splitContainer1.TabIndex = 0;
+      // 
+      // comboBox1
+      // 
+      this.comboBox1.FormattingEnabled = true;
+      this.comboBox1.Items.AddRange(new object[] {
+            "25",
+            "50",
+            "75",
+            "100"});
+      this.comboBox1.Location = new System.Drawing.Point(165, 3);
+      this.comboBox1.Name = "comboBox1";
+      this.comboBox1.Size = new System.Drawing.Size(48, 21);
+      this.comboBox1.TabIndex = 5;
+      // 
+      // btn_finishedJob_next
+      // 
+      this.btn_finishedJob_next.Location = new System.Drawing.Point(84, 3);
+      this.btn_finishedJob_next.Name = "btn_finishedJob_next";
+      this.btn_finishedJob_next.Size = new System.Drawing.Size(75, 23);
+      this.btn_finishedJob_next.TabIndex = 4;
+      this.btn_finishedJob_next.Text = "-->";
+      this.btn_finishedJob_next.UseVisualStyleBackColor = true;
+      // 
+      // btn_finishedJob_prev
+      // 
+      this.btn_finishedJob_prev.Location = new System.Drawing.Point(3, 3);
+      this.btn_finishedJob_prev.Name = "btn_finishedJob_prev";
+      this.btn_finishedJob_prev.Size = new System.Drawing.Size(75, 23);
+      this.btn_finishedJob_prev.TabIndex = 3;
+      this.btn_finishedJob_prev.Text = "<--";
+      this.btn_finishedJob_prev.UseVisualStyleBackColor = true;
+      // 
+      // listView1
+      // 
+      this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.listView1.Location = new System.Drawing.Point(0, 0);
+      this.listView1.Name = "listView1";
+      this.listView1.Size = new System.Drawing.Size(586, 444);
+      this.listView1.TabIndex = 0;
+      this.listView1.UseCompatibleStateImageBehavior = false;
+      // 
+      // JobListViewControl
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.splitContainer1);
+      this.Name = "JobListViewControl";
+      this.Size = new System.Drawing.Size(586, 479);
+      this.splitContainer1.Panel1.ResumeLayout(false);
+      this.splitContainer1.Panel2.ResumeLayout(false);
+      this.splitContainer1.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.SplitContainer splitContainer1;
+    private System.Windows.Forms.ComboBox comboBox1;
+    private System.Windows.Forms.Button btn_finishedJob_next;
+    private System.Windows.Forms.Button btn_finishedJob_prev;
+    private System.Windows.Forms.ListView listView1;
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.cs	(revision 4042)
@@ -0,0 +1,16 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace HeuristicLab.Hive.Server.ServerConsole {
+  public partial class JobListViewControl : UserControl {
+    public JobListViewControl() {
+      InitializeComponent();
+    }
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.resx
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.resx	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/JobListViewControl.resx	(revision 4042)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/ServiceLocator.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/ServiceLocator.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Console/3.2/ServiceLocator.cs	(revision 4042)
@@ -34,7 +34,14 @@
                          
         serverConsoleFacade = factory.CreateChannel();
+        ((ICommunicationObject)serverConsoleFacade).Faulted += ServiceLocator_Faulted;
       }
       
       return serverConsoleFacade;
+    }
+
+    static void ServiceLocator_Faulted(object sender, EventArgs e) {
+      ((ICommunicationObject)serverConsoleFacade).Abort();
+      ((ICommunicationObject)serverConsoleFacade).Faulted -= ServiceLocator_Faulted;
+      serverConsoleFacade = null;
     }
 
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 4042)
@@ -725,10 +725,10 @@
             CachedHivePluginInfoDto currCachedPlugin = new CachedHivePluginInfoDto {
               Name = currPlugin.Name,
-              Version = currPlugin.Version.ToString(),
+              Version = currPlugin.Version,
               BuildDate = currPlugin.BuildDate
             };
 
             foreach (string fileName in from file in currPlugin.Files select file.Name) {
-              currCachedPlugin.PluginFiles.Add(File.ReadAllBytes(fileName));
+              currCachedPlugin.PluginFiles.Add(new HivePluginFile(File.ReadAllBytes(fileName), fileName));
             }
             response.Plugins.Add(currCachedPlugin);
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientFacade.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientFacade.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientFacade.cs	(revision 4042)
@@ -100,4 +100,5 @@
     #region IClientFacade Members
 
+    [SpringTransaction(UserTransaction = true)]
     public Stream SendStreamedJob(Guid clientId) {
       MultiStream stream =
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/DefaultScheduler.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/DefaultScheduler.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/DefaultScheduler.cs	(revision 4042)
@@ -8,4 +8,6 @@
 using System.Threading;
 using HeuristicLab.DataAccess.Interfaces;
+using System.Transactions;
+using HeuristicLab.Hive.Contracts;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -32,20 +34,21 @@
       /// Critical section ///
       jobLock.WaitOne();
-
-      ClientDto client = DaoLocator.ClientDao.FindById(clientId);
-      LinkedList<JobDto> allOfflineJobsForClient =
-        new LinkedList<JobDto>(DaoLocator.JobDao.FindFittingJobsForClient(State.offline, client.NrOfFreeCores,
-                                                                          client.FreeMemory, client.Id));
-
       JobDto jobToCalculate = null;
-      if (allOfflineJobsForClient != null && allOfflineJobsForClient.Count > 0) {
-        jobToCalculate = allOfflineJobsForClient.First.Value;
-        jobToCalculate.State = State.calculating;
-        jobToCalculate.Client = client;
-        jobToCalculate.Client.State = State.calculating;
-        jobToCalculate.DateCalculated = DateTime.Now;
-        DaoLocator.JobDao.AssignClientToJob(client.Id, jobToCalculate.Id);
-        DaoLocator.JobDao.Update(jobToCalculate);
-        DaoLocator.ClientDao.Update(jobToCalculate.Client);
+      using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
+        ClientDto client = DaoLocator.ClientDao.FindById(clientId);
+        LinkedList<JobDto> allOfflineJobsForClient =
+          new LinkedList<JobDto>(DaoLocator.JobDao.FindFittingJobsForClient(State.offline, client.NrOfFreeCores,
+                                                                            client.FreeMemory, client.Id));        
+        if (allOfflineJobsForClient != null && allOfflineJobsForClient.Count > 0) {
+          jobToCalculate = allOfflineJobsForClient.First.Value;
+          jobToCalculate.State = State.calculating;
+          jobToCalculate.Client = client;
+          jobToCalculate.Client.State = State.calculating;
+          jobToCalculate.DateCalculated = DateTime.Now;
+          DaoLocator.JobDao.AssignClientToJob(client.Id, jobToCalculate.Id);
+          DaoLocator.JobDao.Update(jobToCalculate);
+          DaoLocator.ClientDao.Update(jobToCalculate.Client);
+        }
+        scope.Complete();
       }
       jobLock.ReleaseMutex();
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ExecutionEngineFacade.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ExecutionEngineFacade.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ExecutionEngineFacade.cs	(revision 4042)
@@ -53,6 +53,6 @@
 
     public ResponseObject<SerializedJob> 
-      GetLastSerializedResult(Guid jobId, bool requested) {
-      return jobManager.GetLastSerializedJobResultOf(jobId, requested);
+      GetLastSerializedResult(Guid jobId, bool requested, bool snapshot) {
+      return jobManager.GetLastSerializedJobResultOf(jobId, requested, snapshot);
     }
 
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/HeuristicLab.Hive.Server.Core-3.2.csproj
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/HeuristicLab.Hive.Server.Core-3.2.csproj	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/HeuristicLab.Hive.Server.Core-3.2.csproj	(revision 4042)
@@ -120,4 +120,5 @@
     </Compile>
     <Compile Include="Settings.cs" />
+    <Compile Include="SpringTransaction.cs" />
   </ItemGroup>
   <ItemGroup>
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs	(revision 4042)
@@ -105,4 +105,5 @@
       ResponseList<JobDto> response = new ResponseList<JobDto>();
       response.List = new List<JobDto>(DaoLocator.JobDao.FindWithLimitations(jobState, offset, count));
+      response.Success = true;
       return response;
     }
@@ -237,11 +238,14 @@
     }
 
+    //Requested means: there MUST be a job result which gets sent back
     public ResponseObject<SerializedJob>
-      GetLastSerializedJobResultOf(Guid jobId, bool requested) {
+      GetLastSerializedJobResultOf(Guid jobId, bool requested, bool snapshot) {
       ResponseObject<SerializedJob> response =
         new ResponseObject<SerializedJob>();
 
       JobDto job = DaoLocator.JobDao.FindById(jobId);
-      if (requested && (job.State == State.requestSnapshot || job.State == State.requestSnapshotSent)) {
+
+      //if it's a snapshot but the result hasn't reached the server yet...
+      if (snapshot && (job.State == State.requestSnapshot || job.State == State.requestSnapshotSent)) {
         response.Success = true;
         response.StatusMessage = ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE;
@@ -250,10 +254,21 @@
       }
 
+      //if it's NOT a snapshot, NEITHER request NOR is it finished
+      if(!requested && !snapshot && job.State != State.finished) {      
+        response.Success = true;
+        response.StatusMessage = ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE;
+
+        return response;
+      }
+
+      //every other case - snapshot, job finished or it's requested
       response.Success = true;
       response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_RESULT_SENT;
       response.Obj = new SerializedJob();
       response.Obj.JobInfo = job;
+
       response.Obj.SerializedJobData =
         DaoLocator.JobDao.GetBinaryJobFile(jobId);
+
       return response;
     }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 4042)
@@ -122,7 +122,7 @@
     }
 
-    public ResponseObject<SerializedJob> GetLastSerializedJobResultOf(Guid jobId, bool requested) {
+    public ResponseObject<SerializedJob> GetLastSerializedJobResultOf(Guid jobId, bool requested, bool snapshot) {
       secMan.Authorize("AccessJobResults", sessionID, jobId);
-      return jobManager.GetLastSerializedJobResultOf(jobId, requested);
+      return jobManager.GetLastSerializedJobResultOf(jobId, requested, snapshot);
     }
 
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/SpringTransaction.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/SpringTransaction.cs	(revision 4042)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/SpringTransaction.cs	(revision 4042)
@@ -0,0 +1,11 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace HeuristicLab.Hive.Server.Core {
+  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
+  public class SpringTransaction : System.Attribute{
+    public Boolean UserTransaction { get; set; }
+  }
+}
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs	(revision 4042)
@@ -19,4 +19,5 @@
         Context.SubmitChanges(ConflictMode.ContinueOnConflict);
       } catch (ChangeConflictException e) {
+        
         Logger.Warn("Concurrency Exception! " + e.Message);
         foreach (ObjectChangeConflict conflict in Context.ChangeConflicts) { 
@@ -30,5 +31,7 @@
           conflict.Resolve(RefreshMode.KeepChanges);
         }
-        Context.SubmitChanges(ConflictMode.FailOnFirstConflict);
+        //next round!
+        CommitChanges();
+        //Context.SubmitChanges(ConflictMode.FailOnFirstConflict);
       }
     }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs	(revision 4042)
@@ -43,12 +43,12 @@
 
     public void InsertPluginDependenciesForJob(JobDto jobDto) {
-      foreach (HivePluginInfoDto info in jobDto.PluginsNeeded) {        
+      foreach (HivePluginInfoDto info in jobDto.PluginsNeeded) {                
         PluginInfo dbpi =
-          Context.PluginInfos.Where(pi => pi.Name.Equals(info.Name) && pi.Version == info.Version).SingleOrDefault();
+          Context.PluginInfos.Where(pi => pi.Name.Equals(info.Name) && pi.Version == info.Version.ToString()).SingleOrDefault();
         if (dbpi == null) {
           dbpi = new PluginInfo {
                                   BuildDate = info.BuildDate.ToString(),
                                   Name = info.Name,
-                                  Version = info.Version
+                                  Version = info.Version.ToString()
                                 };
           Context.PluginInfos.InsertOnSubmit(dbpi);
@@ -82,5 +82,5 @@
       target.Name = source.Name;
       target.PluginId = source.Id;
-      target.Version = source.Version;      
+      target.Version = source.Version.ToString();      
 
       return target;
@@ -96,5 +96,5 @@
       target.Name = source.Name;
       target.Id = source.PluginId;
-      target.Version = source.Version;
+      target.Version = new Version(source.Version);
 
       return target;
Index: /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.Designer.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.Designer.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.Designer.cs	(revision 4042)
@@ -37,5 +37,4 @@
           this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
           this.tsExit = new System.Windows.Forms.ToolStripMenuItem();
-          this.btnClose = new System.Windows.Forms.Button();
           this.ctxNotifyMenu.SuspendLayout();
           this.SuspendLayout();
@@ -72,10 +71,10 @@
             this.tsExit});
           this.ctxNotifyMenu.Name = "ctxNotifyMenu";
-          this.ctxNotifyMenu.Size = new System.Drawing.Size(106, 54);
+          this.ctxNotifyMenu.Size = new System.Drawing.Size(96, 54);
           // 
           // tsShowInfo
           // 
           this.tsShowInfo.Name = "tsShowInfo";
-          this.tsShowInfo.Size = new System.Drawing.Size(105, 22);
+          this.tsShowInfo.Size = new System.Drawing.Size(95, 22);
           this.tsShowInfo.Text = "&Info";
           this.tsShowInfo.Click += new System.EventHandler(this.ShowInfo);
@@ -84,42 +83,25 @@
           // 
           this.toolStripSeparator1.Name = "toolStripSeparator1";
-          this.toolStripSeparator1.Size = new System.Drawing.Size(102, 6);
+          this.toolStripSeparator1.Size = new System.Drawing.Size(92, 6);
           // 
           // tsExit
           // 
           this.tsExit.Name = "tsExit";
-          this.tsExit.Size = new System.Drawing.Size(105, 22);
+          this.tsExit.Size = new System.Drawing.Size(95, 22);
           this.tsExit.Text = "E&xit";
           this.tsExit.Click += new System.EventHandler(this.CloseApp);
           // 
-          // btnClose
-          // 
-          this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
-          this.btnClose.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-          this.btnClose.Location = new System.Drawing.Point(279, 1);
-          this.btnClose.Name = "btnClose";
-          this.btnClose.Size = new System.Drawing.Size(22, 21);
-          this.btnClose.TabIndex = 2;
-          this.btnClose.Text = "X";
-          this.btnClose.UseVisualStyleBackColor = true;
-          this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
-          // 
           // MainForm
           // 
-          this.AcceptButton = this.btnClose;
           this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
           this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-          this.CancelButton = this.btnClose;
           this.ClientSize = new System.Drawing.Size(304, 166);
-          this.ControlBox = false;
-          this.Controls.Add(this.btnClose);
           this.Controls.Add(this.rtfServices);
           this.Controls.Add(this.label1);
-          this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
+          this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
           this.Name = "MainForm";
-          this.ShowInTaskbar = false;
           this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
           this.Text = "Hive Server";
-          this.TopMost = true;
+          this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
           this.ctxNotifyMenu.ResumeLayout(false);
           this.ResumeLayout(false);
@@ -137,5 +119,4 @@
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
         private System.Windows.Forms.ToolStripMenuItem tsExit;
-        private System.Windows.Forms.Button btnClose;
     }
 }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/MainForm.cs	(revision 4042)
@@ -50,4 +50,7 @@
         }
 
+        private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {          
+        }
+
     }
 }
Index: /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs	(revision 4042)
@@ -9,20 +9,24 @@
 using HeuristicLab.Hive.Contracts;
 using HeuristicLab.Tracing;
+using System.Reflection;
+using HeuristicLab.Hive.Server.Core;
 
 namespace HeuristicLab.Hive.Server {
   internal class ServiceCallInterception : IMethodInterceptor {
-
     private const bool UseTransactions = true;
 
     public object Invoke(IMethodInvocation invocation) {
+      bool userTransaction = false;
+
       DateTime start = DateTime.Now;
       Logger.Info("Entering Method: " + invocation.Method.Name);
 
-      if(!ContextFactory.IsContextNull()) {
+      if (!ContextFactory.IsContextNull()) {
         Logger.Info("Not null context found - why wasn't this disposed?");
         try {
           Logger.Info("Trying to dispose");
           ContextFactory.Context.Dispose();
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
           Logger.Error(e);
         }
@@ -30,49 +34,26 @@
       }
       Logger.Info("Context info: Timeout: " + ContextFactory.Context.Connection.ConnectionTimeout + " | " +
-                  ContextFactory.Context.Connection.State + " | Conn: " + ContextFactory.Context + " | HashCode is: " + ContextFactory.Context.Connection.GetHashCode());
+                  ContextFactory.Context.Connection.State + " | Conn: " + ContextFactory.Context + " | HashCode is: " +
+                  ContextFactory.Context.Connection.GetHashCode());
       Object obj = null;
 
-      /*if (invocation.Method.Name.Equals("SendStreamedJob") || invocation.Method.Name.Equals("StoreFinishedJobResultStreamed")) {        
-        ContextFactory.Context.Connection.Open();
-        if(UseTransactions) {
-          Logger.Debug("Opening Transaction");
-          ContextFactory.Context.Transaction = ContextFactory.Context.Connection.BeginTransaction(ApplicationConstants.ISOLATION_LEVEL);
-        } else {
-          Logger.Debug("Not using a Transaction");
-        }
-        try {
-          obj = invocation.Proceed();
-          Logger.Info("leaving context open for streaming");
-        }
-        catch (Exception e) {
-          Logger.Error("Exception occured during method invocation", e);              
-          ContextFactory.Context.Dispose();
-          ContextFactory.Context = null;
-        }        
-      } else { */
-        if(UseTransactions) {
-          using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
-            try {
-              Logger.Debug("Current Transaction Isolation level is: " + Transaction.Current.IsolationLevel);
-              obj = invocation.Proceed();
-              scope.Complete();
-            }
-            catch (Exception e) {
-              Logger.Error("Exception occured during method invocation", e);     
-              Logger.Error("Inner Exception: ", e.InnerException);
-            }
-            finally {
-              ContextFactory.Context.Dispose();
-              Logger.Debug("Disposed Context");
-              ContextFactory.Context = null;
-              Logger.Debug("Set Context Null");
-            }
-          }
-        } else {
+      Object[] attributes = invocation.Method.GetCustomAttributes(typeof (SpringTransaction), true);
+      foreach (Object o in attributes) {
+        SpringTransaction st = (SpringTransaction) o;
+        userTransaction = st.UserTransaction;
+      }
+      if (UseTransactions && !userTransaction) {
+        using (
+          TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,
+                                                        new TransactionOptions
+                                                        {IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE})) {
           try {
-            obj = invocation.Proceed();            
+            Logger.Debug("Current Transaction Isolation level is: " + Transaction.Current.IsolationLevel);
+            obj = invocation.Proceed();
+            scope.Complete();
           }
           catch (Exception e) {
-            Logger.Error("Exception occured during method invocation", e);                          
+            Logger.Error("Exception occured during method invocation", e);
+            Logger.Error("Inner Exception: ", e.InnerException);
           }
           finally {
@@ -81,21 +62,37 @@
             ContextFactory.Context = null;
             Logger.Debug("Set Context Null");
-          }  
+          }
         }
+      }
+      else {
+        try {
+          obj = invocation.Proceed();
+        }
+        catch (Exception e) {
+          Logger.Error("Exception occured during method invocation", e);
+        }
+        finally {
+          ContextFactory.Context.Dispose();
+          Logger.Debug("Disposed Context");
+          ContextFactory.Context = null;
+          Logger.Debug("Set Context Null");
+        }
+      }
       //}       
       TimeSpan ts = DateTime.Now - start;
       if (ts.Seconds > 2) {
         Logger.Warn("Invocation took: " + ts);
-      } else if (ts.Seconds > 10) {
+      }
+      else if (ts.Seconds > 10) {
         Logger.Error("Invocation took: " + ts);
-      } else {
-        Logger.Info("Invocation took: " + ts); ;
+      }
+      else {
+        Logger.Info("Invocation took: " + ts);
+        ;
       }
       Logger.Info("Leaving Method: " + invocation.Method.Name);
-      
+
       return obj;
     }
   }
 }
-     
-  
Index: /branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs
===================================================================
--- /branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 4041)
+++ /branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 4042)
@@ -65,20 +65,23 @@
 
       #region permission set for sandbox
-      // Uncomment code for sandboxed appdomain
-      //pset = new PermissionSet(PermissionState.None);
-      //pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
-      //pset.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.MemberAccess));
-      //FileIOPermission fPerm = new FileIOPermission(PermissionState.None);
+      //Uncomment code for sandboxed appdomain
+      pset = new PermissionSet(PermissionState.None);
+      pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
+      pset.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.AllFlags));
+      FileIOPermission fPerm = new FileIOPermission(PermissionState.None);
 
-      //foreach (IPluginDescription plugin in ApplicationManager.Manager.Plugins) {
-      //  fPerm.AddPathList(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery, plugin.Files.ToArray());
-      //}
+      foreach (IPluginDescription plugin in ApplicationManager.Manager.Plugins) {
+        foreach (IPluginFile pluginFile in plugin.Files) {
+          fPerm.AddPathList(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery, pluginFile.Name);  
+          //fPerm.AddPathList(FileIOPermissionAccess.AllAccess, pluginFile.Name);  
+        }        
+      }
 
-      //pset.AddPermission(fPerm);
+      pset.AddPermission(fPerm);
       #endregion
 
       #region permission set of unrestricted appdomain
       // unrestricted appdomain 
-      pset = new PermissionSet(PermissionState.Unrestricted);
+      //pset = new PermissionSet(PermissionState.Unrestricted);
       #endregion
 
@@ -86,5 +89,6 @@
       //setup.PrivateBinPath = pluginDir;
       setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
-      AppDomain applicationDomain = AppDomain.CreateDomain(name, AppDomain.CurrentDomain.Evidence, setup, pset, CreateStrongName(Assembly.GetExecutingAssembly()));
+      AppDomain applicationDomain = AppDomain.CreateDomain(name, AppDomain.CurrentDomain.Evidence, setup, pset, new StrongName[] {CreateStrongName(Assembly.GetExecutingAssembly())});
+
       Type applicationManagerType = typeof(DefaultApplicationManager);
       DefaultApplicationManager applicationManager =
@@ -93,6 +97,6 @@
       PluginDescription[] plugins = ApplicationManager.Manager.Plugins.Cast<PluginDescription>().ToArray();
       applicationManager.PrepareApplicationDomain(apps, plugins);
-      //if (files != null && files.Count() > 0)
-        //applicationManager.LoadAssemblies(files);
+      if (files != null && files.Count() > 0)
+        applicationManager.LoadAssemblies(files);
       return applicationDomain;
     }
