Index: /stable/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs
===================================================================
--- /stable/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Access/3.3/ClientInformationUtils.cs	(revision 11121)
@@ -30,4 +30,5 @@
 using HeuristicLab.Data;
 using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Clients.Access {
@@ -72,6 +73,5 @@
 
     public static string GetHLVersion() {
-      FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
-      return versionInfo.FileVersion;
+      return AssemblyHelpers.GetFileVersion(Assembly.GetExecutingAssembly());
     }
 
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Core.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Core.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Core.cs	(revision 11121)
@@ -204,5 +204,5 @@
       TS.Task.Factory.StartNew(HandleCalculateTask, jobId)
       .ContinueWith((t) => {
-        SlaveStatusInfo.IncrementExceptionOccured();
+        SlaveStatusInfo.IncrementTasksFailed();
         SlaveClientCom.Instance.LogMessage(t.Exception.ToString());
       }, TaskContinuationOptions.OnlyOnFaulted);
@@ -212,5 +212,5 @@
       TS.Task.Factory.StartNew(HandleStopTask, jobId)
        .ContinueWith((t) => {
-         SlaveStatusInfo.IncrementExceptionOccured();
+         SlaveStatusInfo.IncrementTasksFailed();
          SlaveClientCom.Instance.LogMessage(t.Exception.ToString());
        }, TaskContinuationOptions.OnlyOnFaulted);
@@ -220,5 +220,5 @@
       TS.Task.Factory.StartNew(HandlePauseTask, jobId)
        .ContinueWith((t) => {
-         SlaveStatusInfo.IncrementExceptionOccured();
+         SlaveStatusInfo.IncrementTasksFailed();
          SlaveClientCom.Instance.LogMessage(t.Exception.ToString());
        }, TaskContinuationOptions.OnlyOnFaulted);
@@ -228,5 +228,5 @@
       TS.Task.Factory.StartNew(HandleAbortTask, jobId)
        .ContinueWith((t) => {
-         SlaveStatusInfo.IncrementExceptionOccured();
+         SlaveStatusInfo.IncrementTasksFailed();
          SlaveClientCom.Instance.LogMessage(t.Exception.ToString());
        }, TaskContinuationOptions.OnlyOnFaulted);
@@ -328,5 +328,4 @@
       this.taskManager.TaskStopped += new EventHandler<EventArgs<SlaveTask, TaskData>>(taskManager_TaskStopped);
       this.taskManager.TaskFailed += new EventHandler<EventArgs<Tuple<SlaveTask, TaskData, Exception>>>(taskManager_TaskFailed);
-      this.taskManager.ExceptionOccured += new EventHandler<EventArgs<SlaveTask, Exception>>(taskManager_ExceptionOccured);
       this.taskManager.TaskAborted += new EventHandler<EventArgs<SlaveTask>>(taskManager_TaskAborted);
     }
@@ -391,19 +390,11 @@
       }
       catch (TaskNotFoundException ex) {
-        SlaveStatusInfo.IncrementExceptionOccured();
+        SlaveStatusInfo.IncrementTasksFailed();
         SlaveClientCom.Instance.LogMessage(ex.ToString());
       }
       catch (Exception ex) {
-        SlaveStatusInfo.IncrementExceptionOccured();
+        SlaveStatusInfo.IncrementTasksFailed();
         SlaveClientCom.Instance.LogMessage(ex.ToString());
       }
-    }
-
-    private void taskManager_ExceptionOccured(object sender, EventArgs<SlaveTask, Exception> e) {
-      SlaveStatusInfo.DecrementUsedCores(e.Value.CoresNeeded);
-      SlaveStatusInfo.IncrementExceptionOccured();
-      heartbeatManager.AwakeHeartBeatThread();
-      SlaveClientCom.Instance.LogMessage(string.Format("Exception occured for task {0}: {1}", e.Value.TaskId, e.Value2.ToString()));
-      wcfService.UpdateJobState(e.Value.TaskId, TaskState.Waiting, e.Value2.ToString());
     }
 
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Executor.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Executor.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Executor.cs	(revision 11121)
@@ -85,13 +85,11 @@
         task.Start();
         if (!startTaskSem.WaitOne(Settings.Default.ExecutorSemTimeouts)) {
-          taskDataInvalid = true;
           throw new TimeoutException("Timeout when starting the task. TaskStarted event was not fired.");
         }
       }
       catch (Exception e) {
-        this.CurrentException = e;
-        taskDataInvalid = true;
-        Task_TaskFailed(this, new EventArgs<Exception>(e));
-      } finally {
+        HandleStartStopPauseError(e);
+      }
+      finally {
         taskStartedSem.Set();
       }
