Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs	(revision 241)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationInfo.cs	(revision 242)
@@ -46,8 +46,13 @@
     }
 
+    private bool autoRestart;
+    public bool AutoRestart {
+      get { return autoRestart; }
+      set { autoRestart = value; }
+    }
+
     private string pluginAssembly;
     /// <summary>
     /// Name of the assembly that contains the IApplication type.
-    /// NEEDED?
     /// </summary>
     public string PluginAssembly {
@@ -59,5 +64,4 @@
     /// <summary>
     /// Name of the type that implements the interface IApplication.
-    /// NEEDED?
     /// </summary>
     public string PluginType {
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs	(revision 241)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/BaseClasses/ApplicationBase.cs	(revision 242)
@@ -30,5 +30,6 @@
     private Version version;
     private string description;
-    
+    private bool autoRestart;
+
     public ApplicationBase() {
       ReadAttributes();
@@ -45,24 +46,27 @@
       // after the assertion we are sure that the array access will not fail
       ClassInfoAttribute pluginAttribute = (ClassInfoAttribute)pluginAttributes[0];
+      if(pluginAttribute != null) {
+        // if the plugin name is not explicitly set in the attribute then the default plugin name is the FullName of the type
+        if(pluginAttribute.Name != null) {
+          this.name = pluginAttribute.Name;
+        } else {
+          this.name = this.GetType().FullName;
+        }
 
-      // if the plugin name is not explicitly set in the attribute then the default plugin name is the FullName of the type
-      if(pluginAttribute != null && pluginAttribute.Name != null) {
-        this.name = pluginAttribute.Name;
-      } else {
-        this.name = this.GetType().FullName;
-      }
+        // if the version is not explicitly set in the attribute then the version of the assembly is used as default
+        if(pluginAttribute.Version != null) {
+          this.version = new Version(pluginAttribute.Version);
+        } else {
+          this.version = this.GetType().Assembly.GetName().Version;
+        }
 
-      // if the version is not explicitly set in the attribute then the version of the assembly is used as default
-      if(pluginAttribute != null && pluginAttribute.Version != null) {
-        this.version = new Version(pluginAttribute.Version);
-      } else {
-        this.version = this.GetType().Assembly.GetName().Version;
-      }
+        // if the description is not explicitly set in the attribute then the name of name of the application is used as default
+        if(pluginAttribute.Description != null) {
+          this.description = pluginAttribute.Description;
+        } else {
+          this.description = name;
+        }
 
-      // if the description is not explicitly set in the attribute then the name of name of the application is used as default
-      if(pluginAttribute != null && pluginAttribute.Description != null) {
-        this.description = pluginAttribute.Description;
-      } else {
-        this.description = name;
+        this.autoRestart = pluginAttribute.AutoRestart;
       }
     }
@@ -83,5 +87,9 @@
     }
 
-    public abstract void Run() ;
+    public bool AutoRestart {
+      get { return autoRestart; }
+    }
+
+    public abstract void Run();
 
     #endregion
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs	(revision 241)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ClassInfoAttribute.cs	(revision 242)
@@ -52,4 +52,10 @@
     }
 
+    private bool autoRestart;
+    public bool AutoRestart {
+      get { return autoRestart; }
+      set { autoRestart = value; }
+    }
+
     public ClassInfoAttribute() {}
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs	(revision 241)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IApplication.cs	(revision 242)
@@ -29,4 +29,5 @@
     Version Version { get; }
     string Description { get;}
+    bool AutoRestart { get; }
     void Run();
   }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 241)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Loader.cs	(revision 242)
@@ -120,4 +120,5 @@
         info.Version = application.Version;
         info.Description = application.Description;
+        info.AutoRestart = application.AutoRestart;
         info.PluginAssembly = application.GetType().Assembly.GetName().Name;
         info.PluginType = application.GetType().Namespace + "." + application.GetType().Name;
Index: /trunk/sources/HeuristicLab/MainForm.cs
===================================================================
--- /trunk/sources/HeuristicLab/MainForm.cs	(revision 241)
+++ /trunk/sources/HeuristicLab/MainForm.cs	(revision 242)
@@ -94,9 +94,15 @@
           PluginManager.Manager.Action += new PluginManagerActionEventHandler(splashScreen.Manager_Action);
           Thread t = new Thread(delegate() {
-            try {
-              PluginManager.Manager.Run(app);
-            } catch(Exception ex) {
-              ShowErrorMessageBox(ex);
-            }
+            bool stopped = false;
+            do {
+              try {
+                PluginManager.Manager.Run(app);
+                stopped = true;
+              } catch(Exception ex) {
+                stopped = false;
+                ThreadPool.QueueUserWorkItem(delegate(object exception) { ShowErrorMessageBox((Exception)exception); }, ex);
+                Thread.Sleep(5000); // sleep 5 seconds before autorestart
+              }
+            } while(!stopped && app.AutoRestart);
           });
           t.SetApartmentState(ApartmentState.STA); // needed for the AdvancedOptimizationFrontent
