Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationDriver.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationDriver.cs	(revision 3864)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationDriver.cs	(revision 3865)
@@ -31,4 +31,10 @@
     public bool IsInitialized { get; protected set; }
 
+    protected ExternalEvaluationDriver()
+      : base() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+
     #region IExternalEvaluationDriver Members
 
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationProcessDriver.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationProcessDriver.cs	(revision 3864)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationProcessDriver.cs	(revision 3865)
@@ -23,4 +23,5 @@
 using System.Diagnostics;
 using System.IO;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
@@ -30,9 +31,30 @@
   [StorableClass]
   public class ExternalEvaluationProcessDriver : ExternalEvaluationDriver {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
     private Process process;
     [Storable]
     private string executable;
+    public string Executable {
+      get { return executable; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException("ExternalEvaluationProcessDriver cannot change the executable path as it has already been started.");
+        string oldExecutable = executable;
+        executable = value;
+        if (!oldExecutable.Equals(executable)) OnExecutableChanged();
+      }
+    }
     [Storable]
     private string arguments;
+    public string Arguments {
+      get { return arguments; }
+      set {
+        if (IsInitialized) throw new InvalidOperationException("ExternalEvaluationProcessDriver cannot change the arguments as it has already been started.");
+        string oldArguments = arguments;
+        arguments = value;
+        if (!oldArguments.Equals(arguments)) OnArgumentsChanged();
+      }
+    }
     private ExternalEvaluationStreamDriver driver;
 
@@ -44,18 +66,30 @@
     }
 
+    public override IDeepCloneable Clone(Cloner cloner) {
+      ExternalEvaluationProcessDriver clone = (ExternalEvaluationProcessDriver)base.Clone(cloner);
+      clone.executable = executable;
+      clone.arguments = arguments;
+      return clone;
+    }
+
     #region IExternalDriver Members
 
     public override void Start() {
-      base.Start();
-      process = new Process();
-      process.StartInfo = new ProcessStartInfo(executable, arguments);
-      process.StartInfo.UseShellExecute = false;
-      process.StartInfo.RedirectStandardInput = true;
-      process.StartInfo.RedirectStandardOutput = true;
-      process.Start();
-      Stream processStdOut = process.StandardOutput.BaseStream;
-      Stream processStdIn = process.StandardInput.BaseStream;
-      driver = new ExternalEvaluationStreamDriver(processStdOut, processStdIn);
-      driver.Start();
+      if (!String.IsNullOrEmpty(executable.Trim())) {
+        base.Start();
+        process = new Process();
+        process.StartInfo = new ProcessStartInfo(executable, arguments);
+        process.StartInfo.UseShellExecute = false;
+        process.StartInfo.RedirectStandardInput = true;
+        process.StartInfo.RedirectStandardOutput = true;
+        process.EnableRaisingEvents = true; // required to be notified of exit
+        process.Start();
+        Stream processStdOut = process.StandardOutput.BaseStream;
+        Stream processStdIn = process.StandardInput.BaseStream;
+        OnProcessStarted();
+        process.Exited += new EventHandler(process_Exited);
+        driver = new ExternalEvaluationStreamDriver(processStdOut, processStdIn);
+        driver.Start();
+      } else throw new InvalidOperationException("Cannot start ExternalEvaluationProcessDriver because executable is not defined.");
     }
 
@@ -70,16 +104,57 @@
     public override void Stop() {
       base.Stop();
-      if (!process.HasExited) {
-        driver.Stop();
+      if (process != null) {
         if (!process.HasExited) {
-          process.CloseMainWindow();
-          process.WaitForExit(1000);
-          process.Close();
+          driver.Stop();
+          if (!process.HasExited) {
+            process.CloseMainWindow();
+            process.WaitForExit(1000);
+            process.Close();
+            // for some reasons the event process_Exited does not fire
+            OnProcessExited();
+          }
         }
+        process = null;
       }
-      process = null;
     }
 
     #endregion
+
+    #region Event handlers (process)
+    private void process_Exited(object sender, EventArgs e) {
+      if (IsInitialized) {
+        if (driver.IsInitialized) driver.Stop();
+        IsInitialized = false;
+        process = null;
+      }
+      OnProcessExited();
+    }
+    #endregion
+
+    #region Events
+    public event EventHandler ExecutableChanged;
+    protected void OnExecutableChanged() {
+      EventHandler handler = ExecutableChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ArgumentsChanged;
+    protected void OnArgumentsChanged() {
+      EventHandler handler = ArgumentsChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessStarted;
+    private void OnProcessStarted() {
+      EventHandler handler = ProcessStarted;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    public event EventHandler ProcessExited;
+    private void OnProcessExited() {
+      EventHandler handler = ProcessExited;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+    #endregion
   }
 }
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs	(revision 3864)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Drivers/ExternalEvaluationStreamDriver.cs	(revision 3865)
@@ -30,4 +30,7 @@
   [StorableClass]
   public class ExternalEvaluationStreamDriver : ExternalEvaluationDriver {
+    public override bool CanChangeName { get { return false; } }
+    public override bool CanChangeDescription { get { return false; } }
+
     private CodedInputStream inputStream;
     private Stream input;
Index: trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Properties/AssemblyInfo.frame
===================================================================
--- trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Properties/AssemblyInfo.frame	(revision 3864)
+++ trunk/sources/HeuristicLab.Problems.ExternalEvaluation/3.3/Properties/AssemblyInfo.frame	(revision 3865)
@@ -7,5 +7,5 @@
 // associated with an assembly.
 [assembly: AssemblyTitle("HeuristicLab.Problems.ExternalEvaluation")]
-[assembly: AssemblyDescription("Plugins for Problems that are evaluated outside of HeuristicLab.")]
+[assembly: AssemblyDescription("Plugin for Problems that are evaluated outside of HeuristicLab.")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("")]
