Index: /branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIConsole.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIConsole.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab.CommandLineInterface/CLIConsole.cs	(revision 16998)
@@ -28,6 +28,6 @@
       WriteHeader(cmdData);
 
-      if(exception != null) WriteErrors(exception);
-      
+      if (exception != null) WriteErrors(exception);
+
       WriteSyntax(cmdData);
 
@@ -62,11 +62,11 @@
       Console.WriteLine($"ERROR(S):");
       AggregateException ae = exception as AggregateException;
-      if(ae != null) {
-        foreach(var e in ae.InnerExceptions) {
+      if (ae != null) {
+        foreach (var e in ae.InnerExceptions) {
           Console.WriteLine($"  -> {e} ");
         }
       } else {
         Console.WriteLine($"  -> {exception}");
-      }      
+      }
       Console.WriteLine();
     }
@@ -94,13 +94,14 @@
       WriteBoxSeparatorLine();
       foreach (OptionData opt in cmdData.Options)
-        WriteBoxLine(
-          ((opt.Shortcut != null) ?
-            $"{(OptionData.ShortcutPrefix + opt.Shortcut).ToLower() + ",",-ShortcutWidth}" :
-            $""
-          ) +
-          $"{(OptionData.LongformPrefix + opt.Identifier).ToLower()}",
-          opt.Property?.PropertyType.GetPrettyName(),
-          opt.Description
-        );
+        if (!opt.Hidden)
+          WriteBoxLine(
+            ((opt.Shortcut != null) ?
+              $"{(OptionData.ShortcutPrefix + opt.Shortcut).ToLower() + ",",-ShortcutWidth}" :
+              $""
+            ) +
+            $"{(OptionData.LongformPrefix + opt.Identifier).ToLower()}",
+            opt.Property?.PropertyType.GetPrettyName(),
+            opt.Description
+          );
       WriteBoxSeparatorLine();
     }
Index: /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/AppTest.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/AppTest.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/AppTest.cs	(revision 16998)
@@ -1,4 +1,5 @@
 ﻿using System;
 using System.IO;
+using System.Threading;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -8,29 +9,94 @@
 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) {
-      ContentManager.Initialize(new PersistenceContentManager());
-      IStorableContent content = ContentManager.Load(InputFilePath.ToString());
-      IExecutable exec = content as IExecutable;
-      if (exec != null) {
-        exec.Start();
-        IOptimizer optimizer = exec as IOptimizer;
-        if (optimizer != null) {
-          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}");
-            }
+      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}");
           }
         }
-        
-        ContentManager.Save((IStorableContent)exec, OutputPath.ToString() + Path.DirectorySeparatorChar + "result.hl", true);
-      } else throw new NotSupportedException("The given file does not contain any algorithm to start.");
+      }
     }
+    #endregion
   }
 }
