Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive 3.3.sln	(revision 4120)
@@ -154,5 +154,6 @@
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x86.ActiveCfg = Debug|x86
+		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Debug|x86.Build.0 = Debug|x86
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C92AAC8C-4D88-449C-ABA5-2B935D769842}.Release|Any CPU.Build.0 = Release|Any CPU
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Client.Core/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Client.Core/3.3/Properties/AssemblyInfo.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Client.Core/3.3/Properties/AssemblyInfo.cs	(revision 4120)
@@ -57,5 +57,5 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("3.3.0.4116")]
-[assembly: AssemblyFileVersion("3.3.0.4116")]
-[assembly: AssemblyBuildDate("2010/07/28 17:42:03")]
+[assembly: AssemblyVersion("3.3.0.4119")]
+[assembly: AssemblyFileVersion("3.3.0.4119")]
+[assembly: AssemblyBuildDate("2010/07/29 16:49:03")]
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HeuristicLab.Hive.Experiment.Views-3.3.csproj	(revision 4120)
@@ -73,5 +73,6 @@
       <HintPath>..\..\..\..\..\..\..\..\..\Programme\HeuristicLab 3.3\HeuristicLab.Data-3.3.dll</HintPath>
     </Reference>
-    <Reference Include="HeuristicLab.Hive.Experiment.Views-3.3, Version=3.3.0.4111, Culture=neutral, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.DataAccess-3.3, Version=3.3.0.4091, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
+    <Reference Include="HeuristicLab.Hive.Experiment.Views-3.3, Version=3.3.0.4119, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Hive.Server.Console-3.3">
       <HintPath>..\..\HeuristicLab.Hive.Server.Console\3.3\obj\Debug\HeuristicLab.Hive.Server.Console-3.3.dll</HintPath>
@@ -92,4 +93,5 @@
       <HintPath>..\..\..\..\..\..\..\..\..\Programme\HeuristicLab 3.3\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Persistence-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.PluginInfrastructure-3.3">
       <HintPath>..\..\..\..\..\..\..\..\..\Programme\HeuristicLab 3.3\HeuristicLab.PluginInfrastructure-3.3.dll</HintPath>
@@ -101,5 +103,4 @@
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
@@ -113,4 +114,16 @@
       <DependentUpon>HiveExperimentView.cs</DependentUpon>
     </Compile>
+    <Compile Include="JobItemListView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobItemListView.Designer.cs">
+      <DependentUpon>JobItemListView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="JobItemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="JobItemView.Designer.cs">
+      <DependentUpon>JobItemView.cs</DependentUpon>
+    </Compile>
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
@@ -120,7 +133,15 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Hive.Contracts\3.3\HeuristicLab.Hive.Contracts-3.3.csproj">
+      <Project>{134F93D7-E7C8-4ECD-9923-7F63259A60D8}</Project>
+      <Name>HeuristicLab.Hive.Contracts-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Hive.Experiment\3.3\HeuristicLab.Hive.Experiment-3.3.csproj">
       <Project>{A84C0A25-13D0-40A6-924F-53556D9691DC}</Project>
       <Name>HeuristicLab.Hive.Experiment-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Hive.JobBase\3.3\HeuristicLab.Hive.JobBase-3.3.csproj">
+      <Project>{21187322-52DD-4243-80A4-A85F0263E63B}</Project>
+      <Name>HeuristicLab.Hive.JobBase-3.3</Name>
     </ProjectReference>
   </ItemGroup>
@@ -128,4 +149,7 @@
     <EmbeddedResource Include="HiveExperimentView.resx">
       <DependentUpon>HiveExperimentView.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="JobItemView.resx">
+      <DependentUpon>JobItemView.cs</DependentUpon>
     </EmbeddedResource>
   </ItemGroup>
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.Designer.cs	(revision 4120)
@@ -53,4 +53,7 @@
       this.loadExperimentButton = new System.Windows.Forms.Button();
       this.hiveStatusTabPage = new System.Windows.Forms.TabPage();
+      this.jobListView = new HeuristicLab.Hive.Experiment.Views.JobItemListView();
+      this.logTabPage = new System.Windows.Forms.TabPage();
+      this.logView = new HeuristicLab.Core.Views.LogView();
       this.startButton = new System.Windows.Forms.Button();
       this.stopButton = new System.Windows.Forms.Button();
@@ -66,4 +69,6 @@
       this.tabControl.SuspendLayout();
       this.experimentTabPage.SuspendLayout();
+      this.hiveStatusTabPage.SuspendLayout();
+      this.logTabPage.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -85,8 +90,9 @@
       this.tabControl.Controls.Add(this.experimentTabPage);
       this.tabControl.Controls.Add(this.hiveStatusTabPage);
-      this.tabControl.Location = new System.Drawing.Point(0, 135);
+      this.tabControl.Controls.Add(this.logTabPage);
+      this.tabControl.Location = new System.Drawing.Point(0, 99);
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(735, 359);
+      this.tabControl.Size = new System.Drawing.Size(735, 395);
       this.tabControl.TabIndex = 4;
       // 
@@ -100,5 +106,5 @@
       this.experimentTabPage.Name = "experimentTabPage";
       this.experimentTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.experimentTabPage.Size = new System.Drawing.Size(727, 333);
+      this.experimentTabPage.Size = new System.Drawing.Size(727, 369);
       this.experimentTabPage.TabIndex = 1;
       this.experimentTabPage.Text = "Experiment";
@@ -149,11 +155,48 @@
       // hiveStatusTabPage
       // 
+      this.hiveStatusTabPage.Controls.Add(this.jobListView);
       this.hiveStatusTabPage.Location = new System.Drawing.Point(4, 22);
       this.hiveStatusTabPage.Name = "hiveStatusTabPage";
       this.hiveStatusTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.hiveStatusTabPage.Size = new System.Drawing.Size(727, 333);
+      this.hiveStatusTabPage.Size = new System.Drawing.Size(727, 369);
       this.hiveStatusTabPage.TabIndex = 2;
       this.hiveStatusTabPage.Text = "HiveStatus";
       this.hiveStatusTabPage.UseVisualStyleBackColor = true;
+      // 
+      // jobListView
+      // 
+      this.jobListView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.jobListView.Caption = "JobList View";
+      this.jobListView.Content = null;
+      this.jobListView.Location = new System.Drawing.Point(3, 6);
+      this.jobListView.Name = "jobListView";
+      this.jobListView.ReadOnly = false;
+      this.jobListView.Size = new System.Drawing.Size(721, 360);
+      this.jobListView.TabIndex = 0;
+      // 
+      // logTabPage
+      // 
+      this.logTabPage.Controls.Add(this.logView);
+      this.logTabPage.Location = new System.Drawing.Point(4, 22);
+      this.logTabPage.Name = "logTabPage";
+      this.logTabPage.Size = new System.Drawing.Size(727, 369);
+      this.logTabPage.TabIndex = 3;
+      this.logTabPage.Text = "Log";
+      this.logTabPage.UseVisualStyleBackColor = true;
+      // 
+      // logView
+      // 
+      this.logView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.logView.Caption = "Log View";
+      this.logView.Content = null;
+      this.logView.Location = new System.Drawing.Point(3, 4);
+      this.logView.Name = "logView";
+      this.logView.ReadOnly = false;
+      this.logView.Size = new System.Drawing.Size(721, 362);
+      this.logView.TabIndex = 0;
       // 
       // startButton
