Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs	(revision 16993)
@@ -36,11 +36,11 @@
     private ApplicationAttribute ApplicationAttribute {
       get {
-        object[] appAttributes = this.GetType().GetCustomAttributes(typeof(ApplicationAttribute), false);
+        object[] appAttributes = GetType().GetCustomAttributes(typeof(ApplicationAttribute), false);
 
         // exactly one attribute of the type ClassInfoAttribute must be given
         if (appAttributes.Length == 0) {
-          throw new InvalidPluginException("ApplicationAttribute on type " + this.GetType() + " is missing.");
+          throw new InvalidPluginException("ApplicationAttribute on type " + GetType() + " is missing.");
         } else if (appAttributes.Length > 1) {
-          throw new InvalidPluginException("Found multiple ApplicationAttributes on type " + this.GetType());
+          throw new InvalidPluginException("Found multiple ApplicationAttributes on type " + GetType());
         }
 
@@ -50,20 +50,13 @@
 
     #region IApplication Members
-
     /// <summary>
     /// Gets the name of the application.
     /// </summary>
-    public string Name {
-      get { return ApplicationAttribute.Name; }
-    }
+    public string Name => ApplicationAttribute.Name;
 
     /// <summary>
     /// Gets the description of the application.
     /// </summary>
-    public string Description {
-      get {
-        return ApplicationAttribute.Description;
-      }
-    }
+    public string Description => ApplicationAttribute.Description;
 
     /// <summary>
@@ -72,8 +65,7 @@
     public abstract void Run(ICommandLineArgument[] args);
 
-    public virtual void OnCancel() { Console.WriteLine("OnCancellation"); }
-    public virtual void OnPause() { Console.WriteLine("OnPause"); }
-    public virtual void OnResume() { Console.WriteLine("OnResume"); }
-
+    public virtual void OnCancel() { }
+    public virtual void OnPause() { }
+    public virtual void OnResume() { }
     #endregion
   }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Exceptions/DockerException.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Exceptions/DockerException.cs	(revision 16993)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Exceptions/DockerException.cs	(revision 16993)
@@ -0,0 +1,7 @@
+﻿using System;
+
+namespace HeuristicLab.PluginInfrastructure.Exceptions {
+  public sealed class DockerException : Exception {
+    public DockerException(string message) : base(message) { }
+  }
+}
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 16993)
@@ -21,10 +21,6 @@
     <PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
     <PackageReference Include="System.Security.Cryptography.ProtectedData" Version="4.5.0" />
-    <PackageReference Include="System.ServiceModel.Primitives" Version="4.5.3" />
     <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" />
     <PackageReference Include="System.Security.Cryptography.Primitives" Version="4.3.0" />
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Exceptions\" />
-  </ItemGroup>
 </Project>
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IApplicationManager.cs	(revision 16993)
@@ -47,4 +47,12 @@
 
     /// <summary>
+    /// Discovers and creates instances of <typeparamref name="T"/> and all types implementing or inheriting <typeparamref name="T"/> (directly and indirectly).
+    /// </summary>
+    /// <typeparam name="T">The type or super-type to discover.</typeparam>
+    /// <param name="args">Constructor arguments.</param>
+    /// <returns>An enumerable of instances of the discovered types.</returns>
+    IEnumerable<T> GetInstances<T>(params object[] args) where T : class;
+
+    /// <summary>
     /// Discovers and creates instances of <paramref name="type"/> and all types implementing or inheriting <paramref name="type"/> (directly and indirectly).
     /// </summary>
@@ -52,4 +60,12 @@
     /// <returns>An enumerable of instances of the discovered types.</returns>
     IEnumerable<object> GetInstances(Type type);