@@ -103,6 +101,5 @@
       taskStartedSem.WaitOne(Settings.Default.ExecutorSemTimeouts);
       if (task == null) {
-        CurrentException = new Exception("Pausing task " + this.TaskId + ": Task is null");
-        executorQueue.AddMessage(ExecutorMessageType.ExceptionOccured);
+        HandleStartStopPauseError(new Exception("Pausing task " + this.TaskId + ": Task is null"));
         return;
       }
@@ -112,9 +109,10 @@
           task.Pause();
           //we need to block the pause...
-          pauseStopSem.WaitOne();
+          if (!pauseStopSem.WaitOne(Settings.Default.ExecutorSemTimeouts)) {
+            throw new Exception("Pausing task " + this.TaskId + " timed out.");
+          }
         }
         catch (Exception ex) {
-          CurrentException = new Exception("Error pausing task " + this.TaskId + ": " + ex.ToString());
-          executorQueue.AddMessage(ExecutorMessageType.ExceptionOccured);
+          HandleStartStopPauseError(ex);
         }
       }
@@ -125,18 +123,20 @@
       // wait until task is started. if this does not happen, the Task is null an we give up
       taskStartedSem.WaitOne(Settings.Default.ExecutorSemTimeouts);
+      wasTaskAborted = true;
+
       if (task == null) {
-        CurrentException = new Exception("Stopping task " + this.TaskId + ": Task is null");
-        executorQueue.AddMessage(ExecutorMessageType.ExceptionOccured);
-      }
-      wasTaskAborted = true;
+        HandleStartStopPauseError(new Exception("Stopping task " + this.TaskId + ": Task is null"));
+        return;
+      }
 
       if ((ExecutionState == ExecutionState.Started) || (ExecutionState == ExecutionState.Paused)) {
         try {
           task.Stop();
-          pauseStopSem.WaitOne();
+          if (!pauseStopSem.WaitOne(Settings.Default.ExecutorSemTimeouts)) {
+            throw new Exception("Stopping task " + this.TaskId + " timed out.");
+          }
         }
         catch (Exception ex) {
-          CurrentException = new Exception("Error stopping task " + this.TaskId + ": " + ex.ToString());
-          executorQueue.AddMessage(ExecutorMessageType.ExceptionOccured);
+          HandleStartStopPauseError(ex);
         }
       }
@@ -190,18 +190,17 @@
       if (task != null && task.ExecutionState == ExecutionState.Started) {
         throw new InvalidStateException("Task is still running");
+      }
+
+      TaskData taskData = null;
+      if (task == null) {
+        if (CurrentException == null) {
+          CurrentException = new Exception("Task with id " + this.TaskId + " is null, sending empty task");
+        }
       } else {
-        TaskData taskData = new TaskData();
-        if (task == null) {
-          //send empty task and save exception
-          taskData.Data = PersistenceUtil.Serialize(new TaskData());
-          if (CurrentException == null) {
-            CurrentException = new Exception("Task with id " + this.TaskId + " is null, sending empty task");
-          }
-        } else {
-          taskData.Data = PersistenceUtil.Serialize(task);
-        }
+        taskData = new TaskData();
+        taskData.Data = PersistenceUtil.Serialize(task);
         taskData.TaskId = TaskId;
-        return taskData;
-      }
+      }
+      return taskData;
     }
 
@@ -211,4 +210,9 @@
       task = null;
     }
+
+    private void HandleStartStopPauseError(Exception e) {
+      taskDataInvalid = true;
+      Task_TaskFailed(this, new EventArgs<Exception>(e));
+    }
   }
 }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/ExecutorMessage.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/ExecutorMessage.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/ExecutorMessage.cs	(revision 11121)
@@ -30,6 +30,5 @@
     TaskStopped,
     TaskFailed,
