Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 1725)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 1726)
@@ -31,4 +31,5 @@
 using HeuristicLab.Hive.Contracts.BusinessObjects;
 using System.IO;
+using System.Xml;
 
 namespace HeuristicLab.Hive.Engine {
@@ -46,5 +47,4 @@
     }
 
-
     #region IEngine Members
 
@@ -75,5 +75,5 @@
     public void Execute() {
       IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
-     
+
       DiscoveryService dService = new DiscoveryService();
       PluginInfo depInfo = dService.GetDeclaringPlugin(typeof(HiveEngine));
@@ -89,5 +89,5 @@
 
       foreach (PluginInfo info in dependentPlugins) {
-        HivePluginInfo pluginInfo = 
+        HivePluginInfo pluginInfo =
           new HivePluginInfo();
         pluginInfo.Name = info.Name;
@@ -102,20 +102,7 @@
     }
 
-    public void ExecuteStep() {
-      throw new NotSupportedException();
-    }
-
-    public void ExecuteSteps(int steps) {
-      throw new NotSupportedException();
-    }
-
-    public void Abort() {
+    public void RequestSnapshot() {
       IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
-      
-      
-      //This are just Stubs on the server right now. There won't be any effect right now...
-      executionEngineFacade.AbortJob(jobId);      
-      executionEngineFacade.RequestSnapshot(Guid);
-      
+
       //Requests the last result.
       //false: There will always be a result that is been sent back
@@ -123,28 +110,89 @@
       //      the snapshot hasn't been submitted to the server (because the client needs
       //      more time).
-      executionEngineFacade.GetLastResult(jobId, false);
-
-      throw new NotImplementedException();
+      var result = executionEngineFacade.GetLastResult(jobId, false);
+      if (result.Success) {
+        JobResult jobResult = result.Obj;
+        if (jobResult != null) {
+          job = (Job)PersistenceManager.RestoreFromGZip(jobResult.Result);
+          PluginManager.ControlManager.ShowControl(job.Engine.CreateView());
+        }
+      } else {
+        Exception ex = new Exception(result.Obj.Exception.Message);
+        ThreadPool.QueueUserWorkItem(delegate(object state) { OnExceptionOccurred(ex); });
+      }
+    }
+
+
+    public void ExecuteStep() {
+      throw new NotSupportedException();
+    }
+
+    public void ExecuteSteps(int steps) {
+      throw new NotSupportedException();
+    }
+
+    public void Abort() {
+      IExecutionEngineFacade executionEngineFacade = ServiceLocator.CreateExecutionEngineFacade(HiveServerUrl);
+
+      //This are just Stubs on the server right now. There won't be any effect right now...
+      executionEngineFacade.AbortJob(jobId);
+      OnFinished();
     }
 
     public void Reset() {
-      throw new NotImplementedException();
+      job.Engine.Reset();
+      jobId = Guid.NewGuid();
+      OnInitialized();
     }
 
     public event EventHandler Initialized;
+    /// <summary>
+    /// Fires a new <c>Initialized</c> event.
+    /// </summary>
+    protected virtual void OnInitialized() {
+      if (Initialized != null)
+        Initialized(this, new EventArgs());
+    }
 
     public event EventHandler<OperationEventArgs> OperationExecuted;
+    /// <summary>
+    /// Fires a new <c>OperationExecuted</c> event.
+    /// </summary>
+    /// <param name="operation">The operation that has been executed.</param>
+    protected virtual void OnOperationExecuted(IOperation operation) {
+      if (OperationExecuted != null)
+        OperationExecuted(this, new OperationEventArgs(operation));
+    }
 
     public event EventHandler<ExceptionEventArgs> ExceptionOccurred;
+    /// <summary>
+    /// Aborts the execution and fires a new <c>ExceptionOccurred</c> event.
+    /// </summary>
+    /// <param name="exception">The exception that was thrown.</param>
+    protected virtual void OnExceptionOccurred(Exception exception) {
+      Abort();
+      if (ExceptionOccurred != null)
+        ExceptionOccurred(this, new ExceptionEventArgs(exception));
+    }
 
     public event EventHandler ExecutionTimeChanged;
+    /// <summary>
+    /// Fires a new <c>ExecutionTimeChanged</c> event.
+    /// </summary>
+    protected virtual void OnExecutionTimeChanged() {
+      if (ExecutionTimeChanged != null)
+        ExecutionTimeChanged(this, new EventArgs());
+    }
 
     public event EventHandler Finished;
+    /// <summary>
+    /// Fires a new <c>Finished</c> event.
+    /// </summary>
+    protected virtual void OnFinished() {
+      if (Finished != null)
+        Finished(this, new EventArgs());
+    }
 
     #endregion
-
-    public void RequestSnapshot() {
-      throw new NotImplementedException();
-    }
 
     public override IView CreateView() {
@@ -158,4 +206,19 @@
     }
     #endregion
+
+    public override System.Xml.XmlNode GetXmlNode(string name, System.Xml.XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
+      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
+      XmlAttribute attr = document.CreateAttribute("HiveServerUrl");
+      attr.Value = HiveServerUrl;
+      node.Attributes.Append(attr);
+      node.AppendChild(PersistenceManager.Persist("Job", job, document, persistedObjects));
+      return node;
+    }
+
+    public override void Populate(System.Xml.XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
+      base.Populate(node, restoredObjects);
+      HiveServerUrl = node.Attributes["HiveServerUrl"].Value;
+      job = (Job)PersistenceManager.Restore(node.SelectSingleNode("Job"), restoredObjects);
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs	(revision 1725)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.Designer.cs	(revision 1726)
@@ -87,4 +87,5 @@
       // 
       this.snapshotButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+      this.snapshotButton.Enabled = false;
       this.snapshotButton.Location = new System.Drawing.Point(294, 457);
       this.snapshotButton.Name = "snapshotButton";
@@ -93,4 +94,5 @@
       this.snapshotButton.Text = "Snapshot";
       this.snapshotButton.UseVisualStyleBackColor = true;
+      this.snapshotButton.Click += new System.EventHandler(this.snapshotButton_Click);
       // 
       // urlTextBox
Index: trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs
===================================================================
--- trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs	(revision 1725)
+++ trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngineEditor.cs	(revision 1726)
@@ -42,5 +42,7 @@
       get { return (HiveEngine)Engine; }
       set {
+        if (base.Engine != null) RemoveItemEvents();
         base.Engine = value;
+        AddItemEvents();
         SetDataBinding();
       }
@@ -61,4 +63,9 @@
       : this() {
       HiveEngine = hiveEngine;
+      base.executeButton.Click += new EventHandler(executeButton_Click);
+    }
+
+    void executeButton_Click(object sender, EventArgs e) {
+      snapshotButton.Enabled = true;
     }
 
@@ -66,4 +73,28 @@
       urlTextBox.DataBindings.Add("Text", HiveEngine, "HiveServerUrl");
     }
+
+    protected override void RemoveItemEvents() {
+      Engine.Initialized -= new EventHandler(Engine_Initialized);
+      Engine.Finished -= new EventHandler(Engine_Finished);
+      base.RemoveItemEvents();
+    }
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      Engine.Finished += new EventHandler(Engine_Finished);
+      Engine.Initialized += new EventHandler(Engine_Initialized);
+    }
+
+    void Engine_Initialized(object sender, EventArgs e) {
+      snapshotButton.Enabled = false;
+    }
+
+    void Engine_Finished(object sender, EventArgs e) {
+      snapshotButton.Enabled = false;
+    }
+
+    private void snapshotButton_Click(object sender, EventArgs e) {
+      HiveEngine.RequestSnapshot();
+    }
   }
 }