@@ -300,4 +343,6 @@
       this.tabControl.ResumeLayout(false);
       this.experimentTabPage.ResumeLayout(false);
+      this.hiveStatusTabPage.ResumeLayout(false);
+      this.logTabPage.ResumeLayout(false);
       this.ResumeLayout(false);
       this.PerformLayout();
@@ -323,4 +368,7 @@
     private System.Windows.Forms.Button loadExperimentButton;
     private Core.Views.NamedItemView experimentNamedItemView;
+    private System.Windows.Forms.TabPage logTabPage;
+    private Core.Views.LogView logView;
+    private JobItemListView jobListView;
 
   }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.cs	(revision 4120)
@@ -81,4 +81,6 @@
         serverUrlTextBox.Text = Content.ServerUrl;
         experimentNamedItemView.Content = Content.Experiment;
+        logView.Content = Content.Log;
+        jobListView.Content = Content.JobItems;
       }
     }
@@ -104,5 +106,5 @@
         Content.Prepare();
       }
-      SetEnabledStateOfExecutableButtons();
+      SetEnabledStateOfControls();
     }
 
@@ -189,4 +191,5 @@
         stopButton.Enabled = (Content.ExecutionState == ExecutionState.Started) || (Content.ExecutionState == ExecutionState.Paused);
         resetButton.Enabled = Content.ExecutionState != ExecutionState.Started;
+        
       }
     }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/HiveExperimentView.resx	(revision 4120)
@@ -128,6 +128,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
-        CwsBbQSEtwAAALZJREFUOE9j/P//PwNFAGQAOi7bn+2GTRybGIZmkKKEGRH/iTUEpwGWZfpEGYLVgKgp
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCAAA
+        CwgBwL2l2gAAALZJREFUOE9j/P//PwNFAGQAOi7bn+2GTRybGIZmkKKEGRH/iTUEpwGWZfpEGYLVgKgp
         Qf833Fr8nxhDsBoQPMEbZDtRhmA1wKfLGWwACEctCsDrEqwGODZb/M/YEAvWbNus/1+nWOG/RBo3iFZD
         jwmsBpjX6KFo5k9gwaoZnIawxa1eqTLcZnyacRqgki8FdjYhzTgNkM4QJEozTgNEkjlx+pmoQMQW2rjy
@@ -138,6 +138,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
-        CwsBbQSEtwAAAXJJREFUOE+tkj1IQmEYhWsoaIi2xmhpiYSgKFoiCMLJJYSEJiEI0mgIyqjA6vaLUKIU
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCAAA
+        CwgBwL2l2gAAAXJJREFUOE+tkj1IQmEYhWsoaIi2xmhpiYSgKFoiCMLJJYSEJiEI0mgIyqjA6vaLUKIU
         iZlJKKUoWEbZDzVYCYlQYVxcNDIoRND8ud7idD83C27g7YNvPM8573nfcgBlgh4BCPmCxIX0Qtx/ATTu
         Lyy78ph3ZKC2pTBlSWB86w2jhleMrD9jWB9N/jQsSkDEj5FPPERZ+J7yOL5j4PYzsPsYGL1piKR7nL64
@@ -151,6 +151,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
-        CwsBbQSEtwAAAYNJREFUOE9j/P//PwNFAGQAJZgizWDXI9veu/nvfxhuW/vtf+OKz/9rF7//XzHv1f+S
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCAAA
+        CwgBwL2l2gAAAYNJREFUOE9j/P//PwNFAGQAJZgizWDXI9veu/nvfxhuW/vtf+OKz/9rF7//XzHv1f+S
         2c//F0x//L901mOgFoSrUQzo2vDr/6aT3/6vPPTl/4I9n/5ffvDzf+/ad/+bl74BG5I3/cV/3dBVuA0A
         2bri4Jf/83Z9+n/ryS+Qwv8NS978L5378n/O1Of/k3qf/Vf1W4TbAJCT5+z49P/hyx9gzSBQMvvl/6wp
