Index: branches/3.2/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.Communication/3.2/WcfService.cs	(revision 4140)
@@ -462,5 +462,4 @@
       }
     }
-
   }
 }
Index: branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/Core.cs	(revision 4140)
@@ -45,4 +45,5 @@
 using HeuristicLab.Hive.Client.Core.JobStorage;
 using HeuristicLab.Tracing;
+using System.IO;
 
 namespace HeuristicLab.Hive.Client.Core {
@@ -135,17 +136,6 @@
 
         case MessageContainer.MessageType.JobAborted:          
-        //todo: thread this          
-          lock (engines) {
-            Guid jobId = new Guid(container.JobId.ToString());
-            if (engines.ContainsKey(jobId)) {
-              appDomains[jobId].UnhandledException -= new UnhandledExceptionEventHandler(appDomain_UnhandledException);
-              AppDomain.Unload(appDomains[jobId]);
-              appDomains.Remove(jobId);
-              engines.Remove(jobId);
-              jobs.Remove(jobId);
-              GC.Collect();
-            } else
-              Logger.Error("JobAbort: Engine doesn't exist");
-          }
+          Guid jobId = new Guid(container.JobId.ToString());
+          KillAppDomain(jobId);
           break;
 
@@ -252,22 +242,10 @@
             sJob,
             1,
-            null,
+            engines[jId].CurrentException,
             true);
         } else {
           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);
-            
-            //Disposing it
-            engines[jId].Dispose();
-            
-            AppDomain.Unload(appDomains[jId]);
-            Logger.Debug("Unloaded appdomain");
-            appDomains.Remove(jId);            
-            engines.Remove(jId);            
-            jobs.Remove(jId);
-            Logger.Debug("Removed job from appDomains, Engines and Jobs");
-          }
+          KillAppDomain(jId);
         }
       }
@@ -339,11 +317,11 @@
         PluginCache.Instance.PreparePlugins(e.Result.Job.PluginsNeeded);
 
-//        foreach (CachedHivePluginInfoDto plugininfo in PluginCache.Instance.GetPlugins(e.Result.Job.PluginsNeeded))
-  //        files.AddRange(plugininfo.PluginFiles);
+        PluginCache.Instance.CopyPluginsForJob(e.Result.Job.PluginsNeeded, e.Result.Job.Id);
+
         Logger.Debug("Plugins fetched for job " + e.Result.Job.Id);
         try {
+          String pluginDir = Path.Combine(PluginCache.PLUGIN_REPO, e.Result.Job.Id.ToString());
           AppDomain appDomain =
-            HeuristicLab.PluginInfrastructure.Sandboxing.SandboxManager.CreateAndInitSandbox(
-              e.Result.Job.Id.ToString(), null);
+            HeuristicLab.PluginInfrastructure.Sandboxing.SandboxManager.CreateAndInitSandbox(pluginDir, null);
           appDomain.UnhandledException += new UnhandledExceptionEventHandler(appDomain_UnhandledException);
           lock (engines) {
@@ -372,4 +350,6 @@
           CurrentlyFetching = false;
           KillAppDomain(e.Result.Job.Id);
+          wcfService.StoreFinishedJobResultsSync(ConfigManager.Instance.GetClientInfo().Id, e.Result.Job.Id, new byte[] { },
+                                                 1, exception, true);
         }
       } else
@@ -504,4 +484,5 @@
           engines.Remove(id);
           jobs.Remove(id);
+          PluginCache.Instance.DeletePluginsForJob(id);
           GC.Collect();
         }
Index: branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.Core/3.2/PluginCache.cs	(revision 4140)
@@ -2,4 +2,5 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.CompilerServices;
 using System.Text;
 using HeuristicLab.PluginInfrastructure;
@@ -9,9 +10,20 @@
 using HeuristicLab.Tracing;
 using System.IO;
