Index: branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIApplication.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIApplication.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIApplication.cs	(revision 17013)
@@ -51,5 +51,5 @@
           SetOption(cmdData, option, (i + 1 < args.Length) ? args[++i] : "");
         // else check if arg is valid command, then jump to next command
-        else if (IsValidCommand(args[i], cmdData, out CommandData next)) {          
+        else if (IsValidCommand(args[i], cmdData, out CommandData next)) {
           CheckRequirements(cmdData);
           valueIndex = 0; // reset value index for new command
@@ -163,5 +163,5 @@
     /// Returns true when the given argument can be identified as help option (--help).
     /// </summary>
-    private static bool IsHelpRequest(string arg) => arg.ToLower().Equals("--help");
+    private static bool IsHelpRequest(string arg) => arg.Equals("--help", StringComparison.InvariantCultureIgnoreCase);
 
     /// <summary>
@@ -185,5 +185,5 @@
     private static bool IsValidCommand(string arg, CommandData cmdData, out CommandData next) {
       foreach (var cmd in cmdData.Commands) {
-        if (arg.ToLower().Equals(cmd.Identifier.ToLower())) {
+        if (cmd.Identifier.Equals(arg, StringComparison.InvariantCultureIgnoreCase)) {
           next = cmd;
           return true;
@@ -213,5 +213,5 @@
     /// </summary>
     private static ICommand GetInstance(CommandData cmdData) {
-      if (cmdData.Instance == null) 
+      if (cmdData.Instance == null)
         cmdData.Instance = (ICommand)Activator.CreateInstance(cmdData.CommandType);
       return cmdData.Instance;
@@ -226,5 +226,5 @@
           IList list = (IList)CreateGenericType(typeof(List<>), targetType);
           string[] elements = nextArg.Split(',');
-          foreach(var elem in elements) list.Add(ParseString(elem, targetType));
+          foreach (var elem in elements) list.Add(ParseString(elem, targetType));
           property.SetValue(GetInstance(cmdData), list);
         } else property.SetValue(GetInstance(cmdData), ParseString(nextArg, property.PropertyType));
@@ -318,8 +318,8 @@
     /// Valid = it implements ICommand and has a parameterless constructor.
     /// </summary>
-    private static bool IsInstancableCommand(Type type) => 
-      type.GetInterface(nameof(ICommand)) != null && 
-      !type.IsAbstract && 
-      !type.IsInterface && 
+    private static bool IsInstancableCommand(Type type) =>
+      type.GetInterface(nameof(ICommand)) != null &&
+      !type.IsAbstract &&
+      !type.IsInterface &&
       type.GetConstructors().Any(info => info.GetParameters().Length == 0);
 
Index: branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/AppTest.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/AppTest.cs	(revision 17012)
+++ 	(revision )
@@ -1,102 +1,0 @@
-﻿using System;
-using System.IO;
-using System.Threading;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Optimization;
-using HeuristicLab.PluginInfrastructure;
-
-namespace HeuristicLab.DynamicAssemblyTestApp {
-  [Serializable]
-  [Application("CLIOptimize", "")]
-  public class AppTest : ApplicationBase {
-
-    #region Vars
-    [NonSerialized]
-    private IExecutable executable;
-    [NonSerialized]
-    private static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
-    [NonSerialized]
-    private static object locker = new object();
-    #endregion
-
-    #region Properties
-    public UniPath InputFilePath { get; set; } = null;
-    public UniPath OutputPath { get; set; } = null;
-    #endregion
-
-    #region Constructors
-    public AppTest() { }
-    public AppTest(UniPath inputFilePath, UniPath outputPath) {
-      InputFilePath = inputFilePath;
-      OutputPath = outputPath;
-    }
-    #endregion
-
-    public override void Run(ICommandLineArgument[] args) {
-      Init();
-      lock (locker) {
-        executable.Stopped += Executable_Stopped;
-        executable.StartAsync();
-      }
-      autoResetEvent.WaitOne();
-    }
-
-    public override void OnCancel() {
-      lock (locker) {
-        base.OnCancel();
-        if (executable != null)
-          executable.Stop();
-      }
-    }
-
-    public override void OnPause() {
-      base.OnPause();
-      lock (locker) {
-        if (executable != null) executable.Pause();
-      }
-    }
-
-    public override void OnResume() {
-      base.OnResume();
-      lock (locker) {
-        if (executable != null)
-          executable.StartAsync();
-      }
-    }
-
-    #region Helper
-    private void Init() {
-      lock (locker) {
-        ContentManager.Initialize(new PersistenceContentManager());
-        IStorableContent content = ContentManager.Load(InputFilePath.ToString());
-        executable = content as IExecutable;
-        if (executable == null)
-          throw new NotSupportedException("The given file does not contain any algorithm to start.");
-      }
-    }
-
-    private void Executable_Stopped(object sender, EventArgs e) {
-      lock (locker) {
-        IOptimizer optimizer = executable as IOptimizer;
-        if (optimizer != null) PrintResults(optimizer);
-        ContentManager.Save((IStorableContent)executable, OutputPath.ToString() + Path.DirectorySeparatorChar + "result.hl", true);
-      }
-      autoResetEvent.Set();
-    }
-
-    private void PrintResults(IOptimizer optimizer) {
-      lock (locker) {
-        Console.WriteLine("\nRESULT(S):");
-        int i = 1;
-        foreach (var run in optimizer.Runs) {
-          Console.WriteLine($"{"-------------------------------- RUN",35} {$"{i++:D3}" + " --------------------------------",-35}");
-          foreach (var res in run.Results) {
-            Console.WriteLine($"{res.Key,35} : {res.Value,-35}");
-          }
-        }
-      }
-    }
-    #endregion
-  }
-}
Index: branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/ConsoleOptimizer.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/ConsoleOptimizer.cs	(revision 17013)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/ConsoleOptimizer.cs	(revision 17013)
@@ -0,0 +1,122 @@
+﻿using System;
+using System.IO;
+using System.Threading;
+using HEAL.Attic;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.PluginInfrastructure;
+
+namespace HeuristicLab.DynamicAssemblyTestApp {
+  [StorableType("33B32897-258B-4E29-8E2E-0A9A8AE67B1D")]
+  [Application("CLIOptimize", "")]
+  public class ConsoleOptimizer : ApplicationBase {
+
+    #region Vars
+    private IExecutable executable;
+    private readonly ManualResetEvent stoppedSignal = new ManualResetEvent(false);
+    private readonly ManualResetEvent startedSignal = new ManualResetEvent(false);
+    private bool isFinished = false;
+    private static object locker = new object();
+    #endregion
+
+    #region Properties
+    [Storable]
+    public UniPath InputFilePath { get; set; } = null;
+    [Storable]
+    public UniPath OutputPath { get; set; } = null;
+    #endregion
+
+    #region Constructors
+    public ConsoleOptimizer() { }
+    public ConsoleOptimizer(UniPath inputFilePath, UniPath outputPath) {
+      InputFilePath = inputFilePath;
+      OutputPath = outputPath;
+    }
+    #endregion
+
+
+    public override void Run(ICommandLineArgument[] args) {
+      lock (locker) {
+        Init();
+        executable.Started += Executable_Started;
+        executable.Stopped += Executable_Stopped;
+        startedSignal.Reset();
+        executable.StartAsync();
+        startedSignal.WaitOne();
+      }
+      stoppedSignal.WaitOne();
+
+      startedSignal.Close();
+      stoppedSignal.Close();
+    }
+
+    private void Executable_Started(object sender, EventArgs e) {
+      startedSignal.Set();
+    }
+
+    public override void OnCancel() {
+      base.OnCancel();
+      startedSignal.WaitOne();
+      lock (locker) {
+        if (isFinished) throw new InvalidOperationException("Executable has already finished!");
+        executable.Stop();
+      }
+    }
+
+    public override void OnPause() {
+      base.OnPause();
+      startedSignal.WaitOne();
+      lock (locker) {
+        if (isFinished) throw new InvalidOperationException("Executable has already finished!");
+        executable.Pause();
+      }
+    }
+
+    public override void OnResume() {
+      base.OnResume();
+      startedSignal.WaitOne();
+      lock (locker) {
+        if (isFinished) throw new InvalidOperationException("Executable has already finished!");
+        startedSignal.Reset();
+        executable.StartAsync();
+        startedSignal.WaitOne();
+      }
+    }
+
+    #region Helper
+    private void Init() {
+      lock (locker) {
+        ContentManager.Initialize(new PersistenceContentManager());
+        IStorableContent content = ContentManager.Load(InputFilePath.ToString());
+        executable = content as IExecutable;
+        if (executable == null)
+          throw new NotSupportedException("The given file does not contain any algorithm to start.");
+      }
+    }
+
+    private void Executable_Stopped(object sender, EventArgs e) {
+      lock (locker) {
+        isFinished = true;
+        IOptimizer optimizer = executable as IOptimizer;
+        if (optimizer != null) PrintResults(optimizer);
+        ContentManager.Save((IStorableContent)executable, OutputPath.ToString() + Path.DirectorySeparatorChar + "result.hl", true);
+      }
+      stoppedSignal.Set();
+    }
+
+    private void PrintResults(IOptimizer optimizer) {
+      lock (locker) {
+        Console.WriteLine("\nRESULT(S):");
+        int i = 1;
+        foreach (var run in optimizer.Runs) {
+          Console.WriteLine($"{"-------------------------------- RUN",35} {$"{i++:D3}" + " --------------------------------",-35}");
+          foreach (var res in run.Results) {
+            Console.WriteLine($"{res.Key,35} : {res.Value,-35}");
+          }
+        }
+      }
+    }
+    #endregion
+  }
+}
Index: branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/HeuristicLab.DynamicAssemblyTestApp.csproj
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/HeuristicLab.DynamicAssemblyTestApp.csproj	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/HeuristicLab.DynamicAssemblyTestApp.csproj	(revision 17013)
@@ -19,3 +19,9 @@
   </ItemGroup>
 
+  <ItemGroup>
+    <Reference Include="HEAL.Attic">
+      <HintPath>..\bin\HEAL.Attic.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
 </Project>
Index: branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs	(revision 17013)
@@ -1,3 +1,4 @@
 ﻿using System;
+using HEAL.Attic;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -6,7 +7,8 @@
 
 namespace HeuristicLab.DynamicAssemblyTestApp {
-  [Serializable]
+  [StorableType("61621E70-8A67-43A2-8EB2-233FC01E493B")]
   [Application("CLIInspect", "")]
   public class InspectApplication : ApplicationBase {
+    [Storable]
     public UniPath InputFilePath { get; set; }
 
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/ApplicationBase.cs	(revision 17013)
@@ -21,5 +21,5 @@
 
 
-using System;
+using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
@@ -27,5 +27,5 @@
   /// Abstract base implementation for the IApplication interface.
   /// </summary>
-  [Serializable]
+  [StorableType("FB13839C-2EEC-4C6F-BEF3-A1CAE4467362")]
   public abstract class ApplicationBase : IApplication {
     /// <summary>
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 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj	(revision 17013)
@@ -17,10 +17,11 @@
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="System.CodeDom" Version="4.5.0" />
-    <PackageReference Include="System.Drawing.Common" Version="4.5.1" />
     <PackageReference Include="System.Runtime.Loader" Version="4.3.0" />
-    <PackageReference Include="System.Security.Cryptography.ProtectedData" Version="4.5.0" />
-    <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" />
-    <PackageReference Include="System.Security.Cryptography.Primitives" Version="4.3.0" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="HEAL.Attic">
+      <HintPath>..\..\bin\HEAL.Attic.dll</HintPath>
+      <Private>true</Private>
+    </Reference>
   </ItemGroup>
 </Project>
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunner.cs	(revision 17013)
@@ -3,9 +3,4 @@
 namespace HeuristicLab.PluginInfrastructure {
   public interface IRunner {
-    /// <summary>
-    /// Set this to true, if console output should be disabled.
-    /// </summary>
-    bool QuietMode { get; set; }
-
     /// <summary>
     /// Assemblies which the child process needs to load.
@@ -17,4 +12,8 @@
     /// </summary>
     void Run();
+
+    void Pause();
+    void Resume();
+    void Cancel();
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Interfaces/IRunnerHost.cs	(revision 17013)
@@ -12,4 +12,9 @@
     /// </summary>
     RunnerState State { get; }
+
+    /// <summary>
+    /// Set this to true, if console output should be disabled.
+    /// </summary>
+    bool QuietMode { get; set; }
 
     /// <summary>
@@ -28,12 +33,8 @@
 
     /// <summary>
-    /// Method to pause the runner and the isolated IApplication.
+    /// Method to send messages to the runner, which runs in child process.
     /// </summary>
-    void Pause();
-
-    /// <summary>
-    /// Method to resume a paused runner and the isolated IApplication.
-    /// </summary>
-    void Resume();
+    /// <param name="runnerMessage">A object from a derived class of RunnerMessage.</param>
+    void Send(RunnerMessage runnerMessage);
   }
 }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/ApplicationRunner.cs	(revision 17013)
@@ -1,11 +1,11 @@
-﻿using System;
-using System.IO;
+﻿using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
-  [Serializable]
+  [StorableType("612F98AF-E254-4C5E-BD41-75B4F1D9B96D")]
   public class ApplicationRunner : Runner {
     /// <summary>
     /// Arguments for the StartApplication.
     /// </summary>
+    [Storable]
     public ICommandLineArgument[] Args { get; set; }
 
@@ -15,15 +15,14 @@
     public IApplication StartApplication {
       get {
-        if (application == null) {
-          using (var memStream = new MemoryStream(serializedStartApplication)) {
-            application = (IApplication)formatter.Deserialize(memStream);
-          }
+        lock (locker) {
+          if (application == null)
+            application = (IApplication)new ProtoBufSerializer().Deserialize(serializedStartApplication);
+          return application;
         }
-        return application;
       }
       set {
-        using (var ms = new MemoryStream()) {
-          formatter.Serialize(ms, value);
-          serializedStartApplication = ms.ToArray();
+        lock (locker) {
+          serializedStartApplication = new ProtoBufSerializer().Serialize(value);
+          application = value;
         }
       }
@@ -31,7 +30,10 @@
     // Encapsulated application is necessary, because it is not possible to 
     // instantly deserialize the application, before all assemblies are loaded.
+    [Storable]
     private byte[] serializedStartApplication = new byte[0];
+
     // cache application to prevent new instances every get call of StartApplication
     private IApplication application;
+    private object locker = new object();
 
     protected override void Execute() {
@@ -39,10 +41,11 @@
     }
 
-    protected override void OnRunnerJob(RunnerJob runnerJob) {
-      switch (runnerJob) {
-        case RunnerJob.Cancel: StartApplication.OnCancel(); break;
-        case RunnerJob.Pause: StartApplication.OnPause(); break;
-        case RunnerJob.Resume: StartApplication.OnResume(); break;
-      }
+    protected override void OnRunnerMessage(RunnerMessage message) {
+      if (message is PauseRunnerMessage)
+        StartApplication.OnPause();
+      else if (message is ResumeRunnerMessage)
+        StartApplication.OnResume();
+      else if (message is CancelRunnerMessage)
+        StartApplication.OnCancel();
     }
   }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyInfo.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyInfo.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/AssemblyInfo.cs	(revision 17013)
@@ -1,6 +1,6 @@
-﻿using System;
+﻿using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
-  [Serializable]
+  [StorableType(StorableMemberSelection.AllProperties, "D1DC9C3E-16B7-464E-A377-35FA614195AD")]
   public class AssemblyInfo {
     /// <summary>
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/DockerRunnerHost.cs	(revision 17013)
@@ -1,3 +1,5 @@
 ﻿using System.Diagnostics;
+using System.IO;
+using System.Threading.Tasks;
 using HeuristicLab.PluginInfrastructure.Exceptions;
 
@@ -8,25 +10,37 @@
   public class DockerRunnerHost : RunnerHost {
     #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!";
+    private readonly static string Docker = "docker";
+    private readonly static string ContainerStartup = "container run -i --rm ";
+    private readonly static string MountingLinux = @"--mount type=bind,source=/c/Users/,target=/Users ";
+    private readonly static string MountingWindows = @"--mount type=bind,source=C:\Users\,target=C:\Users\ ";
+    private readonly static string LinuxImage = "." + Path.DirectorySeparatorChar + "DockerLinuxBuild" + Path.DirectorySeparatorChar + "Dockerfile";
+    private readonly static string WindowsImage = "." + Path.DirectorySeparatorChar + "DockerWindowsBuild" + Path.DirectorySeparatorChar + "Dockerfile";
+    private readonly static string Image = "heuristiclab33:latest";
+    private readonly static string DockerExceptionMessage = "Docker is not running!";
     #endregion
 
     #region Constructors
-    public DockerRunnerHost(bool doDockerAvailableCheck = true)
-      : base(Docker, ContainerStartup + Mounting + Image, null, null, null) {
-      if (doDockerAvailableCheck && !IsDockerAvailable())
-        throw new DockerException(DockerExceptionMessage);
+    public DockerRunnerHost()
+      : base(Docker, ContainerStartup + GetTargetOSMounting() + Image, null, null, null) {
     }
     #endregion
 
     #region Helper
-    private bool IsDockerAvailable() {
+
+    private static string GetTargetOSMounting() {
+      Task<bool> win = Task.Run(() => BuildImage(WindowsImage));
+      Task<bool> lin = Task.Run(() => BuildImage(LinuxImage));
+      if (win.Result) return MountingWindows;
+      else if (lin.Result) return MountingLinux;
+      else throw new DockerException(DockerExceptionMessage);
+    }
+
+    private static bool BuildImage(string pathToDockerfile) {
       var process = new Process {
         StartInfo = new ProcessStartInfo {
           FileName = Docker,
-          Arguments = "image inspect " + Image,
+          Arguments = "image build -t " + Image +
+            " -f " + Path.GetFullPath(pathToDockerfile) +
+            " .",
           UseShellExecute = false,
           RedirectStandardOutput = true,
@@ -37,5 +51,4 @@
         EnableRaisingEvents = false
       };
-
       process.Start();
       process.BeginOutputReadLine();
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/Runner.cs	(revision 17013)
@@ -2,59 +2,65 @@
 using System.Collections.Generic;
 using System.IO;
-using System.Runtime.Serialization;
-using System.Runtime.Serialization.Formatters.Binary;
 using System.Threading;
+using System.Threading.Tasks;
+using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
-  [Serializable]
+  [StorableType(StorableMemberSelection.MarkedOnly, "D93CBE04-9847-417A-AAB5-7FBCA6A32247")]
   public abstract class Runner : IRunner {
 
     #region Vars
-    [NonSerialized]
     private Thread listener;
-
-    [NonSerialized]
-    private Thread executor;
-
-    [NonSerialized]
-    protected static IFormatter formatter = new BinaryFormatter();
     #endregion
 
     #region Properties
-    public bool QuietMode { get; set; }
+    [Storable]
+    public IEnumerable<AssemblyInfo> AssembliesToLoad { get; set; }
 
-    public IEnumerable<AssemblyInfo> AssembliesToLoad { get; set; }
+    internal RunnerHost Host { get; set; }
     #endregion
 
+    public void Pause() {
+      var message = new PauseRunnerMessage();
+      if (Host != null) Host.Send(message);
+      else OnRunnerMessage(message);
+    }
 
-    public static void Serialize(IRunner runner, Stream stream) => formatter.Serialize(stream, runner);
-    public static IRunner Deserialize(Stream stream = null) => (IRunner)formatter.Deserialize(stream);
-    public static void Pause(Stream stream) => formatter.Serialize(stream, RunnerJob.Pause);
-    public static void Resume(Stream stream) => formatter.Serialize(stream, RunnerJob.Resume);
-    public static void Cancel(Stream stream) => formatter.Serialize(stream, RunnerJob.Cancel);
+    public void Resume() {
+      var message = new ResumeRunnerMessage();
+      if (Host != null) Host.Send(message);
+      else OnRunnerMessage(message);
+    }
+
+    public void Cancel() {
+      var message = new CancelRunnerMessage();
+      if (Host != null) Host.Send(message);
+      else OnRunnerMessage(message);
+    }
 
     public void Run() {
       IPluginLoader loader = PluginLoaderFactory.Create();
       loader.LoadPlugins(AssembliesToLoad);
-      StartExecutor();
+      Task t = Task.Run(Execute);
       StartListener();
-      executor.Join();
+      t.Wait();
     }
 
     protected abstract void Execute();
-    protected abstract void OnRunnerJob(RunnerJob runnerJob);
+    protected abstract void OnRunnerMessage(RunnerMessage message);
 
     #region Helper
-    private void StartExecutor() {
-      executor = new Thread(Execute);
-      executor.IsBackground = false;
-      executor.Start();
-    }
 
     private void StartListener() {
       listener = new Thread(() => {
         Stream stdin = Console.OpenStandardInput();
-        while (executor.IsAlive)
-          OnRunnerJob((RunnerJob)formatter.Deserialize(stdin));
+        DateTime lastMessageRecieved = DateTime.MinValue;
+        while (true) {
+          RunnerMessage message = RunnerMessage.ReadMessageFromStream(stdin);
+          if (DateTime.Compare(lastMessageRecieved, message.SendTime) < 0) {
+            OnRunnerMessage(message);
+            lastMessageRecieved = message.SendTime;
+          }
+        }
       });
       listener.IsBackground = true;
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerHost.cs	(revision 17013)
@@ -4,4 +4,5 @@
 using System.Threading;
 using System.Threading.Tasks;
+using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
@@ -14,6 +15,4 @@
     Starting,
     Running,
-    Paused,
-    Stopping,
     Stopped
   }
@@ -27,7 +26,14 @@
     #region Vars
     protected Process process;
+    private ProtoBufSerializer serializer = new ProtoBufSerializer();
     #endregion
 
     #region Properties
+    /// <summary>
+    /// Set this to true, if console output should be disabled.
+    /// </summary>
+    public bool QuietMode { get; set; }
+
+
     /// <summary>
     /// The programm, which should be used. For example 'docker'.
@@ -41,12 +47,11 @@
     protected string Password { get; private set; }
     protected string Domain { get; private set; }
+    protected IRunner Runner { get; set; }
 
-    /// <summary>
-    /// The runner state.
-    /// </summary>
     public RunnerState State { get; protected set; } = RunnerState.Created;
     #endregion
 
     #region Constructors
+
     protected RunnerHost(string program, string startArgument, string userName, string password, string domain) {
       Program = program;
@@ -63,4 +68,5 @@
         throw new InvalidOperationException("Runner must be in state 'Created'.");
       State = RunnerState.Starting;
+      Runner = runner;
       process = new Process {
         StartInfo = new ProcessStartInfo {
@@ -72,5 +78,5 @@
           RedirectStandardError = true,
           CreateNoWindow = false,
-          UserName = string.IsNullOrEmpty(UserName) ? null : UserName,
+          UserName = string.IsNullOrEmpty(UserName) ? null : UserName, // TODO: accounts testen: https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/local-accounts#sec-localsystem
           PasswordInClearText = string.IsNullOrEmpty(Password) ? null : Password,
           Domain = string.IsNullOrEmpty(Domain) ? null : Domain,
@@ -80,41 +86,44 @@
       };
       process.Start();
+
       // registers a task for cancellation, prevents the use of polling (while-loop)
       var task = RegisterCancellation(token.HasValue ? token.Value : CancellationToken.None);
 
-      // write config to standardinput, runner listens on this and deserializes the config
-      Runner.Serialize(runner, process.StandardInput.BaseStream);
+      // set runnerhost in runner 
+      Runner r = Runner as Runner;
+      if (r != null) r.Host = this;
 
       process.BeginOutputReadLine();
       process.BeginErrorReadLine();
 
-      if (!runner.QuietMode) {
+      if (!QuietMode) {
         process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
         process.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
       }
+
+      // write config to standardinput, runner listens on this and deserializes the config
+      SendMessage(new TransportRunnerMessage(Runner));
+
       State = RunnerState.Running;
       if (await task) State = RunnerState.Cancelled;
       else State = RunnerState.Stopped;
-
     }
 
-    /// <summary>
-    /// Pauses the runners. The childprocess gets notified with the help of the standard input and a serialized RunnerJob.
-    /// To pause the runner, the state must be "Running".
-    /// </summary>
-    public void Pause() {
+
+    public void Send(RunnerMessage runnerMessage) {
       if (State != RunnerState.Running) throw new InvalidOperationException("Runner must be in state 'Running'!");
-      Runner.Pause(process.StandardInput.BaseStream);
-      State = RunnerState.Paused;
+      SendMessage(runnerMessage);
     }
 
-    /// <summary>
-    /// Resumes a paused runner. The childprocess gets notified with the help of the standard input and a serialized RunnerJob.
-    /// To resume the runner, the state must be "Paused".
-    /// </summary>
-    public void Resume() {
-      if (State != RunnerState.Paused) throw new InvalidOperationException("Runner must be in state 'Paused'!");
-      Runner.Resume(process.StandardInput.BaseStream);
-      State = RunnerState.Running;
+    // because we need to transfer the runner with a TransportRunnerMessage in the starting state and the 
+    // original send method should not be available until running state
+    protected virtual void SendMessage(RunnerMessage runnerMessage) {
+      runnerMessage.SendTime = DateTime.Now;
+      byte[] bytes = serializer.Serialize(runnerMessage);
+      byte[] size = BitConverter.GetBytes(bytes.Length);
+      process.StandardInput.BaseStream.Write(size, 0, size.Length);
+      process.StandardInput.BaseStream.Flush();
+      process.StandardInput.BaseStream.Write(bytes, 0, bytes.Length);
+      process.StandardInput.BaseStream.Flush();
     }
 
@@ -125,5 +134,5 @@
     /// When the child process gets finished without requested cancellation, the linked token gets cancelled and a result set. 
     /// </summary>
-    private Task<bool> RegisterCancellation(CancellationToken token) {
+    protected Task<bool> RegisterCancellation(CancellationToken token) {
       if (process != null && State == RunnerState.Starting) {
         var cts = CancellationTokenSource.CreateLinkedTokenSource(token);
@@ -133,5 +142,5 @@
         cts.Token.Register(() => {
           if (!process.HasExited) {
-            Runner.Cancel(process.StandardInput.BaseStream);
+            Runner.Cancel();
             process.WaitForExit();
           }
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerJob.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerJob.cs	(revision 17012)
+++ 	(revision )
@@ -1,16 +1,0 @@
-﻿using System;
-using System.IO;
-using System.Runtime.Serialization;
-using System.Runtime.Serialization.Formatters.Binary;
-
-namespace HeuristicLab.PluginInfrastructure {
-  /// <summary>
-  /// Job command for the runner.
-  /// </summary>
-  [Serializable]
-  public enum RunnerJob {
-    Cancel,
-    Pause,
-    Resume
-  }
-}
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerMessage.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerMessage.cs	(revision 17013)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Isolation/RunnerMessage.cs	(revision 17013)
@@ -0,0 +1,48 @@
+﻿using System;
+using System.IO;
+using HEAL.Attic;
+
+namespace HeuristicLab.PluginInfrastructure {
+
+  [StorableType(StorableMemberSelection.MarkedOnly, "081DC79E-1E57-49A2-AB25-D9AC42A40911")]
+  public class RunnerMessage {
+    private static ProtoBufSerializer serializer = new ProtoBufSerializer();
+    public static RunnerMessage ReadMessageFromStream(Stream stream) {
+      byte[] buf = new byte[4];
+      stream.Read(buf, 0, buf.Length);
+      int bufSize = BitConverter.ToInt32(buf, 0);
+      buf = new byte[bufSize];
+      stream.Read(buf, 0, buf.Length);
+      return (RunnerMessage)serializer.Deserialize(buf);
+    }
+
+    /// <summary>
+    /// This will get set from the RunnerHost and helps to identify the correct message flow.
+    /// </summary>
+    [Storable]
+    public DateTime SendTime { get; set; }
+  }
+
+
+  [StorableType(StorableMemberSelection.AllProperties, "84771CF3-46CA-4D0B-96D1-7F2E8EAC50B7")]
+  public class PauseRunnerMessage : RunnerMessage { }
+
+
+  [StorableType(StorableMemberSelection.AllProperties, "FE2AEE66-E2A2-4DE1-8E60-C116F084D2AA")]
+  public class ResumeRunnerMessage : RunnerMessage { }
+
+
+  [StorableType(StorableMemberSelection.AllProperties, "2C836B74-C28B-4F4A-9645-E1ED5F4415A7")]
+  public class CancelRunnerMessage : RunnerMessage { }
+
+
+  [StorableType(StorableMemberSelection.AllProperties, "2D8D1D8F-58D4-4D92-BB15-62DF55DC0459")]
+  public class TransportRunnerMessage : RunnerMessage {
+    public IRunner Runner { get; set; }
+    public TransportRunnerMessage(IRunner runner) => Runner = runner;
+
+    [StorableConstructor]
+    private TransportRunnerMessage(StorableConstructorFlag _) { }
+  }
+
+}
Index: branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Utils/UniPath.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Utils/UniPath.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.PluginInfrastructure/3.3/Utils/UniPath.cs	(revision 17013)
@@ -1,30 +1,31 @@
-﻿using System;
-using System.Collections.Generic;
-using System.IO;
+﻿using System.IO;
 using System.Runtime.InteropServices;
-using System.Text;
 using System.Text.RegularExpressions;
+using HEAL.Attic;
 
 namespace HeuristicLab.PluginInfrastructure {
-  [Serializable]
+  [StorableType("8911C8DC-FDA0-4CF6-A0CD-C67E72094D62")]
   public class UniPath {
 
     #region Vars
+    [Storable]
     private string fullPath = "";
     #endregion
 
     #region Constructors
+    [StorableConstructor]
+    private UniPath(StorableConstructorFlag _) { }
     public UniPath(string path) {
       fullPath = Path.GetFullPath(path);
     }
     #endregion
-    
+
     private bool IsWindowsAbsolutePath(string path) => Regex.IsMatch(path, @"^[A-Z]:");
-    
+
     private string Rebuild(char split, string startStr, string seperator) {
       string[] splits = fullPath.Split(split);
       string tmp = startStr;
       int i = 1;
-      while (i < splits.Length - 1) {
+      while (i < (splits.Length - 1)) {
         tmp += splits[i] + seperator;
         ++i;
Index: branches/2924_DotNetCoreMigration/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab.Scripting/3.3/HeuristicLab.Scripting-3.3.csproj	(revision 17013)
@@ -31,4 +31,5 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
+    <PackageReference Include="System.CodeDom" Version="4.5.0" />
   </ItemGroup>
 </Project>
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs	(revision 17013)
@@ -40,5 +40,6 @@
     private void StartupRunnerHost() {
       Stream stdin = Console.OpenStandardInput();
-      IRunner runner = Runner.Deserialize(stdin);
+      var message = (TransportRunnerMessage)RunnerMessage.ReadMessageFromStream(stdin);
+      IRunner runner = message.Runner;
 
       if (runner != null)
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerLinuxBuild/Dockerfile
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerLinuxBuild/Dockerfile	(revision 17013)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerLinuxBuild/Dockerfile	(revision 17013)
@@ -0,0 +1,37 @@
+FROM mcr.microsoft.com/dotnet/core/runtime:3.0-buster-slim AS runtime
+WORKDIR /app
+
+#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
+#WORKDIR /src
+
+
+#COPY ["HeuristicLab/3.3/", "HeuristicLab/3.3/"]
+#COPY ["HeuristicLab.CommandLineInterface/", "HeuristicLab.CommandLineInterface/"]
+#COPY ["HeuristicLab.Common/3.3/", "HeuristicLab.Common/3.3/"]
+#COPY ["HeuristicLab.PluginInfrastructure/3.3/", "HeuristicLab.PluginInfrastructure/3.3/"]
+#COPY ["HeuristicLab.DynamicAssemblyTestApp/", "HeuristicLab.DynamicAssemblyTestApp/"]
+#COPY ["HeuristicLab.Core/3.3/", "HeuristicLab.Core/3.3/"]
+#COPY ["HeuristicLab.Persistence/3.3/", "HeuristicLab.Persistence/3.3/"]
+#COPY ["HeuristicLab.Tracing/3.3/", "HeuristicLab.Tracing/3.3/"]
+#COPY ["HeuristicLab.Common.Resources/3.3/", "HeuristicLab.Common.Resources/3.3/"]
+#COPY ["HeuristicLab.Collections/3.3/", "HeuristicLab.Collections/3.3/"]
+#COPY ["HeuristicLab.Optimization/3.3/", "HeuristicLab.Optimization/3.3/"]
+#COPY ["HeuristicLab.Data/3.3/", "HeuristicLab.Data/3.3/"]
+#COPY ["HeuristicLab.Parameters/3.3/", "HeuristicLab.Parameters/3.3/"]
+#COPY ["HeuristicLab.Operators/3.3/", "HeuristicLab.Operators/3.3/"]
+#COPY ["HEAL.Attic-master/HEAL.Attic-master/src", "HeuristicLab.Operators/3.3/"]
+
+
+#RUN dotnet restore "HeuristicLab/3.3/HeuristicLab-3.3.csproj"
+#WORKDIR "/src/HeuristicLab/3.3"
+#RUN dotnet build "HeuristicLab-3.3.csproj" -c Release -o /app_linux
+
+#FROM build AS publish
+#RUN dotnet publish "HeuristicLab-3.3.csproj" -c Release -o /app_linux
+
+COPY . .
+
+#FROM runtime AS final
+#WORKDIR /app
+#COPY --from=publish /app .
+ENTRYPOINT ["dotnet", "HeuristicLab-3.3.dll"] 
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerWindowsBuild/Dockerfile
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerWindowsBuild/Dockerfile	(revision 17013)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/DockerWindowsBuild/Dockerfile	(revision 17013)
@@ -0,0 +1,40 @@
+ #TODO: von linuxbase und windowsbase
+FROM mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1809 AS runtime
+WORKDIR /app
+
+#FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
+#WORKDIR /src
+
+
+#COPY ["HeuristicLab/3.3/", "HeuristicLab/3.3/"]
+#COPY ["HeuristicLab.CommandLineInterface/", "HeuristicLab.CommandLineInterface/"]
+#COPY ["HeuristicLab.Common/3.3/", "HeuristicLab.Common/3.3/"]
+#COPY ["HeuristicLab.PluginInfrastructure/3.3/", "HeuristicLab.PluginInfrastructure/3.3/"]
+#COPY ["HeuristicLab.DynamicAssemblyTestApp/", "HeuristicLab.DynamicAssemblyTestApp/"]
+#COPY ["HeuristicLab.Core/3.3/", "HeuristicLab.Core/3.3/"]
+#COPY ["HeuristicLab.Persistence/3.3/", "HeuristicLab.Persistence/3.3/"]
+#COPY ["HeuristicLab.Tracing/3.3/", "HeuristicLab.Tracing/3.3/"]
+#COPY ["HeuristicLab.Common.Resources/3.3/", "HeuristicLab.Common.Resources/3.3/"]
+#COPY ["HeuristicLab.Collections/3.3/", "HeuristicLab.Collections/3.3/"]
+#COPY ["HeuristicLab.Optimization/3.3/", "HeuristicLab.Optimization/3.3/"]
+#COPY ["HeuristicLab.Data/3.3/", "HeuristicLab.Data/3.3/"]
+#COPY ["HeuristicLab.Parameters/3.3/", "HeuristicLab.Parameters/3.3/"]
+#COPY ["HeuristicLab.Operators/3.3/", "HeuristicLab.Operators/3.3/"]
+#COPY ["HEAL.Attic-master/HEAL.Attic-master/src", "HeuristicLab.Operators/3.3/"]
+
+
+#RUN dotnet restore "HeuristicLab/3.3/HeuristicLab-3.3.csproj"
+#WORKDIR "/src/HeuristicLab/3.3"
+#RUN dotnet build "HeuristicLab-3.3.csproj" -c Release -o /app_linux
+
+#FROM build AS publish
+#RUN dotnet publish "HeuristicLab-3.3.csproj" -c Release -o /app_linux
+
+COPY . .
+
+#FROM runtime AS final
+#WORKDIR /app
+#COPY --from=publish /app .
+ENTRYPOINT ["dotnet", "HeuristicLab-3.3.dll"] 
+#TODO: image nur aus binarys bauen von publish
+#https://blogs.msdn.microsoft.com/appconsult/2018/09/20/running-containers-based-on-different-platforms-side-by-side-with-docker-preview/
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/Dockerfile
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/Dockerfile	(revision 17012)
+++ 	(revision )
@@ -1,30 +1,0 @@
-FROM mcr.microsoft.com/dotnet/core/runtime:3.0-buster-slim AS base
-WORKDIR /app
-
-FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
-WORKDIR /src
-COPY ["HeuristicLab/3.3/", "HeuristicLab/3.3/"]
-COPY ["HeuristicLab.CommandLineInterface/", "HeuristicLab.CommandLineInterface/"]
-COPY ["HeuristicLab.Common/3.3/", "HeuristicLab.Common/3.3/"]
-COPY ["HeuristicLab.PluginInfrastructure/3.3/", "HeuristicLab.PluginInfrastructure/3.3/"]
-COPY ["HeuristicLab.DynamicAssemblyTestApp/", "HeuristicLab.DynamicAssemblyTestApp/"]
-COPY ["HeuristicLab.Core/3.3/", "HeuristicLab.Core/3.3/"]
-COPY ["HeuristicLab.Persistence/3.3/", "HeuristicLab.Persistence/3.3/"]
-COPY ["HeuristicLab.Tracing/3.3/", "HeuristicLab.Tracing/3.3/"]
-COPY ["HeuristicLab.Common.Resources/3.3/", "HeuristicLab.Common.Resources/3.3/"]
-COPY ["HeuristicLab.Collections/3.3/", "HeuristicLab.Collections/3.3/"]
-COPY ["HeuristicLab.Optimization/3.3/", "HeuristicLab.Optimization/3.3/"]
-COPY ["HeuristicLab.Data/3.3/", "HeuristicLab.Data/3.3/"]
-COPY ["HeuristicLab.Parameters/3.3/", "HeuristicLab.Parameters/3.3/"]
-COPY ["HeuristicLab.Operators/3.3/", "HeuristicLab.Operators/3.3/"]
-RUN dotnet restore "HeuristicLab/3.3/HeuristicLab-3.3.csproj"
-WORKDIR "/src/HeuristicLab/3.3"
-RUN dotnet build "HeuristicLab-3.3.csproj" -c Release -o /app
-
-FROM build AS publish
-RUN dotnet publish "HeuristicLab-3.3.csproj" -c Release -o /app
-
-FROM base AS final
-WORKDIR /app
-COPY --from=publish /app .
-ENTRYPOINT ["dotnet", "HeuristicLab-3.3.dll"]
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj	(revision 17013)
@@ -22,4 +22,5 @@
 
   <ItemGroup>
+    <PackageReference Include="Google.Protobuf" Version="3.6.1" />
     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.7.9" />
   </ItemGroup>
@@ -31,3 +32,15 @@
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj" />
   </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="HEAL.Attic">
+      <HintPath>..\..\bin\HEAL.Attic.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="$(SolutionDir)\HeuristicLab\3.3\DockerWindowsBuild\**" CopyToOutputDirectory="Always" LinkBase="DockerWindowsBuild\" />
+    <None Include="$(SolutionDir)\HeuristicLab\3.3\DockerLinuxBuild\**" CopyToOutputDirectory="Always" LinkBase="DockerLinuxBuild\" />
+  </ItemGroup>
+
 </Project>
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs	(revision 17013)
@@ -16,6 +16,6 @@
 
       if (Settings.Host != null) {
+        Settings.Host.QuietMode = false;
         Settings.Host.Run(new ApplicationRunner() {
-          QuietMode = false,
           AssembliesToLoad = Settings.assemblyInfos,
           StartApplication =
Index: branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs
===================================================================
--- branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs	(revision 17012)
+++ branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs	(revision 17013)
@@ -21,8 +21,7 @@
       if (Output != null && !Directory.Exists(Output))
         throw new DirectoryNotFoundException("Output directory does not exist!");
-
       if (Settings.Host != null) {
-        Settings.Host.Run(new ApplicationRunner() {
-          QuietMode = Quiet,
+        Settings.Host.QuietMode = Quiet;
+        IRunner runner = new ApplicationRunner() {
           AssembliesToLoad = Settings.assemblyInfos,
           StartApplication =
@@ -32,5 +31,6 @@
             ).Where(x => x.Name.Equals("CLIOptimize"))
              .First()
-        });
+        };
+        Settings.Host.Run(runner);
       }
     }
