Index: /trunk/sources/HeuristicLab.Grid/3.2/ProcessingEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Grid/3.2/ProcessingEngine.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Grid/3.2/ProcessingEngine.cs	(revision 3578)
@@ -81,5 +81,5 @@
         } catch(Exception ex) {
           errorMessage = CreateErrorMessage(ex);
-          HeuristicLab.Tracing.HiveLogger.Error(errorMessage);
+          HeuristicLab.Tracing.Logger.Error(errorMessage);
           // push operation on stack again
           myExecutionStack.Push(atomicOperation);
Index: /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Common/3.2/HeuristicLab.Hive.Client.Common-3.2.csproj	(revision 3578)
@@ -82,5 +82,4 @@
   <ItemGroup>
     <Compile Include="CommonPlugin.cs" />
-    <Compile Include="Logging.cs" />
     <Compile Include="MessageQueue.cs" />
     <Compile Include="NetworkEnum.cs" />
Index: /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/CommunicationsPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/CommunicationsPlugin.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/CommunicationsPlugin.cs	(revision 3578)
@@ -35,4 +35,5 @@
   [PluginDependency("HeuristicLab.Hive.Client.Common-3.2")]
   [PluginDependency("HeuristicLab.Hive.Contracts-3.2")]
+  [PluginDependency("HeuristicLab.Tracing")]
   public class CommunicationsPlugin : PluginBase {
   }
Index: /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/HeuristicLab.Hive.Client.Communication-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/HeuristicLab.Hive.Client.Communication-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/HeuristicLab.Hive.Client.Communication-3.2.csproj	(revision 3578)
@@ -120,4 +120,8 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs	(revision 3578)
@@ -33,4 +33,5 @@
 using System.IO;
 using System.Runtime.Serialization.Formatters.Binary;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Client.Communication {
@@ -45,6 +46,7 @@
     /// <returns>the Instance of the WcfService class</returns>
     public static WcfService Instance {
-      get {
+      get {        
         if (instance == null) {
+          Logger.Debug("New WcfService Instance created");
           instance = new WcfService();
         }
@@ -76,13 +78,18 @@
     public void Connect() {
       try {
+        Logger.Debug("Starting the Connection Process");
         if (String.Empty.Equals(ServerIP) || ServerPort == 0) {
-          Logging.Instance.Info(this.ToString(), "No Server IP or Port set!");
+          Logger.Info("No Server IP or Port set!");
           return;
         }
+
+        Logger.Debug("Creating the new connection proxy");
         proxy = new ClientFacadeClient(
           WcfSettings.GetStreamedBinding(),
           new EndpointAddress("net.tcp://" + ServerIP + ":" + ServerPort + "/HiveServer/ClientCommunicator")
         );
-
+        Logger.Debug("Created the new connection proxy");
+
+        Logger.Debug("Registring new Events");
         proxy.LoginCompleted += new EventHandler<LoginCompletedEventArgs>(proxy_LoginCompleted);
         proxy.SendStreamedJobCompleted += new EventHandler<SendStreamedJobCompletedEventArgs>(proxy_SendStreamedJobCompleted);
@@ -90,12 +97,17 @@
         proxy.ProcessSnapshotStreamedCompleted += new EventHandler<ProcessSnapshotStreamedCompletedEventArgs>(proxy_ProcessSnapshotStreamedCompleted);
         proxy.ProcessHeartBeatCompleted += new EventHandler<ProcessHeartBeatCompletedEventArgs>(proxy_ProcessHeartBeatCompleted);
+        Logger.Debug("Registered new Events");
+        Logger.Debug("Opening the Connection");
         proxy.Open();
+        Logger.Debug("Opened the Connection");
 
         ConnState = NetworkEnum.WcfConnState.Connected;
         ConnectedSince = DateTime.Now;
-        
-        if (Connected != null)
-          Connected(this, new EventArgs());                               
-        //Todo: This won't be hit. EVER        
+
+        if (Connected != null) {
+          Logger.Debug("Calling the connected Event");
+          Connected(this, new EventArgs());
+          //Todo: This won't be hit. EVER        
+        }
         if (ConnState == NetworkEnum.WcfConnState.Failed)
           ConnectionRestored(this, new EventArgs());        
@@ -113,4 +125,5 @@
     /// <param name="serverPort">current Server Port</param>
     public void Connect(String serverIP, int serverPort) {
+      Logger.Debug("Called Connected with " + serverIP + ":" + serverPort);
       String oldIp = this.ServerIP;
       int oldPort = this.ServerPort;
@@ -124,4 +137,5 @@
 
     public void SetIPAndPort(String serverIP, int serverPort) {
+      Logger.Debug("Called with " + serverIP + ":" + serverPort);
       this.ServerIP = serverIP;
       this.ServerPort = serverPort;
@@ -141,5 +155,5 @@
     private void HandleNetworkError(Exception e) {
       ConnState = NetworkEnum.WcfConnState.Failed;
-      Logging.Instance.Error(this.ToString(), "exception: ", e);
+      Logger.Error("Network exception occurred: " + e);
     }
 
@@ -152,11 +166,14 @@
     public event System.EventHandler<LoginCompletedEventArgs> LoginCompleted;
     public void LoginAsync(ClientDto clientInfo) {
-      if (ConnState == NetworkEnum.WcfConnState.Connected)
+      if (ConnState == NetworkEnum.WcfConnState.Connected) {
+        Logger.Debug("STARTED: Login Async");
         proxy.LoginAsync(clientInfo);
+      }
     }
     private void proxy_LoginCompleted(object sender, LoginCompletedEventArgs e) {
-      if (e.Error == null)
+      if (e.Error == null) {
+        Logger.Debug("ENDED: Login Async");
         LoginCompleted(sender, e);
-      else
+      } else
         HandleNetworkError(e.Error.InnerException);
     }
@@ -165,11 +182,12 @@
       try {
         if (ConnState == NetworkEnum.WcfConnState.Connected) {
+          Logger.Debug("STARTED: Login Sync");
           Response res = proxy.Login(clientInfo);
           if (!res.Success) {
-            Logging.Instance.Error(this.ToString(), "Login Failed! " + res.StatusMessage);
-            HandleNetworkError(new Exception(res.StatusMessage));
+            Logger.Error("FAILED: Login Failed! " + res.StatusMessage);
+            throw new Exception(res.StatusMessage);
           } else {
-            ConnState = NetworkEnum.WcfConnState.Loggedin;
-            Logging.Instance.Info(this.ToString(), res.StatusMessage);
+            Logger.Info("ENDED: Login succeeded" + res.StatusMessage);
+            ConnState = NetworkEnum.WcfConnState.Loggedin;            
           }
         }
@@ -188,10 +206,13 @@
     public event System.EventHandler<SendJobCompletedEventArgs> SendJobCompleted;
     public void SendJobAsync(Guid guid) {
-      if (ConnState == NetworkEnum.WcfConnState.Loggedin)        
+      if (ConnState == NetworkEnum.WcfConnState.Loggedin) {
+        Logger.Debug("STARTED: Fetching of Jobs from Server for Client");
         proxy.SendStreamedJobAsync(guid);
+      }
     }
 
     void proxy_SendStreamedJobCompleted(object sender, SendStreamedJobCompletedEventArgs e) {
       if (e.Error == null) {
+        Logger.Debug("ENDED: Fetching of Jobs from Server for Client");
         Stream stream = null;
         MemoryStream memStream = null;
@@ -220,6 +241,7 @@
             new SendJobCompletedEventArgs(new object[] { response, memStream.GetBuffer() }, e.Error, e.Cancelled, e.UserState);
           SendJobCompleted(sender, completedEventArgs);
-        }
-        finally {
+        } catch (Exception ex) {
+          Logger.Error(ex);
+        } finally {
           if(stream != null)
             stream.Dispose();
@@ -241,21 +263,28 @@
     public void StoreFinishedJobResultAsync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception, bool finished) {
       if (ConnState == NetworkEnum.WcfConnState.Loggedin) {
+        Logger.Debug("STARTED: Sending back the finished job results");
+        Logger.Debug("Building stream");
         Stream stream =
           GetStreamedJobResult(clientId, jobId, result, percentage, exception);
-
+        Logger.Debug("Builded stream");
+        Logger.Debug("Making the call");
         proxy.StoreFinishedJobResultStreamedAsync(stream, stream);
       }
      }
     private void proxy_StoreFinishedJobResultStreamedCompleted(object sender, StoreFinishedJobResultStreamedCompletedEventArgs e) {
+      Logger.Debug("Finished storing the job");
       Stream stream =
         (Stream)e.UserState;
-      if (stream != null)
+      if (stream != null) {
+        Logger.Debug("Stream not null, disposing it");
         stream.Dispose();
-      
+      }
       if (e.Error == null) {
         StoreFinishedJobResultCompletedEventArgs args =
           new StoreFinishedJobResultCompletedEventArgs(
             new object[] { e.Result }, e.Error, e.Cancelled, e.UserState);
+        Logger.Debug("calling the Finished Job Event");
         StoreFinishedJobResultCompleted(sender, args);
+        Logger.Debug("ENDED: Sending back the finished job results");
       } else
         HandleNetworkError(e.Error);
@@ -300,15 +329,18 @@
     public void SendHeartBeatAsync(HeartBeatData hbd) {
       if (ConnState == NetworkEnum.WcfConnState.Loggedin)
+        Logger.Debug("STARTING: sending heartbeat");
         proxy.ProcessHeartBeatAsync(hbd);
     }
 
     private void proxy_ProcessHeartBeatCompleted(object sender, ProcessHeartBeatCompletedEventArgs e) {
-      if (e.Error == null && e.Result.Success == true)
+      if (e.Error == null && e.Result.Success == true) {
         SendHeartBeatCompleted(sender, e);
-      else {
+        Logger.Debug("ENDED: sending heartbeats");
+      } else {
         try {
-          Logging.Instance.Error(this.ToString(), "Error: " + e.Result.StatusMessage);
-        } catch (Exception ex) {
-          Logging.Instance.Error(this.ToString(), "Error: ", ex);          
+          Logger.Error("Error: " + e.Result.StatusMessage);
+        }
+        catch (Exception ex) {
+          Logger.Error("Error: ", ex);
         }
         HandleNetworkError(e.Error);
@@ -351,5 +383,8 @@
     public Response IsJobStillNeeded(Guid jobId) {
       try {
-        return proxy.IsJobStillNeeded(jobId);
+        Logger.Debug("STARTING: Sync call: IsJobStillNeeded");
+        Response res = proxy.IsJobStillNeeded(jobId);
+        Logger.Debug("ENDED: Sync call: IsJobStillNeeded");
+        return res;
       }
       catch (Exception e) {
@@ -361,6 +396,5 @@
 
     public ResponseResultReceived ProcessSnapshotSync(Guid clientId, Guid jobId, byte[] result, double percentage, Exception exception) {
-      try {
-        Logging.Instance.Info(this.ToString(), "Snapshot for Job " + jobId + " submitted");
+      try {        
         return proxy.ProcessSnapshotStreamed(
           GetStreamedJobResult(clientId, jobId, result, percentage, exception));
@@ -374,9 +408,15 @@
     public List<CachedHivePluginInfoDto> RequestPlugins(List<HivePluginInfoDto> requestedPlugins) {
       try {
+        Logger.Debug("STARTED: Requesting Plugins for Job");
+        Logger.Debug("STARTED: Getting the stream");
         Stream stream = proxy.SendStreamedPlugins(requestedPlugins.ToArray());
-
+        Logger.Debug("ENDED: Getting the stream");
         BinaryFormatter formatter =
           new BinaryFormatter();
+        Logger.Debug("STARTED: Deserializing the stream");
         ResponsePlugin response = (ResponsePlugin)formatter.Deserialize(stream);
+        Logger.Debug("ENDED: Deserializing the stream");
+        if (stream != null)
+          stream.Dispose();        
         return response.Plugins;        
       }
@@ -389,5 +429,7 @@
     public void Logout(Guid guid) {
       try {
+        Logger.Debug("STARTED: Logout");
         proxy.Logout(guid);
+        Logger.Debug("ENDED: Logout");
       }
       catch (Exception e) {
@@ -398,5 +440,8 @@
     public ResponseCalendar GetCalendarSync(Guid clientId) {
       try {
-        return proxy.GetCalendar(clientId);        
+        Logger.Debug("STARTED: Syncing Calendars");
+        ResponseCalendar cal = proxy.GetCalendar(clientId);
+        Logger.Debug("ENDED: Syncing Calendars");
+        return cal;
       }
       catch (Exception e) {
@@ -408,5 +453,8 @@
     public Response SetCalendarStatus (Guid clientId, CalendarState state) {
       try {
-        return proxy.SetCalendarStatus(clientId, state);        
+        Logger.Debug("STARTED: Setting Calendar status to: " + state);
+        Response resp = proxy.SetCalendarStatus(clientId, state);
+        Logger.Debug("ENDED: Setting Calendar status to: " + state);
+        return resp;
       } catch (Exception e) {
         HandleNetworkError(e);
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/ConfigurationManager/UptimeManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/ConfigurationManager/UptimeManager.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/ConfigurationManager/UptimeManager.cs	(revision 3578)
@@ -9,4 +9,5 @@
 using HeuristicLab.Hive.Contracts.BusinessObjects;
 using HeuristicLab.Hive.Contracts;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Client.Core.ConfigurationManager {
@@ -49,5 +50,5 @@
       }
       catch (Exception e) {
-        Logging.Instance.Error(this.ToString(), "Persistance of the Calendar failed!", e);
+        Logger.Error("Persistance of the Calendar failed!", e);
       }
       finally {
@@ -68,6 +69,6 @@
         }
         catch (Exception e) {
-          Logging.Instance.Error(this.ToString(), "Deserialization of Calendar failed", e);
-          Logging.Instance.Info(this.ToString(), "Starting with a new one");
+          Logger.Error("Deserialization of Calendar failed", e);
+          Logger.Info("Starting with a new one");
           _appContainer = new AppointmentContainer();
           CalendarAvailable = false;
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 3578)
@@ -44,4 +44,5 @@
 using HeuristicLab.Hive.JobBase;
 using HeuristicLab.Hive.Client.Core.JobStorage;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Client.Core {
@@ -51,5 +52,14 @@
   public class Core : MarshalByRefObject {
     public static bool abortRequested { get; set; }
-    private bool currentlyFetching = false;
+
+    private bool _currentlyFetching;
+    private bool CurrentlyFetching { 
+      get {
+        return _currentlyFetching;
+      } set {        
+        _currentlyFetching = value;
+        Logger.Debug("Set CurrentlyFetching to " + _currentlyFetching);
+      } 
+    }
 
     private Dictionary<Guid, Executor> engines = new Dictionary<Guid, Executor>();
@@ -65,5 +75,5 @@
     public void Start() {
       abortRequested = false;
-      Logging.Instance.Info(this.ToString(), "Hive Client started");
+      Logger.Info("Hive Client started");
       ClientConsoleServer server = new ClientConsoleServer();
       server.StartClientConsoleServer(new Uri("net.tcp://127.0.0.1:8000/ClientConsole/"));
@@ -104,5 +114,5 @@
         DetermineAction(container);
       }
-      System.Console.WriteLine("ended");
+      Logger.Info("Program shutdown");
     }
 
@@ -112,5 +122,5 @@
     /// <param name="container">The Container, containing the message</param>
     private void DetermineAction(MessageContainer container) {
-      Logging.Instance.Info(this.ToString(), "Message: " + container.Message.ToString() + " for job: " + container.JobId);        
+      Logger.Info("Message: " + container.Message.ToString() + " for job: " + container.JobId);        
       switch (container.Message) {
         //Server requests to abort a job
@@ -119,5 +129,5 @@
             engines[container.JobId].Abort();
           else
-            Logging.Instance.Error(this.ToString(), "AbortJob: Engine doesn't exist");
+            Logger.Error("AbortJob: Engine doesn't exist");
           break;
         //Job has been successfully aborted
@@ -136,5 +146,5 @@
               GC.Collect();
             } else
-              Logging.Instance.Error(this.ToString(), "JobAbort: Engine doesn't exist");
+              Logger.Error("JobAbort: Engine doesn't exist");
           }
           break;
@@ -146,5 +156,5 @@
             engines[container.JobId].RequestSnapshot();
           else
-            Logging.Instance.Error(this.ToString(), "RequestSnapshot: Engine doesn't exist");
+            Logger.Error("RequestSnapshot: Engine doesn't exist");
           break;
 
@@ -158,9 +168,9 @@
         //Pull a Job from the Server
         case MessageContainer.MessageType.FetchJob:          
-          if (!currentlyFetching) {
+          if (!CurrentlyFetching) {
             wcfService.SendJobAsync(ConfigManager.Instance.GetClientInfo().Id);
-            currentlyFetching = true;
+            CurrentlyFetching = true;
           } else
-            Logging.Instance.Info(this.ToString(), "Currently fetching, won't fetch this time!");
+            Logger.Info("Currently fetching, won't fetch this time!");
           break;          
         
@@ -174,10 +184,10 @@
         //When the timeslice is up
         case MessageContainer.MessageType.UptimeLimitDisconnect:
-          Logging.Instance.Info(this.ToString(), "Uptime Limit reached, storing jobs and sending them back");
+          Logger.Info("Uptime Limit reached, storing jobs and sending them back");
 
           //check if there are running jobs
           if (engines.Count > 0) {
             //make sure there is no more fetching of jobs while the snapshots get processed
-            currentlyFetching = true;
+            CurrentlyFetching = true;
             //request a snapshot of each running job
             foreach (KeyValuePair<Guid, Executor> kvp in engines) {
@@ -193,26 +203,23 @@
           //Fetch or Force Fetch Calendar!
         case MessageContainer.MessageType.FetchOrForceFetchCalendar:
-          ResponseCalendar rescal = wcfService.GetCalendarSync(ConfigManager.Instance.GetClientInfo().Id);
-          if(rescal.Success) {
-            if(!UptimeManager.Instance.SetAppointments(false, rescal)) {
-              wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);              
-            } else {
-              wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.Fetched);              
-            }
-          } else {
-            wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);
-          }
+          Logger.Info("Fetch Calendar from Server");
+          FetchCalendarFromServer();  
         break;
 
         //Hard shutdown of the client
         case MessageContainer.MessageType.Shutdown:
+          Logger.Info("Shutdown Signal received");
           lock (engines) {
+            Logger.Debug("engines locked");
             foreach (KeyValuePair<Guid, AppDomain> kvp in appDomains) {
+              Logger.Debug("Shutting down Appdomain for " + kvp.Key);
               appDomains[kvp.Key].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
               AppDomain.Unload(kvp.Value);
             }
           }
+          Logger.Debug("Stopping heartbeat");
           abortRequested = true;
           beat.StopHeartBeat();
+          Logger.Debug("Logging out");
           WcfService.Instance.Logout(ConfigManager.Instance.GetClientInfo().Id);
           break;
@@ -230,8 +237,8 @@
     private void GetFinishedJob(object jobId) {
       Guid jId = (Guid)jobId;
-      Logging.Instance.Info(this.ToString(), "Getting the finished job with id: " + jId);
+      Logger.Info("Getting the finished job with id: " + jId);
       try {
         if (!engines.ContainsKey(jId)) {
-          Logging.Instance.Error(this.ToString(), "GetFinishedJob: Engine doesn't exist");
+          Logger.Info("Engine doesn't exist");
           return;
         }
@@ -240,5 +247,5 @@
 
         if (WcfService.Instance.ConnState == NetworkEnum.WcfConnState.Loggedin) {
-          Logging.Instance.Info(this.ToString(), "Sending the finished job with id: " + jId);
+          Logger.Info("Sending the finished job with id: " + jId);
           wcfService.StoreFinishedJobResultAsync(ConfigManager.Instance.GetClientInfo().Id,
             jId,
@@ -248,25 +255,27 @@
             true);
         } else {
-          Logging.Instance.Info(this.ToString(), "Storing the finished job with id: " + jId + " to hdd");
+          Logger.Info("Storing the finished job with id: " + jId + " to hdd");
           JobStorageManager.PersistObjectToDisc(wcfService.ServerIP, wcfService.ServerPort, jId, sJob);
           lock (engines) {
             appDomains[jId].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
             AppDomain.Unload(appDomains[jId]);
-            appDomains.Remove(jId);
-            engines.Remove(jId);
+            Logger.Debug("Unloaded appdomain");
+            appDomains.Remove(jId);            
+            engines.Remove(jId);            
             jobs.Remove(jId);
+            Logger.Debug("Removed job from appDomains, Engines and Jobs");
           }
         }
       }
       catch (InvalidStateException ise) {
-        Logging.Instance.Error(this.ToString(), "Exception: ", ise);
+        Logger.Error("Invalid State while Snapshoting:", ise);
       }
     }
 
     private void GetSnapshot(object jobId) {
-      Logging.Instance.Info(this.ToString(), "Fetching a snapshot for job " + jobId);
+      Logger.Info("Fetching a snapshot for job " + jobId);
       Guid jId = (Guid)jobId;
       byte[] obj = engines[jId].GetSnapshot();
-      Logging.Instance.Info(this.ToString(), "BEGIN: Sending snapshot sync");
+      Logger.Debug("BEGIN: Sending snapshot sync");
       wcfService.ProcessSnapshotSync(ConfigManager.Instance.GetClientInfo().Id,
         jId,
@@ -274,15 +283,23 @@
         engines[jId].Progress,
         null);
-      Logging.Instance.Info(this.ToString(), "END: Sended snapshot sync");
+      Logger.Debug("END: Sended snapshot sync");
       //Uptime Limit reached, now is a good time to destroy this jobs.
+      Logger.Debug("Checking if uptime limit is reached");
       if (!UptimeManager.Instance.IsOnline()) {
+        Logger.Debug("Uptime limit reached");
+        Logger.Debug("Killing Appdomain");
         KillAppDomain(jId);
-        //Still anything running?
-        if (engines.Count == 0)
+        //Still anything running?  
+        if (engines.Count == 0) {
+          Logger.Info("All jobs snapshotted and sent back, disconnecting");          
           WcfService.Instance.Disconnect();
+        } else {
+          Logger.Debug("There are still active Jobs in the Field, not disconnecting");
+        }
 
       } else {
-        Logging.Instance.Info(this.ToString(), "Restarting the job" + jobId);
+        Logger.Debug("Restarting the job" + jobId);
         engines[jId].StartOnlyJob();
+        Logger.Info("Restarted the job" + jobId);
       }
     }
@@ -299,8 +316,8 @@
     void wcfService_LoginCompleted(object sender, LoginCompletedEventArgs e) {
       if (e.Result.Success) {
-        currentlyFetching = false;
-        Logging.Instance.Info(this.ToString(), "Login completed to Hive Server @ " + DateTime.Now);
+        CurrentlyFetching = false;
+        Logger.Info("Login completed to Hive Server @ " + DateTime.Now);
       } else
-        Logging.Instance.Error(this.ToString(), e.Result.StatusMessage);
+        Logger.Error("Error during login: " + e.Result.StatusMessage);
     }
 
@@ -312,11 +329,11 @@
     void wcfService_SendJobCompleted(object sender, SendJobCompletedEventArgs e) {
       if (e.Result.StatusMessage != ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOBS_LEFT) {
-        Logging.Instance.Info(this.ToString(), "Received new job with id " + e.Result.Job.Id);      
+        Logger.Info("Received new job with id " + e.Result.Job.Id);      
         bool sandboxed = false;
         List<byte[]> files = new List<byte[]>();
-        Logging.Instance.Info(this.ToString(), "Fetching plugins for job " + e.Result.Job.Id);
+        Logger.Debug("Fetching plugins for job " + e.Result.Job.Id);
         foreach (CachedHivePluginInfoDto plugininfo in PluginCache.Instance.GetPlugins(e.Result.Job.PluginsNeeded))
           files.AddRange(plugininfo.PluginFiles);
-        Logging.Instance.Info(this.ToString(), "Plugins fetched for job " + e.Result.Job.Id);
+        Logger.Debug("Plugins fetched for job " + e.Result.Job.Id);
         AppDomain appDomain = HeuristicLab.PluginInfrastructure.Sandboxing.SandboxManager.CreateAndInitSandbox(e.Result.Job.Id.ToString(), files);
         appDomain.UnhandledException += new UnhandledExceptionEventHandler(appDomain_UnhandledException);
@@ -325,10 +342,10 @@
             jobs.Add(e.Result.Job.Id, e.Result.Job);
             appDomains.Add(e.Result.Job.Id, appDomain);
-            Logging.Instance.Info(this.ToString(), "Creating AppDomain");
+            Logger.Debug("Creating AppDomain");
             Executor engine = (Executor)appDomain.CreateInstanceAndUnwrap(typeof(Executor).Assembly.GetName().Name, typeof(Executor).FullName);
-            Logging.Instance.Info(this.ToString(), "Created AppDomain");
+            Logger.Debug("Created AppDomain");
             engine.JobId = e.Result.Job.Id;
             engine.Queue = MessageQueue.GetInstance();
-            Logging.Instance.Info(this.ToString(), "Starting Engine for job " + e.Result.Job.Id);
+            Logger.Debug("Starting Engine for job " + e.Result.Job.Id);
             engine.Start(e.Data);
             engines.Add(e.Result.Job.Id, engine);
@@ -336,10 +353,10 @@
             ClientStatusInfo.JobsFetched++;
 
-            Debug.WriteLine("Increment FetchedJobs to:" + ClientStatusInfo.JobsFetched);
+            Logger.Info("Increment FetchedJobs to:" + ClientStatusInfo.JobsFetched);
           }
         }
       } else
-        Logging.Instance.Info(this.ToString(), "No more jobs left!");
-      currentlyFetching = false;
+        Logger.Info("No more jobs left!");
+      CurrentlyFetching = false;
     }
 
@@ -350,11 +367,11 @@
     /// <param name="e"></param>
     void wcfService_StoreFinishedJobResultCompleted(object sender, StoreFinishedJobResultCompletedEventArgs e) {
-      Logging.Instance.Info(this.ToString(), "Job submitted with id " + e.Result.JobId);
+      Logger.Info("Job submitted with id " + e.Result.JobId);
       KillAppDomain(e.Result.JobId);
       if (e.Result.Success) {
         ClientStatusInfo.JobsProcessed++;
-        Debug.WriteLine("ProcessedJobs to:" + ClientStatusInfo.JobsProcessed);
+        Logger.Info("Increased ProcessedJobs to:" + ClientStatusInfo.JobsProcessed);
       } else {
-        Logging.Instance.Error(this.ToString(), "Sending of job " + e.Result.JobId + " failed, job has been wasted. Message: " + e.Result.StatusMessage);
+        Logger.Error("Sending of job " + e.Result.JobId + " failed, job has been wasted. Message: " + e.Result.StatusMessage);
       }
     }
@@ -366,5 +383,5 @@
     /// <param name="e"></param>
     void wcfService_ProcessSnapshotCompleted(object sender, ProcessSnapshotCompletedEventArgs e) {
-      Logging.Instance.Info(this.ToString(), "Snapshot " + e.Result.JobId + " has been transmitted according to plan.");
+      Logger.Info("Snapshot " + e.Result.JobId + " has been transmitted according to plan.");
     }
 
@@ -375,5 +392,5 @@
     /// <param name="e"></param>
     void wcfService_ServerChanged(object sender, EventArgs e) {
-      Logging.Instance.Info(this.ToString(), "ServerChanged has been called");
+      Logger.Info("ServerChanged has been called");
       lock (engines) {
         foreach (KeyValuePair<Guid, Executor> entries in engines) {
@@ -394,22 +411,33 @@
     /// <param name="e"></param>
     void wcfService_Connected(object sender, EventArgs e) {
+      Logger.Info("WCF Service got a connection");
       if (!UptimeManager.Instance.CalendarAvailable) {
-        ResponseCalendar calres = wcfService.GetCalendarSync(ConfigManager.Instance.GetClientInfo().Id);
-        if(calres.Success) {
-          if (UptimeManager.Instance.SetAppointments(false, calres))
-            wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.Fetched);
-          else
-            wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);
-        }
-        else {
-          wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);
-        }
+        Logger.Info("No local calendar available, fetch it");
+        FetchCalendarFromServer();
       }
       //if the fetching from the server failed - still set the client online... maybe we get 
-      //a result within the next few heartbeats
+      //a result within the next few heartbeats      
       if (!UptimeManager.Instance.CalendarAvailable || UptimeManager.Instance.IsOnline()) {
+        Logger.Info("CalendarAvailable is " + UptimeManager.Instance.CalendarAvailable + " and IsOnline is: " + UptimeManager.Instance.IsOnline());
+        Logger.Info("Setting client online");
         wcfService.LoginSync(ConfigManager.Instance.GetClientInfo());
         JobStorageManager.CheckAndSubmitJobsFromDisc();
-        currentlyFetching = false;
+        CurrentlyFetching = false;
+      }
+    }
+
+    private void FetchCalendarFromServer() {
+      ResponseCalendar calres = wcfService.GetCalendarSync(ConfigManager.Instance.GetClientInfo().Id);
+      if(calres.Success) {
+        if (UptimeManager.Instance.SetAppointments(false, calres)) {
+          Logger.Info("Remote calendar installed");
+          wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.Fetched);
+        } else {
+          Logger.Info("Remote calendar installation failed, setting state to " + CalendarState.NotAllowedToFetch);
+          wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);
+        }
+      } else {
+        Logger.Info("Remote calendar installation failed, setting state to " + CalendarState.NotAllowedToFetch);
+        wcfService.SetCalendarStatus(ConfigManager.Instance.GetClientInfo().Id, CalendarState.NotAllowedToFetch);
       }
     }
@@ -417,9 +445,9 @@
     //this is a little bit tricky - 
     void wcfService_ConnectionRestored(object sender, EventArgs e) {
-      Logging.Instance.Info(this.ToString(), "Reconnected to old server - checking currently running appdomains");
+      Logger.Info("Reconnected to old server - checking currently running appdomains");
 
       foreach (KeyValuePair<Guid, Executor> execKVP in engines) {
         if (!execKVP.Value.Running && execKVP.Value.CurrentMessage == MessageContainer.MessageType.NoMessage) {
-          Logging.Instance.Info(this.ToString(), "Checking for JobId: " + execKVP.Value.JobId);
+          Logger.Info("Checking for JobId: " + execKVP.Value.JobId);
           Thread finThread = new Thread(new ParameterizedThreadStart(GetFinishedJob));
           finThread.Start(execKVP.Value.JobId);
@@ -435,5 +463,5 @@
 
     void appDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
-      Logging.Instance.Error(this.ToString(), "Exception in AppDomain: " + e.ExceptionObject.ToString());
+      Logger.Error("Exception in AppDomain: " + e.ExceptionObject.ToString());    
     }
 
@@ -447,5 +475,5 @@
     /// <param name="id">the GUID of the job</param>
     private void KillAppDomain(Guid id) {
-      Logging.Instance.Info(this.ToString(), "Shutting down Appdomain for Job " + id);
+      Logger.Debug("Shutting down Appdomain for Job " + id);
       lock (engines) {
         try {
@@ -457,5 +485,5 @@
         }
         catch (Exception ex) {
-          Logging.Instance.Error(this.ToString(), "Exception when unloading the appdomain: ", ex);
+          Logger.Error("Exception when unloading the appdomain: ", ex);
         }
       }
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/CorePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/CorePlugin.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/CorePlugin.cs	(revision 3578)
@@ -36,4 +36,5 @@
   [PluginDependency("HeuristicLab.Hive.Contracts-3.2")]
   [PluginDependency("HeuristicLab.Hive.JobBase-3.2")]
+  [PluginDependency("HeuristicLab.Tracing", "3.2.0")]
   public class CorePlugin: PluginBase {
   }
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Heartbeat.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Heartbeat.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Heartbeat.cs	(revision 3578)
@@ -32,4 +32,5 @@
 using HeuristicLab.Hive.Client.Core.ConfigurationManager;
 using HeuristicLab.Hive.Client.Communication.ServerService;
+using HeuristicLab.Tracing;
 //using BO = HeuristicLab.Hive.Contracts.BusinessObjects;
 
@@ -92,5 +93,5 @@
           //That's quiet simple: Just reconnect and you're good for new jobs
           if (wcfService.ConnState != NetworkEnum.WcfConnState.Loggedin) {
-            Logging.Instance.Info(this.ToString(), "Client goes online according to timetable");
+            Logger.Info("Client goes online according to timetable");
             wcfService.Connect();
           }
@@ -103,5 +104,5 @@
         wcfService.Connect();
       } else if (wcfService.ConnState == NetworkEnum.WcfConnState.Loggedin) {
-        Logging.Instance.Info(this.ToString(), "Sending Heartbeat: " + heartBeatData);        
+        Logger.Debug("Sending Heartbeat: " + heartBeatData);        
         wcfService.SendHeartBeatAsync(heartBeatData);
       }
@@ -109,5 +110,5 @@
 
     void wcfService_ProcessHeartBeatCompleted(object sender, ProcessHeartBeatCompletedEventArgs e) {
-      Logging.Instance.Info(this.ToString(), "Heartbeat received");
+      Logger.Debug("Heartbeat received");
       e.Result.ActionRequest.ForEach(mc => MessageQueue.GetInstance().AddMessage(mc));      
     }
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/HeuristicLab.Hive.Client.Core-3.2.csproj	(revision 3578)
@@ -157,4 +157,11 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <WCFMetadata Include="Service References\" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/JobStorage/JobStorageManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/JobStorage/JobStorageManager.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/JobStorage/JobStorageManager.cs	(revision 3578)
@@ -11,4 +11,5 @@
 using System.Diagnostics;
 using System.Xml;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Client.Core.JobStorage {
@@ -28,8 +29,8 @@
         jobstream.Write(job, 0, job.Length);
         storedJobsList.Add(info);        
-        Logging.Instance.Info("JobStorageManager", "Job " + info.JobID + " stored on the harddisc");
+        Logger.Info("Job " + info.JobID + " stored on the harddisc");
       }
       catch (Exception e) {
-        Logging.Instance.Error("JobStorageManager", "Exception: ", e);
+        Logger.Error("Exception: ", e);
       }
       finally {
@@ -46,5 +47,5 @@
         if (WcfService.Instance.ConnState == NetworkEnum.WcfConnState.Loggedin && (storedJobsList[index-1].ServerIP == WcfService.Instance.ServerIP && storedJobsList[index-1].ServerPort == WcfService.Instance.ServerPort)) {
           String filename = storedJobsList[index-1].ServerIP + "." + storedJobsList[index-1].ServerPort + "." + storedJobsList[index-1].JobID.ToString();          
-          Logging.Instance.Info("JobStorageManager", "Sending stored job " + storedJobsList[index - 1].JobID + " to the server");
+          Logger.Info("Sending stored job " + storedJobsList[index - 1].JobID + " to the server");
           try {
             byte[] job = File.ReadAllBytes(path + filename + ".dat");
@@ -52,7 +53,7 @@
               ResponseResultReceived res = WcfService.Instance.SendStoredJobResultsSync(ConfigManager.Instance.GetClientInfo().Id, storedJobsList[index - 1].JobID, job, 1.00, null, true);
               if (!res.Success)
-                Logging.Instance.Error("JobStorageManager", "sending of job failed: " + res.StatusMessage);
+                Logger.Error("sending of job failed: " + res.StatusMessage);
               else
-                Logging.Instance.Info("JobStorageManager", "Sending of job " + storedJobsList[index - 1].JobID + " done");
+                Logger.Info("Sending of job " + storedJobsList[index - 1].JobID + " done");
             }
             ClientStatusInfo.JobsProcessed++;
@@ -61,5 +62,5 @@
           }
           catch (Exception e) {
-            Logging.Instance.Error("JobStorageManager", "Job not on hdd but on list - deleting job from list", e);
+            Logger.Error("Job not on hdd but on list - deleting job from list ", e);
             storedJobsList.Remove(storedJobsList[index - 1]);
             StoreJobList();
@@ -78,5 +79,5 @@
 
     static JobStorageManager() {
-      Logging.Instance.Info("JobStorageManager", "Restoring Joblist from Harddisk");
+      Logger.Info("Restoring Joblist from Harddisk");
       if (!Directory.Exists(path))
         Directory.CreateDirectory(path);
@@ -89,8 +90,8 @@
           XmlTextReader reader = new XmlTextReader(stream);
           storedJobsList = (List<JobStorageInfo>)serializer.Deserialize(reader);
-          Logging.Instance.Info("JobStorageManager", "Loaded " + storedJobsList.Count + " Elements");
+          Logger.Info("Loaded " + storedJobsList.Count + " Elements");
         }
         catch (Exception e) {
-          Logging.Instance.Error("JobStorageManager", "Exception while loading the Stored Job List", e);
+          Logger.Error("Exception while loading the Stored Job List", e);
         } finally {
           if(stream != null) 
@@ -98,5 +99,5 @@
         }
       } else {
-        Logging.Instance.Info("JobStorageManager", "no stored jobs on harddisk, starting new list");
+        Logger.Info("no stored jobs on harddisk, starting new list");
         storedJobsList = new List<JobStorageInfo>();
       }
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 3578)
@@ -7,4 +7,5 @@
 using HeuristicLab.Hive.Client.Common;
 using HeuristicLab.Hive.Contracts.BusinessObjects;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Client.Core {
@@ -32,4 +33,5 @@
 
     public List<CachedHivePluginInfoDto> GetPlugins(List<HivePluginInfoDto> requests) {
+      Logger.Debug("Fetching plugins for job");
       List<CachedHivePluginInfoDto> neededPlugins = new List<CachedHivePluginInfoDto>();
       List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
@@ -40,4 +42,5 @@
         foreach (CachedHivePluginInfoDto cache in pluginCache) {
           if (info.Name.Equals(cache.Name) && info.Version.Equals(cache.Version) && info.BuildDate <= cache.BuildDate) {
+            Logger.Debug("Found plugin " + info.Name + ", " + info.Version);
             neededPlugins.Add(cache);
             found = true;
@@ -46,14 +49,18 @@
         }
         if (!found)
+          Logger.Debug("Found NOT found " + info.Name + ", " + info.Version);
           missingPlugins.Add(info);
         found = false;
       }
 
+      Logger.Debug("Requesting missing plugins");
       List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);
+      Logger.Debug("Requested missing plugins");
+
       if (receivedPlugins != null) {
         neededPlugins.AddRange(receivedPlugins);
         pluginCache.AddRange(receivedPlugins);
       } else
-        Logging.Instance.Error(this.ToString(), "Fetching of the plugins failed!");
+        Logger.Error("Fetching of the plugins failed!");
 
       return neededPlugins;
Index: /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Properties/Settings.Designer.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Client.Core/3.2/Properties/Settings.Designer.cs	(revision 3578)
@@ -2,5 +2,5 @@
 // <auto-generated>
 //     This code was generated by a tool.
-//     Runtime Version:2.0.50727.3053
+//     Runtime Version:2.0.50727.4927
 //
 //     Changes to this file may cause incorrect behavior and will be lost if
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs	(revision 3578)
@@ -24,8 +24,13 @@
 using System.Linq;
 using System.Text;
+using System.Data;
 
 namespace HeuristicLab.Hive.Contracts {
   public class ApplicationConstants {
 
+    public static System.Data.IsolationLevel ISOLATION_LEVEL = IsolationLevel.ReadCommitted;
+
+    public static System.Transactions.IsolationLevel ISOLATION_LEVEL_SCOPE =
+      System.Transactions.IsolationLevel.ReadCommitted;
     public static int HEARTBEAT_MAX_DIF = 120; // value in seconds
     public static int JOB_TIME_TO_LIVE = 5;
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs	(revision 3578)
@@ -48,4 +48,6 @@
     public DateTime? DateCalculated { get; set; }
     [DataMember]
+    public DateTime? DateFinished { get; set; }
+    [DataMember]
     public int Priority { get; set; }
     [DataMember]
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/HeuristicLab.Hive.Contracts-3.2.csproj	(revision 3578)
@@ -76,4 +76,5 @@
       <RequiredTargetFramework>3.0</RequiredTargetFramework>
     </Reference>
+    <Reference Include="System.Transactions" />
     <Reference Include="System.Xml.Linq">
       <RequiredTargetFramework>3.5</RequiredTargetFramework>
Index: /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Contracts/3.2/Interfaces/IJobManager.cs	(revision 3578)
@@ -34,7 +34,11 @@
   public interface IJobManager {
     [OperationContract]
+    ResponseList<JobDto> GetAllJobsWithFilter(State jobState, int offset, int count);
+    [OperationContract]
     ResponseList<JobDto> GetAllJobs();
     [OperationContract]
     ResponseObject<JobDto> GetJobById(Guid jobId);
+    [OperationContract]
+    ResponseObject<JobDto> GetJobByIdWithDetails(Guid jobId);
     [OperationContract]
     ResponseObject<JobDto> AddNewJob(SerializedJob job);
@@ -62,5 +66,5 @@
     ResponseList<JobDto> GetJobsByProject(Guid projectId);
     [OperationContract]
-    ResponseObject<JobDto> AddJobWithGroupStrings(SerializedJob job, IEnumerable<string> resources);
+    ResponseObject<JobDto> AddJobWithGroupStrings(SerializedJob job, IEnumerable<string> resources);    
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Engine/3.2/HiveEngine.cs	(revision 3578)
@@ -135,7 +135,7 @@
           Thread.Sleep(RESULT_POLLING_INTERVAL_MS);
           lock (locker) {
-            HiveLogger.Debug("HiveEngine: Results-polling - GetLastResult");
+            Logger.Debug("HiveEngine: Results-polling - GetLastResult");
             response = executionEngineFacade.GetLastSerializedResult(jobId, false);
-            HiveLogger.Debug("HiveEngine: Results-polling - Server: " + response.StatusMessage + " success: " + response.Success);
+            Logger.Debug("HiveEngine: Results-polling - Server: " + response.StatusMessage + " success: " + response.Success);
             // loop while 
             // 1. the user doesn't request an abort 
@@ -145,7 +145,7 @@
             if (abortRequested) return;
             if (response.Success && response.Obj != null) {
-              HiveLogger.Debug("HiveEngine: Results-polling - Got result!");
+              Logger.Debug("HiveEngine: Results-polling - Got result!");
               restoredJob = (Job)PersistenceManager.RestoreFromGZip(response.Obj.SerializedJobData);
-              HiveLogger.Debug("HiveEngine: Results-polling - IsSnapshotResult: " + (restoredJob.Progress<1.0));
+              Logger.Debug("HiveEngine: Results-polling - IsSnapshotResult: " + (restoredJob.Progress < 1.0));
             }
           }
@@ -157,5 +157,5 @@
         OnFinished();
       });
-      HiveLogger.Debug("HiveEngine: Starting results-polling thread");
+      Logger.Debug("HiveEngine: Starting results-polling thread");
       t.Start();
     }
@@ -166,11 +166,11 @@
       ResponseObject<SerializedJob> response;
       lock (locker) {
-        HiveLogger.Debug("HiveEngine: Abort - RequestSnapshot");
+        Logger.Debug("HiveEngine: Abort - RequestSnapshot");
         Response snapShotResponse = executionEngineFacade.RequestSnapshot(jobId);
         if (snapShotResponse.StatusMessage == ApplicationConstants.RESPONSE_JOB_IS_NOT_BEEING_CALCULATED) {
           // job is finished already
-          HiveLogger.Debug("HiveEngine: Abort - GetLastResult(false)");
+          Logger.Debug("HiveEngine: Abort - GetLastResult(false)");
           response = executionEngineFacade.GetLastSerializedResult(jobId, false);
-          HiveLogger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
+          Logger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
         } else {
           // server sent snapshot request to client
@@ -178,7 +178,7 @@
           do {
             Thread.Sleep(SNAPSHOT_POLLING_INTERVAL_MS);
-            HiveLogger.Debug("HiveEngine: Abort - GetLastResult(true)");
+            Logger.Debug("HiveEngine: Abort - GetLastResult(true)");
             response = executionEngineFacade.GetLastSerializedResult(jobId, true);
-            HiveLogger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
+            Logger.Debug("HiveEngine: Abort - Server: " + response.StatusMessage + " success: " + response.Success);
             retryCount++;
             // loop while
@@ -194,5 +194,5 @@
       SerializedJob jobResult = response.Obj;
       if (jobResult != null) {
-        HiveLogger.Debug("HiveEngine: Results-polling - Got result!");
+        Logger.Debug("HiveEngine: Results-polling - Got result!");
         job = (Job)PersistenceManager.RestoreFromGZip(jobResult.SerializedJobData);
         ControlManager.Manager.ShowControl(job.Engine.CreateView());
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.Designer.cs	(revision 3578)
@@ -55,8 +55,4 @@
       this.chContent = new System.Windows.Forms.ColumnHeader();
       this.chDetails = new System.Windows.Forms.ColumnHeader();
-      this.lvSnapshots = new System.Windows.Forms.ListView();
-      this.chClientCalculated = new System.Windows.Forms.ColumnHeader();
-      this.chProgress = new System.Windows.Forms.ColumnHeader();
-      this.chSnapshotTime = new System.Windows.Forms.ColumnHeader();
       this.lblProgress = new System.Windows.Forms.Label();
       this.lblStatus = new System.Windows.Forms.Label();
@@ -85,8 +81,8 @@
       this.menuItemAddGroup = new System.Windows.Forms.ToolStripMenuItem();
       this.menuItemDeleteGroup = new System.Windows.Forms.ToolStripMenuItem();
+      this.menuItemOpenCalendar = new System.Windows.Forms.ToolStripMenuItem();
       this.lvClientControl = new System.Windows.Forms.ListView();
       this.tcManagementConsole = new System.Windows.Forms.TabControl();
       this.checkBox1 = new System.Windows.Forms.CheckBox();
-      this.menuItemOpenCalendar = new System.Windows.Forms.ToolStripMenuItem();
       this.menuStrip1.SuspendLayout();
       this.plClientDetails.SuspendLayout();
@@ -350,5 +346,4 @@
       this.plJobDetails.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
       this.plJobDetails.Controls.Add(this.lvJobDetails);
-      this.plJobDetails.Controls.Add(this.lvSnapshots);
       this.plJobDetails.Controls.Add(this.lblProgress);
       this.plJobDetails.Controls.Add(this.lblStatus);
@@ -372,5 +367,5 @@
       this.lvJobDetails.Location = new System.Drawing.Point(17, 124);
       this.lvJobDetails.Name = "lvJobDetails";
-      this.lvJobDetails.Size = new System.Drawing.Size(382, 175);
+      this.lvJobDetails.Size = new System.Drawing.Size(382, 243);
       this.lvJobDetails.TabIndex = 17;
       this.lvJobDetails.UseCompatibleStateImageBehavior = false;
@@ -386,35 +381,4 @@
       this.chDetails.Text = "Details";
       this.chDetails.Width = 255;
-      // 
-      // lvSnapshots
-      // 
-      this.lvSnapshots.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
-            this.chClientCalculated,
-            this.chProgress,
-            this.chSnapshotTime});
-      this.lvSnapshots.Enabled = false;
-      this.lvSnapshots.FullRowSelect = true;
-      this.lvSnapshots.GridLines = true;
-      this.lvSnapshots.Location = new System.Drawing.Point(17, 310);
-      this.lvSnapshots.Name = "lvSnapshots";
-      this.lvSnapshots.Size = new System.Drawing.Size(382, 69);
-      this.lvSnapshots.TabIndex = 16;
-      this.lvSnapshots.UseCompatibleStateImageBehavior = false;
-      this.lvSnapshots.View = System.Windows.Forms.View.Details;
-      // 
-      // chClientCalculated
-      // 
-      this.chClientCalculated.Text = "Client Calculated";
-      this.chClientCalculated.Width = 112;
-      // 
-      // chProgress
-      // 
-      this.chProgress.Text = "Progress";
-      this.chProgress.Width = 100;
-      // 
-      // chSnapshotTime
-      // 
-      this.chSnapshotTime.Text = "Snapshot request";
-      this.chSnapshotTime.Width = 166;
       // 
       // lblProgress
@@ -657,5 +621,5 @@
             this.menuItemOpenCalendar});
       this.contextMenuGroup.Name = "contextMenuJob";
-      this.contextMenuGroup.Size = new System.Drawing.Size(154, 92);
+      this.contextMenuGroup.Size = new System.Drawing.Size(154, 70);
       // 
       // menuItemAddGroup
@@ -670,4 +634,10 @@
       this.menuItemDeleteGroup.Size = new System.Drawing.Size(153, 22);
       this.menuItemDeleteGroup.Text = "Delete Group";
+      // 
+      // menuItemOpenCalendar
+      // 
+      this.menuItemOpenCalendar.Name = "menuItemOpenCalendar";
+      this.menuItemOpenCalendar.Size = new System.Drawing.Size(153, 22);
+      this.menuItemOpenCalendar.Text = "Open Calendar";
       // 
       // lvClientControl
@@ -705,10 +675,4 @@
       this.checkBox1.Text = "checkBox1";
       this.checkBox1.UseVisualStyleBackColor = true;
-      // 
-      // menuItemOpenCalendar
-      // 
-      this.menuItemOpenCalendar.Name = "menuItemOpenCalendar";
-      this.menuItemOpenCalendar.Size = new System.Drawing.Size(153, 22);
-      this.menuItemOpenCalendar.Text = "Open Calendar";
       // 
       // HiveServerManagementConsole
@@ -782,7 +746,4 @@
     private System.Windows.Forms.Label lblStatus;
     private System.Windows.Forms.Label lblProgress;
-    private System.Windows.Forms.ListView lvSnapshots;
-    private System.Windows.Forms.ColumnHeader chClientCalculated;
-    private System.Windows.Forms.ColumnHeader chProgress;
     private System.Windows.Forms.Label lblStateClient;
     private System.Windows.Forms.Label lblState;
@@ -796,5 +757,4 @@
     private System.Windows.Forms.ListView lvJobControl;
     private System.Windows.Forms.CheckBox checkBox1;
-    private System.Windows.Forms.ColumnHeader chSnapshotTime;
     private System.Windows.Forms.ContextMenuStrip contextMenuJob;
     private System.Windows.Forms.ToolStripMenuItem menuItemAbortJob;
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.cs	(revision 3578)
@@ -242,5 +242,6 @@
         CloneList(jobsOld, out jobsOldHelp);
 
-        GetDelta(jobsOld.List, jobsOldHelp);
+        if(jobsOld != null && jobsOld.List != null && jobsOldHelp != null)
+          GetDelta(jobsOld.List, jobsOldHelp);
 
       }
@@ -419,16 +420,23 @@
       lvJobDetails.Items.Clear();
 
-      lvSnapshots.Enabled = true;
-
-      if (currentJob.State == State.offline) {
+      ResponseObject<JobDto> response = ServiceLocator.GetJobManager().GetJobByIdWithDetails(currentJob.Id);
+
+      if(response.Success == false || response.Obj == null)
+        return;
+
+      JobDto job = response.Obj;
+
+      //lvSnapshots.Enabled = true;
+
+      if (job.State == State.offline) {
         pbJobControl.Image = ilLargeImgJob.Images[2];
-      } else if (currentJob.State == State.calculating) {
+      } else if (job.State == State.calculating) {
         pbJobControl.Image = ilLargeImgJob.Images[1];
-      } else if (currentJob.State == State.finished) {
+      } else if (job.State == State.finished) {
         pbJobControl.Image = ilLargeImgJob.Images[0];
       }
 
-      lblJobName.Text = currentJob.Id.ToString();
-      if (currentJob.Percentage != null) {
+      lblJobName.Text = job.Id.ToString();
+      if (job.Percentage != null) {
         progressJob.Value = (int) (currentJob.Percentage*100);
         lblProgress.Text = (int) (currentJob.Percentage*100) + "% calculated";
@@ -437,5 +445,5 @@
       ListViewItem lvi = new ListViewItem();
       lvi.Text = "User:";
-      lvi.SubItems.Add(currentJob.UserId.ToString());
+      lvi.SubItems.Add(job.UserId.ToString());
       lvJobDetails.Items.Add(lvi);
 
@@ -443,12 +451,12 @@
       lvi = new ListViewItem();
       lvi.Text = "created at:";
-      lvi.SubItems.Add(currentJob.DateCreated.ToString());
+      lvi.SubItems.Add(job.DateCreated.ToString());
       lvJobDetails.Items.Add(lvi);
 
-      if (currentJob.ParentJob != null) {
+      if (job.ParentJob != null) {
         lvi = null;
         lvi = new ListViewItem();
         lvi.Text = "Parent job:";
-        lvi.SubItems.Add(currentJob.ParentJob.ToString());
+        lvi.SubItems.Add(job.ParentJob.ToString());
         lvJobDetails.Items.Add(lvi);
       }
@@ -457,20 +465,20 @@
       lvi = new ListViewItem();
       lvi.Text = "Priority:";
-      lvi.SubItems.Add(currentJob.Priority.ToString());
+      lvi.SubItems.Add(job.Priority.ToString());
       lvJobDetails.Items.Add(lvi);
 
-      if (currentJob.Project != null) {
+      if (job.Project != null) {
         lvi = null;
         lvi = new ListViewItem();
         lvi.Text = "Project:";
-        lvi.SubItems.Add(currentJob.Project.Name.ToString());
+        lvi.SubItems.Add(job.Project.Name.ToString());
         lvJobDetails.Items.Add(lvi);
       }
 
-      if (currentJob.Client != null) {
+      if (job.Client != null) {
         lvi = null;
         lvi = new ListViewItem();
         lvi.Text = "Calculation begin:";
-        lvi.SubItems.Add(currentJob.DateCalculated.ToString());
+        lvi.SubItems.Add(job.DateCalculated.ToString());
         lvJobDetails.Items.Add(lvi);
 
@@ -479,29 +487,16 @@
         lvi = new ListViewItem();
         lvi.Text = "Client calculated:";
-        lvi.SubItems.Add(currentJob.Client.Name.ToString());
+        lvi.SubItems.Add(job.Client.Name.ToString());
         lvJobDetails.Items.Add(lvi);
 
-        if (currentJob.State == State.finished) {
-          IJobManager jobManager =
-            ServiceLocator.GetJobManager();
-          ResponseObject<JobResult> jobRes = null;
-          //Todo: jobManager.GetLastJobResultOf(currentJob.Id);
-
-          if (jobRes != null && jobRes.Obj != null) {
-            lvi = null;
+        if (job.State == State.finished) {
+          lvi = null;
             lvi = new ListViewItem();
             lvi.Text = "Calculation ended:";
-            lvi.SubItems.Add(jobRes.Obj.DateFinished.ToString());
+            lvi.SubItems.Add(job.DateFinished.ToString());
             lvJobDetails.Items.Add(lvi);
           }
         }
-      }
-      if (currentJob.State != State.offline) {
-        lvSnapshots.Items.Clear();
-        GetSnapshotList();
-      } else {
-        lvSnapshots.Visible = false;
-      }
-    }
+      } 
 
     /// <summary>
@@ -776,10 +771,15 @@
     private void CloneList(ResponseList<JobDto> oldList, out IDictionary<int, JobDto> newList) {
       newList = new Dictionary<int, JobDto>();
-      for (int i = 0; i < oldList.List.Count; i++) {
-        newList.Add(i, oldList.List[i]);
+      if (oldList != null && oldList.List != null) {
+        for (int i = 0; i < oldList.List.Count; i++) {
+          newList.Add(i, oldList.List[i]);
+        }
       }
     }
 
     private bool IsEqual(ClientDto ci1, ClientDto ci2) {
+      if (ci1 == null && ci2 == null) {
+        return true;
+      }
       if (ci2 == null) {
         return false;
@@ -849,29 +849,4 @@
     }
 
-    private void GetSnapshotList() {
-
-      lvSnapshots.Items.Clear();
-      IJobManager jobManager = ServiceLocator.GetJobManager();
-
-      ResponseList<JobResult> jobRes = jobManager.GetAllJobResults(currentJob.Id);
-
-      if (jobRes != null && jobRes.List != null) {
-        foreach (JobResult jobresult in jobRes.List) {
-          ListViewItem curSnapshot = new ListViewItem(jobresult.ClientId.ToString());
-          double percentage = jobresult.Percentage * 100;
-          curSnapshot.SubItems.Add(percentage.ToString() + " %");
-          curSnapshot.SubItems.Add(jobresult.Timestamp.ToString());
-          lvSnapshots.Items.Add(curSnapshot);
-        }
-      }
-
-      if ((jobRes.List == null) || (jobRes.List.Count == 0)) {
-        lvSnapshots.Visible = false;
-      } else {
-        lvSnapshots.Visible = true;
-      }
-
-    }
-
     #endregion
 
Index: /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Console/3.2/HiveServerManagementConsole.resx	(revision 3578)
@@ -129,5 +129,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABo
-        FwAAAk1TRnQBSQFMAgEBBAEAAQwBAAEMAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        FwAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAAUADAAEBAQABCAYAASAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -239,5 +239,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAO
-        DgAAAk1TRnQBSQFMAgEBAwEAAQwBAAEMAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DgAAAk1TRnQBSQFMAgEBAwEAARQBAAEUAQABIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABgAMAASADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -312,6 +312,6 @@
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcQgAA
-        XEIB62nEUwAAA3hJREFUSEu1ls1PE2EQxj229ouPVNErgZOJicZDjR68mHg1JgYvxov/gIlHxARBoxGU
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAABcQQAA
+        XEEBRtDlPgAAA3hJREFUSEu1ls1PE2EQxj229ouPVNErgZOJicZDjR68mHg1JgYvxov/gIlHxARBoxGU
         KlJUVJDypVIQKkXBpIootoC0tLS0pZEIiILfikAfZ5Zuu9sWaDQ2edLt7vvOrzPzzsxuALBBquIeRR7p
         CKmQVJSmeC3vyUu0FzNOD3NIFhJYpU8VuGBXpiVeK+6L2sgRQQKAbm4hTZ/pVcA8ooN9Ug/H7GY4Z3PS
@@ -342,5 +342,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy
-        DAAAAk1TRnQBSQFMAgEBBAEAAQwBAAEMAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        DAAAAk1TRnQBSQFMAgEBBAEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
@@ -409,5 +409,5 @@
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABq
-        CQAAAk1TRnQBSQFMAgEBAwEAAQwBAAEMAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+        CQAAAk1TRnQBSQFMAgEBAwEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
         AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 3578)
@@ -90,7 +90,7 @@
     /// <param name="e"></param>
     void lifecycleManager_OnServerHeartbeat(object sender, EventArgs e) {
-      HiveLogger.Info(this.ToString() + ": Server Heartbeat ticked");
-
-      using (TransactionScope scope = new TransactionScope()) {
+      Logger.Debug("Server Heartbeat ticked");
+
+      using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
 
         List<ClientDto> allClients = new List<ClientDto>(DaoLocator.ClientDao.FindAll());
@@ -101,14 +101,13 @@
 
             if (!lastHeartbeats.ContainsKey(client.Id)) {
-              HiveLogger.Info(this.ToString() + ": Client " + client.Id +
+              Logger.Info("Client " + client.Id +
                               " wasn't offline but hasn't sent heartbeats - setting offline");
               client.State = State.offline;
               DaoLocator.ClientDao.Update(client);
-              HiveLogger.Info(this.ToString() + ": Client " + client.Id +
+              Logger.Info("Client " + client.Id +
                               " wasn't offline but hasn't sent heartbeats - Resetting all his jobs");
               foreach (JobDto job in DaoLocator.JobDao.FindActiveJobsOfClient(client)) {
                 //maybe implementa n additional Watchdog? Till then, just set them offline..
-                DaoLocator.JobDao.SetJobOffline(job);                
-                //jobManager.ResetJobsDependingOnResults(job);
+                DaoLocator.JobDao.SetJobOffline(job);                                
               }
             } else {
@@ -119,5 +118,5 @@
               if (dif.TotalSeconds > ApplicationConstants.HEARTBEAT_MAX_DIF) {
                 // if client calculated jobs, the job must be reset
-                HiveLogger.Info(this.ToString() + ": Client timed out and is on RESET");
+                Logger.Info("Client timed out and is on RESET");
                 foreach (JobDto job in DaoLocator.JobDao.FindActiveJobsOfClient(client)) {
                   jobManager.ResetJobsDependingOnResults(job);
@@ -127,5 +126,5 @@
                   }
                 }
-
+                Logger.Debug("setting client offline");
                 // client must be set offline
                 client.State = State.offline;
@@ -134,4 +133,5 @@
                 DaoLocator.ClientDao.Update(client);
 
+                Logger.Debug("removing it from the heartbeats list");
                 heartbeatLock.EnterWriteLock();
                 lastHeartbeats.Remove(client.Id);
@@ -264,17 +264,12 @@
     /// <returns></returns>
     public ResponseHB ProcessHeartBeat(HeartBeatData hbData) {
-      HiveLogger.Debug(this.ToString() + ": BEGIN Processing Heartbeat for Client " + hbData.ClientId);
-      HiveLogger.Debug(this.ToString() + ": BEGIN Fetching Adapters");
-      HiveLogger.Debug(this.ToString() + ": END Fetched Adapters");
-      HiveLogger.Debug(this.ToString() + ": BEGIN Starting Transaction");
-
-      HiveLogger.Debug(this.ToString() + ": END Started Transaction");
+      Logger.Debug("BEGIN Processing Heartbeat for Client " + hbData.ClientId);
 
       ResponseHB response = new ResponseHB();
       response.ActionRequest = new List<MessageContainer>();
 
-      HiveLogger.Debug(this.ToString() + ": BEGIN Started Client Fetching");
+      Logger.Debug("BEGIN Started Client Fetching");
       ClientDto client = DaoLocator.ClientDao.FindById(hbData.ClientId);
-      HiveLogger.Debug(this.ToString() + ": END Finished Client Fetching");
+      Logger.Debug("END Finished Client Fetching");
       // check if the client is logged in
       if (client.State == State.offline || client.State == State.nullState) {
@@ -283,5 +278,5 @@
         response.ActionRequest.Add(new MessageContainer(MessageContainer.MessageType.NoMessage));
 
-        HiveLogger.Error(this.ToString() + " ProcessHeartBeat: Client state null or offline: " + client);
+        Logger.Error("ProcessHeartBeat: Client state null or offline: " + client);
 
         return response;
@@ -292,7 +287,7 @@
 
       // save timestamp of this heartbeat
-      HiveLogger.Debug(this.ToString() + ": BEGIN Locking for Heartbeats");
+      Logger.Debug("BEGIN Locking for Heartbeats");
       heartbeatLock.EnterWriteLock();
-      HiveLogger.Debug(this.ToString() + ": END Locked for Heartbeats");
+      Logger.Debug("END Locked for Heartbeats");
       if (lastHeartbeats.ContainsKey(hbData.ClientId)) {
         lastHeartbeats[hbData.ClientId] = DateTime.Now;
@@ -302,7 +297,7 @@
       heartbeatLock.ExitWriteLock();
 
-      HiveLogger.Debug(this.ToString() + ": BEGIN Processing Heartbeat Jobs");
+      Logger.Debug("BEGIN Processing Heartbeat Jobs");
       processJobProcess(hbData, response);
-      HiveLogger.Debug(this.ToString() + ": END Processed Heartbeat Jobs");
+      Logger.Debug("END Processed Heartbeat Jobs");
 
       //check if new Cal must be loaded
@@ -314,10 +309,10 @@
         //client.CalendarSyncStatus = CalendarState.Fetching;
         
-        HiveLogger.Info(this.ToString() + " fetch or forcefetch sent");        
+        Logger.Info("fetch or forcefetch sent");        
       }
 
       // check if client has a free core for a new job
       // if true, ask scheduler for a new job for this client
-      HiveLogger.Debug(this.ToString() + ": BEGIN Looking for Client Jobs");
+      Logger.Debug(" BEGIN Looking for Client Jobs");
       if (hbData.FreeCores > 0 && scheduler.ExistsJobForClient(hbData)) {
         response.ActionRequest.Add(new MessageContainer(MessageContainer.MessageType.FetchJob));
@@ -325,5 +320,5 @@
         response.ActionRequest.Add(new MessageContainer(MessageContainer.MessageType.NoMessage));
       }
-      HiveLogger.Debug(this.ToString() + ": END Looked for Client Jobs");
+      Logger.Debug(" END Looked for Client Jobs");
       response.Success = true;
       response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_HEARTBEAT_RECEIVED;
@@ -332,5 +327,5 @@
 
       //tx.Commit();
-      HiveLogger.Debug(this.ToString() + ": END Processed Heartbeat for Client " + hbData.ClientId);
+      Logger.Debug(" END Processed Heartbeat for Client " + hbData.ClientId);
       return response;
     }
@@ -344,5 +339,5 @@
     /// <param name="response"></param>
     private void processJobProcess(HeartBeatData hbData, ResponseHB response) {
-      HiveLogger.Info(this.ToString() + " processJobProcess: Started for Client " + hbData.ClientId);
+      Logger.Debug("Started for Client " + hbData.ClientId);
       List<JobDto> jobsOfClient = new List<JobDto>(DaoLocator.JobDao.FindActiveJobsOfClient(DaoLocator.ClientDao.FindById(hbData.ClientId)));
       if (hbData.JobProgress != null && hbData.JobProgress.Count > 0) {        
@@ -350,5 +345,5 @@
           response.Success = false;
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_IS_NOT_BEEING_CALCULATED;
-          HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId);
+          Logger.Error("There is no job calculated by this user " + hbData.ClientId);
           return;
         }
@@ -360,5 +355,5 @@
             response.Success = false;
             response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_IS_NOT_BEEING_CALCULATED;
-            HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId + " Job: " + curJob);
+            Logger.Error("There is no job calculated by this user " + hbData.ClientId + " Job: " + curJob);
           } else if (curJob.State == State.abort) {
             // a request to abort the job has been set
@@ -392,7 +387,7 @@
             if (newAssignedJobs.ContainsKey(currJob.Id)) {
               newAssignedJobs[currJob.Id]--;
-              HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL Reduced by one for job: " + currJob + "and is now: " + newAssignedJobs[currJob.Id] + ". User that sucks: " + currJob.Client);
+              Logger.Error("Job TTL Reduced by one for job: " + currJob + "and is now: " + newAssignedJobs[currJob.Id] + ". User that sucks: " + currJob.Client);
               if (newAssignedJobs[currJob.Id] <= 0) {
-                HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL reached Zero, Job gets removed: " + currJob + " and set back to offline. User that sucks: " + currJob.Client);
+                Logger.Error("Job TTL reached Zero, Job gets removed: " + currJob + " and set back to offline. User that sucks: " + currJob.Client);
 
                 currJob.State = State.offline;
@@ -404,5 +399,5 @@
               }
             } else {
-              HiveLogger.Error(this.ToString() + " processJobProcess: Job ID wasn't with the heartbeats:  " + currJob);
+              Logger.Error("Job ID wasn't with the heartbeats:  " + currJob);
               currJob.State = State.offline;
               DaoLocator.JobDao.Update(currJob);
@@ -413,5 +408,5 @@
 
             if (newAssignedJobs.ContainsKey(currJob.Id)) {
-              HiveLogger.Info(this.ToString() + " processJobProcess: Job is sending a heart beat, removing it from the newAssignedJobList: " + currJob);
+              Logger.Info("Job is sending a heart beat, removing it from the newAssignedJobList: " + currJob);
               newAssignedJobs.Remove(currJob.Id);
             }
@@ -427,57 +422,4 @@
     /// <param name="clientId"></param>
     /// <returns></returns>
-    /*public ResponseSerializedJob SendSerializedJob(Guid clientId) {
-      ISession session = factory.GetSessionForCurrentThread();
-      ITransaction tx = null;
-
-      try {
-        IJobAdapter jobAdapter =
-          session.GetDataAdapter<JobDto, IJobAdapter>();
-
-        tx = session.BeginTransaction();
-
-        ResponseSerializedJob response = new ResponseSerializedJob();
-
-        JobDto job2Calculate = scheduler.GetNextJobForClient(clientId);
-        if (job2Calculate != null) {
-          SerializedJob computableJob =
-            jobAdapter.GetSerializedJob(job2Calculate.Id);
-
-          response.Job = computableJob;
-          response.Success = true;
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + computableJob.JobInfo + " for user " + clientId);                      
-          response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_PULLED;
-          lock (newAssignedJobs) {
-            if (!newAssignedJobs.ContainsKey(job2Calculate.Id))
-              newAssignedJobs.Add(job2Calculate.Id, ApplicationConstants.JOB_TIME_TO_LIVE);
-          }
-        } else {
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);                      
-          response.Success = false;
-          response.Job = null;
-          response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOBS_LEFT;
-        }
-
-        tx.Commit();
-
-        return response;
-      }
-      catch (Exception ex) {
-        if (tx != null)
-          tx.Rollback();
-        throw ex;
-      }
-      finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }     */
-
-    /// <summary>
-    /// if the client was told to pull a job he calls this method
-    /// the server selects a job and sends it to the client
-    /// </summary>
-    /// <param name="clientId"></param>
-    /// <returns></returns>
     public ResponseJob SendJob(Guid clientId) {
 
@@ -487,6 +429,7 @@
       if (job2Calculate != null) {
         response.Job = job2Calculate;
+        response.Job.PluginsNeeded = DaoLocator.PluginInfoDao.GetPluginDependenciesForJob(response.Job);
         response.Success = true;
-        HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + job2Calculate + " for user " + clientId);
+        Logger.Info("Job pulled: " + job2Calculate + " for user " + clientId);
         response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_PULLED;
         lock (newAssignedJobs) {
@@ -494,9 +437,9 @@
             newAssignedJobs.Add(job2Calculate.Id, ApplicationConstants.JOB_TIME_TO_LIVE);
         }
-      } else {
+      } else {                  
         response.Success = false;
         response.Job = null;
         response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOBS_LEFT;
-        HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);
+        Logger.Info("No more Jobs left for " + clientId);
       }
 
@@ -510,5 +453,5 @@
       bool finished) {
 
-      HiveLogger.Info(this.ToString() + " ProcessJobResult: BEGIN Job received for Storage - main method:");
+      Logger.Info("BEGIN Job received for Storage - main method:");
 
 
@@ -547,5 +490,5 @@
         jobStream.Close();
       }
-      HiveLogger.Info(this.ToString() + " ProcessJobResult: END Job received for Storage:");
+      Logger.Info("END Job received for Storage:");
       return response;
     }
@@ -559,5 +502,5 @@
       bool finished) {
 
-      HiveLogger.Info(this.ToString() + " ProcessJobResult: BEGIN Job received for Storage - SUB method: " + jobId);
+      Logger.Info("BEGIN Job received for Storage - SUB method: " + jobId);
 
       ResponseResultReceived response = new ResponseResultReceived();
@@ -579,5 +522,5 @@
         response.JobId = jobId;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: No job with Id " + jobId);
+        Logger.Error("No job with Id " + jobId);
 
         //tx.Rollback();
@@ -588,5 +531,5 @@
         response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_WAS_ABORTED;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: Job was aborted! " + job.JobInfo);
+        Logger.Error("Job was aborted! " + job.JobInfo);
 
         //tx.Rollback();
@@ -598,5 +541,5 @@
         response.JobId = jobId;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: Job is not being calculated (client = null)! " + job.JobInfo);
+        Logger.Error("Job is not being calculated (client = null)! " + job.JobInfo);
 
         //tx.Rollback();
@@ -608,5 +551,5 @@
         response.JobId = jobId;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Client for this Job! " + job.JobInfo + ", Sending Client is: " + clientId);
+        Logger.Error("Wrong Client for this Job! " + job.JobInfo + ", Sending Client is: " + clientId);
 
         //tx.Rollback();
@@ -618,9 +561,10 @@
         response.JobId = jobId;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: Job already finished! " + job.JobInfo + ", Sending Client is: " + clientId);
+        Logger.Error("Job already finished! " + job.JobInfo + ", Sending Client is: " + clientId);
 
         //tx.Rollback();
         return response;
       }
+      //Todo: RequestsnapshotSent => calculating?
       if (job.JobInfo.State == State.requestSnapshotSent) {
         job.JobInfo.State = State.calculating;
@@ -632,5 +576,5 @@
         response.JobId = jobId;
 
-        HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Job State, job is: " + job.JobInfo);
+        Logger.Error("Wrong Job State, job is: " + job.JobInfo);
 
         //tx.Rollback();
@@ -641,4 +585,5 @@
       if (finished) {
         job.JobInfo.State = State.finished;
+        job.JobInfo.DateFinished = DateTime.Now;
       }
 
@@ -652,5 +597,5 @@
       response.finished = finished;
 
-      HiveLogger.Info(this.ToString() + " ProcessJobResult: END Job received for Storage - SUB method: " + jobId);
+      Logger.Info("END Job received for Storage - SUB method: " + jobId);
       return response;
 
@@ -691,5 +636,5 @@
     public Response Logout(Guid clientId) {
 
-      HiveLogger.Info("Client logged out " + clientId);
+      Logger.Info("Client logged out " + clientId);
       
       Response response = new Response();
@@ -736,5 +681,5 @@
         response.Success = false;
         response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_DOESNT_EXIST;
-        HiveLogger.Error(this.ToString() + " IsJobStillNeeded: Job doesn't exist (anymore)! " + jobId);
+        Logger.Error("Job doesn't exist (anymore)! " + jobId);
         return response;
       }
@@ -742,5 +687,5 @@
         response.Success = true;
         response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_ALLREADY_FINISHED;
-        HiveLogger.Error(this.ToString() + " IsJobStillNeeded: already finished! " + job);
+        Logger.Error("already finished! " + job);
         return response;
       }
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/HiveServerCorePlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/HiveServerCorePlugin.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/HiveServerCorePlugin.cs	(revision 3578)
@@ -35,4 +35,5 @@
   [PluginDependency("HeuristicLab.Hive.Server.LINQDataAccess-3.2")]
   [PluginDependency("HeuristicLab.Security.Contracts-3.2")]
+  [PluginDependency("HeuristicLab.Tracing", "3.2.0")]
   public class HiveServerCorePlugin : PluginBase {
   }
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/JobManager.cs	(revision 3578)
@@ -35,4 +35,5 @@
 using System.Transactions;
 using HeuristicLab.Hive.Server.LINQDataAccess;
+using IsolationLevel=System.Transactions.IsolationLevel;
 
 namespace HeuristicLab.Hive.Server.Core {
@@ -57,5 +58,5 @@
 
     public void ResetJobsDependingOnResults(JobDto job) {
-      HiveLogger.Info(this.ToString() + ": Setting job " + job.Id + " offline");
+      Logger.Info("Setting job " + job.Id + " offline");
       if (job != null) {
         DaoLocator.JobDao.SetJobOffline(job);
@@ -65,6 +66,6 @@
 
     void checkForDeadJobs() {
-      HiveLogger.Info(this.ToString() + " Searching for dead Jobs");
-      using (TransactionScope scope = new TransactionScope()) {
+      Logger.Info("Searching for dead Jobs");
+      using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
         List<JobDto> allJobs = new List<JobDto>(DaoLocator.JobDao.FindAll());
         foreach (JobDto curJob in allJobs) {
@@ -91,10 +92,4 @@
     /// <returns></returns>
     public ResponseList<JobDto> GetAllJobs() {
-       /*ISession session = factory.GetSessionForCurrentThread();
-
-       try {
-         IJobAdapter jobAdapter =
-             session.GetDataAdapter<JobDto, IJobAdapter>();*/
-
          ResponseList<JobDto> response = new ResponseList<JobDto>();
 
@@ -104,10 +99,11 @@
 
          return response;
-       /*}
-       finally {
-         if (session != null)
-           session.EndSession();
-       } */
-    }
+    }
+
+    public ResponseList<JobDto> GetAllJobsWithFilter(State jobState, int offset, int count) {
+      ResponseList<JobDto> response = new ResponseList<JobDto>();
+      response.List = new List<JobDto>(DaoLocator.JobDao.FindWithLimitations(jobState, offset, count));
+      return response;
+    }  
 
     /// <summary>
@@ -126,10 +122,4 @@
     /// <returns></returns>
     public ResponseObject<JobDto> GetJobById(Guid jobId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {              
-        IJobAdapter jobAdapter =
-            session.GetDataAdapter<JobDto, IJobAdapter>();*/
-
         ResponseObject<JobDto> response = new ResponseObject<JobDto>();
 
@@ -145,9 +135,19 @@
         return response;
       }
-      /*finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }   */
+
+    public ResponseObject<JobDto> GetJobByIdWithDetails(Guid jobId) {
+      ResponseObject<JobDto> job = new ResponseObject<JobDto>();
+      job.Obj = DaoLocator.JobDao.FindById(jobId);
+      if (job.Obj != null) {
+        job.Success = true;
+        job.StatusMessage = ApplicationConstants.RESPONSE_JOB_GET_JOB_BY_ID;
+
+        job.Obj.Client = DaoLocator.ClientDao.GetClientForJob(jobId);
+      } else {
+        job.Success = false;
+        job.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_DOESNT_EXIST;
+      }      
+      return job;
+    }
 
     public ResponseObject<JobDto> AddJobWithGroupStrings(SerializedJob job, IEnumerable<string> resources) {
@@ -167,10 +167,4 @@
     /// <returns></returns>
     public ResponseObject<JobDto> AddNewJob(SerializedJob job) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IJobAdapter jobAdapter =
-            session.GetDataAdapter<JobDto, IJobAdapter>();*/
-
         ResponseObject<JobDto> response = new ResponseObject<JobDto>();
 
@@ -218,10 +212,4 @@
     /// <returns></returns>
     public Response RemoveJob(Guid jobId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      try {
-        IJobAdapter jobAdapter =
-            session.GetDataAdapter<JobDto, IJobAdapter>();*/
-
         Response response = new Response();
 
@@ -238,9 +226,4 @@
         return response;
       }
-      /*finally {
-        if (session != null)
-          session.EndSession();
-      }
-    }   */
 
     public ResponseObject<JobDto> GetLastJobResultOf(Guid jobId) {
@@ -258,16 +241,4 @@
     public ResponseObject<SerializedJob>
       GetLastSerializedJobResultOf(Guid jobId, bool requested) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-
-      ITransaction tx = null;
-
-      try {
-        IJobAdapter jobAdapter =
-            session.GetDataAdapter<JobDto, IJobAdapter>();
-
-        IJobResultsAdapter jobResultsAdapter =
-          session.GetDataAdapter<JobResult, IJobResultsAdapter>();
-
-        tx = session.BeginTransaction();                          */
 
         ResponseObject<SerializedJob> response =
@@ -386,87 +357,12 @@
 
     public ResponseList<JobResult> GetAllJobResults(Guid jobId) {
-     /* ISession session = factory.GetSessionForCurrentThread();
-      ResponseList<JobResult> response = new ResponseList<JobResult>();
-
-      try {
-        IJobResultsAdapter jobResultAdapter =
-            session.GetDataAdapter<JobResult, IJobResultsAdapter>();
-        IJobAdapter jobAdapter = session.GetDataAdapter<JobDto, IJobAdapter>();
-
-        JobDto job = jobAdapter.GetById(jobId);
-        if (job == null) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_DOESNT_EXIST;
-          return response;
-        }
-        response.List = new List<JobResult>(jobResultAdapter.GetResultsOf(job.Id));
-        response.Success = true;
-        response.StatusMessage = ApplicationConstants.RESPONSE_JOB_JOB_RESULT_SENT;
-
-        return response;
-      }
-      finally {
-        if(session != null)
-          session.EndSession();
-      }  */
       return new ResponseList<JobResult>();
     }
 
     public ResponseList<ProjectDto> GetAllProjects() {
-      /*ISession session = factory.GetSessionForCurrentThread();
-      ResponseList<ProjectDto> response = new ResponseList<ProjectDto>();
-
-      try {
-        IProjectAdapter projectAdapter =
-          session.GetDataAdapter<ProjectDto, IProjectAdapter>();
-
-        List<ProjectDto> allProjects = new List<ProjectDto>(projectAdapter.GetAll());
-        response.List = allProjects;
-        response.Success = true;
-        return response;
-      }
-      finally {
-        if (session != null)
-          session.EndSession();
-      } */
       return null;
     }
 
     private Response createUpdateProject(ProjectDto project) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-      Response response = new Response();
-      ITransaction tx = null;
-
-      try {
-        IProjectAdapter projectAdapter =
-          session.GetDataAdapter<ProjectDto, IProjectAdapter>();
-
-        if (project.Name == null || project.Name == "") {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_JOB_PROJECT_NAME_EMPTY;
-          return response;
-        }
-        tx = session.BeginTransaction();
-        projectAdapter.Update(project);
-
-        tx.Commit();
-        response.Success = true;
-        response.StatusMessage = ApplicationConstants.RESPONSE_JOB_PROJECT_ADDED;
-      } catch (ConstraintException ce) {
-        if (tx != null)
-          tx.Rollback();
-        response.Success = false;
-        response.StatusMessage = ce.Message;
-      }
-      catch (Exception ex) {
-        if (tx != null)
-          tx.Rollback();
-        throw ex;
-      }
-      finally {
-        if (session != null)
-          session.EndSession();
-      }
-      return response;    */
       return null;
     }
@@ -481,57 +377,10 @@
 
     public Response DeleteProject(Guid projectId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-      Response response = new Response();
-      ITransaction tx = null;
-
-      try {
-        IProjectAdapter projectAdapter =
-          session.GetDataAdapter<ProjectDto, IProjectAdapter>();
-
-        ProjectDto project = projectAdapter.GetById(projectId);
-        if (project == null) {
-          response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_JOB_PROJECT_DOESNT_EXIST;
-          return response;
-        }
-        projectAdapter.Delete(project);
-        tx.Commit();
-        response.Success = true;
-        response.StatusMessage = ApplicationConstants.RESPONSE_JOB_PROJECT_DELETED;
-      }
-      catch (Exception e) {
-        if (tx != null)
-          tx.Rollback();
-        response.Success = false;
-        response.StatusMessage = e.Message;
-      }
-      finally {
-        if (session != null)
-          session.EndSession();
-      }     
-      return response; */
       return null;
     }
 
     public ResponseList<JobDto> GetJobsByProject(Guid projectId) {
-      /*ISession session = factory.GetSessionForCurrentThread();
-      ResponseList<JobDto> response = new ResponseList<JobDto>();
-
-      try {
-        IJobAdapter jobAdapter =
-          session.GetDataAdapter<JobDto, IJobAdapter>();
-        List<JobDto> jobsByProject = new List<JobDto>(jobAdapter.GetJobsByProject(projectId));
-        response.List = jobsByProject;
-        response.Success = true;
-      }
-      finally {
-        if (session != null)
-          session.EndSession();
-      } 
-       
-      return response;*/
       return null;      
     }
-
     #endregion
   }
Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ServerConsoleFacade.cs	(revision 3578)
@@ -97,7 +97,17 @@
     }
 
+    public ResponseList<JobDto> GetAllJobsWithFilter(State jobState, int offset, int count) {
+      secMan.Authorize("AccessJobs", sessionID, Guid.Empty);
+      return jobManager.GetAllJobsWithFilter(jobState, offset, count);
+    }
+
     public ResponseObject<JobDto> GetJobById(Guid jobId) {
       secMan.Authorize("AccessJobs", sessionID, jobId);
       return jobManager.GetJobById(jobId);
+    }
+
+    public ResponseObject<JobDto> GetJobByIdWithDetails(Guid jobId) {
+      secMan.Authorize("AccessJobs", sessionID, jobId);
+      return jobManager.GetJobByIdWithDetails(jobId);
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IJobDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IJobDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IJobDao.cs	(revision 3578)
@@ -21,4 +21,6 @@
     IEnumerable<JobDto> FindFittingJobsForClient(State state, int freeCores, int freeMemory, Guid clientGuid);
     Stream GetSerializedJobStream(Guid jobId);
+
+    IEnumerable<JobDto> FindWithLimitations(State jobState, int offset, int count);
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.DataAccess/3.2/IPluginInfoDao.cs	(revision 3578)
@@ -7,4 +7,5 @@
   public interface IPluginInfoDao: IGenericDao<HivePluginInfoDto> {    
     void InsertPluginDependenciesForJob(JobDto jobDto);
+    List<HivePluginInfoDto> GetPluginDependenciesForJob(JobDto jobDto);
   }
 }
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/BaseDao.cs	(revision 3578)
@@ -3,4 +3,6 @@
 using System.Linq;
 using System.Text;
+using System.Data.Linq;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Server.LINQDataAccess {
@@ -12,4 +14,15 @@
     }
 
+    protected void CommitChanges() {
+      try {
+        Context.SubmitChanges(ConflictMode.ContinueOnConflict);
+      } catch (ChangeConflictException e) {
+        Logger.Warn("Concurrency Exception! " + e.Message);
+        foreach (ObjectChangeConflict conflict in Context.ChangeConflicts) {          
+          conflict.Resolve(RefreshMode.KeepChanges);
+        }
+      }
+    }
+
     public abstract TDatabaseEntity DtoToEntity(TBusiness source, TDatabaseEntity target);
     public abstract TBusiness EntityToDto(TDatabaseEntity source, TBusiness target);
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientConfigDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientConfigDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientConfigDao.cs	(revision 3578)
@@ -26,5 +26,5 @@
       ClientConfig c = DtoToEntity(bObj, null);
       Context.ClientConfigs.InsertOnSubmit(c);
-      Context.SubmitChanges();
+      CommitChanges();
       bObj.Id = c.ClientConfigId;
       return bObj;  
@@ -33,5 +33,5 @@
     public void Delete(ClientConfigDto bObj) {
       Context.ClientConfigs.DeleteOnSubmit(Context.ClientConfigs.SingleOrDefault(c => c.ClientConfigId.Equals(bObj.Id)));
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -39,5 +39,5 @@
       ClientConfig cc = Context.ClientConfigs.SingleOrDefault(c => c.ClientConfigId.Equals(bObj.Id));
       DtoToEntity(bObj, cc);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientDao.cs	(revision 3578)
@@ -43,5 +43,5 @@
       dbclient.UseCalendarFromResourceId = clientGroupId;
       dbclient.CalendarSyncStatus = Enum.GetName(typeof(CalendarState), CalendarState.Fetch);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -49,5 +49,5 @@
       Client c = DtoToEntity(info, null);      
       Context.Clients.InsertOnSubmit(c);
-      Context.SubmitChanges();
+      CommitChanges();
       info.Id = c.ResourceId;
       return info;
@@ -58,5 +58,5 @@
       Resource res = Context.Resources.SingleOrDefault(c => c.ResourceId.Equals(info.Id));            
       Context.Resources.DeleteOnSubmit(res);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -64,10 +64,5 @@
       Client client = Context.Clients.SingleOrDefault(c => c.ResourceId.Equals(info.Id));
       DtoToEntity(info, client);
-      try {
-        Console.WriteLine("Sending from thread: " + Thread.CurrentThread.ManagedThreadId);
-        Context.SubmitChanges();
-      } catch (System.Data.Linq.ChangeConflictException cce) {
-        Console.WriteLine(cce);        
-      }
+      CommitChanges();      
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientGroupDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientGroupDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ClientGroupDao.cs	(revision 3578)
@@ -31,5 +31,5 @@
       ClientGroup cc = DtoToEntity(bObj, null);
       Context.ClientGroups.InsertOnSubmit(cc);
-      Context.SubmitChanges();
+      CommitChanges();
       bObj.Id = cc.ResourceId;
       return bObj;
@@ -44,5 +44,5 @@
 
       Context.Resources.DeleteOnSubmit(res);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -50,5 +50,5 @@
       ClientGroup client = Context.ClientGroups.SingleOrDefault(c => c.ResourceId.Equals(bObj.Id));
       DtoToEntity(bObj, client);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -57,5 +57,5 @@
       Resource res = Context.Resources.SingleOrDefault(r => r.ResourceId.Equals(resource));
       cg.ClientGroup_Resources.Add(new ClientGroup_Resource { ClientGroup = cg, Resource = res });      
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -65,5 +65,5 @@
           cg => cg.ResourceId.Equals(resource) && cg.ClientGroupId.Equals(clientGroupId));
       Context.ClientGroup_Resources.DeleteOnSubmit(cgr);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ContextFactory.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ContextFactory.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/ContextFactory.cs	(revision 3578)
@@ -9,8 +9,8 @@
   public class ContextFactory {
     [ThreadStatic]
-    private static HiveDataContext _hiveDataContext;
+    private static HiveDataContext _hiveDataContext = null;
 
     [ThreadStatic]
-    private static SqlTransaction _currentTransaction;
+    private static SqlTransaction _currentTransaction = null;
 
     public static HiveDataContext Context { 
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HeuristicLab.Hive.Server.LINQDataAccess-3.2.csproj	(revision 3578)
@@ -134,4 +134,8 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.dbml	(revision 3578)
@@ -88,5 +88,5 @@
       <Column Name="ResourceId" Type="System.Guid" DbType="UniqueIdentifier" CanBeNull="true" />
       <Column Name="Percentage" Type="System.Double" DbType="Float" CanBeNull="true" />
-      <Column Name="SerializedJob" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX)" CanBeNull="true" UpdateCheck="Never" />
+      <Column Name="SerializedJob" Type="System.Data.Linq.Binary" DbType="VarBinary(MAX)" CanBeNull="true" UpdateCheck="Never" IsDelayLoaded="true" />
       <Column Name="DateCreated" Type="System.DateTime" DbType="DateTime" CanBeNull="true" />
       <Column Name="DateCalculated" Type="System.DateTime" DbType="DateTime" CanBeNull="true" />
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Hive.designer.cs	(revision 3578)
@@ -1774,5 +1774,5 @@
 		private System.Nullable<double> _Percentage;
 		
-		private System.Data.Linq.Binary _SerializedJob;
+		private System.Data.Linq.Link<System.Data.Linq.Binary> _SerializedJob;
 		
 		private System.Nullable<System.DateTime> _DateCreated;
@@ -1957,18 +1957,18 @@
 		}
 		
-		[Column(Storage="_SerializedJob", DbType="VarBinary(MAX)", CanBeNull=true, UpdateCheck=UpdateCheck.Never)]
+		[Column(Storage="_SerializedJob", DbType="VarBinary(MAX)", UpdateCheck=UpdateCheck.Never)]
 		public System.Data.Linq.Binary SerializedJob
 		{
 			get
 			{
-				return this._SerializedJob;
-			}
-			set
-			{
-				if ((this._SerializedJob != value))
+				return this._SerializedJob.Value;
+			}
+			set
+			{
+				if ((this._SerializedJob.Value != value))
 				{
 					this.OnSerializedJobChanging(value);
 					this.SendPropertyChanging();
-					this._SerializedJob = value;
+					this._SerializedJob.Value = value;
 					this.SendPropertyChanged("SerializedJob");
 					this.OnSerializedJobChanged();
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs	(revision 3578)
@@ -25,4 +25,28 @@
     }
 
+    public IEnumerable<JobDto> FindWithLimitations(State jobState, int offset, int count) {
+
+      IQueryable<JobDto> query = null;
+      if (jobState == State.finished) {
+         query = from job in Context.Jobs
+                 where job.JobState == Enum.GetName(typeof (State), jobState)
+                 orderby job.DateFinished
+                 select EntityToDto(job, null);
+      } else if (jobState == State.calculating || jobState == State.requestSnapshot || jobState == State.requestSnapshotSent) {
+        query = from job in Context.Jobs
+                    where job.JobState == Enum.GetName(typeof(State), jobState)
+                    orderby job.DateCalculated
+                    select EntityToDto(job, null);
+      } else {
+        query = from job in Context.Jobs
+                    where job.JobState == Enum.GetName(typeof(State), jobState)
+                    orderby job.DateCreated
+                    select EntityToDto(job, null);
+      }
+
+      return query.Skip(offset).Take(count).ToList();
+    }
+
+
     public byte[] GetBinaryJobFile(Guid jobId) {
       return (from job in Context.Jobs
@@ -34,5 +58,5 @@
       Job j = DtoToEntity(bObj, null);
       Context.Jobs.InsertOnSubmit(j);
-      Context.SubmitChanges();
+      CommitChanges();
       bObj.Id = j.JobId;
       return bObj;
@@ -45,5 +69,5 @@
         j.AssignedResources.Add(new AssignedResource { ResourceId = assignRessourceId});
       Context.Jobs.InsertOnSubmit(j);
-      Context.SubmitChanges();
+      CommitChanges();
       job.JobInfo.Id = j.JobId;
       return job;
@@ -54,15 +78,11 @@
       Job job = Context.Jobs.SingleOrDefault(j => j.JobId.Equals(bObj.Id));
       Context.Jobs.DeleteOnSubmit(job);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
     public void Update(JobDto bObj) {
       Job job = Context.Jobs.SingleOrDefault(j => j.JobId.Equals(bObj.Id));
-      DtoToEntity(bObj, job);
-      try {
-        Context.SubmitChanges();
-      } catch (ChangeConflictException cfe) {
-        
-      }
+      DtoToEntity(bObj, job);    
+      CommitChanges(); 
     }
 
@@ -105,5 +125,5 @@
       c.Jobs.Add(j);
       j.Client = c;
-      Context.SubmitChanges();      
+      CommitChanges();      
     }
 
@@ -112,5 +132,5 @@
       j.Client = null;
       j.JobState = Enum.GetName(typeof(State), State.offline); 
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -137,4 +157,5 @@
       target.DateCalculated = source.DateCalculated;
       target.DateCreated = source.DateCreated;
+      target.DateFinished = source.DateFinished;
       target.JobId = source.Id;
 
@@ -162,11 +183,9 @@
       target.MemoryNeeded = source.MemoryNeeded;
 
-
-
       target.DateCalculated = source.DateCalculated;
       target.DateCreated = source.DateCreated;
+      target.DateFinished = source.DateFinished;
       target.Id = source.JobId;
-      
-          
+       
       target.Percentage = source.Percentage;
       
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/LINQDataAccessPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/LINQDataAccessPlugin.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/LINQDataAccessPlugin.cs	(revision 3578)
@@ -11,4 +11,5 @@
   [PluginDependency("HeuristicLab.Hive.Contracts-3.2")]
   [PluginDependency("HeuristicLab.Hive.Server.DataAccess-3.2")]
+  [PluginDependency("HeuristicLab.Tracing", "3.2.0")]
   public class LINQDataAccessPlugin: PluginBase {
   }
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/PluginInfoDao.cs	(revision 3578)
@@ -26,5 +26,5 @@
       PluginInfo pi = DtoToEntity(bObj, null);
       Context.PluginInfos.InsertOnSubmit(pi);
-      Context.SubmitChanges();
+      CommitChanges();
       bObj.Id = pi.PluginId;
       return bObj;
@@ -39,5 +39,5 @@
       PluginInfo pi = Context.PluginInfos.SingleOrDefault(p => p.PluginId.Equals(bObj.Id));
       DtoToEntity(bObj, pi);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -53,5 +53,5 @@
                                 };
           Context.PluginInfos.InsertOnSubmit(dbpi);
-          Context.SubmitChanges();
+          CommitChanges();
         }
 
@@ -60,6 +60,13 @@
         rq.PluginInfo = dbpi;
         Context.RequiredPlugins.InsertOnSubmit(rq);
-        Context.SubmitChanges();
+        CommitChanges();
       }
+    }
+
+    public List<HivePluginInfoDto> GetPluginDependenciesForJob(JobDto jobDto) {
+      return (from rp in Context.RequiredPlugins
+              where rp.JobId.Equals(jobDto.Id)
+              select EntityToDto(rp.PluginInfo, null)).ToList();
+      
     }
 
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.Designer.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.Designer.cs	(revision 3578)
@@ -27,5 +27,5 @@
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
         [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
-        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=SEMTEX-PC;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=" +
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=" +
             "True")]
         public string HeuristicLab_Hive_LinqConnectionString {
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.settings	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/Properties/Settings.settings	(revision 3578)
@@ -6,8 +6,8 @@
       <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
 &lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
-  &lt;ConnectionString&gt;Data Source=SEMTEX-PC;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True&lt;/ConnectionString&gt;
+  &lt;ConnectionString&gt;Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True&lt;/ConnectionString&gt;
   &lt;ProviderName&gt;System.Data.SqlClient&lt;/ProviderName&gt;
 &lt;/SerializableConnectionString&gt;</DesignTimeValue>
-      <Value Profile="(Default)">Data Source=SEMTEX-PC;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True</Value>
+      <Value Profile="(Default)">Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True</Value>
     </Setting>
   </Settings>
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/UptimeCalendarDao.cs	(revision 3578)
@@ -60,5 +60,5 @@
       UptimeCalendar uc = DtoToEntity(bObj, null);
       Context.UptimeCalendars.InsertOnSubmit(uc);
-      Context.SubmitChanges();
+      CommitChanges();
       bObj.Id = uc.UptimeCalendarId;
       return bObj;
@@ -67,5 +67,5 @@
     public void Delete(AppointmentDto bObj) {
       Context.UptimeCalendars.DeleteOnSubmit(Context.UptimeCalendars.SingleOrDefault(uc => uc.UptimeCalendarId.Equals(bObj.Id)));
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -73,5 +73,5 @@
       UptimeCalendar cc = Context.UptimeCalendars.SingleOrDefault(c => c.UptimeCalendarId.Equals(bObj.Id));
       DtoToEntity(bObj, cc);
-      Context.SubmitChanges();
+      CommitChanges();
     }
 
@@ -95,5 +95,5 @@
       }
 
-      Context.SubmitChanges();            
+      CommitChanges();            
     }    
 
@@ -143,5 +143,5 @@
       }
       
-      Context.SubmitChanges();
+      CommitChanges();
 
       //Get all Subgroups
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/VarBinaryStream.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/VarBinaryStream.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/VarBinaryStream.cs	(revision 3578)
@@ -7,4 +7,5 @@
 using System.Data.SqlClient;
 using System.Data;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Server.LINQDataAccess {
@@ -253,7 +254,9 @@
 
     public void Close() {
+      Logger.Info("Closing Stream");
       if (_transaction != null) {
         _transaction.Commit();
         _transaction = null;
+        Logger.Info("Transaction commited and closed");
       }
 
@@ -262,4 +265,5 @@
         ContextFactory.Context.Dispose();
         ContextFactory.Context = null;
+        Logger.Info("Connection and Context disposed and set null");
       }
     }
Index: /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/app.config
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/app.config	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/app.config	(revision 3578)
@@ -5,5 +5,5 @@
     <connectionStrings>
         <add name="HeuristicLab.Hive.Server.LINQDataAccess.Properties.Settings.HeuristicLab_Hive_LinqConnectionString"
-            connectionString="Data Source=SEMTEX-PC;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True"
+            connectionString="Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Hive.Linq;Integrated Security=True"
             providerName="System.Data.SqlClient" />
     </connectionStrings>
Index: /trunk/sources/HeuristicLab.Hive.Server/3.2/HeuristicLab.Hive.Server-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server/3.2/HeuristicLab.Hive.Server-3.2.csproj	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server/3.2/HeuristicLab.Hive.Server-3.2.csproj	(revision 3578)
@@ -168,4 +168,8 @@
       <Name>HeuristicLab.PluginInfrastructure</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Tracing\3.2\HeuristicLab.Tracing-3.2.csproj">
+      <Project>{EE2034D9-6E27-48A1-B855-42D45F69A4FC}</Project>
+      <Name>HeuristicLab.Tracing-3.2</Name>
+    </ProjectReference>
   </ItemGroup>
   <ItemGroup>
Index: /trunk/sources/HeuristicLab.Hive.Server/3.2/HiveServerPlugin.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server/3.2/HiveServerPlugin.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server/3.2/HiveServerPlugin.cs	(revision 3578)
@@ -35,4 +35,5 @@
   [PluginDependency("HeuristicLab.Hive.Server.LINQDataAccess-3.2")]
   [PluginDependency("HeuristicLab.SpringNET", "1.3.0.0")]
+  [PluginDependency("HeuristicLab.Tracing", "3.2.0")]
   public class HiveServerPlugin : PluginBase {
   }
Index: /trunk/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Hive.Server/3.2/ServiceCallInterception.cs	(revision 3578)
@@ -7,16 +7,23 @@
 using HeuristicLab.Hive.Server.LINQDataAccess;
 using System.Transactions;
+using HeuristicLab.Hive.Contracts;
+using HeuristicLab.Tracing;
 
 namespace HeuristicLab.Hive.Server {
   internal class ServiceCallInterception : IMethodInterceptor {
 
-    private bool useTransactions = false;
+    private const bool UseTransactions = true;
 
     public object Invoke(IMethodInvocation invocation) {
-      Console.WriteLine(DateTime.Now + " - " + Thread.CurrentThread.ManagedThreadId + " - Entering Method " +
-                        invocation.Method.Name);
+      Logger.Info("Entering Method: " + invocation.Method.Name);
 
       if(ContextFactory.Context != null) {
-        Console.WriteLine("Error - Not null context found - why wasn't this disposed?");
+        Logger.Info("Not null context found - why wasn't this disposed?");
+        try {
+          Logger.Info("Trying to dispose");
+          ContextFactory.Context.Dispose();
+        } catch (Exception e) {
+          Logger.Error(e);
+        }
         ContextFactory.Context = null;
       }
@@ -26,31 +33,35 @@
       if (invocation.Method.Name.Equals("SendStreamedJob") || invocation.Method.Name.Equals("StoreFinishedJobResultStreamed")) {        
         ContextFactory.Context.Connection.Open();
-        if(useTransactions)
-          ContextFactory.Context.Transaction = ContextFactory.Context.Connection.BeginTransaction();
+        if(UseTransactions) {
+          Logger.Debug("Opening Transaction");
+          ContextFactory.Context.Transaction = ContextFactory.Context.Connection.BeginTransaction(ApplicationConstants.ISOLATION_LEVEL);
+        } else {
+          Logger.Debug("Not using a Transaction");
+        }
         try {
           obj = invocation.Proceed();
-          Console.WriteLine("leaving context open for Streaming");
+          Logger.Info("leaving context open for streaming");
         }
-        catch (Exception e) {          
-          Console.WriteLine(e);
+        catch (Exception e) {
+          Logger.Error("Exception occured during method invocation", e);              
           ContextFactory.Context.Dispose();
           ContextFactory.Context = null;
         }        
       } else {
-        if(useTransactions) {
-          using (TransactionScope scope = new TransactionScope()) {
+        if(UseTransactions) {
+          using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = ApplicationConstants.ISOLATION_LEVEL_SCOPE })) {
             try {
+              Logger.Debug("Current Transaction Isolation level is: " + Transaction.Current.IsolationLevel);
               obj = invocation.Proceed();
               scope.Complete();
             }
             catch (Exception e) {
-              Console.WriteLine("Exception Occured");
-              Console.WriteLine(e);
+              Logger.Error("Exception occured during method invocation", e);              
             }
             finally {
               ContextFactory.Context.Dispose();
-              Console.WriteLine("setting old context null");
+              Logger.Debug("Disposed Context");
               ContextFactory.Context = null;
-              Console.WriteLine("Disposing old Context");
+              Logger.Debug("Set Context Null");
             }
           }
@@ -60,17 +71,15 @@
           }
           catch (Exception e) {
-            Console.WriteLine("Exception Occured");
-            Console.WriteLine(e);
+            Logger.Error("Exception occured during method invocation", e);                          
           }
           finally {
             ContextFactory.Context.Dispose();
-            Console.WriteLine("setting old context null");
+            Logger.Debug("Disposed Context");
             ContextFactory.Context = null;
-            Console.WriteLine("Disposing old Context");
+            Logger.Debug("Set Context Null");
           }  
         }
       }
-      Console.WriteLine(DateTime.Now + " - " + Thread.CurrentThread.ManagedThreadId + " - Leaving Method " +
-                          invocation.Method.Name);
+      Logger.Info("Leaving Method: " + invocation.Method.Name);
 
       return obj;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 3578)
@@ -94,5 +94,5 @@
       applicationManager.PrepareApplicationDomain(apps, plugins);
       //if (files != null && files.Count() > 0)
-      //applicationManager.LoadAssemblies(files);
+        //applicationManager.LoadAssemblies(files);
       return applicationDomain;
     }
Index: /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.Designer.cs	(revision 3577)
+++ /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.Designer.cs	(revision 3578)
@@ -26,6 +26,6 @@
         [global::System.Configuration.ApplicationScopedSettingAttribute()]
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
-        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Persist Security Info" +
-            "=True;User ID=hive;Password=hive;Pooling=true;MultipleActiveResultSets=true")]
+        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Integrated Security=T" +
+            "rue;Pooling=true;MultipleActiveResultSets=true")]
         public string SecurityServerConnectionString {
             get {
Index: /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.settings
===================================================================
--- /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.settings	(revision 3577)
+++ /trunk/sources/HeuristicLab.Security.Core/3.2/Properties/Settings.settings	(revision 3578)
@@ -4,5 +4,5 @@
   <Settings>
     <Setting Name="SecurityServerConnectionString" Type="System.String" Scope="Application">
-      <Value Profile="(Default)">Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Persist Security Info=True;User ID=hive;Password=hive;Pooling=true;MultipleActiveResultSets=true</Value>
+      <Value Profile="(Default)">Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Integrated Security=True;Pooling=true;MultipleActiveResultSets=true</Value>
     </Setting>
   </Settings>
Index: /trunk/sources/HeuristicLab.Security.Core/3.2/app.config
===================================================================
--- /trunk/sources/HeuristicLab.Security.Core/3.2/app.config	(revision 3577)
+++ /trunk/sources/HeuristicLab.Security.Core/3.2/app.config	(revision 3578)
@@ -10,5 +10,5 @@
         <HeuristicLab.Security.Core.Properties.Settings>
             <setting name="SecurityServerConnectionString" serializeAs="String">
-                <value>Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Persist Security Info=True;User ID=hive;Password=hive;Pooling=true;MultipleActiveResultSets=true</value>
+                <value>Data Source=127.0.0.1;Initial Catalog=HeuristicLab.Security;Integrated Security=True;Pooling=true;MultipleActiveResultSets=true</value>
             </setting>
         </HeuristicLab.Security.Core.Properties.Settings>
Index: /trunk/sources/HeuristicLab.Tracing/3.2/HeuristicLab.Hive.log4net.xml
===================================================================
--- /trunk/sources/HeuristicLab.Tracing/3.2/HeuristicLab.Hive.log4net.xml	(revision 3577)
+++ /trunk/sources/HeuristicLab.Tracing/3.2/HeuristicLab.Hive.log4net.xml	(revision 3578)
@@ -9,6 +9,32 @@
     <staticLogFileName value="true" />
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
-    <layout type="log4net.Layout.PatternLayout">
-      <conversionPattern value="%-4timestamp %-5level% =>   %message%newline%exception" />
+    <layout type="HeuristicLab.Tracing.MethodCallPatternLayout, HeuristicLab.Tracing-3.2">
+      <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.ffff} %-4timestamp %-5level %logger.%RM - %message%newline%exception" />
+    </layout>
+  </appender>
+
+  <appender name="ServerRollingFileAppender" type="log4net.Appender.RollingFileAppender">
+    <file value="Hive.Server.log" />
+    <appendToFile value="true" />
+    <rollingStyle value="Size" />
+    <maxSizeRollBackups value="10" />
+    <maximumFileSize value="1000KB" />
+    <staticLogFileName value="true" />
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+    <layout type="HeuristicLab.Tracing.MethodCallPatternLayout, HeuristicLab.Tracing-3.2">
+      <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.ffff} %-4timestamp %-5level %logger.%RM - %message%newline%exception" />
+    </layout>
+  </appender>
+
+  <appender name="ClientRollingFileAppender" type="log4net.Appender.RollingFileAppender">
+    <file value="Hive.Client.log" />
+    <appendToFile value="true" />
+    <rollingStyle value="Size" />
+    <maxSizeRollBackups value="10" />
+    <maximumFileSize value="1000KB" />
+    <staticLogFileName value="true" />
+    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+    <layout type="HeuristicLab.Tracing.MethodCallPatternLayout, HeuristicLab.Tracing-3.2">
+      <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss.ffff} %-4timestamp %-5level %logger.%RM - %message%newline%exception" />
     </layout>
   </appender>
@@ -18,5 +44,5 @@
     <lossy value="true" />
     <evaluator type="log4net.Core.LevelEvaluator">
-        <threshold value="INFO"/>
+        <threshold value="DEBUG"/>
     </evaluator>
     <appender-ref ref="RollingFileAppender" />
@@ -27,4 +53,14 @@
     <appender-ref ref="BufferingForwardingAppender" />
   </root>
+
+  <logger name="HeuristicLab.Hive.Server">
+    <level value="DEBUG" />
+    <appender-ref ref="ServerRollingFileAppender" />    
+  </logger>
+
+  <logger name="HeuristicLab.Hive.Client">
+    <level value="DEBUG" />
+    <appender-ref ref="ClientRollingFileAppender" />  
+  </logger>
   
 </log4net>