-    StopExecutorMonitoringThread,
-    ExceptionOccured
+    StopExecutorMonitoringThread
   }
 
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/ConfigManager.cs	(revision 11121)
@@ -117,5 +117,4 @@
       st.JobsFetched = SlaveStatusInfo.TasksFetched;
       st.JobsFailed = SlaveStatusInfo.TasksFailed;
-      st.ExceptionsOccured = SlaveStatusInfo.ExceptionsOccured;
 
       st.Jobs = jobManager.GetExecutionTimes().Select(x => new TaskStatus { TaskId = x.Key, ExecutionTime = x.Value }).ToList();
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/HeartbeatManager.cs	(revision 11121)
@@ -24,5 +24,4 @@
 using System.Threading;
 using HeuristicLab.Clients.Hive.SlaveCore.Properties;
-using HeuristicLab.Common;
 
 namespace HeuristicLab.Clients.Hive.SlaveCore {
@@ -115,5 +114,4 @@
               if (msgs == null) {
                 SlaveClientCom.Instance.LogMessage("Error getting response from HB");
-                OnExceptionOccured(new Exception("Error getting response from HB"));
               } else {
                 SlaveClientCom.Instance.LogMessage("HB Response received (" + msgs.Count + "): ");
@@ -126,5 +124,4 @@
         catch (Exception e) {
           SlaveClientCom.Instance.LogMessage("Heartbeat thread failed: " + e.ToString());
-          OnExceptionOccured(e);
         }
         waitHandle.WaitOne(this.interval);
@@ -132,12 +129,4 @@
       SlaveClientCom.Instance.LogMessage("Heartbeat thread stopped");
     }
-
-    #region Eventhandler
-    public event EventHandler<EventArgs<Exception>> ExceptionOccured;
-    private void OnExceptionOccured(Exception e) {
-      var handler = ExceptionOccured;
-      if (handler != null) handler(this, new EventArgs<Exception>(e));
-    }
-    #endregion
   }
 }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/Manager/TaskManager.cs	(revision 11121)
@@ -71,5 +71,5 @@
       try {
         if (slaveTasks.ContainsKey(task.Id)) {
-          SlaveStatusInfo.IncrementExceptionOccured();
+          SlaveStatusInfo.IncrementTasksFailed();
           throw new TaskAlreadyRunningException(task.Id);
         } else {
@@ -185,5 +185,4 @@
       slaveTask.TaskStopped += new EventHandler<EventArgs<Guid>>(slaveTask_TaskStopped);
       slaveTask.TaskFailed += new EventHandler<EventArgs<Guid, Exception>>(slaveTask_TaskFailed);
-      slaveTask.ExceptionOccured += new EventHandler<EventArgs<Guid, Exception>>(slaveTask_ExceptionOccured);
     }
 
@@ -193,5 +192,4 @@
       slaveTask.TaskStopped -= new EventHandler<EventArgs<Guid>>(slaveTask_TaskStopped);
       slaveTask.TaskFailed -= new EventHandler<EventArgs<Guid, Exception>>(slaveTask_TaskFailed);
-      slaveTask.ExceptionOccured -= new EventHandler<EventArgs<Guid, Exception>>(slaveTask_ExceptionOccured);
     }
 
@@ -220,5 +218,4 @@
       try {
         taskData = slaveTask.GetTaskData();
-        if (taskData == null) throw new SerializationException();
         SlaveStatusInfo.IncrementTasksFinished();
         OnTaskPaused(slaveTask, taskData);
@@ -243,5 +240,4 @@
       try {
         taskData = slaveTask.GetTaskData();
-        if (taskData == null) throw new SerializationException();
         SlaveStatusInfo.IncrementTasksFinished();
         OnTaskStopped(slaveTask, taskData);
@@ -266,22 +262,8 @@
       try {
         taskData = slaveTask.GetTaskData();
-        if (taskData == null) throw new SerializationException();
       }
       catch { /* taskData will be null */ }
       SlaveStatusInfo.IncrementTasksFailed();
       OnTaskFailed(slaveTask, taskData, e.Value2);
-    }
-
-    private void slaveTask_ExceptionOccured(object sender, EventArgs<Guid, Exception> e) {
-      SlaveTask slaveTask;
-      slaveTasksLocker.EnterUpgradeableReadLock();
-      try {
-        slaveTask = slaveTasks[e.Value];
-        RemoveSlaveTask(e.Value, slaveTask);
-      }
-      finally { slaveTasksLocker.ExitUpgradeableReadLock(); }
-
-      SlaveStatusInfo.IncrementExceptionOccured();
-      OnExceptionOccured(slaveTask, e.Value2);
     }
     #endregion
@@ -312,10 +294,4 @@
     }
 