+
+    /// <summary>
+    /// Discovers and creates instances of <paramref name="type"/> and all types implementing or inheriting <paramref name="type"/> (directly and indirectly).
+    /// </summary>
+    /// <param name="type">The type or super-type to discover.</param>
+    /// <param name="args">Constructor arguments.</param>
+    /// <returns>An enumerable of instances of the discovered types.</returns>
+    IEnumerable<object> GetInstances(Type type, params object[] args);
 
     /// <summary>
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs	(revision 16993)
@@ -1,6 +1,3 @@
-﻿using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
+﻿using System.Collections.Generic;
 
 namespace HeuristicLab.PluginInfrastructure {
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs	(revision 16993)
@@ -8,4 +8,8 @@
   /// </summary>
   public interface IRunnerHost {
+    /// <summary>
+    /// The runner state.
+    /// </summary>
+    RunnerState State { get; }
 
     /// <summary>
@@ -32,5 +36,4 @@
     /// </summary>
     void Resume();
-
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs	(revision 16993)
@@ -1,6 +1,4 @@
 ﻿using System;
-using System.Collections.Generic;
 using System.IO;
-using System.Text;
 
 namespace HeuristicLab.PluginInfrastructure {
@@ -17,7 +15,10 @@
     public IApplication StartApplication {
       get {
-        using (var memStream = new MemoryStream(serializedStartApplication)) {
-          return (IApplication)formatter.Deserialize(memStream);
+        if (application == null) {
+          using (var memStream = new MemoryStream(serializedStartApplication)) {
+            application = (IApplication)formatter.Deserialize(memStream);
+          }
         }
+        return application;
       }
       set {
@@ -31,4 +32,6 @@
     // instantly deserialize the application, before all assemblies are loaded.
     private byte[] serializedStartApplication = new byte[0];
+    // cache application to prevent new instances every get call of StartApplication
+    private IApplication application;
 
     protected override void Execute() {
@@ -39,5 +42,5 @@
       switch (runnerJob) {
         case RunnerJob.Cancel: StartApplication.OnCancel(); break;
-        case RunnerJob.Pause:  StartApplication.OnPause (); break;
+        case RunnerJob.Pause: StartApplication.OnPause(); break;
         case RunnerJob.Resume: StartApplication.OnResume(); break;
       }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyLoader.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyLoader.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyLoader.cs	(revision 16993)
@@ -120,5 +120,4 @@
     #endregion
 
-
     private void LoadTypes(IEnumerable<Assembly> assemblies) {
       foreach (Assembly asm in assemblies) {
@@ -136,5 +135,5 @@
             }
           } catch (BadImageFormatException) { }
-        } catch (Exception e) { // to catch every other exception
+        } catch (Exception) { // to catch every other exception
           //Tracing.Logger.Error(
           //  $"Exception occured while loading types of assembly {asm.FullName}! \n " +
@@ -147,5 +146,5 @@
       foreach (string path in GetAssembliesFromBasePath(basePath))
         LoadAssemblyFromPath(path);
-      
+
       LoadTypes(this.Assemblies);
       return this.Assemblies;
@@ -155,5 +154,5 @@
       foreach (var info in assemblyInfos)
         LoadAssemblyFromPath(info.Path.ToString());
-      
+
       LoadTypes(this.Assemblies);
       return this.Assemblies;
@@ -167,5 +166,5 @@
         } // else
           //Tracing.Logger.Error($"Unnable to load assembly with path {path}!");
-      } catch (Exception e) { // to catch every exception occured by assembly loading.
+      } catch (Exception) { // to catch every exception occured by assembly loading.
         //Tracing.Logger.Error(
         //  $"Exception occured while loading assembly from path {path}! \n " +
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs	(revision 16993)
@@ -1,10 +1,48 @@
-﻿namespace HeuristicLab.PluginInfrastructure {
+﻿using System.Diagnostics;
+using HeuristicLab.PluginInfrastructure.Exceptions;
+
+namespace HeuristicLab.PluginInfrastructure {
   /// <summary>
   /// IRunner for isolation with docker.
   /// </summary>
   public class DockerRunnerHost : RunnerHost {
-    public DockerRunnerHost()
-      : base("docker", "run -i --rm --mount type=bind,source=/c/Users/,target=/Users heuristiclab33", null, null, null) {
+    #region Constants
+    private const string Docker = "docker";
+    private const string ContainerStartup = "container run -i --rm ";
+    private const string Mounting = @"--mount type=bind,source=/c/Users/,target=/Users ";
+    private const string Image = "heuristiclab33:latest";
+    private const string DockerExceptionMessage = "Docker is not running or image '" + Image + "' does not exists!";
+    #endregion
+
+    #region Constructors
+    public DockerRunnerHost(bool doDockerAvailableCheck = true)
+      : base(Docker, ContainerStartup + Mounting + Image, null, null, null) {
+      if (doDockerAvailableCheck && !IsDockerAvailable())
+        throw new DockerException(DockerExceptionMessage);
     }
+    #endregion
+
+    #region Helper
+    private bool IsDockerAvailable() {
+      var process = new Process {
+        StartInfo = new ProcessStartInfo {
+          FileName = Docker,
+          Arguments = "image inspect " + Image,
+          UseShellExecute = false,
+          RedirectStandardOutput = true,
+          RedirectStandardInput = false,
+          RedirectStandardError = true,
+          CreateNoWindow = false
+        },
+        EnableRaisingEvents = false
+      };
+
+      process.Start();
+      process.BeginOutputReadLine();
+      process.BeginErrorReadLine();
+      process.WaitForExit();
+      return process.ExitCode == 0;
+    }
+    #endregion
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/NativeRunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/NativeRunnerHost.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/NativeRunnerHost.cs	(revision 16993)
@@ -6,7 +6,12 @@
   /// </summary>
   public class NativeRunnerHost : RunnerHost {
-    public NativeRunnerHost()
-      : base($"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}HeuristicLab-3.3.exe", "", null, null, null) {
+    #region Constructors
+    public NativeRunnerHost() : this(null, null, null) {
     }
+
+    public NativeRunnerHost(string userName, string password, string domain)
+      : base($"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}HeuristicLab-3.3.exe", "", userName, password, domain) {
+    }
+    #endregion
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs	(revision 16993)
@@ -4,5 +4,4 @@
 using System.Runtime.Serialization;
 using System.Runtime.Serialization.Formatters.Binary;
-using System.Text;
 using System.Threading;
 
@@ -11,4 +10,5 @@
   public abstract class Runner : IRunner {
 
+    #region Vars
     [NonSerialized]
     private Thread listener;
@@ -19,8 +19,12 @@
     [NonSerialized]
     protected static IFormatter formatter = new BinaryFormatter();
-    
+    #endregion
+
+    #region Properties
     public bool QuietMode { get; set; }
-     
+
     public IEnumerable<AssemblyInfo> AssembliesToLoad { get; set; }
+    #endregion
+
 
     public static void Serialize(IRunner runner, Stream stream) => formatter.Serialize(stream, runner);
@@ -41,4 +45,5 @@
     protected abstract void OnRunnerJob(RunnerJob runnerJob);
 
+    #region Helper
     private void StartExecutor() {
       executor = new Thread(Execute);
@@ -46,8 +51,9 @@
       executor.Start();
     }
+
     private void StartListener() {
       listener = new Thread(() => {
         Stream stdin = Console.OpenStandardInput();
-        while (executor.IsAlive) 
+        while (executor.IsAlive)
           OnRunnerJob((RunnerJob)formatter.Deserialize(stdin));
       });
@@ -55,5 +61,5 @@
       listener.Start();
     }
-
+    #endregion
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs	(revision 16993)
@@ -74,5 +74,5 @@
           UserName = string.IsNullOrEmpty(UserName) ? null : UserName,
           PasswordInClearText = string.IsNullOrEmpty(Password) ? null : Password,
-          Domain = string.IsNullOrEmpty(Domain) ? null: Domain,
+          Domain = string.IsNullOrEmpty(Domain) ? null : Domain,
           WorkingDirectory = Directory.GetCurrentDirectory()
         },
@@ -86,7 +86,8 @@
       Runner.Serialize(runner, process.StandardInput.BaseStream);
 
+      process.BeginOutputReadLine();
+      process.BeginErrorReadLine();
+
       if (!runner.QuietMode) {
-        process.BeginOutputReadLine();
-        process.BeginErrorReadLine();
         process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
         process.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
@@ -124,6 +125,4 @@
     /// When the child process gets finished without requested cancellation, the linked token gets cancelled and a result set. 
     /// </summary>
-    /// <param name="token"></param>
-    /// <returns></returns>
     private Task<bool> RegisterCancellation(CancellationToken token) {
       if (process != null && State == RunnerState.Starting) {
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 16991)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/LightweightApplicationManager.cs	(revision 16993)
@@ -37,7 +37,5 @@
     }
 
-    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
-      return null;
-    }
+    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) => null;
 
 
@@ -46,14 +44,10 @@
     /// Gets an empty list of plugins. (LightweightApplicationManager doesn't support plugin discovery)
     /// </summary>
-    public IEnumerable<IPluginDescription> Plugins {
-      get { return new IPluginDescription[0]; }
-    }
+    public IEnumerable<IPluginDescription> Plugins => new IPluginDescription[0];
 
     /// <summary>
     /// Gets an empty list of applications. (LightweightApplicationManager doesn't support application discovery)
     /// </summary>
-    public IEnumerable<IApplicationDescription> Applications {
-      get { return new IApplicationDescription[0]; }
-    }
+    public IEnumerable<IApplicationDescription> Applications => new IApplicationDescription[0];
 
     /// <summary>
@@ -62,7 +56,13 @@
     /// <typeparam name="T">Most general type.</typeparam>
     /// <returns>Enumerable of the created instances.</returns>
-    public IEnumerable<T> GetInstances<T>() where T : class {
-      return GetInstances(typeof(T)).Cast<T>();
-    }
+    public IEnumerable<T> GetInstances<T>() where T : class => GetInstances(typeof(T)).Cast<T>();
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <typeparam name="T">Most general type.</typeparam>
+    /// <param name="args">Constructor arguments.</param>
+    /// <returns>Enumerable of the created instances.</returns>
+    public IEnumerable<T> GetInstances<T>(params object[] args) where T : class => GetInstances(typeof(T), args).Cast<T>();
 
     /// <summary>
@@ -71,9 +71,17 @@
     /// <param name="type">Most general type.</param>
     /// <returns>Enumerable of the created instances.</returns>
-    public IEnumerable<object> GetInstances(Type type) {
+    public IEnumerable<object> GetInstances(Type type) => GetInstances(type, null);
+
+    /// <summary>
+    /// Creates an instance of all types that are subtypes or the same type of the specified type
+    /// </summary>
+    /// <param name="type">Most general type.</param>
+    /// <param name="args">Constructor arguments.</param>
+    /// <returns>Enumerable of the created instances.</returns>
+    public IEnumerable<object> GetInstances(Type type, params object[] args) {
       List<object> instances = new List<object>();
       foreach (Type t in GetTypes(type)) {
         object instance = null;
-        try { instance = Activator.CreateInstance(t); } catch { }
+        try { instance = Activator.CreateInstance(t, args); } catch { }
         if (instance != null) instances.Add(instance);
       }
@@ -81,4 +89,9 @@
     }
 
+    /// <summary>
+    /// Discovers a specific type by its name.
+    /// </summary>
+    /// <param name="typeName">Full name of the type.</param>
+    /// <returns>A type or null, if nothing was found.</returns>
     public Type GetType(string typeName) {
       foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
@@ -217,5 +230,4 @@
       throw new NotSupportedException("LightweightApplicationManager doesn't support type discovery for plugins.");
     }
-
     #endregion
   }