+using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.Hive.Client.Core {
+
+  
+
   public class PluginCache {
 
     private static PluginCache instance = null;
+
+    public const string PLUGIN_REPO = @"plugins\";
+
+    private List<PluginDescription> cachedPlugins = new List<PluginDescription>();
+
+    private PluginManager pm = new PluginManager(PLUGIN_REPO);
+  
     public static PluginCache Instance {
       get {
@@ -22,70 +34,111 @@
     } 
     
-    private List<CachedHivePluginInfoDto> pluginCache;
-    
 
-    public PluginCache() {
-      pluginCache = new List<CachedHivePluginInfoDto>();
-    }
-    
-    public void AddPlugin(CachedHivePluginInfoDto plugin) {
-      pluginCache.Add(plugin);    
+    public PluginCache() {      
+      DoUpdateRun();
     }
 
-    public List<CachedHivePluginInfoDto> GetPlugins(List<HivePluginInfoDto> requests) {
+    private void DoUpdateRun() {
+      pm.DiscoverAndCheckPlugins();
+      cachedPlugins = new List<PluginDescription>(pm.Plugins);
+    }
+
+
+    [MethodImpl(MethodImplOptions.Synchronized)]
+    public bool CopyPluginsForJob(List<HivePluginInfoDto> requests, Guid jobId) {
+
+      String targetDir = PLUGIN_REPO + jobId.ToString() + "\\";
+
+      if(Directory.Exists(targetDir)) {
+        Directory.Delete(targetDir, true);
+      }
+
+      DirectoryInfo di = Directory.CreateDirectory(targetDir);
+
+      foreach (HivePluginInfoDto requestedPlugin in requests) {
+        PluginDescription pd =
+          cachedPlugins.Where(
+            cp =>
+            cp.Name == requestedPlugin.Name && 
+            cp.Version.Major == requestedPlugin.Version.Major && 
+            cp.Version.Minor == requestedPlugin.Version.Minor && 
+            cp.Version.Revision >= requestedPlugin.Version.Revision).
+            SingleOrDefault();
+        if (pd == null) {
+          return false;
+        }
+
+        foreach(IPluginFile ipf in pd.Files) {
+          File.Copy(ipf.Name, targetDir + ipf.Name.Split('\\').Last());
+        }
+      }
+      return true;                                                                                                       
+    }
+
+    [MethodImpl(MethodImplOptions.Synchronized)]
+    internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) {
       Logger.Debug("Fetching plugins for job");
-      List<CachedHivePluginInfoDto> neededPlugins = new List<CachedHivePluginInfoDto>();
+      List<HivePluginInfoDto> localPlugins = new List<HivePluginInfoDto>();
+      List<HivePluginInfoDto> neededPlugins = new List<HivePluginInfoDto>();
       List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
       bool found = false;
-            
-      foreach (HivePluginInfoDto info in requests) {
+
+      foreach (HivePluginInfoDto info in requiredPlugins) {
         //we MAY run in problems here - if there is a plugin twice in requests, there may be added two different versions of the plugin
-        foreach (CachedHivePluginInfoDto cache in pluginCache) {
-          if (info.Name.Equals(cache.Name) && info.Version.Equals(cache.Version) && info.BuildDate <= cache.BuildDate) {
+        foreach (PluginDescription cachedPlugin in cachedPlugins) {
+          if (info.Name.Equals(cachedPlugin.Name)) {
             Logger.Debug("Found plugin " + info.Name + ", " + info.Version);
-            neededPlugins.Add(cache);
+            localPlugins.Add(new HivePluginInfoDto() { BuildDate = DateTime.Now, Id = new Guid(), Name = info.Name, Version = info.Version, Update =  true});
+            neededPlugins.Add(info);
             found = true;
+
             break;
           }
         }
-        if (!found)
-          Logger.Debug("Found NOT found " + info.Name + ", " + info.Version);
+        if (!found) {
+          Logger.Debug("Plugin 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");
+      Logger.Debug("First run - Update the plugins in the cache");
 
-      if (receivedPlugins != null) {
-        neededPlugins.AddRange(receivedPlugins);
-        pluginCache.AddRange(receivedPlugins);
-      } else
-        Logger.Error("Fetching of the plugins failed!");
+      localPlugins.AddRange(missingPlugins);
 
-      return neededPlugins;
+      List<CachedHivePluginInfoDto> updateablePlugins = WcfService.Instance.RequestPlugins(localPlugins);      
+
+      foreach (CachedHivePluginInfoDto updateablePlugin in updateablePlugins) {
+        PluginDescription pd =
+          cachedPlugins.Where(cachedPlugin => cachedPlugin.Name.Equals(updateablePlugin.Name)).SingleOrDefault();
+
+        if (pd != null) {
+          Logger.Debug("deleting old files");
+          foreach (IPluginFile ipf in pd.Files) {
+            File.Delete(ipf.Name);
+          }
+        }
+
+        Logger.Debug("deleted old files");
+        Logger.Debug("creating new files");
+
+        
+
+        foreach (HivePluginFile pf in updateablePlugin.PluginFiles) {
+          File.WriteAllBytes(PLUGIN_REPO + pf.Name.Split('\\').Last(), pf.BinaryFile);
+        }
+
+        Logger.Debug("created new files");
+        DoUpdateRun();
+      }
     }
 
-
-    internal void PreparePlugins(List<HivePluginInfoDto> requiredPlugins) {
-      List<HivePluginInfoDto> missingPlugins = new List<HivePluginInfoDto>();
-      foreach (HivePluginInfoDto requiredPlugin in requiredPlugins) {
-        if(ApplicationManager.Manager.Plugins.Count(ipd => ipd.Version.Major == requiredPlugin.Version.Major && ipd.Version.Minor >= requiredPlugin.Version.Minor) == 0) {
-          missingPlugins.Add(requiredPlugin);             
-        }
+    internal void DeletePluginsForJob(Guid id) {
+      try {
+        Logger.Debug("unloading...");
+        Directory.Delete(Path.Combine(PLUGIN_REPO, id.ToString()), true);
+      } catch (Exception ex) {
+        Logger.Debug("failed while unloading " + id + " with exception " + ex);
       }
-
-      Logger.Debug("Requesting missing plugins");
-      List<CachedHivePluginInfoDto> receivedPlugins = WcfService.Instance.RequestPlugins(missingPlugins);
-      Logger.Debug("Requested missing plugins");
-
-      foreach (CachedHivePluginInfoDto receivedPlugin in receivedPlugins) {
-        foreach (HivePluginFile hpf in receivedPlugin.PluginFiles) {
-          Logger.Info("writing file " + hpf.Name);
-          File.WriteAllBytes("C:\\temp\\" + hpf.Name.Split('\\').Last(), hpf.BinaryFile);
-        }        
-      }
-
     }
   }
Index: branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/ExecutionEnginePlugin.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/ExecutionEnginePlugin.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/ExecutionEnginePlugin.cs	(revision 4140)
@@ -30,4 +30,5 @@
   [PluginFile("HeuristicLab.Hive.Client.ExecutionEngine-3.2.dll", PluginFileType.Assembly)]
   [PluginDependency("HeuristicLab.Core-3.2")]
+  [PluginDependency("HeuristicLab.Common")]
   [PluginDependency("HeuristicLab.Hive.Client.Common-3.2")]
   [PluginDependency("HeuristicLab.Hive.Client.Communication-3.2")]
Index: branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/Executor.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/Executor.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/Executor.cs	(revision 4140)
@@ -37,4 +37,6 @@
     public IJob Job { get; set; }
     public MessageContainer.MessageType CurrentMessage { get; set; }
+    public Exception CurrentException { get; set; }
+
     public MessageQueue Queue { get; set; }
 
@@ -66,5 +68,7 @@
 
     void Job_JobFailed(object sender, EventArgs e) {
-      Queue.AddMessage(new MessageContainer(MessageContainer.MessageType.JobFailed, JobId));
+      HeuristicLab.Common.EventArgs<Exception> ex = (HeuristicLab.Common.EventArgs<Exception>) e;
+      CurrentException = ex.Value;
+      Queue.AddMessage(new MessageContainer(MessageContainer.MessageType.FinishedJob, JobId));
     }
 
Index: branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/HeuristicLab.Hive.Client.ExecutionEngine-3.2.csproj
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/HeuristicLab.Hive.Client.ExecutionEngine-3.2.csproj	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Client.ExecutionEngine/3.2/HeuristicLab.Hive.Client.ExecutionEngine-3.2.csproj	(revision 4140)
@@ -90,4 +90,8 @@
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\..\HeuristicLab.Common\3.2\HeuristicLab.Common-3.2.csproj">
+      <Project>{1FC004FC-59AF-4249-B1B6-FF25873A20E4}</Project>
+      <Name>HeuristicLab.Common-3.2</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Core\3.2\HeuristicLab.Core-3.2.csproj">
       <Project>{F43B59AB-2B8C-4570-BC1E-15592086517C}</Project>
Index: branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/ApplicationConstants.cs	(revision 4140)
@@ -85,4 +85,5 @@
     public static string RESPONSE_COMMUNICATOR_SEND_JOBRESULT = "Please send the Jobresult to the server";
     public static string RESPONSE_COMMUNICATOR_PLUGINS_SENT = "Communicator.PluginsSent";
+    public static string RESPONSE_COMMUNICATOR_PLUGINS_NOT_AVAIL = "Communicator.PluginsNotAvail";
     public static string RESPONSE_COMMUNICATOR_JOB_WAS_ABORTED = "Job was aborted";
 
Index: branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/ClientDto.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/ClientDto.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/ClientDto.cs	(revision 4140)
@@ -28,5 +28,5 @@
 namespace HeuristicLab.Hive.Contracts.BusinessObjects {
 
-  public enum State { nullState, idle, calculating, offline, finished, abort, requestSnapshot, requestSnapshotSent, pending };
+  public enum State { nullState, idle, calculating, offline, finished, abort, requestSnapshot, requestSnapshotSent, pending, failed };
   public enum CalendarState { Fetch, ForceFetch, Fetching, Fetched, NotAllowedToFetch };
 
Index: branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/HivePluginInfoDto.cs	(revision 4140)
@@ -41,4 +41,7 @@
     [DataMember]
     public DateTime BuildDate { get; set; }
+
+    [DataMember]
+    public Boolean Update { get; set; }
   }
 }
Index: branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Contracts/3.2/BusinessObjects/JobDto.cs	(revision 4140)
@@ -44,4 +44,6 @@
     public double? Percentage { get; set; }
     [DataMember]
+    public String Exception { get; set; }
+    [DataMember]
     public DateTime? DateCreated { get; set; }
     [DataMember]
Index: branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 4140)
@@ -595,6 +595,9 @@
       }
       job.JobInfo.Percentage = percentage;
-
-      if (finished) {
+      if(exception != null) {
+        job.JobInfo.State = State.failed;
+        job.JobInfo.Exception = exception.ToString();
+        job.JobInfo.DateFinished = DateTime.Now;
+      } else if (finished) {
         job.JobInfo.State = State.finished;
         job.JobInfo.DateFinished = DateTime.Now;
@@ -718,19 +721,20 @@
       ResponsePlugin response = new ResponsePlugin();
       foreach (HivePluginInfoDto pluginInfo in pluginList) {
-        // TODO: BuildDate deleted, not needed???
-        // TODO: Split version to major, minor and revision number
-        foreach (IPluginDescription currPlugin in ApplicationManager.Manager.Plugins) {
-          if (currPlugin.Name == pluginInfo.Name) {
-
-            CachedHivePluginInfoDto currCachedPlugin = new CachedHivePluginInfoDto {
-              Name = currPlugin.Name,
-              Version = currPlugin.Version,
-              BuildDate = currPlugin.BuildDate
-            };
-
-            foreach (string fileName in from file in currPlugin.Files select file.Name) {
-              currCachedPlugin.PluginFiles.Add(new HivePluginFile(File.ReadAllBytes(fileName), fileName));
-            }
-            response.Plugins.Add(currCachedPlugin);
+        if(pluginInfo.Update) {
+          //check if there is a newer version         
+          IPluginDescription ipd =
+            ApplicationManager.Manager.Plugins.Where(pd => pd.Name == pluginInfo.Name && pd.Version.Major == pluginInfo.Version.Major && pd.Version.Minor == pluginInfo.Version.Minor && pd.Version.Revision > pluginInfo.Version.Revision).SingleOrDefault();
+          if(ipd != null) {
+            response.Plugins.Add(convertPluginDescriptorToDto(ipd));  
+          }  
+        } else {
+          IPluginDescription ipd =
+            ApplicationManager.Manager.Plugins.Where(pd => pd.Name == pluginInfo.Name && pd.Version.Major == pluginInfo.Version.Major && pd.Version.Minor == pluginInfo.Version.Minor && pd.Version.Revision >= pluginInfo.Version.Revision).SingleOrDefault();
+          if(ipd != null) {
+            response.Plugins.Add(convertPluginDescriptorToDto(ipd));  
+          } else {
+            response.Success = false;
+            response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_PLUGINS_NOT_AVAIL;
+            return response;
           }
         }
@@ -741,4 +745,17 @@
       return response;
 
+    }
+
+    private CachedHivePluginInfoDto convertPluginDescriptorToDto(IPluginDescription currPlugin) {
+      CachedHivePluginInfoDto currCachedPlugin = new CachedHivePluginInfoDto {
+                                                                               Name = currPlugin.Name,
+                                                                               Version = currPlugin.Version,
+                                                                               BuildDate = currPlugin.BuildDate
+                                                                             };
+
+      foreach (string fileName in from file in currPlugin.Files select file.Name) {
+        currCachedPlugin.PluginFiles.Add(new HivePluginFile(File.ReadAllBytes(fileName), fileName));
+      }
+      return currCachedPlugin;
     }
 
Index: branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.cs	(revision 4140)
@@ -1941,4 +1941,6 @@
 		private System.Nullable<double> _Percentage;
 		
+		private string _Exception;
+		
 		private System.Data.Linq.Link<System.Data.Linq.Binary> _SerializedJob;
 		
@@ -1985,4 +1987,6 @@
     partial void OnPercentageChanging(System.Nullable<double> value);
     partial void OnPercentageChanged();
+    partial void OnExceptionChanging(string value);
+    partial void OnExceptionChanged();
     partial void OnSerializedJobChanging(System.Data.Linq.Binary value);
     partial void OnSerializedJobChanged();
@@ -2124,4 +2128,24 @@
 		}
 		
+		[Column(Storage="_Exception", DbType="VarChar(MAX)")]
+		public string Exception
+		{
+			get
+			{
+				return this._Exception;
+			}
+			set
+			{
+				if ((this._Exception != value))
+				{
+					this.OnExceptionChanging(value);
+					this.SendPropertyChanging();
+					this._Exception = value;
+					this.SendPropertyChanged("Exception");
+					this.OnExceptionChanged();
+				}
+			}
+		}
+		
 		[Column(Storage="_SerializedJob", DbType="VarBinary(MAX)", UpdateCheck=UpdateCheck.Never)]
 		public System.Data.Linq.Binary SerializedJob
Index: branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.xml
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.xml	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/HiveDataContext.xml	(revision 4140)
@@ -99,4 +99,5 @@
       <Column Name="ResourceId" Member="ResourceId" DbType="UniqueIdentifier" Type="System.Guid" CanBeNull="true"/>
       <Column Name="Percentage" Member="Percentage" DbType="Float" Type="System.Double" CanBeNull="true"/>
+      <Column Name="Exception" Member="Exception" DbType="VarChar(MAX)" Type="System.String" CanBeNull="true"/>
       <Column Name="SerializedJob" Member="SerializedJob" DbType="VarBinary(MAX)" UpdateCheck="Never" Type="System.Data.Linq.Binary" IsDelayLoaded="true"/>
       <Column Name="DateCreated" Member="DateCreated" DbType="DateTime" Type="System.DateTime" CanBeNull="true"/>
Index: branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.Hive.Server.LINQDataAccess/3.2/JobDao.cs	(revision 4140)
@@ -167,6 +167,7 @@
       target.DateFinished = source.DateFinished;
       target.JobId = source.Id;
-
+      
       target.Percentage = source.Percentage;
+      target.Exception = source.Exception;
 
       target.Priority = source.Priority;
@@ -195,5 +196,6 @@
       target.DateFinished = source.DateFinished;
       target.Id = source.JobId;
-       
+
+      target.Exception = source.Exception;
       target.Percentage = source.Percentage;
       
Index: branches/3.2/sources/HeuristicLab.PluginInfrastructure/Manager/PluginManager.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.PluginInfrastructure/Manager/PluginManager.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.PluginInfrastructure/Manager/PluginManager.cs	(revision 4140)
@@ -35,5 +35,5 @@
   /// Class to manage different plugins.
   /// </summary>
-  internal sealed class PluginManager : MarshalByRefObject {
+  public sealed class PluginManager : MarshalByRefObject {
     internal event EventHandler<PluginInfrastructureEventArgs> PluginLoaded;
     internal event EventHandler<PluginInfrastructureEventArgs> PluginUnloaded;
@@ -49,5 +49,5 @@
     /// Gets all installed plugins.
     /// </summary>
-    internal IEnumerable<PluginDescription> Plugins {
+    public IEnumerable<PluginDescription> Plugins {
       get { return plugins; }
     }
@@ -64,5 +64,5 @@
     private bool initialized;
 
-    internal PluginManager(string pluginDir) {
+    public PluginManager(string pluginDir) {
       this.pluginDir = pluginDir;
       plugins = new List<PluginDescription>();
@@ -74,5 +74,5 @@
     /// Determines installed plugins and checks if all plugins are loadable.
     /// </summary>
-    internal void DiscoverAndCheckPlugins() {
+    public void DiscoverAndCheckPlugins() {
       OnInitializing(PluginInfrastructureEventArgs.Empty);
       AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
Index: branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs
===================================================================
--- branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 4053)
+++ branches/3.2/sources/HeuristicLab.PluginInfrastructure/Sandboxing/SandboxManager.cs	(revision 4140)
@@ -94,9 +94,9 @@
       DefaultApplicationManager applicationManager =
         (DefaultApplicationManager)applicationDomain.CreateInstanceAndUnwrap(applicationManagerType.Assembly.FullName, applicationManagerType.FullName, true, BindingFlags.NonPublic | BindingFlags.Instance, null, null, null, null, null);
-      ApplicationDescription[] apps = ApplicationManager.Manager.Applications.Cast<ApplicationDescription>().ToArray();
-      PluginDescription[] plugins = ApplicationManager.Manager.Plugins.Cast<PluginDescription>().ToArray();
-      applicationManager.PrepareApplicationDomain(apps, plugins);
-      if (files != null && files.Count() > 0)
-        applicationManager.LoadAssemblies(files);
+      PluginManager pm = new PluginManager(name);
+      pm.DiscoverAndCheckPlugins();
+      ApplicationDescription[] apps = pm.Applications.Cast<ApplicationDescription>().ToArray();
+      PluginDescription[] plugins = pm.Plugins.Cast<PluginDescription>().ToArray();
+      applicationManager.PrepareApplicationDomain(apps, plugins);      
       return applicationDomain;
     }