@@ -164,6 +164,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCwAA
-        CwsBbQSEtwAAAMZJREFUOE9j/P//PwNFAGQAJZgizWDXU2I7VgN6N//937Xh1/+8qY8+gRSg89EtxHAB
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCAAA
+        CwgBwL2l2gAAAMZJREFUOE9j/P//PwNFAGQAJZgizWDXU2I7VgN6N//937Xh1/+8qY8+gRSg89EtxHAB
         SPPVh3/+64auAqr9z4DOJ2hA29pv/289/f1f1W8R2AB0PkEDGld8/n/54e//cm6zwAag8wkaULv4/f8T
         13//F7ObBDYAnU/QgIp5r/7vvvDzP79ZN9gAdD5BA0pmP/+//uTP/5wGrWAD0PkEDSiY/vj/gj2f/7Pq
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.Designer.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.Designer.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.Designer.cs	(revision 4120)
@@ -0,0 +1,32 @@
+﻿namespace HeuristicLab.Hive.Experiment.Views {
+  partial class JobItemListView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing) {
+        if (components != null) components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      components = new System.ComponentModel.Container();
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+    }
+
+    #endregion
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemListView.cs	(revision 4120)
@@ -0,0 +1,43 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  [View("JobItemList View")]
+  [Content(typeof(JobItemList), true)]
+  [Content(typeof(IItemList<JobItem>), false)]
+  public partial class JobItemListView : ItemListView<JobItem> {
+
+    public JobItemListView() {
+      InitializeComponent();
+      itemsGroupBox.Text = "Jobs";
+      //this.ReadOnly = true;
+    }
+
+    protected override JobItem CreateItem() {
+      return null;
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      this.addButton.Enabled = false;
+      this.moveDownButton.Enabled = false;
+      this.moveUpButton.Enabled = false;
+      this.removeButton.Enabled = false;
+    }
+
+    protected override void Content_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs<Collections.IndexedItem<JobItem>> e) {
+      base.Content_ItemsAdded(sender, e);
+    }
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.Designer.cs	(revision 4120)
@@ -0,0 +1,385 @@
+﻿namespace HeuristicLab.Hive.Experiment.Views {
+  partial class JobItemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.stateLabel = new System.Windows.Forms.Label();
+      this.userIdLabel = new System.Windows.Forms.Label();
+      this.stateTextBox = new System.Windows.Forms.TextBox();
+      this.userIdTextBox = new System.Windows.Forms.TextBox();
+      this.percentageTextBox = new System.Windows.Forms.TextBox();
+      this.dateCreatedTextBox = new System.Windows.Forms.TextBox();
+      this.dateFinishedTextBox = new System.Windows.Forms.TextBox();
+      this.priorityTextBox = new System.Windows.Forms.TextBox();
+      this.coresNeededTextBox = new System.Windows.Forms.TextBox();
+      this.memoryNeededTextBox = new System.Windows.Forms.TextBox();
+      this.pluginsNeededTextBox = new System.Windows.Forms.TextBox();
+      this.projectTextBox = new System.Windows.Forms.TextBox();
+      this.percentageLabel = new System.Windows.Forms.Label();
+      this.dateCreatedLabel = new System.Windows.Forms.Label();
+      this.dateFinishedLabel = new System.Windows.Forms.Label();
+      this.priorityLabel = new System.Windows.Forms.Label();
+      this.coresNeededLabel = new System.Windows.Forms.Label();
+      this.memoryNeededLabel = new System.Windows.Forms.Label();
+      this.pluginsNeededLabel = new System.Windows.Forms.Label();
+      this.projectLabel = new System.Windows.Forms.Label();
+      this.snapshotGroupBox = new System.Windows.Forms.GroupBox();
+      this.openSnapshotButton = new System.Windows.Forms.Button();
+      this.snapshotTimeText = new System.Windows.Forms.TextBox();
+      this.snapshotStatusText = new System.Windows.Forms.TextBox();
+      this.snapshotTimeLabel = new System.Windows.Forms.Label();
+      this.snapshotStatusLabel = new System.Windows.Forms.Label();
+      this.dateCalculatedText = new System.Windows.Forms.TextBox();
+      this.dateCalculatedLabel = new System.Windows.Forms.Label();
+      this.snapshotGroupBox.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // stateLabel
+      // 
+      this.stateLabel.AutoSize = true;
+      this.stateLabel.Location = new System.Drawing.Point(4, 4);
+      this.stateLabel.Name = "stateLabel";
+      this.stateLabel.Size = new System.Drawing.Size(35, 13);
+      this.stateLabel.TabIndex = 0;
+      this.stateLabel.Text = "State:";
+      // 
+      // userIdLabel
+      // 
+      this.userIdLabel.AutoSize = true;
+      this.userIdLabel.Location = new System.Drawing.Point(4, 26);
+      this.userIdLabel.Name = "userIdLabel";
+      this.userIdLabel.Size = new System.Drawing.Size(41, 13);
+      this.userIdLabel.TabIndex = 1;
+      this.userIdLabel.Text = "UserId:";
+      // 
+      // stateTextBox
+      // 
+      this.stateTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stateTextBox.Location = new System.Drawing.Point(92, 4);
+      this.stateTextBox.Name = "stateTextBox";
+      this.stateTextBox.Size = new System.Drawing.Size(319, 20);
+      this.stateTextBox.TabIndex = 2;
+      // 
+      // userIdTextBox
+      // 
+      this.userIdTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.userIdTextBox.Location = new System.Drawing.Point(92, 26);
+      this.userIdTextBox.Name = "userIdTextBox";
+      this.userIdTextBox.Size = new System.Drawing.Size(319, 20);
+      this.userIdTextBox.TabIndex = 3;
+      // 
+      // percentageTextBox
+      // 
+      this.percentageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.percentageTextBox.Location = new System.Drawing.Point(92, 48);
+      this.percentageTextBox.Name = "percentageTextBox";
+      this.percentageTextBox.Size = new System.Drawing.Size(319, 20);
+      this.percentageTextBox.TabIndex = 4;
+      // 
+      // dateCreatedTextBox
+      // 
+      this.dateCreatedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCreatedTextBox.Location = new System.Drawing.Point(92, 70);
+      this.dateCreatedTextBox.Name = "dateCreatedTextBox";
+      this.dateCreatedTextBox.Size = new System.Drawing.Size(319, 20);
+      this.dateCreatedTextBox.TabIndex = 5;
+      // 
+      // dateFinishedTextBox
+      // 
+      this.dateFinishedTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateFinishedTextBox.Location = new System.Drawing.Point(92, 114);
+      this.dateFinishedTextBox.Name = "dateFinishedTextBox";
+      this.dateFinishedTextBox.Size = new System.Drawing.Size(319, 20);
+      this.dateFinishedTextBox.TabIndex = 6;
+      // 
+      // priorityTextBox
+      // 
+      this.priorityTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.priorityTextBox.Location = new System.Drawing.Point(92, 136);
+      this.priorityTextBox.Name = "priorityTextBox";
+      this.priorityTextBox.Size = new System.Drawing.Size(319, 20);
+      this.priorityTextBox.TabIndex = 7;
+      // 
+      // coresNeededTextBox
+      // 
+      this.coresNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.coresNeededTextBox.Location = new System.Drawing.Point(92, 158);
+      this.coresNeededTextBox.Name = "coresNeededTextBox";
+      this.coresNeededTextBox.Size = new System.Drawing.Size(319, 20);
+      this.coresNeededTextBox.TabIndex = 8;
+      // 
+      // memoryNeededTextBox
+      // 
+      this.memoryNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.memoryNeededTextBox.Location = new System.Drawing.Point(92, 180);
+      this.memoryNeededTextBox.Name = "memoryNeededTextBox";
+      this.memoryNeededTextBox.Size = new System.Drawing.Size(319, 20);
+      this.memoryNeededTextBox.TabIndex = 9;
+      // 
+      // pluginsNeededTextBox
+      // 
+      this.pluginsNeededTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.pluginsNeededTextBox.Location = new System.Drawing.Point(92, 202);
+      this.pluginsNeededTextBox.Name = "pluginsNeededTextBox";
+      this.pluginsNeededTextBox.Size = new System.Drawing.Size(319, 20);
+      this.pluginsNeededTextBox.TabIndex = 10;
+      // 
+      // projectTextBox
+      // 
+      this.projectTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.projectTextBox.Location = new System.Drawing.Point(92, 224);
+      this.projectTextBox.Name = "projectTextBox";
+      this.projectTextBox.Size = new System.Drawing.Size(319, 20);
+      this.projectTextBox.TabIndex = 11;
+      // 
+      // percentageLabel
+      // 
+      this.percentageLabel.AutoSize = true;
+      this.percentageLabel.Location = new System.Drawing.Point(4, 48);
+      this.percentageLabel.Name = "percentageLabel";
+      this.percentageLabel.Size = new System.Drawing.Size(65, 13);
+      this.percentageLabel.TabIndex = 13;
+      this.percentageLabel.Text = "Percentage:";
+      // 
+      // dateCreatedLabel
+      // 
+      this.dateCreatedLabel.AutoSize = true;
+      this.dateCreatedLabel.Location = new System.Drawing.Point(4, 70);
+      this.dateCreatedLabel.Name = "dateCreatedLabel";
+      this.dateCreatedLabel.Size = new System.Drawing.Size(70, 13);
+      this.dateCreatedLabel.TabIndex = 14;
+      this.dateCreatedLabel.Text = "DateCreated:";
+      // 
+      // dateFinishedLabel
+      // 
+      this.dateFinishedLabel.AutoSize = true;
+      this.dateFinishedLabel.Location = new System.Drawing.Point(4, 114);
+      this.dateFinishedLabel.Name = "dateFinishedLabel";
+      this.dateFinishedLabel.Size = new System.Drawing.Size(72, 13);
+      this.dateFinishedLabel.TabIndex = 15;
+      this.dateFinishedLabel.Text = "DateFinished:";
+      // 
+      // priorityLabel
+      // 
+      this.priorityLabel.AutoSize = true;
+      this.priorityLabel.Location = new System.Drawing.Point(4, 136);
+      this.priorityLabel.Name = "priorityLabel";
+      this.priorityLabel.Size = new System.Drawing.Size(41, 13);
+      this.priorityLabel.TabIndex = 16;
+      this.priorityLabel.Text = "Priority:";
+      // 
+      // coresNeededLabel
+      // 
+      this.coresNeededLabel.AutoSize = true;
+      this.coresNeededLabel.Location = new System.Drawing.Point(4, 158);
+      this.coresNeededLabel.Name = "coresNeededLabel";
+      this.coresNeededLabel.Size = new System.Drawing.Size(75, 13);
+      this.coresNeededLabel.TabIndex = 17;
+      this.coresNeededLabel.Text = "CoresNeeded:";
+      // 
+      // memoryNeededLabel
+      // 
+      this.memoryNeededLabel.AutoSize = true;
+      this.memoryNeededLabel.Location = new System.Drawing.Point(4, 180);
+      this.memoryNeededLabel.Name = "memoryNeededLabel";
+      this.memoryNeededLabel.Size = new System.Drawing.Size(85, 13);
+      this.memoryNeededLabel.TabIndex = 18;
+      this.memoryNeededLabel.Text = "MemoryNeeded:";
+      // 
+      // pluginsNeededLabel
+      // 
+      this.pluginsNeededLabel.AutoSize = true;
+      this.pluginsNeededLabel.Location = new System.Drawing.Point(4, 202);
+      this.pluginsNeededLabel.Name = "pluginsNeededLabel";
+      this.pluginsNeededLabel.Size = new System.Drawing.Size(82, 13);
+      this.pluginsNeededLabel.TabIndex = 19;
+      this.pluginsNeededLabel.Text = "PluginsNeeded:";
+      // 
+      // projectLabel
+      // 
+      this.projectLabel.AutoSize = true;
+      this.projectLabel.Location = new System.Drawing.Point(4, 224);
+      this.projectLabel.Name = "projectLabel";
+      this.projectLabel.Size = new System.Drawing.Size(43, 13);
+      this.projectLabel.TabIndex = 20;
+      this.projectLabel.Text = "Project:";
+      // 
+      // snapshotGroupBox
+      // 
+      this.snapshotGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.snapshotGroupBox.Controls.Add(this.openSnapshotButton);
+      this.snapshotGroupBox.Controls.Add(this.snapshotTimeText);
+      this.snapshotGroupBox.Controls.Add(this.snapshotStatusText);
+      this.snapshotGroupBox.Controls.Add(this.snapshotTimeLabel);
+      this.snapshotGroupBox.Controls.Add(this.snapshotStatusLabel);
+      this.snapshotGroupBox.Location = new System.Drawing.Point(7, 246);
+      this.snapshotGroupBox.Name = "snapshotGroupBox";
+      this.snapshotGroupBox.Size = new System.Drawing.Size(404, 100);
+      this.snapshotGroupBox.TabIndex = 21;
+      this.snapshotGroupBox.TabStop = false;
+      this.snapshotGroupBox.Text = "Latest Snapshot";
+      // 
+      // openSnapshotButton
+      // 
+      this.openSnapshotButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+      this.openSnapshotButton.Location = new System.Drawing.Point(297, 67);
+      this.openSnapshotButton.Name = "openSnapshotButton";
+      this.openSnapshotButton.Size = new System.Drawing.Size(101, 26);
+      this.openSnapshotButton.TabIndex = 25;
+      this.openSnapshotButton.Text = "Open Snapshot";
+      this.openSnapshotButton.UseVisualStyleBackColor = true;
+      this.openSnapshotButton.Click += new System.EventHandler(this.openSnapshotButton_Click);
+      // 
+      // snapshotTimeText
+      // 
+      this.snapshotTimeText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.snapshotTimeText.Location = new System.Drawing.Point(45, 41);
+      this.snapshotTimeText.Name = "snapshotTimeText";
+      this.snapshotTimeText.Size = new System.Drawing.Size(353, 20);
+      this.snapshotTimeText.TabIndex = 24;
+      // 
+      // snapshotStatusText
+      // 
+      this.snapshotStatusText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.snapshotStatusText.Location = new System.Drawing.Point(45, 19);
+      this.snapshotStatusText.Name = "snapshotStatusText";
+      this.snapshotStatusText.Size = new System.Drawing.Size(353, 20);
+      this.snapshotStatusText.TabIndex = 23;
+      // 
+      // snapshotTimeLabel
+      // 
+      this.snapshotTimeLabel.AutoSize = true;
+      this.snapshotTimeLabel.Location = new System.Drawing.Point(6, 41);
+      this.snapshotTimeLabel.Name = "snapshotTimeLabel";
+      this.snapshotTimeLabel.Size = new System.Drawing.Size(33, 13);
+      this.snapshotTimeLabel.TabIndex = 22;
+      this.snapshotTimeLabel.Text = "Time:";
+      // 
+      // snapshotStatusLabel
+      // 
+      this.snapshotStatusLabel.AutoSize = true;
+      this.snapshotStatusLabel.Location = new System.Drawing.Point(6, 19);
+      this.snapshotStatusLabel.Name = "snapshotStatusLabel";
+      this.snapshotStatusLabel.Size = new System.Drawing.Size(40, 13);
+      this.snapshotStatusLabel.TabIndex = 21;
+      this.snapshotStatusLabel.Text = "Status:";
+      // 
+      // dateCalculatedText
+      // 
+      this.dateCalculatedText.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.dateCalculatedText.Location = new System.Drawing.Point(92, 92);
+      this.dateCalculatedText.Name = "dateCalculatedText";
+      this.dateCalculatedText.Size = new System.Drawing.Size(319, 20);
+      this.dateCalculatedText.TabIndex = 22;
+      // 
+      // dateCalculatedLabel
+      // 
+      this.dateCalculatedLabel.AutoSize = true;
+      this.dateCalculatedLabel.Location = new System.Drawing.Point(4, 92);
+      this.dateCalculatedLabel.Name = "dateCalculatedLabel";
+      this.dateCalculatedLabel.Size = new System.Drawing.Size(83, 13);
+      this.dateCalculatedLabel.TabIndex = 23;
+      this.dateCalculatedLabel.Text = "DateCalculated:";
+      // 
+      // JobItemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.dateCalculatedLabel);
+      this.Controls.Add(this.dateCalculatedText);
+      this.Controls.Add(this.snapshotGroupBox);
+      this.Controls.Add(this.projectLabel);
+      this.Controls.Add(this.pluginsNeededLabel);
+      this.Controls.Add(this.memoryNeededLabel);
+      this.Controls.Add(this.coresNeededLabel);
+      this.Controls.Add(this.priorityLabel);
+      this.Controls.Add(this.dateFinishedLabel);
+      this.Controls.Add(this.dateCreatedLabel);
+      this.Controls.Add(this.percentageLabel);
+      this.Controls.Add(this.projectTextBox);
+      this.Controls.Add(this.pluginsNeededTextBox);
+      this.Controls.Add(this.memoryNeededTextBox);
+      this.Controls.Add(this.coresNeededTextBox);
+      this.Controls.Add(this.priorityTextBox);
+      this.Controls.Add(this.dateFinishedTextBox);
+      this.Controls.Add(this.dateCreatedTextBox);
+      this.Controls.Add(this.percentageTextBox);
+      this.Controls.Add(this.userIdTextBox);
+      this.Controls.Add(this.stateTextBox);
+      this.Controls.Add(this.userIdLabel);
+      this.Controls.Add(this.stateLabel);
+      this.Name = "JobItemView";
+      this.Size = new System.Drawing.Size(414, 417);
+      this.snapshotGroupBox.ResumeLayout(false);
+      this.snapshotGroupBox.PerformLayout();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Label stateLabel;
+    private System.Windows.Forms.Label userIdLabel;
+    private System.Windows.Forms.TextBox stateTextBox;
+    private System.Windows.Forms.TextBox userIdTextBox;
+    private System.Windows.Forms.TextBox percentageTextBox;
+    private System.Windows.Forms.TextBox dateCreatedTextBox;
+    private System.Windows.Forms.TextBox dateFinishedTextBox;
+    private System.Windows.Forms.TextBox priorityTextBox;
+    private System.Windows.Forms.TextBox coresNeededTextBox;
+    private System.Windows.Forms.TextBox memoryNeededTextBox;
+    private System.Windows.Forms.TextBox pluginsNeededTextBox;
+    private System.Windows.Forms.TextBox projectTextBox;
+    private System.Windows.Forms.Label percentageLabel;
+    private System.Windows.Forms.Label dateCreatedLabel;
+    private System.Windows.Forms.Label dateFinishedLabel;
+    private System.Windows.Forms.Label priorityLabel;
+    private System.Windows.Forms.Label coresNeededLabel;
+    private System.Windows.Forms.Label memoryNeededLabel;
+    private System.Windows.Forms.Label pluginsNeededLabel;
+    private System.Windows.Forms.Label projectLabel;
+    private System.Windows.Forms.GroupBox snapshotGroupBox;
+    private System.Windows.Forms.Button openSnapshotButton;
+    private System.Windows.Forms.TextBox snapshotTimeText;
+    private System.Windows.Forms.TextBox snapshotStatusText;
+    private System.Windows.Forms.Label snapshotTimeLabel;
+    private System.Windows.Forms.Label snapshotStatusLabel;
+    private System.Windows.Forms.TextBox dateCalculatedText;
+    private System.Windows.Forms.Label dateCalculatedLabel;
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs	(revision 4120)
@@ -0,0 +1,85 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.Core.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.Hive.JobBase;
+using HeuristicLab.Persistence.Default.Xml;
+using System.IO;
+
+namespace HeuristicLab.Hive.Experiment.Views {
+  [View("JobItem View")]
+  [Content(typeof(JobItem), true)]
+  public partial class JobItemView : ItemView {
+    public new JobItem Content {
+      get { return (JobItem)base.Content; }
+      set {
+        if (base.Content != value) {
+          base.Content = value;
+        }
+      }
+    }
+
+    public JobItemView() {
+      InitializeComponent();
+      this.ReadOnly = true;
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        this.stateTextBox.Text = Content.JobDto.State.ToString();
+        this.userIdTextBox.Text = Content.JobDto.UserId.ToString();
+        this.percentageTextBox.Text = Content.JobDto.Percentage.ToString();
+        this.dateCreatedTextBox.Text = Content.JobDto.DateCreated.ToString();
+        this.dateCalculatedText.Text = Content.JobDto.DateCalculated.ToString();
+        this.dateFinishedTextBox.Text = Content.JobDto.DateFinished.ToString();
+        this.priorityTextBox.Text = Content.JobDto.Priority.ToString();
+        this.coresNeededTextBox.Text = Content.JobDto.CoresNeeded.ToString();
+        this.memoryNeededTextBox.Text = Content.JobDto.MemoryNeeded.ToString();
+        this.pluginsNeededTextBox.Text = string.Join(", ", Content.JobDto.PluginsNeeded.Select(x => x.Name + "-" + x.Version).ToArray());
+        this.projectTextBox.Text = Content.JobDto.Project != null ? Content.JobDto.Project.Name : "-";
+        if (Content.LatestSnapshot != null) {
+          snapshotStatusText.Text = Content.LatestSnapshot.StatusMessage;
+          snapshotTimeText.Text = Content.LatestSnapshotTime.ToString();
+        }
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.LatestSnapshotChanged += new EventHandler(Content_LatestSnapshotChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      Content.LatestSnapshotChanged -= new EventHandler(Content_LatestSnapshotChanged);
+      base.DeregisterContentEvents();
+    }
+
+    void Content_LatestSnapshotChanged(object sender, EventArgs e) {
+      if (Content.LatestSnapshot != null) {
+        snapshotStatusText.Text = Content.LatestSnapshot.StatusMessage;
+        snapshotTimeText.Text = Content.LatestSnapshotTime.ToString();
+      } else {
+        snapshotStatusText.Text = "";
+        snapshotTimeText.Text = "";
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      openSnapshotButton.Enabled = Content != null && Content.LatestSnapshot != null;
+    }
+
+    private void openSnapshotButton_Click(object sender, EventArgs e) {
+      OptimizerJob job = XmlParser.Deserialize<OptimizerJob>(new MemoryStream(Content.LatestSnapshot.Obj.SerializedJobData));
+      MainFormManager.MainForm.ShowContent(job.Optimizer);
+    }
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.resx
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.resx	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.resx	(revision 4120)
@@ -0,0 +1,156 @@
+﻿<?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="stateTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="userIdTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="percentageTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="dateCreatedTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="dateFinishedTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="priorityTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="coresNeededTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="memoryNeededTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="pluginsNeededTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="projectTextBox.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="snapshotStatusText.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="dateCalculatedText.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/Properties/AssemblyInfo.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/Properties/AssemblyInfo.cs	(revision 4120)
@@ -55,5 +55,5 @@
 // You can specify all the values or you can default the Revision and Build Numbers 
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("3.3.0.4116")]
-[assembly: AssemblyFileVersion("3.3.0.4116")]
-[assembly: AssemblyBuildDate("2010/07/28 17:42:56")]
+[assembly: AssemblyVersion("3.3.0.4119")]
+[assembly: AssemblyFileVersion("3.3.0.4119")]
+[assembly: AssemblyBuildDate("2010/07/29 16:49:22")]
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj	(revision 4120)
@@ -96,4 +96,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="JobItemList.cs" />
+    <Compile Include="JobItem.cs" />
     <Compile Include="OptimizerJob.cs" />
     <Compile Include="HeuristicLabHiveExperimentPlugin.cs" />
Index: anches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj.user
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HeuristicLab.Hive.Experiment-3.3.csproj.user	(revision 4119)
+++ 	(revision )
@@ -1,6 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectView>ProjectFiles</ProjectView>
-  </PropertyGroup>
-</Project>
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs	(revision 4120)
@@ -54,11 +54,19 @@
     private const int resultPollingIntervalMs = 10000;
 
+    private object locker = new object();
     private const int maxSnapshotRetries = 20;
-
-    [Storable]
-    private IDictionary<Guid, IOptimizer> sentOptimizers = null;
-
-    private object locker = new object();
-    private DateTime startTime;
+    private System.Timers.Timer timer;
+    private bool pausePending, stopPending;
+    private DateTime lastUpdateTime;
+
+    [Storable]
+    private IDictionary<Guid, IOptimizer> pendingOptimizers = new Dictionary<Guid, IOptimizer>();
+
+    [Storable]
+    private JobItemList jobItems;
+    public JobItemList JobItems {
+      get { return jobItems; }
+    }
+    
 
     [Storable]
@@ -66,5 +74,10 @@
     public string ServerUrl {
       get { return serverUrl; }
-      set { serverUrl = value; OnServerUrlChanged(); }
+      set {
+        if (serverUrl != value) {
+          serverUrl = value; 
+          OnServerUrlChanged();
+        }
+      }
     }
 
@@ -73,5 +86,10 @@
     public string ResourceIds {
       get { return resourceIds; }
-      set { resourceIds = value; OnResourceIdsChanged(); }
+      set {
+        if (resourceIds != value) {
+          resourceIds = value; 
+          OnResourceIdsChanged();
+        }
+      }
     }
 
@@ -80,5 +98,16 @@
     public HeuristicLab.Optimization.Experiment Experiment {
       get { return experiment; }
-      set { experiment = value; OnExperimentChanged(); }
+      set {
+        if (experiment != value) {
+          experiment = value;
+          OnExperimentChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private ILog log;
+    public ILog Log {
+      get { return log; }
     }
 
@@ -92,7 +121,12 @@
       this.ServerUrl = HeuristicLab.Hive.Experiment.Properties.Settings.Default.HiveServerUrl;
       this.ResourceIds = HeuristicLab.Hive.Experiment.Properties.Settings.Default.ResourceIds;
+      this.log = new Log();
+      pausePending = stopPending = false;
+      jobItems = new JobItemList();
+      InitTimer();
     }
 
     public override IDeepCloneable Clone(Cloner cloner) {
+      log.LogMessage("I am beeing cloned");
       HiveExperiment clone = (HiveExperiment)base.Clone(cloner);
       clone.resourceIds = this.resourceIds;
@@ -101,8 +135,30 @@
       clone.executionState = this.executionState;
       clone.executionTime = this.executionTime;
-      clone.sentOptimizers = new Dictionary<Guid, IOptimizer>();
-      foreach (var pair in this.sentOptimizers)
-        clone.sentOptimizers[pair.Key] = (IOptimizer)cloner.Clone(pair.Value);
+      clone.pendingOptimizers = new Dictionary<Guid, IOptimizer>();
+      foreach (var pair in this.pendingOptimizers)
+        clone.pendingOptimizers[pair.Key] = (IOptimizer)cloner.Clone(pair.Value);
+      clone.log = (ILog)cloner.Clone(log);
+      clone.stopPending = this.stopPending;
+      clone.pausePending = this.pausePending;
+      clone.jobItems = (JobItemList)cloner.Clone(jobItems);
       return clone;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() {
+      InitTimer();
+      log.LogMessage("I was deserialized.");
+    }
+
+    private void InitTimer() {
+      timer = new System.Timers.Timer(100);
+      timer.AutoReset = true;
+      timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
+    }
+
+    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
+      DateTime now = DateTime.Now;
+      ExecutionTime += now - lastUpdateTime;
+      lastUpdateTime = now;
     }
 
@@ -135,6 +191,8 @@
       get { return executionTime; }
       private set {
-        executionTime = value;
-        OnExecutionTimeChanged();
+        if (executionTime != value) {
+          executionTime = value;
+          OnExecutionTimeChanged();
+        }
       }
     }
@@ -145,7 +203,7 @@
 
     public void Prepare() {
-      // [chn] needed?
       if (experiment != null) {
         experiment.Prepare();
+        this.ExecutionState = Core.ExecutionState.Prepared;
         OnPrepared();
       }
@@ -153,17 +211,51 @@
 
     public void Start() {
-      this.startTime = DateTime.Now;
+      OnStarted();
+      lastUpdateTime = DateTime.Now;
       this.ExecutionState = Core.ExecutionState.Started;
-      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(ServerUrl);
-
-      sentOptimizers = new Dictionary<Guid, IOptimizer>();
-      IEnumerable<string> groups = ResourceGroups;
-
-      foreach (IOptimizer optimizer in Experiment.Optimizers) {
-        SerializedJob serializedJob = CreateSerializedJob(optimizer);
-        ResponseObject<JobDto> response = executionEngineFacade.AddJobWithGroupStrings(serializedJob, groups);
-        sentOptimizers.Add(response.Obj.Id, optimizer);
-        StartResultPollingThread(response.Obj);
-      }
+      Thread t = new Thread(() => {
+        IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(ServerUrl);
+
+        pendingOptimizers = new Dictionary<Guid, IOptimizer>();
+        IEnumerable<string> groups = ResourceGroups;
+
+        foreach (IOptimizer optimizer in GetOptimizers(false)) {
+          SerializedJob serializedJob = CreateSerializedJob(optimizer);
+          ResponseObject<JobDto> response = executionEngineFacade.AddJobWithGroupStrings(serializedJob, groups);
+          pendingOptimizers.Add(response.Obj.Id, optimizer);
+          StartResultPollingThread(response.Obj);
+
+          JobItem jobItem = new JobItem() {
+            JobDto = response.Obj,
+            LatestSnapshot = new ResponseObject<SerializedJob>() {
+              Obj = serializedJob,
+              StatusMessage = "Initial Snapshot",
+              Success = true
+            }
+          };
+          jobItems.Add(jobItem);
+
+          log.LogMessage("Sent job to server (jobId: " + response.Obj.Id + ")");
+        }
+      });
+      t.Start();
+    }
+
+    /// <summary>
+    /// Returns all optimizers in the current Experiment
+    /// </summary>
+    /// <param name="flatout">if false only top level optimizers are returned, if true the optimizer-tree is flatted</param>
+    /// <returns></returns>
+    private IEnumerable<IOptimizer> GetOptimizers(bool flatout) {
+      if (!flatout) {
+        return experiment.Optimizers;
+      } else {
+        throw new NotImplementedException();
+      }
+    }
+
+    private void ReplaceOptimizer(IOptimizer originalOptimizer, IOptimizer newOptimizer) {
+      int originalOptimizerIndex = experiment.Optimizers.IndexOf(originalOptimizer);
+      experiment.Optimizers[originalOptimizerIndex] = newOptimizer;
     }
 
@@ -171,7 +263,5 @@
       // todo
     }
-
-    private bool abortRequested;
-
+    
     #endregion
 
@@ -219,8 +309,10 @@
           Thread.Sleep(resultPollingIntervalMs);
           lock (locker) {
-            if (abortRequested) return;
-
+            if (stopPending) return;
+            
             ResponseObject<SerializedJob> response = executionEngineFacade.GetLastSerializedResult(job.Id, false, false);
-
+            log.LogMessage("Received response for job: " + response.StatusMessage + " (jobId: " + job.Id + ")");
+            
+            
             // loop while 
             // 1. the user doesn't request an abort 
@@ -229,6 +321,4 @@
             // 4. the result that we get from the server is a snapshot and not the final result
             if (response.Success && response.Obj != null && response.StatusMessage != ApplicationConstants.RESPONSE_JOB_RESULT_NOT_YET_HERE) {
-
-              // [chn] todo: deserialization into interface is not possible! how to find out correct static type?
               restoredObject = XmlParser.Deserialize<IJob>(new MemoryStream(response.Obj.SerializedJobData));
             }
@@ -236,13 +326,13 @@
         } while (restoredObject == null || restoredObject.ExecutionState != Core.ExecutionState.Stopped);
 
+        log.LogMessage("Job finished (jobId: " + job.Id + ")");
         // job retrieved... replace the existing optimizers with the finished one
-        IOptimizer originalOptimizer = sentOptimizers[job.Id];
+        IOptimizer originalOptimizer = pendingOptimizers[job.Id];
         IOptimizer restoredOptimizer = ((OptimizerJob)restoredObject).Optimizer;
 
-        int originalOptimizerIndex = experiment.Optimizers.IndexOf(originalOptimizer);
-        experiment.Optimizers[originalOptimizerIndex] = restoredOptimizer;
-        sentOptimizers.Remove(job.Id);
-
-        if (sentOptimizers.Count == 0) {
+        ReplaceOptimizer(originalOptimizer, restoredOptimizer);
+        pendingOptimizers.Remove(job.Id);
+
+        if (pendingOptimizers.Count == 0) {
           // finished
           this.ExecutionState = Core.ExecutionState.Stopped;
@@ -254,6 +344,5 @@
       t.Start();
     }
-
-
+    
     #region Required Plugin Search
     /// <summary>
@@ -351,4 +440,5 @@
     public event EventHandler ExecutionStateChanged;
     private void OnExecutionStateChanged() {
+      log.LogMessage("ExecutionState changed to " + executionState.ToString());
       EventHandler handler = ExecutionStateChanged;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -359,4 +449,6 @@
     public event EventHandler Started;
     private void OnStarted() {
+      log.LogMessage("Started");
+      timer.Start();
       EventHandler handler = Started;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -365,4 +457,6 @@
     public event EventHandler Stopped;
     private void OnStopped() {
+      timer.Stop();
+      log.LogMessage("Stopped");
       EventHandler handler = Stopped;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -371,4 +465,6 @@
     public event EventHandler Paused;
     private void OnPaused() {
+      timer.Stop();
+      log.LogMessage("Paused");
       EventHandler handler = Paused;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -377,4 +473,5 @@
     public event EventHandler Prepared;
     protected virtual void OnPrepared() {
+      log.LogMessage("Prepared");
       EventHandler handler = Prepared;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -389,4 +486,5 @@
     public event EventHandler ExperimentChanged;
     protected virtual void OnExperimentChanged() {
+      log.LogMessage("Experiment changed");
       EventHandler handler = ExperimentChanged;
       if (handler != null) handler(this, EventArgs.Empty);
@@ -399,5 +497,4 @@
     }
 
-
     #endregion
   }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs	(revision 4120)
@@ -0,0 +1,60 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Hive.Contracts;
+
+namespace HeuristicLab.Hive.Experiment {
+  public class JobItem : Item {
+    [Storable]
+    private JobDto jobDto;
+    public JobDto JobDto {
+      get { return jobDto; }
+      set {
+        if (jobDto != value) {
+          jobDto = value;
+          OnToStringChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private ResponseObject<SerializedJob> latestSnapshot;
+    public ResponseObject<SerializedJob> LatestSnapshot {
+      get { return latestSnapshot; }
+      set {
+        if (latestSnapshot != value) {
+          latestSnapshot = value;
+          latestSnapshotTime = DateTime.Now;
+          OnLatestSnapshotChanged();
+        }
+      }
+    }
+
+    [Storable]
+    private DateTime latestSnapshotTime;
+    public DateTime LatestSnapshotTime {
+      get { return latestSnapshotTime; }
+    }
+
+    public JobItem() {
+    }
+
+    public override string ToString() {
+      if (jobDto != null) {
+        return base.ToString() + " - " + jobDto.Id.ToString();
+      } else {
+        return base.ToString();
+      }
+    }
+
+    public event EventHandler LatestSnapshotChanged;
+    public void OnLatestSnapshotChanged() {
+      EventHandler handler = LatestSnapshotChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItemList.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItemList.cs	(revision 4120)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItemList.cs	(revision 4120)
@@ -0,0 +1,17 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Hive.Contracts.BusinessObjects;
+
+namespace HeuristicLab.Hive.Experiment {
+  [Item("JobItem List", "Represents a list of hive jobs.")]
+  [StorableClass]
+  public class JobItemList : ItemList<JobItem> {
+    public JobItemList() : base() { }
+    public JobItemList(int capacity) : base(capacity) { }
+    public JobItemList(IEnumerable<JobItem> collection) : base(collection) { }
+  }
+}
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/OptimizerJob.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/OptimizerJob.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/OptimizerJob.cs	(revision 4120)
@@ -10,5 +10,5 @@
 namespace HeuristicLab.Hive.Experiment {
   [StorableClass]
-  class OptimizerJob : IJob {
+  public class OptimizerJob : IJob {
 
     [Storable]
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Properties/AssemblyInfo.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/Properties/AssemblyInfo.cs	(revision 4120)
@@ -55,5 +55,5 @@
 // You can specify all the values or you can default the Revision and Build Numbers 
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("3.3.0.4116")]
-[assembly: AssemblyFileVersion("3.3.0.4116")]
-[assembly: AssemblyBuildDate("2010/07/28 17:42:02")]
+[assembly: AssemblyVersion("3.3.0.4119")]
+[assembly: AssemblyFileVersion("3.3.0.4119")]
+[assembly: AssemblyBuildDate("2010/07/29 16:49:01")]
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/ServiceLocator.cs	(revision 4120)
@@ -31,9 +31,7 @@
   internal class ServiceLocator {
     internal static IExecutionEngineFacade CreateExecutionEngineFacade(string url) {
-      ChannelFactory<IExecutionEngineFacade> factory =
-        new ChannelFactory<IExecutionEngineFacade>(
+      ChannelFactory<IExecutionEngineFacade> factory = new ChannelFactory<IExecutionEngineFacade>(
           WcfSettings.GetStreamedBinding(),
           new EndpointAddress(url));
-
       return factory.CreateChannel();
     }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.JobBase/3.3/HeuristicLab.Hive.JobBase-3.3.csproj	(revision 4120)
@@ -91,4 +91,5 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Collections-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Common-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL" />
     <Reference Include="HeuristicLab.Core-3.3">
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/JobDataFetcher.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/JobDataFetcher.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Console/3.3/JobDataFetcher.cs	(revision 4120)
@@ -11,9 +11,15 @@
 namespace HeuristicLab.Hive.Server.ServerConsole {
   public class JobDataFetcher {
-    public List<State> PollStates { get; set; }    
+    private List<State> pollStates;
+
+    public IEnumerable<State> PollStates {
+      get { return pollStates; }
+    } 
 
     public event EventHandler NewDataAvailable;
 
     private System.Timers.Timer timer;
+
+    private static object locker = new object();
 
     public List<JobDto> CachedJobs { get; set; }
@@ -39,9 +45,9 @@
 
     public JobDataFetcher(IEnumerable<State> states, int nrOfEntries) {
-      PollStates = new List<State>();
+      pollStates = new List<State>();
       CachedJobs = new List<JobDto>();
       NrOfEntriesOnPage = nrOfEntries;
       CurrentPage = 0;
-      PollStates.AddRange(states);
+      pollStates.AddRange(states);
       timer = new System.Timers.Timer();
       timer.Interval = 5000;
@@ -70,20 +76,24 @@
       // [chn] Exception occured here: PollStates enumeration changed!
       // todo: make access to PollStates thread-safe!
-      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--;
+      // * added lock on locker -> didn't help
+      // * made public property PollStates an IEnumerable to be immutable -> lets see
+      lock (locker) {
+        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);
             }
-          } else {
-            CachedJobs = new List<JobDto>();
-            CachedJobs.AddRange(resList.List);
           }
         }
+        if (NewDataAvailable != null)
+          NewDataAvailable(this, new EventArgs());
       }
-      if (NewDataAvailable != null)
-        NewDataAvailable(this, new EventArgs());
     }
   }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ExecutionEngineFacade.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ExecutionEngineFacade.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Facades/ExecutionEngineFacade.cs	(revision 4120)
@@ -70,4 +70,9 @@
     }
 
+    public ResponseObject<JobDto> GetJobById(Guid jobId) {
+      using (contextFactory.GetContext()) {
+        return jobManager.GetJobById(jobId);
+      }
+    }
     #endregion
   }
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/JobManager.cs	(revision 4120)
@@ -58,5 +58,4 @@
     }
 
-
     private void CheckForDeadJobs() {
       Logger.Info("Searching for dead Jobs");
@@ -231,8 +230,8 @@
     }
 
+    // [chn] [refactor] why does this method handle 3 different cases? wouldn't 3 methods be easier?
     //Requested means: there MUST be a job result which gets sent back
     public ResponseObject<SerializedJob> GetLastSerializedJobResultOf(Guid jobId, bool requested, bool snapshot) {
-      ResponseObject<SerializedJob> response =
-        new ResponseObject<SerializedJob>();
+      ResponseObject<SerializedJob> response = new ResponseObject<SerializedJob>();
 
       JobDto job = DaoLocator.JobDao.FindById(jobId);
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Properties/AssemblyInfo.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.Core/3.3/Properties/AssemblyInfo.cs	(revision 4120)
@@ -55,5 +55,5 @@
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("3.3.0.4116")]
-[assembly: AssemblyFileVersion("3.3.0.4116")]
-[assembly: AssemblyBuildDate("2010/07/28 17:42:06")]
+[assembly: AssemblyVersion("3.3.0.4119")]
+[assembly: AssemblyFileVersion("3.3.0.4119")]
+[assembly: AssemblyBuildDate("2010/07/29 16:49:08")]
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/ContextFactory.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/ContextFactory.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Server.LINQDataAccess/3.3/ContextFactory.cs	(revision 4120)
@@ -23,6 +23,7 @@
   /// </summary>
   class ContextFactory : IContextFactory {
-    private static IDictionary<object, HiveDataContext> contexts = new Dictionary<object, HiveDataContext>();
-    private static IDictionary<object, TransactionScope> transactions = new Dictionary<object, TransactionScope>();
+    private static object locker = new object();
+    private static IDictionary<int, HiveDataContext> contexts = new Dictionary<int, HiveDataContext>();
+    private static IDictionary<int, TransactionScope> transactions = new Dictionary<int, TransactionScope>();
 
     private static IContextFactory instance = null;
@@ -42,23 +43,25 @@
 
     public IDisposable GetContext(bool withTransaction) {
-      Logger.Debug("opening transaction");
-      object obj = Thread.CurrentThread;
+      lock (locker) {
+        Logger.Debug("opening transaction");
+        int threadId = Thread.CurrentThread.ManagedThreadId;
 
-      if (contexts.ContainsKey(obj)) {
-        throw new DataAccessException("Context for this Thread already defined");
+        if (contexts.ContainsKey(threadId)) {
+          throw new DataAccessException("Context for this Thread already defined");
+        }
+
+        Logger.Debug("creating context");
+        DisposableHiveDataContext context = CreateContext();
+        context.OnDisposing += new EventHandler(context_OnDisposing);
+        contexts.Add(threadId, context);
+
+        if (withTransaction) {
+          TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE });
+          Logger.Debug("creating  transaction");
+
+          transactions.Add(threadId, transaction);
+        }
+        return context;
       }
-
-      Logger.Debug("creating context");
-      DisposableHiveDataContext context = CreateContext();
-      context.OnDisposing += new EventHandler(context_OnDisposing);
-      contexts.Add(obj, context);
-
-      if (withTransaction) {
-        TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE });
-        Logger.Debug("creating  transaction");
-        
-        transactions.Add(obj, transaction);
-      }
-      return context;
     }
 
@@ -74,27 +77,31 @@
     public void RollbackTransaction() {
       Logger.Debug("rolling back transaction");
-      object obj = Thread.CurrentThread;
+      int threadId = Thread.CurrentThread.ManagedThreadId;
 
-      TransactionScope transaction = transactions[obj];
+      TransactionScope transaction = transactions[threadId];
       transaction.Dispose();
     }
 
     public void RemoveContext() {
-      Logger.Debug("removing context");
-      object obj = Thread.CurrentThread;
+      lock (locker) {
+        Logger.Debug("removing context");
+        int threadId = Thread.CurrentThread.ManagedThreadId;
 
-      contexts.Remove(obj);
-      // context gets disposed implicitly, when it is used as IDisposable
+        contexts.Remove(threadId);
+        // context gets disposed implicitly, when it is used as IDisposable
+      }
     }
 
     public void RemoveAndCompleteTransaction() {
-      Logger.Debug("completing transaction");
-      object obj = Thread.CurrentThread;
+      lock (locker) {
+        Logger.Debug("completing transaction");
+        int threadId = Thread.CurrentThread.ManagedThreadId;
 
-      // context does not always have an associated transaction
-      if (transactions.ContainsKey(obj)) {
-        transactions[obj].Complete();
-        transactions[obj].Dispose();
-        transactions.Remove(obj);
+        // context does not always have an associated transaction
+        if (transactions.ContainsKey(threadId)) {
+          transactions[threadId].Complete();
+          transactions[threadId].Dispose();
+          transactions.Remove(threadId);
+        }
       }
     }
@@ -102,7 +109,7 @@
     public DataContext CurrentContext {
       get {
-        object obj = Thread.CurrentThread;
-        if (contexts.ContainsKey(obj)) {
-          return contexts[obj];
+        int threadId = Thread.CurrentThread.ManagedThreadId;
+        if (contexts.ContainsKey(threadId)) {
+          return contexts[threadId];
         } else {
           return null;
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj	(revision 4120)
@@ -41,4 +41,12 @@
   <PropertyGroup>
     <AssemblyOriginatorKeyFile>HeuristicLab.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <PlatformTarget>x86</PlatformTarget>
+    <OutputPath>bin\Debug\</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <PlatformTarget>x86</PlatformTarget>
+    <OutputPath>bin\x86\Release\</OutputPath>
   </PropertyGroup>
   <ItemGroup>
Index: anches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj.user
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/HeuristicLab.Hive-3.3.csproj.user	(revision 4119)
+++ 	(revision )
@@ -1,7 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
-    <StartAction>Program</StartAction>
-    <StartProgram>C:\Programme\HeuristicLab 3.3\HeuristicLab 3.3.exe</StartProgram>
-  </PropertyGroup>
-</Project>
Index: /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/Properties/AssemblyInfo.cs
===================================================================
--- /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/Properties/AssemblyInfo.cs	(revision 4119)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive/3.3/Properties/AssemblyInfo.cs	(revision 4120)
@@ -51,4 +51,4 @@
 //      Revision
 //
-[assembly: AssemblyVersion("3.3.0.4116")]
-[assembly: AssemblyFileVersion("3.3.0.4116")]
+[assembly: AssemblyVersion("3.3.0.4119")]
+[assembly: AssemblyFileVersion("3.3.0.4119")]
