Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs	(revision 5458)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperiment.cs	(revision 5511)
@@ -29,5 +29,5 @@
   public class HiveExperiment : NamedHiveItem {
     [DataMember]
-    public Guid UserId { get; set; }
+    public Guid OwnerUserId { get; set; }
     [DataMember]
     public Guid RootJobId { get; set; }
@@ -36,11 +36,14 @@
     [DataMember]
     public string ResourceNames { get; set; }
+    [DataMember]
+    public DateTime? LastAccessed { get; set; }
 
     public HiveExperiment() { }
     protected HiveExperiment(HiveExperiment original, Cloner cloner) : base(original, cloner) {
       this.RootJobId = original.RootJobId;
-      this.UserId = original.UserId;
+      this.OwnerUserId = original.OwnerUserId;
       this.DateCreated = original.DateCreated;
       this.ResourceNames = original.ResourceNames;
+      this.LastAccessed = original.LastAccessed;
     }
     public override IDeepCloneable Clone(Cloner cloner) {
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperimentPermission.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperimentPermission.cs	(revision 5511)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/HiveExperimentPermission.cs	(revision 5511)
@@ -0,0 +1,51 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+  [DataContract]
+  [Serializable]
+  public class HiveExperimentPermission : HiveItemBase {
+    [DataMember]
+    public Guid HiveExperimentId { get; set; }
+    [DataMember]
+    public Guid GrantedUserId { get; set; }
+    [DataMember]
+    public Guid GrantedByUserId { get; set; }
+    [DataMember]
+    public Permission Permission { get; set; }
+
+    public HiveExperimentPermission() { }
+
+    protected HiveExperimentPermission(HiveExperimentPermission original, Cloner cloner) : base(original, cloner) {
+      this.HiveExperimentId = original.HiveExperimentId;
+      this.GrantedUserId = original.GrantedUserId;
+      this.GrantedByUserId = original.GrantedByUserId;
+      this.Permission = original.Permission;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new HiveExperimentPermission(this, cloner);
+    }
+  }
+}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs	(revision 5458)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Job.cs	(revision 5511)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
 using System.Runtime.Serialization;
 using HeuristicLab.Common;
@@ -30,6 +29,4 @@
   [Serializable]
   public class Job : LightweightJob {
-    [DataMember]
-    public Guid UserId { get; set; }
     [DataMember]
     public int Priority { get; set; }
@@ -42,10 +39,9 @@
     [DataMember]
     public DateTime? LastHeartbeat { get; set; }
-
+    
     public Job() {
       this.PluginsNeededIds = new List<Guid>();
     }
     protected Job(Job original, Cloner cloner) : base(original, cloner) {
-      this.UserId = original.UserId;
       this.Priority = original.Priority;
       this.CoresNeeded = original.CoresNeeded;
@@ -59,5 +55,5 @@
 
     public override string ToString() {
-      return string.Format("State: {0}, SlaveId: {1}, DateCreated: {2}, DateCalculated: {3}, CoresNeeded: {4}, MemoryNeeded: {5}", JobState, SlaveId, DateCreated, DateCalculated, CoresNeeded, MemoryNeeded);
+      return string.Format("State: {0}, SlaveId: {1}, DateCreated: {2}, DateCalculated: {3}, CoresNeeded: {4}, MemoryNeeded: {5}", State, CurrentStateLog.SlaveId, DateCreated, CoresNeeded, MemoryNeeded);
     }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs	(revision 5458)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/JobState.cs	(revision 5511)
@@ -33,8 +33,18 @@
     Waiting,
 
-        /// <summary>
+    /// <summary>
+    /// The job is set to Finished when all child jobs are Finished.
+    /// </summary>
+    FinishOnChildJobsFinished,
+
+    /// <summary>
     /// The job is paused and waits on the server to be sent back to a Slave when all of its child jobs are Finished.
     /// </summary>
-    WaitingForChildJobs,
+    ResumeOnChildJobsFinished,
+
+    /// <summary>
+    /// Job is beeing transferred
+    /// </summary>
+    Transferring,
 
     /// <summary>
@@ -72,5 +82,5 @@
     public static bool IsWaiting(this JobState jobState) {
       return jobState == JobState.Waiting ||
-        jobState == JobState.WaitingForChildJobs;
+        jobState == JobState.FinishOnChildJobsFinished;
     }
 
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs	(revision 5458)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/LightweightJob.cs	(revision 5511)
@@ -21,4 +21,6 @@
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using System.Runtime.Serialization;
 using HeuristicLab.Common;
@@ -29,46 +31,49 @@
   public class LightweightJob : HiveItem {
     [DataMember]
-    public Guid? SlaveId { get; set; }
-    [DataMember]
-    public JobState JobState { get; set; }
-    [DataMember]
     public TimeSpan? ExecutionTime { get; set; }
     [DataMember]
-    public String Exception { get; set; }
+    public Guid? ParentJobId { get; set; }
     [DataMember]
-    public DateTime DateCreated { get; set; }
+    public List<StateLog> StateLog { get; set; }
     [DataMember]
-    public DateTime? DateCalculated { get; set; }
-    [DataMember]
-    public DateTime? DateFinished { get; set; }
-    [DataMember]
-    public Guid? ParentJobId { get; set; }
+    public JobState State { get; set; }
+
+    public StateLog CurrentStateLog { get { return StateLog.Last(); } }
+    public DateTime DateCreated { get { return StateLog.First().DateTime; } }
+    public DateTime? DateFinished { get { return CurrentStateLog.State == JobState.Finished ? new DateTime?(CurrentStateLog.DateTime) : null; } }
 
     public LightweightJob() {
-      JobState = DataTransfer.JobState.Offline;
+      StateLog = new List<DataTransfer.StateLog>();
     }
+
     public LightweightJob(Job job) {
-      this.SlaveId = job.SlaveId;
-      this.JobState = job.JobState;
       this.ExecutionTime = job.ExecutionTime;
-      this.Exception = job.Exception;
-      this.DateCreated = job.DateCreated;
-      this.DateCalculated = job.DateCalculated;
-      this.DateFinished = job.DateFinished;
       this.ParentJobId = job.ParentJobId;
+      this.StateLog = new List<StateLog>();
     }
-    protected LightweightJob(LightweightJob original, Cloner cloner) : base(original, cloner) {
-      this.SlaveId = original.SlaveId;
-      this.JobState = original.JobState;
+    protected LightweightJob(LightweightJob original, Cloner cloner)
+      : base(original, cloner) {
       this.ExecutionTime = original.ExecutionTime;
-      this.Exception = original.Exception;
-      this.DateCreated = original.DateCreated;
-      this.DateCalculated = original.DateCalculated;
-      this.DateFinished = original.DateFinished;
       this.ParentJobId = original.ParentJobId;
+      this.StateLog = new List<StateLog>(original.StateLog);
     }
     public override IDeepCloneable Clone(Cloner cloner) {
       return new LightweightJob(this, cloner);
     }
+
+    public void SetState(JobState state) {
+      this.State = state;
+      this.StateLog.Add(new StateLog() { State = state, DateTime = DateTime.Now });
+    }
+
+    public void SetState(JobState state, Guid userId) {
+      this.State = state;
+      this.StateLog.Add(new StateLog() { State = state, DateTime = DateTime.Now, UserId = userId });
+    }
+
+    public void SetState(JobState state, Guid slaveId, string exception) {
+      this.State = state;
+      this.StateLog.Add(new StateLog() { State = state, DateTime = DateTime.Now, SlaveId = slaveId, Exception = exception });
+    }
   }
 }
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Permission.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Permission.cs	(revision 5511)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/Permission.cs	(revision 5511)
@@ -0,0 +1,44 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+  public enum Permission {
+    /// <summary>
+    /// User is not allowed to access
+    /// </summary>
+    NotAllowed,
+    
+    /// <summary>
+    /// User can only download and view experiments
+    /// </summary>
+    ReadOnly,
+
+    /// <summary>
+    /// User can also Pause, Stop, Restart experiments
+    /// </summary>
+    Write,
+
+    /// <summary>
+    /// User can also delete experiment
+    /// </summary>
+    Full
+  }
+}
Index: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/StateLog.cs
===================================================================
--- branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/StateLog.cs	(revision 5511)
+++ branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Common/3.4/DataTransfer/StateLog.cs	(revision 5511)
@@ -0,0 +1,57 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Runtime.Serialization;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Services.Hive.Common.DataTransfer {
+  [DataContract]
+  [Serializable]
+  public class StateLog : HiveItem {
+    [DataMember]
+    public DateTime DateTime { get; set; }
+    [DataMember]
+    public Guid? UserId { get; set; }
+    [DataMember]
+    public Guid? SlaveId { get; set; }
+    [DataMember]
+    public string Exception { get; set; }
+    [DataMember]
+    public JobState State { get; set; }
+    [DataMember]
+    public Guid JobId { get; set; }
+
+    public StateLog() { }
+
+    protected StateLog(StateLog original, Cloner cloner) : base(original, cloner) {
+      this.DateTime = original.DateTime;
+      this.UserId = original.UserId;
+      this.SlaveId = original.SlaveId;
+      this.Exception = original.Exception;
+      this.State = original.State;
+      this.JobId = original.JobId;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new StateLog(this, cloner);
+    }
+  }
+}
