Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/HeuristicLabCalendarPlugin.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/HeuristicLabCalendarPlugin.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/HeuristicLabCalendarPlugin.cs	(revision 5469)
@@ -24,5 +24,5 @@
 
 namespace HeuristicLab.Calendar {
-  [Plugin("HeuristicLab.Calendar", "3.3.3.0")]
+  [Plugin("HeuristicLab.Calendar", "3.3.3.5457")]
   [PluginFile("HeuristicLab.Calendar-3.3.dll", PluginFileType.Assembly)]
   [PluginFile("DayView License.txt", PluginFileType.License)]
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Calendar/3.3/Properties/AssemblyInfo.cs	(revision 5469)
@@ -56,3 +56,3 @@
 // by using the '*' as shown below:
 [assembly: AssemblyVersion("3.3.0.0")]
-[assembly: AssemblyFileVersion("3.3.0.0")]
+[assembly: AssemblyFileVersion("3.3.0.5457")]
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Core.cs	(revision 5469)
@@ -357,32 +357,33 @@
     /// <param name="jobId"></param>
     [MethodImpl(MethodImplOptions.Synchronized)]
-    public void SendFinishedJob(object jobId) {
+    public void SendFinishedJob(Guid jobId) {
       try {
-        Guid jId = (Guid)jobId;
-        ClientCom.LogMessage("Getting the finished job with id: " + jId);
-        if (!engines.ContainsKey(jId)) {
+        ClientCom.LogMessage("Getting the finished job with id: " + jobId);
+        if (!engines.ContainsKey(jobId)) {
           ClientCom.LogMessage("Engine doesn't exist");
           return;
         }
-        if (!jobs.ContainsKey(jId)) {
+        if (!jobs.ContainsKey(jobId)) {
           ClientCom.LogMessage("Job doesn't exist");
           return;
         }
-        Job cJob = jobs[jId];
-
-        JobData sJob = engines[jId].GetFinishedJob();
-        cJob.Exception = engines[jId].CurrentException;
-        cJob.ExecutionTime = engines[jId].ExecutionTime;
+        Job cJob = jobs[jobId];
+        cJob.JobState = JobState.Finished;//TODO: what if failed?
+        cJob.ExecutionTime = engines[jobId].ExecutionTime;
+
+        JobData sJob = engines[jobId].GetFinishedJob();
+        cJob.Exception = engines[jobId].CurrentException;
+        cJob.ExecutionTime = engines[jobId].ExecutionTime;
 
         try {
-          ClientCom.LogMessage("Sending the finished job with id: " + jId);
+          ClientCom.LogMessage("Sending the finished job with id: " + jobId);
           wcfService.UpdateJob(cJob, sJob);
           SlaveStatusInfo.JobsProcessed++;
         }
         catch (Exception e) {
-          ClientCom.LogMessage("Transmitting to server failed. Storing the finished job with id: " + jId + " to hdd (" + e.ToString() + ")");
+          ClientCom.LogMessage("Transmitting to server failed. Storing the finished job with id: " + jobId + " to hdd (" + e.ToString() + ")");
         }
         finally {
-          KillAppDomain(jId); // kill app-domain in every case
+          KillAppDomain(jobId); // kill app-domain in every case
           heartbeatManager.AwakeHeartBeatThread();
         }
@@ -464,62 +465,60 @@
     /// <param name="parameter"></param>
     /// <returns>true if the calling method can continue execution, else false</returns>
-    private bool EnqueueExecutorMessage<T>(Action<T> action, T parameter) {
+    public void EnqueueExecutorMessage<T>(Action<T> action, T parameter) {
+      ExecutorMessageContainer<T> container = new ExecutorMessageContainer<T>();
+      container.Callback = action;
+      container.CallbackParameter = parameter;
+      MessageQueue.GetInstance().AddMessage(container);
+    }
+
+    /// <summary>
+    /// Kill a appdomain with a specific id.
+    /// </summary>
+    /// <param name="id">the GUID of the job</param>
+    //[MethodImpl(MethodImplOptions.Synchronized)]
+    public void KillAppDomain(Guid id) {
       if (Thread.CurrentThread.ManagedThreadId != this.coreThreadId) {
-        ExecutorMessageContainer<T> container = new ExecutorMessageContainer<T>();
-        container.Callback = action;
-        container.CallbackParameter = parameter;
-        MessageQueue.GetInstance().AddMessage(container);
-        return false;
-      } else {
-        return true;
-      }
-    }
-
-    /// <summary>
-    /// Kill a appdomain with a specific id.
-    /// </summary>
-    /// <param name="id">the GUID of the job</param>
-    [MethodImpl(MethodImplOptions.Synchronized)]
-    public void KillAppDomain(Guid id) {
-      if (EnqueueExecutorMessage<Guid>(KillAppDomain, id)) {
-        ClientCom.LogMessage("Shutting down Appdomain for Job " + id);
-        lock (engines) {
-          try {
-            if (engines.ContainsKey(id)) {
-              engines[id].Dispose();
-              engines.Remove(id);
-            }
-
-            if (appDomains.ContainsKey(id)) {
-              appDomains[id].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
-
-              int repeat = 5;
-              while (repeat > 0) {
-                try {
-                  AppDomain.Unload(appDomains[id]);
-                  repeat = 0;
-                }
-                catch (CannotUnloadAppDomainException) {
-                  ClientCom.LogMessage("Could not unload AppDomain, will try again in 1 sec.");
-                  Thread.Sleep(1000);
-                  repeat--;
-                  if (repeat == 0) {
-                    throw; // rethrow and let app crash
-                  }
+        EnqueueExecutorMessage<Guid>(KillAppDomain, id);
+        return;
+      }
+
+      ClientCom.LogMessage("Shutting down Appdomain for Job " + id);
+      lock (engines) {
+        try {
+          if (engines.ContainsKey(id)) {
+            engines[id].Dispose();
+            engines.Remove(id);
+          }
+
+          if (appDomains.ContainsKey(id)) {
+            appDomains[id].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
+
+            int repeat = 5;
+            while (repeat > 0) {
+              try {
+                AppDomain.Unload(appDomains[id]);
+                repeat = 0;
+              }
+              catch (CannotUnloadAppDomainException) {
+                ClientCom.LogMessage("Could not unload AppDomain, will try again in 1 sec.");
+                Thread.Sleep(1000);
+                repeat--;
+                if (repeat == 0) {
+                  throw; // rethrow and let app crash
                 }
               }
-              appDomains.Remove(id);
             }
-
-            jobs.Remove(id);
-            PluginCache.Instance.DeletePluginsForJob(id);
-            GC.Collect();
+            appDomains.Remove(id);
           }
-          catch (Exception ex) {
-            ClientCom.LogMessage("Exception when unloading the appdomain: " + ex.ToString());
-          }
-        }
-        GC.Collect();
-      }
+
+          jobs.Remove(id);
+          PluginCache.Instance.DeletePluginsForJob(id);
+          GC.Collect();
+        }
+        catch (Exception ex) {
+          ClientCom.LogMessage("Exception when unloading the appdomain: " + ex.ToString());
+        }
+      }
+      GC.Collect();
     }
   }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/Executor.cs	(revision 5469)
@@ -86,5 +86,5 @@
     public void Pause() {
       Job.Pause();
-      
+
     }
 
@@ -156,12 +156,12 @@
       HeuristicLab.Common.EventArgs<Exception> ex = (HeuristicLab.Common.EventArgs<Exception>)e;
       currentException = ex.Value;
-      Core.SendFinishedJob(JobId);
+      Core.EnqueueExecutorMessage(Core.SendFinishedJob, JobId);
     }
 
     private void Job_JobStopped(object sender, EventArgs e) {
       if (wasJobAborted) {
-        Core.KillAppDomain(JobId);
+        Core.EnqueueExecutorMessage(Core.KillAppDomain, JobId);
       } else {
-        Core.SendFinishedJob(JobId);
+        Core.EnqueueExecutorMessage(Core.SendFinishedJob, JobId);
       }
     }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/PluginCache.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/PluginCache.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Slave/3.4/PluginCache.cs	(revision 5469)
@@ -265,8 +265,8 @@
             tries = 0;
           }
-          catch {
+          catch (Exception e) {
             Thread.Sleep(1000);
             tries--;
-            if (tries == 0) throw;
+            if (tries == 0) throw;// TODO: don't know what do do
           }
         }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/HiveAdministrationView.Designer.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/HiveAdministrationView.Designer.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/HiveAdministrationView.Designer.cs	(revision 5469)
@@ -47,5 +47,5 @@
       this.tabAdmin = new System.Windows.Forms.TabControl();
       this.tabSlaves = new System.Windows.Forms.TabPage();
-      this.tabUsers = new System.Windows.Forms.TabPage();
+      this.splitSlaves = new System.Windows.Forms.SplitContainer();
       this.treeSlaveGroup = new System.Windows.Forms.TreeView();
       this.tabSlaveGroup = new System.Windows.Forms.TabControl();
@@ -53,14 +53,24 @@
       this.tabSchedule = new System.Windows.Forms.TabPage();
       this.tabJobs = new System.Windows.Forms.TabPage();
-      this.splitSlaves = new System.Windows.Forms.SplitContainer();
+      this.tabUsers = new System.Windows.Forms.TabPage();
+      this.splitUsers = new System.Windows.Forms.SplitContainer();
+      this.lstUsers = new System.Windows.Forms.ListView();
+      this.grpUsersInfo = new System.Windows.Forms.GroupBox();
       this.scheduleControl1 = new HeuristicLab.Clients.Hive.Views.Administration.ScheduleControl();
+      this.hiveJobListViewSlaves = new HeuristicLab.Clients.Hive.Views.HiveJobListView();
       this.tabAdmin.SuspendLayout();
       this.tabSlaves.SuspendLayout();
-      this.tabSlaveGroup.SuspendLayout();
-      this.tabSchedule.SuspendLayout();
       ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).BeginInit();
       this.splitSlaves.Panel1.SuspendLayout();
       this.splitSlaves.Panel2.SuspendLayout();
       this.splitSlaves.SuspendLayout();
+      this.tabSlaveGroup.SuspendLayout();
+      this.tabSchedule.SuspendLayout();
+      this.tabJobs.SuspendLayout();
+      this.tabUsers.SuspendLayout();
+      ((System.ComponentModel.ISupportInitialize)(this.splitUsers)).BeginInit();
+      this.splitUsers.Panel1.SuspendLayout();
+      this.splitUsers.Panel2.SuspendLayout();
+      this.splitUsers.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -89,13 +99,22 @@
       this.tabSlaves.UseVisualStyleBackColor = true;
       // 
-      // tabUsers
-      // 
-      this.tabUsers.Location = new System.Drawing.Point(4, 22);
-      this.tabUsers.Name = "tabUsers";
-      this.tabUsers.Padding = new System.Windows.Forms.Padding(3);
-      this.tabUsers.Size = new System.Drawing.Size(734, 520);
-      this.tabUsers.TabIndex = 1;
-      this.tabUsers.Text = "Users";
-      this.tabUsers.UseVisualStyleBackColor = true;
+      // splitSlaves
+      // 
+      this.splitSlaves.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitSlaves.Location = new System.Drawing.Point(3, 6);
+      this.splitSlaves.Name = "splitSlaves";
+      // 
+      // splitSlaves.Panel1
+      // 
+      this.splitSlaves.Panel1.Controls.Add(this.treeSlaveGroup);
+      // 
+      // splitSlaves.Panel2
+      // 
+      this.splitSlaves.Panel2.Controls.Add(this.tabSlaveGroup);
+      this.splitSlaves.Size = new System.Drawing.Size(725, 508);
+      this.splitSlaves.SplitterDistance = 215;
+      this.splitSlaves.TabIndex = 2;
       // 
       // treeSlaveGroup
@@ -146,4 +165,5 @@
       // tabJobs
       // 
+      this.tabJobs.Controls.Add(this.hiveJobListViewSlaves);
       this.tabJobs.Location = new System.Drawing.Point(4, 22);
       this.tabJobs.Name = "tabJobs";
@@ -154,22 +174,53 @@
       this.tabJobs.UseVisualStyleBackColor = true;
       // 
-      // splitSlaves
-      // 
-      this.splitSlaves.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.splitSlaves.Location = new System.Drawing.Point(3, 6);
-      this.splitSlaves.Name = "splitSlaves";
-      // 
-      // splitSlaves.Panel1
-      // 
-      this.splitSlaves.Panel1.Controls.Add(this.treeSlaveGroup);
-      // 
-      // splitSlaves.Panel2
-      // 
-      this.splitSlaves.Panel2.Controls.Add(this.tabSlaveGroup);
-      this.splitSlaves.Size = new System.Drawing.Size(725, 508);
-      this.splitSlaves.SplitterDistance = 215;
-      this.splitSlaves.TabIndex = 2;
+      // tabUsers
+      // 
+      this.tabUsers.Controls.Add(this.splitUsers);
+      this.tabUsers.Location = new System.Drawing.Point(4, 22);
+      this.tabUsers.Name = "tabUsers";
+      this.tabUsers.Padding = new System.Windows.Forms.Padding(3);
+      this.tabUsers.Size = new System.Drawing.Size(734, 520);
+      this.tabUsers.TabIndex = 1;
+      this.tabUsers.Text = "Users";
+      this.tabUsers.UseVisualStyleBackColor = true;
+      // 
+      // splitUsers
+      // 
+      this.splitUsers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitUsers.Location = new System.Drawing.Point(6, 6);
+      this.splitUsers.Name = "splitUsers";
+      // 
+      // splitUsers.Panel1
+      // 
+      this.splitUsers.Panel1.Controls.Add(this.lstUsers);
+      // 
+      // splitUsers.Panel2
+      // 
+      this.splitUsers.Panel2.Controls.Add(this.grpUsersInfo);
+      this.splitUsers.Size = new System.Drawing.Size(722, 508);
+      this.splitUsers.SplitterDistance = 240;
+      this.splitUsers.TabIndex = 0;
+      // 
+      // lstUsers
+      // 
+      this.lstUsers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.lstUsers.Location = new System.Drawing.Point(3, 3);
+      this.lstUsers.Name = "lstUsers";
+      this.lstUsers.Size = new System.Drawing.Size(234, 502);
+      this.lstUsers.TabIndex = 0;
+      this.lstUsers.UseCompatibleStateImageBehavior = false;
+      // 
+      // grpUsersInfo
+      // 
+      this.grpUsersInfo.Location = new System.Drawing.Point(4, 4);
+      this.grpUsersInfo.Name = "grpUsersInfo";
+      this.grpUsersInfo.Size = new System.Drawing.Size(474, 504);
+      this.grpUsersInfo.TabIndex = 0;
+      this.grpUsersInfo.TabStop = false;
+      this.grpUsersInfo.Text = "User Information";
       // 
       // scheduleControl1
@@ -179,4 +230,17 @@
       this.scheduleControl1.Size = new System.Drawing.Size(862, 562);
       this.scheduleControl1.TabIndex = 0;
+      // 
+      // hiveJobListViewSlaves
+      // 
+      this.hiveJobListViewSlaves.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.hiveJobListViewSlaves.Caption = "JobItemList View";
+      this.hiveJobListViewSlaves.Content = null;
+      this.hiveJobListViewSlaves.Location = new System.Drawing.Point(7, 7);
+      this.hiveJobListViewSlaves.Name = "hiveJobListViewSlaves";
+      this.hiveJobListViewSlaves.ReadOnly = false;
+      this.hiveJobListViewSlaves.Size = new System.Drawing.Size(499, 463);
+      this.hiveJobListViewSlaves.TabIndex = 0;
       // 
       // HiveAdministrationView
@@ -189,10 +253,16 @@
       this.tabAdmin.ResumeLayout(false);
       this.tabSlaves.ResumeLayout(false);
-      this.tabSlaveGroup.ResumeLayout(false);
-      this.tabSchedule.ResumeLayout(false);
       this.splitSlaves.Panel1.ResumeLayout(false);
       this.splitSlaves.Panel2.ResumeLayout(false);
       ((System.ComponentModel.ISupportInitialize)(this.splitSlaves)).EndInit();
       this.splitSlaves.ResumeLayout(false);
+      this.tabSlaveGroup.ResumeLayout(false);
+      this.tabSchedule.ResumeLayout(false);
+      this.tabJobs.ResumeLayout(false);
+      this.tabUsers.ResumeLayout(false);
+      this.splitUsers.Panel1.ResumeLayout(false);
+      this.splitUsers.Panel2.ResumeLayout(false);
+      ((System.ComponentModel.ISupportInitialize)(this.splitUsers)).EndInit();
+      this.splitUsers.ResumeLayout(false);
       this.ResumeLayout(false);
 
@@ -211,4 +281,8 @@
     private System.Windows.Forms.SplitContainer splitSlaves;
     private ScheduleControl scheduleControl1;
+    private System.Windows.Forms.SplitContainer splitUsers;
+    private System.Windows.Forms.ListView lstUsers;
+    private System.Windows.Forms.GroupBox grpUsersInfo;
+    private HiveJobListView hiveJobListViewSlaves;
   }
 }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs	(revision 5459)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Clients.Hive.Views/3.4/Administration/MenuItems/AdministrationMenuItem.cs	(revision 5469)
@@ -27,5 +27,5 @@
   public class AdministrationMenuItem : HeuristicLab.MainForm.WindowsForms.MenuItem, IOptimizerUserInterfaceItemProvider {
     public override string Name {
-      get { return "&Hive Administration 3.4"; }
+      get { return "& Administration"; }
     }
     public override IEnumerable<string> Structure {
