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 4144)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment.Views/3.3/JobItemView.cs	(revision 4145)
@@ -47,4 +47,5 @@
       Content.LatestSnapshotChanged += new EventHandler(Content_LatestSnapshotChanged);
       Content.JobDtoChanged += new EventHandler(Content_JobDtoChanged);
+      Content.SnapshotRequestedStateChanged += new EventHandler(Content_SnapshotRequestedStateChanged);
     }
 
@@ -52,4 +53,5 @@
       Content.LatestSnapshotChanged -= new EventHandler(Content_LatestSnapshotChanged);
       Content.JobDtoChanged -= new EventHandler(Content_JobDtoChanged);
+      Content.SnapshotRequestedStateChanged -= new EventHandler(Content_SnapshotRequestedStateChanged);
       base.DeregisterContentEvents();
     }
@@ -92,5 +94,8 @@
     protected override void SetEnabledStateOfControls() {
       base.SetEnabledStateOfControls();
-      openSnapshotButton.Enabled = Content != null && Content.LatestSnapshot != null;
+      if (Content != null) {
+        openSnapshotButton.Enabled = Content.SnapshotRequestedState == SnapshotRequestedState.Idle;
+        requestSnapshotButton.Enabled = Content.SnapshotRequestedState == SnapshotRequestedState.Requested;
+      }
       this.jobIdTextBox.ReadOnly = this.ReadOnly;
       this.stateTextBox.ReadOnly = this.ReadOnly;
@@ -115,5 +120,9 @@
 
     private void requestSnapshotButton_Click(object sender, EventArgs e) {
-      
+      this.Content.RequestSnapshot();
+    }
+
+    private void Content_SnapshotRequestedStateChanged(object sender, EventArgs e) {
+      SetEnabledStateOfControls();
     }
   }
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 4144)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/HiveExperiment.cs	(revision 4145)
@@ -158,4 +158,5 @@
       isPollingResults = false;
       resultPollingThreads = new Dictionary<Guid, Thread>();
+      RegisterEvents();
       InitTimer();
     }
@@ -191,7 +192,8 @@
       this.IsPollingResults = false;
       this.stopResultsPollingPending = false;
+      RegisterEvents();
       LogMessage("I was deserialized.");
     }
-
+    
     private void InitTimer() {
       timer = new System.Timers.Timer(100);
@@ -556,4 +558,11 @@
       lock (locker) {
         log.LogMessage(message);
+      }
+    }
+
+    void JobItem_SnapshotRequestedStateChanged(object sender, EventArgs e) {
+      JobItem jobItem = (JobItem)sender;
+      if (jobItem.SnapshotRequestedState == SnapshotRequestedState.Requested) {
+        RequestSnapshot(jobItem.JobDto.Id);
       }
     }
@@ -588,12 +597,9 @@
           );
       }
-      SerializedJob jobResult = response.Obj;
-      if (jobResult != null) {
-        Logger.Debug("HiveEngine: Results-polling - Got result!");
-
-        //job = XmlParser.Deserialize<Job>(new MemoryStream(jobResult.SerializedJobData));
-
-        throw new NotImplementedException("[chn] how to create a view in 3.3 and why should i do this here? shouldnt the caller of this method receive a result and decide what to do?");
-        //ControlManager.Manager.ShowControl(job.Engine.CreateView());
+      if (response.Success) {
+        GetJobItemById(jobId).LogMessage("Snapshot polling successfull for job " + jobId);
+        GetJobItemById(jobId).LatestSnapshot = response;
+      } else {
+        GetJobItemById(jobId).LogMessage("Error: Polling of Snapshot failed for job " + jobId + ": " + response.StatusMessage);
       }
     }
@@ -763,4 +769,46 @@
       if (handler != null) handler(this, EventArgs.Empty);
     }
+
+    private void RegisterEvents() {
+      jobItems.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_CollectionReset);
+      jobItems.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsAdded);
+      jobItems.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsRemoved);
+      jobItems.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsReplaced);
+    }
+
+    private void DeregisterEvents() {
+      jobItems.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_CollectionReset);
+      jobItems.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsAdded);
+      jobItems.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsRemoved);
+      jobItems.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<JobItem>>(jobItems_ItemsReplaced);
+    }
+
+
+    void jobItems_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
+      UpdateSnapshotRequestedEvents(e);
+    }
+
+    private void UpdateSnapshotRequestedEvents(CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
+      foreach (var item in e.OldItems) {
+        item.Value.SnapshotRequestedStateChanged -= new EventHandler(JobItem_SnapshotRequestedStateChanged);
+      }
+      foreach (var item in e.Items) {
+        item.Value.SnapshotRequestedStateChanged += new EventHandler(JobItem_SnapshotRequestedStateChanged);
+      }
+    }
+
+    void jobItems_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
+      UpdateSnapshotRequestedEvents(e);
+    }
+
+    void jobItems_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
+      UpdateSnapshotRequestedEvents(e);
+    }
+
+    void jobItems_CollectionReset(object sender, CollectionItemsChangedEventArgs<IndexedItem<JobItem>> e) {
+      foreach (var item in e.OldItems) {
+        item.Value.SnapshotRequestedStateChanged -= new EventHandler(JobItem_SnapshotRequestedStateChanged);
+      }
+    }
     #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 4144)
+++ /branches/3.3-HiveMigration/sources/HeuristicLab.Hive/HeuristicLab.Hive.Experiment/3.3/JobItem.cs	(revision 4145)
@@ -13,4 +13,6 @@
 
 namespace HeuristicLab.Hive.Experiment {
+  public enum SnapshotRequestedState { Idle, Requested }
+
   [StorableClass]
   public class JobItem : Item {
@@ -51,4 +53,5 @@
           latestSnapshot = value;
           latestSnapshotTime = DateTime.Now;
+          SnapshotRequestedState = Experiment.SnapshotRequestedState.Idle;
           OnLatestSnapshotChanged();
         }
@@ -74,5 +77,15 @@
       set { this.optimizer = value; }
     }
-    
+
+    [Storable]
+    private SnapshotRequestedState snapshotRequestedState;
+    public SnapshotRequestedState SnapshotRequestedState {
+      get { return snapshotRequestedState; }
+      private set {
+        this.snapshotRequestedState = value;
+        OnSnapshotRequestedStateChanged();
+      }
+    }
+
     public JobItem() {
       log = new Log();
@@ -117,4 +130,16 @@
       return clone;
     }
+
+
+    public event EventHandler SnapshotRequestedStateChanged;
+    private void OnSnapshotRequestedStateChanged() {
+      EventHandler handler = SnapshotRequestedStateChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public void RequestSnapshot() {
+      this.SnapshotRequestedState = Experiment.SnapshotRequestedState.Requested;
+    }
+
   }
 }