-    public event EventHandler<EventArgs<SlaveTask, Exception>> ExceptionOccured;
-    private void OnExceptionOccured(SlaveTask slaveTask, Exception exception) {
-      var handler = ExceptionOccured;
-      if (handler != null) handler(this, new EventArgs<SlaveTask, Exception>(slaveTask, exception));
-    }
-
     public event EventHandler<EventArgs<SlaveTask>> TaskAborted;
     private void OnTaskAborted(SlaveTask slaveTask) {
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveStatusInfo.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveStatusInfo.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveStatusInfo.cs	(revision 11121)
@@ -31,5 +31,4 @@
     private static int tasksAborted;  // server sent abort
     private static int tasksFailed;   // tasks that failed in the sandbox
-    private static int exceptionsOccured; // number jobs failed caused by the business logic, not a faulted task
     private static int usedCores;    // number of cores currently used
 
@@ -60,8 +59,4 @@
     }
 
-    public static int ExceptionsOccured {
-      get { return exceptionsOccured; }
-    }
-
     public static void IncrementTasksStarted() {
       Interlocked.Increment(ref tasksStarted);
@@ -84,8 +79,4 @@
     }
 
-    public static void IncrementExceptionOccured() {
-      Interlocked.Increment(ref exceptionsOccured);
-    }
-
     public static void IncrementUsedCores(int val) {
       Interlocked.Add(ref usedCores, val);
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveTask.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveTask.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/SlaveTask.cs	(revision 11121)
@@ -43,4 +43,5 @@
     public Guid TaskId { get; private set; }
     public bool IsPrepared { get; private set; }
+    private TaskData originalTaskData;
 
     private int coresNeeded;
@@ -74,4 +75,5 @@
       try {
         this.TaskId = task.Id;
+        originalTaskData = taskData;
         Prepare(task);
         StartTaskInAppDomain(taskData);
@@ -143,5 +145,5 @@
         while (repeat > 0) {
           try {
-            waitForStartBeforeKillSem.WaitOne();
+            waitForStartBeforeKillSem.WaitOne(Settings.Default.ExecutorSemTimeouts);
             AppDomain.Unload(appDomain);
             waitForStartBeforeKillSem.Dispose();
@@ -164,5 +166,5 @@
     private void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
       DisposeAppDomain();
-      OnExceptionOccured(new Exception("Unhandled exception: " + e.ExceptionObject.ToString()));
+      OnTaskFailed(new Exception("Unhandled exception: " + e.ExceptionObject.ToString()));
     }
 
@@ -171,4 +173,6 @@
       try {
         data = executor.GetTaskData();
+        //this means that there was a problem executing the task
+        if (data == null) return originalTaskData;
       }
       catch (Exception ex) {
@@ -233,14 +237,4 @@
             executorMonitoringRun = false;
             break;
-
-          case ExecutorMessageType.ExceptionOccured:
-            executorMonitoringRun = false;
-            DisposeAppDomain();
-            if (executor.CurrentException != null) {
-              OnExceptionOccured(executor.CurrentException);
-            } else {
-              OnExceptionOccured(new Exception(string.Format("Unknow exception occured in Executor for task {0}", TaskId)));
-            }
-            break;
         }
       }
@@ -277,10 +271,4 @@
       if (handler != null) handler(this, new EventArgs<Guid, Exception>(this.TaskId, exception));
     }
-
-    public event EventHandler<EventArgs<Guid, Exception>> ExceptionOccured;
-    private void OnExceptionOccured(Exception exception) {
-      var handler = ExceptionOccured;
-      if (handler != null) handler(this, new EventArgs<Guid, Exception>(this.TaskId, exception));
-    }
   }
 }