Index: /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab.DynamicAssemblyTestApp/InspectApplication.cs	(revision 16998)
@@ -7,6 +7,14 @@
 namespace HeuristicLab.DynamicAssemblyTestApp {
   [Serializable]
+  [Application("CLIInspect", "")]
   public class InspectApplication : ApplicationBase {
     public UniPath InputFilePath { get; set; }
+
+    public InspectApplication() { }
+
+    public InspectApplication(UniPath inputFilePath) {
+      InputFilePath = inputFilePath;
+    }
+
     public override void Run(ICommandLineArgument[] args) {
       ContentManager.Initialize(new PersistenceContentManager());
Index: /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/ApplicationCommand.cs	(revision 16998)
@@ -1,4 +1,3 @@
 ﻿using System;
-using System.Collections.Generic;
 using System.IO;
 using HeuristicLab.CommandLineInterface;
@@ -12,5 +11,5 @@
   }
 
-  [HeuristicLab.CommandLineInterface.Application(
+  [CommandLineInterface.Application(
     "HL", "1.0.0.0",
     SubCommands = new Type[] {
@@ -32,10 +31,9 @@
 
     public void Execute() {
-      if(StartAsRunnerHost) {
+      if (StartAsRunnerHost) {
         StartupRunnerHost();
       } else {
         SetupIsolation();
       }
-      
     }
 
@@ -48,5 +46,4 @@
       else
         Console.Error.WriteLine("Cannot deserialize data from stdin to a type of RunnerConfig!");
-
     }
 
Index: /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/Dockerfile
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/Dockerfile	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/Dockerfile	(revision 16998)
@@ -1,27 +1,22 @@
-#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
-#For more information, please see https://aka.ms/containercompat
-
-FROM mcr.microsoft.com/dotnet/core/runtime:3.0-nanoserver-1809 AS base
+FROM mcr.microsoft.com/dotnet/core/runtime:3.0-buster-slim AS base
 WORKDIR /app
 
-FROM mcr.microsoft.com/dotnet/core/sdk:3.0-nanoserver-1809 AS build
+FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
 WORKDIR /src
-COPY ["HeuristicLab/3.3/HeuristicLab-3.3.csproj", "HeuristicLab/3.3/"]
-COPY ["HeuristicLab.CommandLineInterface/HeuristicLab.CommandLineInterface.csproj", "HeuristicLab.CommandLineInterface/"]
-COPY ["HeuristicLab.Common/3.3/HeuristicLab.Common-3.3.csproj", "HeuristicLab.Common/3.3/"]
-COPY ["HeuristicLab.PluginInfrastructure/3.3/HeuristicLab.PluginInfrastructure-3.3.csproj", "HeuristicLab.PluginInfrastructure/3.3/"]
-COPY ["HeuristicLab.DefinitionLanguage/HeuristicLab.DefinitionLanguage.csproj", "HeuristicLab.DefinitionLanguage/"]
-COPY ["HeuristicLab.Core/3.3/HeuristicLab.Core-3.3.csproj", "HeuristicLab.Core/3.3/"]
-COPY ["HeuristicLab.Persistence/3.3/HeuristicLab.Persistence-3.3.csproj", "HeuristicLab.Persistence/3.3/"]
-COPY ["HeuristicLab.Tracing/3.3/HeuristicLab.Tracing-3.3.csproj", "HeuristicLab.Tracing/3.3/"]
-COPY ["HeuristicLab.Common.Resources/3.3/HeuristicLab.Common.Resources-3.3.csproj", "HeuristicLab.Common.Resources/3.3/"]
-COPY ["HeuristicLab.Collections/3.3/HeuristicLab.Collections-3.3.csproj", "HeuristicLab.Collections/3.3/"]
-COPY ["HeuristicLab.DynamicAssemblyTestApp/HeuristicLab.DynamicAssemblyTestApp.csproj", "HeuristicLab.DynamicAssemblyTestApp/"]
-COPY ["HeuristicLab.Optimization/3.3/HeuristicLab.Optimization-3.3.csproj", "HeuristicLab.Optimization/3.3/"]
-COPY ["HeuristicLab.Data/3.3/HeuristicLab.Data-3.3.csproj", "HeuristicLab.Data/3.3/"]
-COPY ["HeuristicLab.Parameters/3.3/HeuristicLab.Parameters-3.3.csproj", "HeuristicLab.Parameters/3.3/"]
-COPY ["HeuristicLab.Operators/3.3/HeuristicLab.Operators-3.3.csproj", "HeuristicLab.Operators/3.3/"]
+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"
-COPY . .
 WORKDIR "/src/HeuristicLab/3.3"
 RUN dotnet build "HeuristicLab-3.3.csproj" -c Release -o /app
Index: /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/HeuristicLab-3.3.csproj	(revision 16998)
@@ -4,6 +4,6 @@
     <OutputType>Exe</OutputType>
     <TargetFramework>netcoreapp3.0</TargetFramework>
-	  <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
-	  <DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
+    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
     <Copyright>(c) 2002-2018 HEAL</Copyright>
     <Product>HeuristicLab</Product>
@@ -13,4 +13,6 @@
     <AssemblyFileVersion>3.3.15.0</AssemblyFileVersion>
     <RootNamespace>HeuristicLab</RootNamespace>
+    <ApplicationIcon>HeuristicLab.ico</ApplicationIcon>
+    <ApplicationManifest>app.manifest</ApplicationManifest>
   </PropertyGroup>
 
@@ -23,9 +25,7 @@
   </ItemGroup>
 
-
   <ItemGroup>
     <ProjectReference Include="..\..\HeuristicLab.CommandLineInterface\HeuristicLab.CommandLineInterface.csproj" />
     <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj" />
-    <ProjectReference Include="..\..\HeuristicLab.DefinitionLanguage\HeuristicLab.DefinitionLanguage.csproj" />
     <ProjectReference Include="..\..\HeuristicLab.DynamicAssemblyTestApp\HeuristicLab.DynamicAssemblyTestApp.csproj" />
     <ProjectReference Include="..\..\HeuristicLab.PluginInfrastructure\3.3\HeuristicLab.PluginInfrastructure-3.3.csproj" />
Index: /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/InspectCommand.cs	(revision 16998)
@@ -1,7 +1,5 @@
-﻿using System;
-using System.Collections.Generic;
-using System.IO;
+﻿using System.IO;
+using System.Linq;
 using HeuristicLab.CommandLineInterface;
-using HeuristicLab.DynamicAssemblyTestApp;
 using HeuristicLab.PluginInfrastructure;
 
@@ -21,10 +19,11 @@
           QuietMode = false,
           AssembliesToLoad = Settings.assemblyInfos,
-          StartApplication = new InspectApplication() {
-            InputFilePath = new UniPath(Input)
-          }
+          StartApplication =
+            ApplicationManager.Manager.GetInstances<IApplication>(new UniPath(Input))
+            .Where(x => x.Name.Equals("CLIInspect"))
+            .First()
+
         });
       }
-      
     }
   }
Index: /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs
===================================================================
--- /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs	(revision 16997)
+++ /branches/2924_DotNetCoreMigration/HeuristicLab/3.3/OptimizeCommand.cs	(revision 16998)
@@ -1,6 +1,5 @@
-﻿using System.Collections.Generic;
-using System.IO;
+﻿using System.IO;
+using System.Linq;
 using HeuristicLab.CommandLineInterface;
-using HeuristicLab.DynamicAssemblyTestApp;
 using HeuristicLab.PluginInfrastructure;
 
@@ -27,8 +26,10 @@
           QuietMode = Quiet,
           AssembliesToLoad = Settings.assemblyInfos,
-          StartApplication = new AppTest() {
-            InputFilePath = new UniPath(Input),
-            OutputPath = new UniPath(Output ?? Input.Replace(Path.GetFileName(Input), ""))
-          }
+          StartApplication =
+            ApplicationManager.Manager.GetInstances<IApplication>(
+              new UniPath(Input),
+              new UniPath(Output ?? Input.Replace(Path.GetFileName(Input), ""))
+            ).Where(x => x.Name.Equals("CLIOptimize"))
+             .First()
         });
       }
Index: /branches/2924_DotNetCoreMigration/dockerImageBuild.ps1
===================================================================
--- /branches/2924_DotNetCoreMigration/dockerImageBuild.ps1	(revision 16998)
+++ /branches/2924_DotNetCoreMigration/dockerImageBuild.ps1	(revision 16998)
@@ -0,0 +1,1 @@
+docker image build -f .\HeuristicLab\3.3\Dockerfile -t heuristiclab33 .