Index: /stable/HeuristicLab.Clients.Hive.Slave/3.3/StatusCommons.cs
===================================================================
--- /stable/HeuristicLab.Clients.Hive.Slave/3.3/StatusCommons.cs	(revision 11120)
+++ /stable/HeuristicLab.Clients.Hive.Slave/3.3/StatusCommons.cs	(revision 11121)
@@ -51,6 +51,4 @@
     public int JobsFailed { get; set; }
     [DataMember]
-    public int ExceptionsOccured { get; set; }
-    [DataMember]
     public List<TaskStatus> Jobs { get; set; }
     [DataMember]
@@ -58,6 +56,6 @@
 
     public override string ToString() {
-      return string.Format("Status: {0}, Fetc,Start,Fin,Abor,Fail,Exc: {1},{2},{3},{4},{5},{6}",
-        Status, JobsFetched, JobsStarted, JobsFinished, JobsAborted, JobsFailed, ExceptionsOccured);
+      return string.Format("Status: {0}, Fetc,Start,Fin,Abor,Fail,Exc: {1},{2},{3},{4},{5}",
+        Status, JobsFetched, JobsStarted, JobsFinished, JobsAborted, JobsFailed);
     }
   }
Index: /stable/HeuristicLab.Core/3.3/OperatorExecutionException.cs
===================================================================
--- /stable/HeuristicLab.Core/3.3/OperatorExecutionException.cs	(revision 11120)
+++ /stable/HeuristicLab.Core/3.3/OperatorExecutionException.cs	(revision 11121)
@@ -21,5 +21,5 @@
 
 using System;
-using System.Diagnostics;
+using HeuristicLab.PluginInfrastructure;
 
 namespace HeuristicLab.Core {
@@ -34,8 +34,8 @@
       get {
         string name = "\"" + op.Name + "\"";
+        var assembly = op.GetType().Assembly;
         if (!op.Name.Equals(op.ItemName)) name += " (" + op.ItemName + ")";
-        if (!string.IsNullOrEmpty(op.GetType().Assembly.Location)) {
-          var fvi = FileVersionInfo.GetVersionInfo(op.GetType().Assembly.Location);
-          name += " [" + fvi.FileName + ": " + fvi.FileVersion + "]";
+        if (!string.IsNullOrEmpty(assembly.Location)) {
+          name += " [" + assembly.Location + ": " + AssemblyHelpers.GetFileVersion(assembly) + "]";
         }
         if (InnerException == null)
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/InstallationManagerForm.cs	(revision 11121)
@@ -22,5 +22,4 @@
 using System.Collections.Generic;
 using System.ComponentModel;
-using System.Diagnostics;
 using System.IO;
 using System.Linq;
@@ -37,6 +36,5 @@
       : base() {
       InitializeComponent();
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      Text = "HeuristicLab Plugin Manager " + pluginInfrastructureVersion.FileVersion;
+      Text = "HeuristicLab Plugin Manager " + AssemblyHelpers.GetFileVersion(GetType().Assembly);
 
       pluginManager.PluginLoaded += pluginManager_PluginLoaded;
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/Advanced/PluginUpdaterForm.cs	(revision 11121)
@@ -22,5 +22,4 @@
 using System.Collections.Generic;
 using System.ComponentModel;
-using System.Diagnostics;
 using System.IO;
 using System.Linq;
@@ -39,6 +38,5 @@
       : base() {
       InitializeComponent();
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      Text = "HeuristicLab Plugin Manager " + pluginInfrastructureVersion.FileVersion;
+      Text = "HeuristicLab Plugin Manager " + AssemblyHelpers.GetFileVersion(GetType().Assembly);
       pluginManager.PluginLoaded += pluginManager_PluginLoaded;
       pluginManager.PluginUnloaded += pluginManager_PluginUnloaded;
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/AssemblyHelpers.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/AssemblyHelpers.cs	(revision 11121)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/AssemblyHelpers.cs	(revision 11121)
@@ -0,0 +1,55 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure {
+  public static class AssemblyHelpers {
+    //Based on the code from http://stackoverflow.com/a/7156425
+    public static string GetCustomAttributeValue<T>(Assembly assembly, string propertyName)
+       where T : Attribute {
+      if (assembly == null || string.IsNullOrEmpty(propertyName)) {
+        throw new ArgumentException("Arguments are not allowed to be null.");
+      }
+
+      object[] attributes = assembly.GetCustomAttributes(typeof(T), false);
+      if (attributes.Length == 0) {
+        throw new InvalidOperationException(string.Format("No attributes of type {0} found in assembly {1}", typeof(T).Name,
+          assembly.FullName));
+      }
+
+      var attribute = (T)attributes[0];
+      var propertyInfo = attribute.GetType().GetProperty(propertyName);
+      if (propertyInfo == null) {
+        throw new InvalidOperationException(string.Format("No property {0} found in attribute {1}, assembly: {2}",
+          propertyName, typeof(T).Name, assembly.FullName));
+      }
+
+      var value = propertyInfo.GetValue(attribute, null);
+      return value.ToString();
+    }
+
+    public static string GetFileVersion(Assembly assembly) {
+      return GetCustomAttributeValue<AssemblyFileVersionAttribute>(assembly, "Version");
+    }
+  }
+}
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/ErrorHandling/ErrorHandling.cs	(revision 11121)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Diagnostics;
 using System.Windows.Forms;
 
@@ -31,5 +30,5 @@
       } else {
         string message =
-          "HeuristicLab version: " + FileVersionInfo.GetVersionInfo(typeof(ErrorHandling).Assembly.Location).FileVersion + Environment.NewLine +
+          "HeuristicLab version: " + AssemblyHelpers.GetFileVersion(typeof(ErrorHandling).Assembly) + Environment.NewLine +
           exception.GetType().Name + ": " + exception.Message + Environment.NewLine +
                          exception.StackTrace;
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 11121)
@@ -215,4 +215,5 @@
       <DependentUpon>PluginView.cs</DependentUpon>
     </Compile>
+    <Compile Include="AssemblyHelpers.cs" />
     <Compile Include="CommandLineArgumentHandling\Arguments\OpenArgument.cs" />
     <Compile Include="CommandLineArgumentHandling\Arguments\HideStarterArgument.cs" />
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/AboutDialog.cs	(revision 11121)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.Linq;
 using System.Reflection;
@@ -80,6 +79,5 @@
 
     private string GetVersion() {
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      return pluginInfrastructureVersion.FileVersion;
+      return AssemblyHelpers.GetFileVersion(GetType().Assembly);
     }
 
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/SplashScreen.cs	(revision 11121)
@@ -21,5 +21,4 @@
 
 using System;
-using System.Diagnostics;
 using System.Linq;
 using System.Reflection;
@@ -45,6 +44,5 @@
       RegisterPluginManagerEventHandlers();
 
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      versionLabel.Text = "Version " + pluginInfrastructureVersion.FileVersion;
+      versionLabel.Text = "Version " + AssemblyHelpers.GetFileVersion(GetType().Assembly);
       infoLabel.Text = "";
 
Index: /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs
===================================================================
--- /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 11120)
+++ /stable/HeuristicLab.PluginInfrastructure/3.3/Starter/StarterForm.cs	(revision 11121)
@@ -22,5 +22,4 @@
 using System;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.IO;
 using System.Linq;
@@ -60,6 +59,5 @@
       smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.HeuristicLab.ToBitmap());
       smallImageList.Images.Add(HeuristicLab.PluginInfrastructure.Resources.UpdateAvailable.ToBitmap());
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
-      Text = "HeuristicLab " + pluginInfrastructureVersion.FileVersion;
+      Text = "HeuristicLab " + AssemblyHelpers.GetFileVersion(GetType().Assembly);
 
       string pluginPath = Path.GetFullPath(Application.StartupPath);
@@ -204,8 +202,7 @@
 
     private void AddPluginManagerItem() {
-      FileVersionInfo pluginInfrastructureVersion = FileVersionInfo.GetVersionInfo(GetType().Assembly.Location);
       pluginManagerListViewItem = new ListViewItem(pluginManagerItemName, 0);
       pluginManagerListViewItem.Group = applicationsListView.Groups["Plugin Management"];
-      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, pluginInfrastructureVersion.FileVersion));
+      pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, AssemblyHelpers.GetFileVersion(GetType().Assembly)));
       pluginManagerListViewItem.SubItems.Add(new ListViewItem.ListViewSubItem(pluginManagerListViewItem, "Install, upgrade or delete plugins"));
       pluginManagerListViewItem.ToolTipText = "Install, upgrade or delete plugins";
