From d85fffac7138a91515805797e9b0032a1623bbe1 Mon Sep 17 00:00:00 2001
From: Jing Ling <lingjing0921@live.com>
Date: Sun, 28 Jan 2024 14:46:16 +0800
Subject: [PATCH] [AOT] Trim compatibility for project WorkflowCore

---
 Directory.Packages.props                      | 120 ++++++
 WorkflowCore.sln                              |   5 +-
 src/WorkflowCore.DSL/WorkflowCore.DSL.csproj  |  10 +-
 .../WorkflowCore.Testing.csproj               |   6 +-
 .../Interface/IContainerStepBuilder.cs        |  13 +-
 .../Interface/IParallelStepBuilder.cs         |   9 +-
 src/WorkflowCore/Interface/IStepBody.cs       |   4 +-
 src/WorkflowCore/Interface/IStepBuilder.cs    |  36 +-
 .../Interface/IStepOutcomeBuilder.cs          |  17 +-
 .../Interface/IWorkflowBuilder.cs             |  15 +-
 .../Interface/IWorkflowController.cs          |  19 +-
 .../Interface/IWorkflowModifier.cs            | 376 ++++++++++--------
 .../Interface/IWorkflowRegistry.cs            |   3 +
 src/WorkflowCore/Models/WorkflowDefinition.cs |  12 +-
 src/WorkflowCore/Models/WorkflowStep.cs       |  48 ++-
 .../Models/WorkflowStepCollection.cs          |   9 +-
 src/WorkflowCore/Primitives/Activity.cs       |  13 +-
 src/WorkflowCore/Primitives/EndStep.cs        |  12 +-
 src/WorkflowCore/Primitives/SagaContainer.cs  |  11 +-
 src/WorkflowCore/Primitives/WaitFor.cs        |   9 +-
 .../ServiceCollectionExtensions.cs            |  14 +-
 .../Services/ActivityController.cs            |  26 +-
 .../Services/BackgroundTasks/QueueConsumer.cs |  30 +-
 .../MemoryPersistenceProvider.cs              |   4 +-
 .../TransientMemoryPersistenceProvider.cs     |   1 +
 .../FluentBuilders/ParallelStepBuilder.cs     |  17 +-
 .../FluentBuilders/ReturnStepBuilder.cs       |  15 +-
 .../Services/FluentBuilders/StepBuilder.cs    |  45 ++-
 .../FluentBuilders/StepOutcomeBuilder.cs      |  15 +-
 .../FluentBuilders/WorkflowBuilder.cs         |  63 ++-
 .../Services/SyncWorkflowRunner.cs            |   2 +-
 .../Services/WorkflowController.cs            |  18 +-
 src/WorkflowCore/Services/WorkflowHost.cs     |  16 +-
 src/WorkflowCore/Services/WorkflowRegistry.cs |  25 +-
 src/WorkflowCore/WorkflowCore.csproj          |  39 +-
 .../WorkflowCore.Users.csproj                 |   4 +-
 .../Controllers/WorkflowsController.cs        |   2 +-
 .../WorkflowCore.WebAPI.csproj                |   8 +-
 .../SqlLockProvider.cs                        |   2 +-
 ...orkflowCore.LockProviders.SqlServer.csproj |   4 +-
 ...lowCore.Persistence.EntityFramework.csproj |  14 +-
 .../WorkflowCore.Persistence.MongoDB.csproj   |   8 +-
 .../WorkflowCore.Persistence.MySQL.csproj     |  24 +-
 ...WorkflowCore.Persistence.PostgreSQL.csproj |  23 +-
 .../ServiceCollectionExtensions.cs            |   4 +-
 .../Services/RavendbPersistenceProvider.cs    |  18 +-
 .../WorkflowCore.Persistence.RavenDB.csproj   |   6 +-
 .../WorkflowCore.Persistence.SqlServer.csproj |  21 +-
 .../WorkflowCore.Persistence.Sqlite.csproj    |  10 +-
 .../WorkflowCore.Providers.AWS.csproj         |  12 +-
 .../WorkflowCore.Providers.Azure.csproj       |  10 +-
 ...orkflowCore.Providers.Elasticsearch.csproj |   6 +-
 .../WorkflowCore.Providers.Redis.csproj       |   9 +-
 ...orkflowCore.QueueProviders.RabbitMQ.csproj |   6 +-
 ...rkflowCore.QueueProviders.SqlServer.csproj |  13 +-
 src/samples/Directory.Build.props             |  16 +-
 .../WorkflowCore.Sample01.csproj              |  12 +-
 .../SimpleDecisionWorkflow.cs                 |   1 +
 .../WorkflowCore.Sample02.csproj              |   4 +-
 .../WorkflowCore.Sample03/Steps/AddNumbers.cs |   7 +-
 .../WorkflowCore.Sample03.csproj              |   4 +-
 .../WorkflowCore.Sample04.csproj              |   6 +-
 .../WorkflowCore.Sample05.csproj              |   2 +-
 .../MultipleOutcomeWorkflow.cs                |   1 +
 .../WorkflowCore.Sample06.csproj              |   2 +-
 src/samples/WorkflowCore.Sample07/Startup.cs  |   9 +-
 .../WorkflowCore.Sample07.csproj              |   5 +-
 .../WorkflowCore.Sample08.csproj              |   2 +-
 .../WorkflowCore.Sample09.csproj              |   2 +-
 .../WorkflowCore.Sample09s.csproj             |   2 +-
 .../WorkflowCore.Sample10.csproj              |   2 +-
 .../WorkflowCore.Sample11.csproj              |   4 +-
 .../WorkflowCore.Sample12.csproj              |   2 +-
 .../WorkflowCore.Sample13.csproj              |   2 +-
 .../WorkflowCore.Sample15.csproj              |   4 +-
 .../WorkflowCore.Sample16.csproj              |   4 +-
 .../WorkflowCore.Sample18.csproj              |  10 +-
 .../WorkflowCore.Sample19.csproj              |  10 +-
 .../WorkflowCore.TestSample01/NUnitTest.cs    |   2 +-
 .../WorkflowCore.TestSample01.csproj          |  14 +-
 test/Directory.Build.props                    |  41 +-
 test/Docker.Testify/Docker.Testify.csproj     |   6 +-
 .../Scenarios/ActivityScenario.cs             |   9 +-
 .../Scenarios/ForkScenario.cs                 |  10 +-
 .../Scenarios/UserScenario.cs                 |   7 +-
 .../WorkflowCore.IntegrationTests.csproj      |   2 +-
 .../WorkflowCore.TestAssets.csproj            |   4 +-
 .../WorkflowCore.Tests.DynamoDB.csproj        |   2 +-
 .../WorkflowCore.Tests.Elasticsearch.csproj   |   2 +-
 .../Scenarios/MongoForkScenario.cs            |   1 +
 .../WorkflowCore.Tests.MongoDB.csproj         |   4 +-
 .../Scenarios/MysqlForkScenario.cs            |   1 +
 .../WorkflowCore.Tests.MySQL.csproj           |   3 +-
 .../Scenarios/PostgresForkScenario.cs         |   1 +
 .../WorkflowCore.Tests.PostgreSQL.csproj      |   2 +-
 ...wCore.Tests.QueueProviders.RabbitMQ.csproj |   2 +-
 .../WorkflowCore.Tests.Redis.csproj           |   4 +-
 .../WorkflowCore.Tests.SqlServer.csproj       |   2 +-
 .../BasePersistenceFixture.cs                 |  38 +-
 99 files changed, 949 insertions(+), 602 deletions(-)
 create mode 100644 Directory.Packages.props

diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 000000000..babad6bc2
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,120 @@
+<Project>
+  
+  <PropertyGroup>
+    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
+  </PropertyGroup>
+  
+  <!-- variables for managing package versions -->
+  <PropertyGroup>
+    <!-- Microsoft.EntityFrameworkCore.* -->
+    <EFCoreVersion Condition=" '$(TargetFramework)' == 'netstandard2.0' ">3.1.2</EFCoreVersion>
+    <EFCoreVersion Condition=" '$(TargetFramework)' == 'netstandard2.1' ">5.0.1</EFCoreVersion>
+    <EFCoreVersion Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">3.1.2</EFCoreVersion>
+    <EFCoreVersion Condition=" '$(TargetFramework)' == 'net6.0' ">6.0.0</EFCoreVersion>
+    <EFCoreVersion Condition=" '$(TargetFramework)' == 'net8.0' ">8.0.0</EFCoreVersion>
+    
+    <!-- Microsoft.Extensions.* -->
+    <MsExtsVersion Condition=" '$(TargetFramework)' == 'netstandard2.0' ">3.1.2</MsExtsVersion>
+    <MsExtsVersion Condition=" '$(TargetFramework)' == 'netstandard2.1' ">3.1.2</MsExtsVersion>
+    <MsExtsVersion Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">3.1.2</MsExtsVersion>
+    <MsExtsVersion Condition=" '$(TargetFramework)' == 'net6.0' ">6.0.0</MsExtsVersion>
+    <MsExtsVersion Condition=" '$(TargetFramework)' == 'net8.0' ">8.0.0</MsExtsVersion>
+  </PropertyGroup>
+  
+  <ItemGroup>
+    <PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="4.3.1" />
+    <PackageVersion Include="AWSSDK.DynamoDBv2" Version="3.7.3.11" />
+    <PackageVersion Include="AWSSDK.Kinesis" Version="3.7.1.32" />
+    <PackageVersion Include="AWSSDK.SQS" Version="3.7.2.33" />
+    <PackageVersion Include="coverlet.collector" Version="1.2.0" />
+    <PackageVersion Include="Docker.DotNet" Version="3.125.2" />
+    <PackageVersion Include="FakeItEasy" Version="8.1.0" />
+    <PackageVersion Include="FluentAssertions" Version="4.19.4" />
+    <PackageVersion Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
+    <PackageVersion Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="1.1.3" />
+    <PackageVersion Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
+    <PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
+    <PackageVersion Include="Microsoft.Azure.Cosmos" Version="3.19.0" />
+    <PackageVersion Include="Microsoft.Azure.DocumentDB" Version="2.11.6" />
+    <PackageVersion Include="Microsoft.Azure.ServiceBus" Version="5.0.0" />
+    <PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
+    <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(EFCoreVersion)" />
+    <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="$(EFCoreVersion)" />
+    <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(EFCoreVersion)" />
+    <PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(EFCoreVersion)" />
+    <PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="$(EFCoreVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="$(MsExtsVersion)" />
+    <PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="8.0.1" />
+    <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
+    <PackageVersion Include="MongoDB.Driver" Version="2.19.0" />
+    <PackageVersion Include="Moq" Version="4.20.70" />
+    <PackageVersion Include="MySqlConnector" Version="2.3.5" />
+    <PackageVersion Include="NEST" Version="7.14.1" />
+    <PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageVersion Include="NUnit" Version="3.9.0" />
+    <PackageVersion Include="NUnit3TestAdapter" Version="3.9.0" />
+    <PackageVersion Include="Polly" Version="7.2.1" />
+    <PackageVersion Include="RabbitMQ.Client" Version="4.1.3" />
+    <PackageVersion Include="RavenDB.Client" Version="5.1.2" />
+    <PackageVersion Include="RedLock.net" Version="2.2.0" />
+    <PackageVersion Include="SharpYaml" Version="1.6.5" />
+    <PackageVersion Include="StackExchange.Redis" Version="2.0.601" />
+    <PackageVersion Include="Squadron.Elasticsearch" Version="0.18.0" />
+    <PackageVersion Include="Squadron.Mongo" Version="0.18.0" />
+    <PackageVersion Include="Squadron.MySql" Version="0.18.0" />
+    <PackageVersion Include="Squadron.PostgreSql" Version="0.18.0" />
+    <PackageVersion Include="Squadron.Redis" Version="0.18.0" />
+    <PackageVersion Include="Squadron.SqlServer" Version="0.18.0" />
+    <PackageVersion Include="System.Data.Common" Version="4.3.0" />
+    <PackageVersion Include="System.Data.SqlClient" Version="4.8.5" />
+    <PackageVersion Include="System.Diagnostics.Process" Version="4.3.0" />
+    <PackageVersion Include="System.Linq.Dynamic.Core" Version="1.3.0" />
+    <PackageVersion Include="System.Net.NetworkInformation" Version="4.3.0" />
+    <PackageVersion Include="WindowsAzure.Storage" Version="9.3.3" />
+    <PackageVersion Include="xunit" Version="2.6.6" />
+    <PackageVersion Include="xunit.core" Version="2.6.6" />
+    <PackageVersion Include="xunit.runner.visualstudio" Version="2.4.1" />
+  </ItemGroup>
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.1" />
+    <PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />
+    <PackageVersion Include="System.Text.Json" Version="6.0.0" />
+    <PackageVersion Include="OpenTelemetry.Api" Version="1.7.0" />
+  </ItemGroup>
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.1" />
+    <PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />
+    <PackageVersion Include="System.Text.Json" Version="6.0.0" />
+    <PackageVersion Include="OpenTelemetry.Api" Version="1.3.1" />
+  </ItemGroup>
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.1" />
+    <PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />
+    <PackageVersion Include="System.Text.Json" Version="6.0.0" />
+    <PackageVersion Include="OpenTelemetry.Api" Version="1.7.0" />
+  </ItemGroup>
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.0" />
+    <PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
+    <PackageVersion Include="System.Text.Json" Version="6.0.0" />
+    <PackageVersion Include="OpenTelemetry.Api" Version="1.7.0" />
+  </ItemGroup>
+  
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
+    <PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
+    <PackageVersion Include="System.Text.Json" Version="8.0.0" />
+    <PackageVersion Include="OpenTelemetry.Api" Version="1.7.0" />
+  </ItemGroup>
+  
+</Project>
\ No newline at end of file
diff --git a/WorkflowCore.sln b/WorkflowCore.sln
index e7fb81a2e..e22210e7a 100644
--- a/WorkflowCore.sln
+++ b/WorkflowCore.sln
@@ -1,12 +1,13 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29509.3
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34518.117
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{EF47161E-E399-451C-BDE8-E92AAD3BD761}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F6AC9AEB-24EF-475A-B190-AA4D9E01270A}"
 	ProjectSection(SolutionItems) = preProject
+		Directory.Packages.props = Directory.Packages.props
 		README.md = README.md
 	EndProjectSection
 EndProject
diff --git a/src/WorkflowCore.DSL/WorkflowCore.DSL.csproj b/src/WorkflowCore.DSL/WorkflowCore.DSL.csproj
index 94765a53e..9fb38d853 100644
--- a/src/WorkflowCore.DSL/WorkflowCore.DSL.csproj
+++ b/src/WorkflowCore.DSL/WorkflowCore.DSL.csproj
@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net8.0</TargetFrameworks>
     <Description>DSL extenstion for Workflow Core provding support for JSON and YAML workflow definitions.</Description>
     <Authors>Daniel Gerlag</Authors>
     <Company />
@@ -9,9 +9,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="SharpYaml" Version="1.6.5" />
-    <PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.0" />
+    <PackageReference Include="Newtonsoft.Json" />
+    <PackageReference Include="SharpYaml" />
+    <PackageReference Include="System.Linq.Dynamic.Core" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/WorkflowCore.Testing/WorkflowCore.Testing.csproj b/src/WorkflowCore.Testing/WorkflowCore.Testing.csproj
index 6102c9892..274db77cb 100644
--- a/src/WorkflowCore.Testing/WorkflowCore.Testing.csproj
+++ b/src/WorkflowCore.Testing/WorkflowCore.Testing.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <Version>3.5.2</Version>
     <AssemblyVersion>3.5.2.0</AssemblyVersion>
     <FileVersion>3.5.2.0</FileVersion>
@@ -9,9 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/WorkflowCore/Interface/IContainerStepBuilder.cs b/src/WorkflowCore/Interface/IContainerStepBuilder.cs
index 1d52bf2c8..bed0d7cd7 100644
--- a/src/WorkflowCore/Interface/IContainerStepBuilder.cs
+++ b/src/WorkflowCore/Interface/IContainerStepBuilder.cs
@@ -1,8 +1,19 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 
 namespace WorkflowCore.Interface
 {
-    public interface IContainerStepBuilder<TData, TStepBody, TReturnStep>
+    public interface IContainerStepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TReturnStep>
         where TStepBody : IStepBody
         where TReturnStep : IStepBody
     {
diff --git a/src/WorkflowCore/Interface/IParallelStepBuilder.cs b/src/WorkflowCore/Interface/IParallelStepBuilder.cs
index 572058fc8..e217c63de 100644
--- a/src/WorkflowCore/Interface/IParallelStepBuilder.cs
+++ b/src/WorkflowCore/Interface/IParallelStepBuilder.cs
@@ -1,9 +1,16 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Primitives;
 
 namespace WorkflowCore.Interface
 {
-    public interface IParallelStepBuilder<TData, TStepBody>
+    public interface IParallelStepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody>
         where TStepBody : IStepBody
     {
         IParallelStepBuilder<TData, TStepBody> Do(Action<IWorkflowBuilder<TData>> builder);
diff --git a/src/WorkflowCore/Interface/IStepBody.cs b/src/WorkflowCore/Interface/IStepBody.cs
index cc786fd87..16252b7d9 100644
--- a/src/WorkflowCore/Interface/IStepBody.cs
+++ b/src/WorkflowCore/Interface/IStepBody.cs
@@ -4,7 +4,7 @@
 namespace WorkflowCore.Interface
 {
     public interface IStepBody
-    {        
-        Task<ExecutionResult> RunAsync(IStepExecutionContext context);        
+    {
+        Task<ExecutionResult> RunAsync(IStepExecutionContext context);
     }
 }
diff --git a/src/WorkflowCore/Interface/IStepBuilder.cs b/src/WorkflowCore/Interface/IStepBuilder.cs
index e20d585c5..94644a3ec 100644
--- a/src/WorkflowCore/Interface/IStepBuilder.cs
+++ b/src/WorkflowCore/Interface/IStepBuilder.cs
@@ -1,14 +1,20 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Linq.Expressions;
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Interface
 {
-    public interface IStepBuilder<TData, TStepBody> : IWorkflowModifier<TData, TStepBody>
+    public interface IStepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody> : IWorkflowModifier<TData, TStepBody>
         where TStepBody : IStepBody
     {
-
-        IWorkflowBuilder<TData> WorkflowBuilder { get; }        
+        IWorkflowBuilder<TData> WorkflowBuilder { get; }
 
         WorkflowStep<TStepBody> Step { get; set; }
 
@@ -46,14 +52,22 @@ public interface IStepBuilder<TData, TStepBody> : IWorkflowModifier<TData, TStep
         /// </summary>
         /// <param name="outcomeValue"></param>
         /// <returns></returns>
-        IStepBuilder<TData, TStepBody> Branch<TStep>(object outcomeValue, IStepBuilder<TData, TStep> branch) where TStep : IStepBody;
+        IStepBuilder<TData, TStepBody> Branch<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(object outcomeValue, IStepBuilder<TData, TStep> branch) where TStep : IStepBody;
 
         /// <summary>
         /// Configure an outcome branch for this step, then wire it to another step
         /// </summary>
         /// <param name="outcomeExpression"></param>
         /// <returns></returns>
-        IStepBuilder<TData, TStepBody> Branch<TStep>(Expression<Func<TData, object, bool>> outcomeExpression, IStepBuilder<TData, TStep> branch) where TStep : IStepBody;
+        IStepBuilder<TData, TStepBody> Branch<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Expression<Func<TData, object, bool>> outcomeExpression, IStepBuilder<TData, TStep> branch) where TStep : IStepBody;
 
         /// <summary>
         /// Map properties on the step to properties on the workflow data object before the step executes
@@ -97,7 +111,11 @@ public interface IStepBuilder<TData, TStepBody> : IWorkflowModifier<TData, TStep
         /// <returns></returns>
         IStepBuilder<TData, TStepBody> Output(Action<TStepBody, TData> action);
 
-        IStepBuilder<TData, TStep> End<TStep>(string name) where TStep : IStepBody;
+        IStepBuilder<TData, TStep> End<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(string name) where TStep : IStepBody;
 
         /// <summary>
         /// Configure the behavior when this step throws an unhandled exception
@@ -119,7 +137,11 @@ public interface IStepBuilder<TData, TStepBody> : IWorkflowModifier<TData, TStep
         /// <typeparam name="TStep">The type of the step to execute</typeparam>
         /// <param name="stepSetup">Configure additional parameters for this step</param>
         /// <returns></returns>
-        IStepBuilder<TData, TStepBody> CompensateWith<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
+        IStepBuilder<TData, TStepBody> CompensateWith<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
 
         /// <summary>
         /// Undo step if unhandled exception is thrown by this step
diff --git a/src/WorkflowCore/Interface/IStepOutcomeBuilder.cs b/src/WorkflowCore/Interface/IStepOutcomeBuilder.cs
index 0145ca1db..234ecf52f 100644
--- a/src/WorkflowCore/Interface/IStepOutcomeBuilder.cs
+++ b/src/WorkflowCore/Interface/IStepOutcomeBuilder.cs
@@ -1,18 +1,29 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Models;
 using WorkflowCore.Primitives;
 
 namespace WorkflowCore.Interface
-{   
+{
     public interface IStepOutcomeBuilder<TData>
     {
         IWorkflowBuilder<TData> WorkflowBuilder { get; }
 
         ValueOutcome Outcome { get; }
 
-        IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
+        IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
 
-        IStepBuilder<TData, TStep> Then<TStep>(IStepBuilder<TData, TStep> step) where TStep : IStepBody;
+        IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(IStepBuilder<TData, TStep> step) where TStep : IStepBody;
 
         IStepBuilder<TData, InlineStepBody> Then(Func<IStepExecutionContext, ExecutionResult> body);
 
diff --git a/src/WorkflowCore/Interface/IWorkflowBuilder.cs b/src/WorkflowCore/Interface/IWorkflowBuilder.cs
index b7b371882..6477e1475 100644
--- a/src/WorkflowCore/Interface/IWorkflowBuilder.cs
+++ b/src/WorkflowCore/Interface/IWorkflowBuilder.cs
@@ -1,4 +1,7 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Collections.Generic;
 using WorkflowCore.Models;
 using WorkflowCore.Primitives;
@@ -11,7 +14,11 @@ public interface IWorkflowBuilder
 
         int LastStep { get; }
 
-        IWorkflowBuilder<T> UseData<T>();
+        IWorkflowBuilder<T> UseData<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            T>();
 
         WorkflowDefinition Build(string id, int version);
 
@@ -22,7 +29,11 @@ public interface IWorkflowBuilder
 
     public interface IWorkflowBuilder<TData> : IWorkflowBuilder, IWorkflowModifier<TData, InlineStepBody>
     {
-        IStepBuilder<TData, TStep> StartWith<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
+        IStepBuilder<TData, TStep> StartWith<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
 
         IStepBuilder<TData, InlineStepBody> StartWith(Func<IStepExecutionContext, ExecutionResult> body);
 
diff --git a/src/WorkflowCore/Interface/IWorkflowController.cs b/src/WorkflowCore/Interface/IWorkflowController.cs
index 924925d2c..fb4cba296 100644
--- a/src/WorkflowCore/Interface/IWorkflowController.cs
+++ b/src/WorkflowCore/Interface/IWorkflowController.cs
@@ -1,5 +1,9 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
 
 namespace WorkflowCore.Interface
 {
@@ -11,8 +15,16 @@ public interface IWorkflowController
         Task<string> StartWorkflow<TData>(string workflowId, int? version, TData data = null, string reference=null) where TData : class, new();
 
         Task PublishEvent(string eventName, string eventKey, object eventData, DateTime? effectiveDate = null);
-        void RegisterWorkflow<TWorkflow>() where TWorkflow : IWorkflow;
-        void RegisterWorkflow<TWorkflow, TData>() where TWorkflow : IWorkflow<TData> where TData : new();
+        void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow>() where TWorkflow : IWorkflow;
+        void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow, TData>() where TWorkflow : IWorkflow<TData> where TData : new();
 
         /// <summary>
         /// Suspend the execution of a given workflow until .ResumeWorkflow is called
@@ -29,11 +41,10 @@ public interface IWorkflowController
         Task<bool> ResumeWorkflow(string workflowId);
 
         /// <summary>
-        /// Permanently terminate the exeuction of a given workflow
+        /// Permanently terminate the execution of a given workflow
         /// </summary>
         /// <param name="workflowId"></param>
         /// <returns></returns>
         Task<bool> TerminateWorkflow(string workflowId);
-
     }
 }
diff --git a/src/WorkflowCore/Interface/IWorkflowModifier.cs b/src/WorkflowCore/Interface/IWorkflowModifier.cs
index 835855e97..4deee79fe 100644
--- a/src/WorkflowCore/Interface/IWorkflowModifier.cs
+++ b/src/WorkflowCore/Interface/IWorkflowModifier.cs
@@ -1,4 +1,7 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Collections;
 using System.Linq.Expressions;
 using WorkflowCore.Models;
@@ -6,182 +9,207 @@
 
 namespace WorkflowCore.Interface
 {
-    public interface IWorkflowModifier<TData, TStepBody>
+    public interface IWorkflowModifier<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody>
         where TStepBody : IStepBody
 
     {
-    /// <summary>
-    /// Specify the next step in the workflow
-    /// </summary>
-    /// <typeparam name="TStep">The type of the step to execute</typeparam>
-    /// <param name="stepSetup">Configure additional parameters for this step</param>
-    /// <returns></returns>
-    IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
-
-    /// <summary>
-    /// Specify the next step in the workflow
-    /// </summary>
-    /// <typeparam name="TStep"></typeparam>
-    /// <param name="newStep"></param>
-    /// <returns></returns>
-    IStepBuilder<TData, TStep> Then<TStep>(IStepBuilder<TData, TStep> newStep) where TStep : IStepBody;
-
-    /// <summary>
-    /// Specify an inline next step in the workflow
-    /// </summary>
-    /// <param name="body"></param>
-    /// <returns></returns>
-    IStepBuilder<TData, InlineStepBody> Then(Func<IStepExecutionContext, ExecutionResult> body);
-
-    /// <summary>
-    /// Specify an inline next step in the workflow
-    /// </summary>
-    /// <param name="body"></param>
-    /// <returns></returns>
-    IStepBuilder<TData, ActionStepBody> Then(Action<IStepExecutionContext> body);
-
-    /// <summary>
-    /// Wait here until to specified event is published
-    /// </summary>
-    /// <param name="eventName">The name used to identify the kind of event to wait for</param>
-    /// <param name="eventKey">A specific key value within the context of the event to wait for</param>
-    /// <param name="effectiveDate">Listen for events as of this effective date</param>
-    /// <param name="cancelCondition">A conditon that when true will cancel this WaitFor</param>
-    /// <returns></returns>
-    IStepBuilder<TData, WaitFor> WaitFor(string eventName, Expression<Func<TData, string>> eventKey,
-        Expression<Func<TData, DateTime>> effectiveDate = null, Expression<Func<TData, bool>> cancelCondition = null);
-
-    /// <summary>
-    /// Wait here until to specified event is published
-    /// </summary>
-    /// <param name="eventName">The name used to identify the kind of event to wait for</param>
-    /// <param name="eventKey">A specific key value within the context of the event to wait for</param>
-    /// <param name="effectiveDate">Listen for events as of this effective date</param>
-    /// <param name="cancelCondition">A conditon that when true will cancel this WaitFor</param>
-    /// <returns></returns>
-    IStepBuilder<TData, WaitFor> WaitFor(string eventName,
-        Expression<Func<TData, IStepExecutionContext, string>> eventKey,
-        Expression<Func<TData, DateTime>> effectiveDate = null, Expression<Func<TData, bool>> cancelCondition = null);
-
-    /// <summary>
-    /// Wait for a specified period
-    /// </summary>
-    /// <param name="period"></param>
-    /// <returns></returns>
-    IStepBuilder<TData, Delay> Delay(Expression<Func<TData, TimeSpan>> period);
-
-    /// <summary>
-    /// Evaluate an expression and take a different path depending on the value
-    /// </summary>
-    /// <param name="expression">Expression to evaluate for decision</param>
-    /// <returns></returns>
-    IStepBuilder<TData, Decide> Decide(Expression<Func<TData, object>> expression);
-
-    /// <summary>
-    /// Execute a block of steps, once for each item in a collection in a parallel foreach
-    /// </summary>
-    /// <param name="collection">Resolves a collection for iterate over</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IEnumerable>> collection);
-
-    /// <summary>
-    /// Execute a block of steps, once for each item in a collection in a RunParallel foreach
-    /// </summary>
-    /// <param name="collection">Resolves a collection for iterate over</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IEnumerable>> collection, Expression<Func<TData, bool>> runParallel);
-
-    /// <summary>
-    /// Execute a block of steps, once for each item in a collection in a RunParallel foreach
-    /// </summary>
-    /// <param name="collection">Resolves a collection for iterate over</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IStepExecutionContext, IEnumerable>> collection, Expression<Func<TData, bool>> runParallel);
-
-    /// <summary>
-    /// Repeat a block of steps until a condition becomes true
-    /// </summary>
-    /// <param name="condition">Resolves a condition to break out of the while loop</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, While, While> While(Expression<Func<TData, bool>> condition);
-
-    /// <summary>
-    /// Repeat a block of steps until a condition becomes true
-    /// </summary>
-    /// <param name="condition">Resolves a condition to break out of the while loop</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, While, While> While(Expression<Func<TData, IStepExecutionContext, bool>> condition);
-
-    /// <summary>
-    /// Execute a block of steps if a condition is true
-    /// </summary>
-    /// <param name="condition">Resolves a condition to evaluate</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, If, If> If(Expression<Func<TData, bool>> condition);
-
-    /// <summary>
-    /// Execute a block of steps if a condition is true
-    /// </summary>
-    /// <param name="condition">Resolves a condition to evaluate</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, If, If> If(Expression<Func<TData, IStepExecutionContext, bool>> condition);
-
-    /// <summary>
-    /// Configure an outcome for this step, then wire it to a sequence
-    /// </summary>
-    /// <param name="outcomeValue"></param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, When, OutcomeSwitch> When(Expression<Func<TData, object>> outcomeValue,
-        string label = null);
-
-    /// <summary>
-    /// Execute multiple blocks of steps in parallel
-    /// </summary>
-    /// <returns></returns>
-    IParallelStepBuilder<TData, Sequence> Parallel();
-
-    /// <summary>
-    /// Execute a sequence of steps in a container
-    /// </summary>
-    /// <returns></returns>
-    IStepBuilder<TData, Sequence> Saga(Action<IWorkflowBuilder<TData>> builder);
-
-    /// <summary>
-    /// Schedule a block of steps to execute in parallel sometime in the future
-    /// </summary>
-    /// <param name="time">The time span to wait before executing the block</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, Schedule, TStepBody> Schedule(Expression<Func<TData, TimeSpan>> time);
-
-    /// <summary>
-    /// Schedule a block of steps to execute in parallel sometime in the future at a recurring interval
-    /// </summary>
-    /// <param name="interval">The time span to wait between recurring executions</param>
-    /// <param name="until">Resolves a condition to stop the recurring task</param>
-    /// <returns></returns>
-    IContainerStepBuilder<TData, Recur, TStepBody> Recur(Expression<Func<TData, TimeSpan>> interval,
-        Expression<Func<TData, bool>> until);
-
-    /// <summary>
-    /// Wait here until an external activity is complete
-    /// </summary>
-    /// <param name="activityName">The name used to identify the activity to wait for</param>
-    /// <param name="parameters">The data to pass the external activity worker</param>
-    /// <param name="effectiveDate">Listen for events as of this effective date</param>
-    /// <param name="cancelCondition">A conditon that when true will cancel this WaitFor</param>
-    /// <returns></returns>
-    IStepBuilder<TData, Activity> Activity(string activityName, Expression<Func<TData, object>> parameters = null,
-        Expression<Func<TData, DateTime>> effectiveDate = null, Expression<Func<TData, bool>> cancelCondition = null);
-
-    /// <summary>
-    /// Wait here until an external activity is complete
-    /// </summary>
-    /// <param name="activityName">The name used to identify the activity to wait for</param>
-    /// <param name="parameters">The data to pass the external activity worker</param>
-    /// <param name="effectiveDate">Listen for events as of this effective date</param>
-    /// <param name="cancelCondition">A conditon that when true will cancel this WaitFor</param>
-    /// <returns></returns>
-    IStepBuilder<TData, Activity> Activity(Expression<Func<TData, IStepExecutionContext, string>> activityName, Expression<Func<TData, object>> parameters = null,
-        Expression<Func<TData, DateTime>> effectiveDate = null, Expression<Func<TData, bool>> cancelCondition = null);
+        /// <summary>
+        /// Specify the next step in the workflow
+        /// </summary>
+        /// <typeparam name="TStep">The type of the step to execute</typeparam>
+        /// <param name="stepSetup">Configure additional parameters for this step</param>
+        /// <returns></returns>
+        IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody;
+
+        /// <summary>
+        /// Specify the next step in the workflow
+        /// </summary>
+        /// <typeparam name="TStep"></typeparam>
+        /// <param name="newStep"></param>
+        /// <returns></returns>
+        IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(IStepBuilder<TData, TStep> newStep) where TStep : IStepBody;
+
+        /// <summary>
+        /// Specify an inline next step in the workflow
+        /// </summary>
+        /// <param name="body"></param>
+        /// <returns></returns>
+        IStepBuilder<TData, InlineStepBody> Then(Func<IStepExecutionContext, ExecutionResult> body);
+
+        /// <summary>
+        /// Specify an inline next step in the workflow
+        /// </summary>
+        /// <param name="body"></param>
+        /// <returns></returns>
+        IStepBuilder<TData, ActionStepBody> Then(Action<IStepExecutionContext> body);
+
+        /// <summary>
+        /// Wait here until to specified event is published
+        /// </summary>
+        /// <param name="eventName">The name used to identify the kind of event to wait for</param>
+        /// <param name="eventKey">A specific key value within the context of the event to wait for</param>
+        /// <param name="effectiveDate">Listen for events as of this effective date</param>
+        /// <param name="cancelCondition">A condition that when true will cancel this WaitFor</param>
+        /// <returns></returns>
+        IStepBuilder<TData, WaitFor> WaitFor(
+            string eventName, Expression<Func<TData, string>> eventKey,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
+            Expression<Func<TData, bool>> cancelCondition = null);
+
+        /// <summary>
+        /// Wait here until to specified event is published
+        /// </summary>
+        /// <param name="eventName">The name used to identify the kind of event to wait for</param>
+        /// <param name="eventKey">A specific key value within the context of the event to wait for</param>
+        /// <param name="effectiveDate">Listen for events as of this effective date</param>
+        /// <param name="cancelCondition">A condition that when true will cancel this WaitFor</param>
+        /// <returns></returns>
+        IStepBuilder<TData, WaitFor> WaitFor(string eventName,
+            Expression<Func<TData, IStepExecutionContext, string>> eventKey,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
+            Expression<Func<TData, bool>> cancelCondition = null);
+
+        /// <summary>
+        /// Wait for a specified period
+        /// </summary>
+        /// <param name="period"></param>
+        /// <returns></returns>
+        IStepBuilder<TData, Delay> Delay(Expression<Func<TData, TimeSpan>> period);
+
+        /// <summary>
+        /// Evaluate an expression and take a different path depending on the value
+        /// </summary>
+        /// <param name="expression">Expression to evaluate for decision</param>
+        /// <returns></returns>
+        IStepBuilder<TData, Decide> Decide(Expression<Func<TData, object>> expression);
+
+        /// <summary>
+        /// Execute a block of steps, once for each item in a collection in a parallel foreach
+        /// </summary>
+        /// <param name="collection">Resolves a collection for iterate over</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IEnumerable>> collection);
+
+        /// <summary>
+        /// Execute a block of steps, once for each item in a collection in a RunParallel foreach
+        /// </summary>
+        /// <param name="collection">Resolves a collection for iterate over</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, Foreach, Foreach> ForEach(
+            Expression<Func<TData, IEnumerable>> collection,
+            Expression<Func<TData, bool>> runParallel);
+
+        /// <summary>
+        /// Execute a block of steps, once for each item in a collection in a RunParallel foreach
+        /// </summary>
+        /// <param name="collection">Resolves a collection for iterate over</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, Foreach, Foreach> ForEach(
+            Expression<Func<TData, IStepExecutionContext, IEnumerable>> collection,
+            Expression<Func<TData, bool>> runParallel);
+
+        /// <summary>
+        /// Repeat a block of steps until a condition becomes true
+        /// </summary>
+        /// <param name="condition">Resolves a condition to break out of the while loop</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, While, While> While(Expression<Func<TData, bool>> condition);
+
+        /// <summary>
+        /// Repeat a block of steps until a condition becomes true
+        /// </summary>
+        /// <param name="condition">Resolves a condition to break out of the while loop</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, While, While> While(Expression<Func<TData, IStepExecutionContext, bool>> condition);
+
+        /// <summary>
+        /// Execute a block of steps if a condition is true
+        /// </summary>
+        /// <param name="condition">Resolves a condition to evaluate</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, If, If> If(Expression<Func<TData, bool>> condition);
+
+        /// <summary>
+        /// Execute a block of steps if a condition is true
+        /// </summary>
+        /// <param name="condition">Resolves a condition to evaluate</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, If, If> If(Expression<Func<TData, IStepExecutionContext, bool>> condition);
+
+        /// <summary>
+        /// Configure an outcome for this step, then wire it to a sequence
+        /// </summary>
+        /// <param name="outcomeValue"></param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, When, OutcomeSwitch> When(Expression<Func<TData, object>> outcomeValue, string label = null);
+
+        /// <summary>
+        /// Execute multiple blocks of steps in parallel
+        /// </summary>
+        /// <returns></returns>
+        IParallelStepBuilder<TData, Sequence> Parallel();
+
+        /// <summary>
+        /// Execute a sequence of steps in a container
+        /// </summary>
+        /// <returns></returns>
+        IStepBuilder<TData, Sequence> Saga(Action<IWorkflowBuilder<TData>> builder);
+
+        /// <summary>
+        /// Schedule a block of steps to execute in parallel sometime in the future
+        /// </summary>
+        /// <param name="time">The time span to wait before executing the block</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, Schedule, TStepBody> Schedule(Expression<Func<TData, TimeSpan>> time);
+
+        /// <summary>
+        /// Schedule a block of steps to execute in parallel sometime in the future at a recurring interval
+        /// </summary>
+        /// <param name="interval">The time span to wait between recurring executions</param>
+        /// <param name="until">Resolves a condition to stop the recurring task</param>
+        /// <returns></returns>
+        IContainerStepBuilder<TData, Recur, TStepBody> Recur(
+            Expression<Func<TData, TimeSpan>> interval,
+            Expression<Func<TData, bool>> until);
+
+        /// <summary>
+        /// Wait here until an external activity is complete
+        /// </summary>
+        /// <param name="activityName">The name used to identify the activity to wait for</param>
+        /// <param name="parameters">The data to pass the external activity worker</param>
+        /// <param name="effectiveDate">Listen for events as of this effective date</param>
+        /// <param name="cancelCondition">A condition that when true will cancel this WaitFor</param>
+        /// <returns></returns>
+        IStepBuilder<TData, Activity> Activity(
+            string activityName,
+            Expression<Func<TData, object>> parameters = null,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
+            Expression<Func<TData, bool>> cancelCondition = null);
+
+        /// <summary>
+        /// Wait here until an external activity is complete
+        /// </summary>
+        /// <param name="activityName">The name used to identify the activity to wait for</param>
+        /// <param name="parameters">The data to pass the external activity worker</param>
+        /// <param name="effectiveDate">Listen for events as of this effective date</param>
+        /// <param name="cancelCondition">A condition that when true will cancel this WaitFor</param>
+        /// <returns></returns>
+        IStepBuilder<TData, Activity> Activity(
+            Expression<Func<TData, IStepExecutionContext, string>> activityName,
+            Expression<Func<TData, object>> parameters = null,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
+            Expression<Func<TData, bool>> cancelCondition = null);
     }
 }
\ No newline at end of file
diff --git a/src/WorkflowCore/Interface/IWorkflowRegistry.cs b/src/WorkflowCore/Interface/IWorkflowRegistry.cs
index 40143e3c1..06d4fc2e6 100644
--- a/src/WorkflowCore/Interface/IWorkflowRegistry.cs
+++ b/src/WorkflowCore/Interface/IWorkflowRegistry.cs
@@ -1,4 +1,7 @@
 using System.Collections.Generic;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Interface
diff --git a/src/WorkflowCore/Models/WorkflowDefinition.cs b/src/WorkflowCore/Models/WorkflowDefinition.cs
index d40fc5a2e..0cf99469f 100644
--- a/src/WorkflowCore/Models/WorkflowDefinition.cs
+++ b/src/WorkflowCore/Models/WorkflowDefinition.cs
@@ -1,5 +1,8 @@
 using System;
-
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json.Serialization;
+#endif
 
 namespace WorkflowCore.Models
 {
@@ -13,6 +16,9 @@ public class WorkflowDefinition
 
         public WorkflowStepCollection Steps { get; set; } = new WorkflowStepCollection();
 
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
         public Type DataType { get; set; }
 
         public WorkflowErrorHandling DefaultErrorBehavior { get; set; }
@@ -21,9 +27,11 @@ public class WorkflowDefinition
         public Type OnExecuteMiddlewareError { get; set; }
 
         public TimeSpan? DefaultErrorRetryInterval { get; set; }
-
     }
 
+#if NET8_0_OR_GREATER
+    [JsonConverter(typeof(JsonStringEnumConverter<WorkflowErrorHandling>))]
+#endif
     public enum WorkflowErrorHandling
     {
         Retry = 0,
diff --git a/src/WorkflowCore/Models/WorkflowStep.cs b/src/WorkflowCore/Models/WorkflowStep.cs
index 814219916..f7a393268 100644
--- a/src/WorkflowCore/Models/WorkflowStep.cs
+++ b/src/WorkflowCore/Models/WorkflowStep.cs
@@ -1,12 +1,19 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Collections.Generic;
 using System.Linq.Expressions;
+using System.Reflection;
 using WorkflowCore.Interface;
 
 namespace WorkflowCore.Models
 {
     public abstract class WorkflowStep
     {
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
         public abstract Type BodyType { get; }
 
         public virtual int Id { get; set; }
@@ -48,7 +55,7 @@ public virtual ExecutionPipelineDirective BeforeExecute(WorkflowExecutorResult e
         }
 
         public virtual void AfterExecute(WorkflowExecutorResult executorResult, IStepExecutionContext context, ExecutionResult stepResult, ExecutionPointer executionPointer)
-        {            
+        {
         }
 
         public virtual void PrimeForRetry(ExecutionPointer pointer)
@@ -57,40 +64,45 @@ public virtual void PrimeForRetry(ExecutionPointer pointer)
 
         /// <summary>
         /// Called after every workflow execution round,
-        /// every exectuon pointer with no end time, even if this step was not executed in this round
+        /// every execution pointer with no end time, even if this step was not executed in this round
         /// </summary>
         /// <param name="executorResult"></param>
-        /// <param name="defintion"></param>
+        /// <param name="definition"></param>
         /// <param name="workflow"></param>
         /// <param name="executionPointer"></param>
-        public virtual void AfterWorkflowIteration(WorkflowExecutorResult executorResult, WorkflowDefinition defintion, WorkflowInstance workflow, ExecutionPointer executionPointer)
+        public virtual void AfterWorkflowIteration(WorkflowExecutorResult executorResult, WorkflowDefinition definition, WorkflowInstance workflow, ExecutionPointer executionPointer)
         {
-            
         }
 
         public virtual IStepBody ConstructBody(IServiceProvider serviceProvider)
         {
-            IStepBody body = (serviceProvider.GetService(BodyType) as IStepBody);
-            if (body == null)
+            if (serviceProvider.GetService(BodyType) is IStepBody body)
             {
-                var stepCtor = BodyType.GetConstructor(new Type[] { });
-                if (stepCtor != null)
-                    body = (stepCtor.Invoke(null) as IStepBody);
+                return body;
             }
-            return body;
+
+            var stepCtor = BodyType.GetConstructor(Array.Empty<Type>());
+            return stepCtor != null ? stepCtor.Invoke(Array.Empty<object>()) as IStepBody : null;
         }
     }
 
-    public class WorkflowStep<TStepBody> : WorkflowStep
-        where TStepBody : IStepBody 
+    public class WorkflowStep<
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody> : WorkflowStep
+        where TStepBody : IStepBody
     {
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
         public override Type BodyType => typeof(TStepBody);
     }
 
-	public enum ExecutionPipelineDirective 
-    { 
-        Next = 0, 
-        Defer = 1, 
-        EndWorkflow = 2 
+    public enum ExecutionPipelineDirective
+    {
+        Next = 0,
+        Defer = 1,
+        EndWorkflow = 2
     }
 }
diff --git a/src/WorkflowCore/Models/WorkflowStepCollection.cs b/src/WorkflowCore/Models/WorkflowStepCollection.cs
index 68346620e..7eac7f019 100644
--- a/src/WorkflowCore/Models/WorkflowStepCollection.cs
+++ b/src/WorkflowCore/Models/WorkflowStepCollection.cs
@@ -8,7 +8,7 @@ namespace WorkflowCore.Models
     public class WorkflowStepCollection : ICollection<WorkflowStep>
     {
         private readonly Dictionary<int, WorkflowStep> _dictionary = new Dictionary<int, WorkflowStep>();
-        
+
         public WorkflowStepCollection()
         {
         }
@@ -38,12 +38,9 @@ IEnumerator IEnumerable.GetEnumerator()
 
         public WorkflowStep FindById(int id)
         {
-            if (!_dictionary.ContainsKey(id))
-                return null;
-
-            return _dictionary[id];
+            return !_dictionary.TryGetValue(id, out WorkflowStep value) ? null : value;
         }
-        
+
         public void Add(WorkflowStep item)
         {
             _dictionary.Add(item.Id, item);
diff --git a/src/WorkflowCore/Primitives/Activity.cs b/src/WorkflowCore/Primitives/Activity.cs
index 4f0ebb0c1..4302c8d90 100644
--- a/src/WorkflowCore/Primitives/Activity.cs
+++ b/src/WorkflowCore/Primitives/Activity.cs
@@ -8,25 +8,18 @@ namespace WorkflowCore.Primitives
     public class Activity : StepBody
     {
         public string ActivityName { get; set; }
-        
+
         public DateTime EffectiveDate { get; set; }
 
         public object Parameters { get; set; }
-        
+
         public object Result { get; set; }
 
         public override ExecutionResult Run(IStepExecutionContext context)
         {
             if (!context.ExecutionPointer.EventPublished)
             {
-                DateTime effectiveDate = DateTime.MinValue;
-
-                if (EffectiveDate != null)
-                {
-                    effectiveDate = EffectiveDate;
-                }
-
-                return ExecutionResult.WaitForActivity(ActivityName, Parameters, effectiveDate);
+                return ExecutionResult.WaitForActivity(ActivityName, Parameters, EffectiveDate);
             }
 
             if (context.ExecutionPointer.EventData is ActivityResult)
diff --git a/src/WorkflowCore/Primitives/EndStep.cs b/src/WorkflowCore/Primitives/EndStep.cs
index fbe53b39d..bef46277e 100644
--- a/src/WorkflowCore/Primitives/EndStep.cs
+++ b/src/WorkflowCore/Primitives/EndStep.cs
@@ -1,16 +1,22 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Primitives
 {
     public class EndStep : WorkflowStep
     {
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
         public override Type BodyType => null;
 
         public override ExecutionPipelineDirective InitForExecution(
-            WorkflowExecutorResult executorResult, 
-            WorkflowDefinition defintion, 
-            WorkflowInstance workflow, 
+            WorkflowExecutorResult executorResult,
+            WorkflowDefinition definition,
+            WorkflowInstance workflow,
             ExecutionPointer executionPointer)
         {
             return ExecutionPipelineDirective.EndWorkflow;
diff --git a/src/WorkflowCore/Primitives/SagaContainer.cs b/src/WorkflowCore/Primitives/SagaContainer.cs
index 93470cdbb..aa4fcd85f 100644
--- a/src/WorkflowCore/Primitives/SagaContainer.cs
+++ b/src/WorkflowCore/Primitives/SagaContainer.cs
@@ -1,9 +1,16 @@
-using WorkflowCore.Interface;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
+using WorkflowCore.Interface;
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Primitives
 {
-    public class SagaContainer<TStepBody> : WorkflowStep<TStepBody>
+    public class SagaContainer<
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody> : WorkflowStep<TStepBody>
         where TStepBody : IStepBody
     {
         public override bool ResumeChildrenAfterCompensation => false;
diff --git a/src/WorkflowCore/Primitives/WaitFor.cs b/src/WorkflowCore/Primitives/WaitFor.cs
index 7f84be2cd..01d4d3f21 100644
--- a/src/WorkflowCore/Primitives/WaitFor.cs
+++ b/src/WorkflowCore/Primitives/WaitFor.cs
@@ -18,14 +18,7 @@ public override ExecutionResult Run(IStepExecutionContext context)
         {
             if (!context.ExecutionPointer.EventPublished)
             {
-                DateTime effectiveDate = DateTime.MinValue;
-
-                if (EffectiveDate != null)
-                {
-                    effectiveDate = EffectiveDate;
-                }
-
-                return ExecutionResult.WaitForEvent(EventName, EventKey, effectiveDate);
+                return ExecutionResult.WaitForEvent(EventName, EventKey, EffectiveDate);
             }
 
             EventData = context.ExecutionPointer.EventData;
diff --git a/src/WorkflowCore/ServiceCollectionExtensions.cs b/src/WorkflowCore/ServiceCollectionExtensions.cs
index 760a89d41..1c9b07331 100644
--- a/src/WorkflowCore/ServiceCollectionExtensions.cs
+++ b/src/WorkflowCore/ServiceCollectionExtensions.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using WorkflowCore.Interface;
 using WorkflowCore.Services;
@@ -93,7 +94,11 @@ public static IServiceCollection AddWorkflow(this IServiceCollection services, A
         /// <typeparam name="TMiddleware">The type of middleware.
         /// It must implement <see cref="IWorkflowStepMiddleware"/>.</typeparam>
         /// <returns>The services collection for chaining.</returns>
-        public static IServiceCollection AddWorkflowStepMiddleware<TMiddleware>(
+        public static IServiceCollection AddWorkflowStepMiddleware<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TMiddleware>(
             this IServiceCollection services,
             Func<IServiceProvider, TMiddleware> factory = null)
             where TMiddleware : class, IWorkflowStepMiddleware =>
@@ -111,7 +116,11 @@ public static IServiceCollection AddWorkflowStepMiddleware<TMiddleware>(
         /// <typeparam name="TMiddleware">The type of middleware.
         /// It must implement <see cref="IWorkflowMiddleware"/>.</typeparam>
         /// <returns>The services collection for chaining.</returns>
-        public static IServiceCollection AddWorkflowMiddleware<TMiddleware>(
+        public static IServiceCollection AddWorkflowMiddleware<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TMiddleware>(
             this IServiceCollection services,
             Func<IServiceProvider, TMiddleware> factory = null)
             where TMiddleware : class, IWorkflowMiddleware =>
@@ -120,4 +129,3 @@ public static IServiceCollection AddWorkflowMiddleware<TMiddleware>(
                     : services.AddTransient<IWorkflowMiddleware, TMiddleware>(factory);
     }
 }
-
diff --git a/src/WorkflowCore/Services/ActivityController.cs b/src/WorkflowCore/Services/ActivityController.cs
index e37481521..8cd4c9c52 100644
--- a/src/WorkflowCore/Services/ActivityController.cs
+++ b/src/WorkflowCore/Services/ActivityController.cs
@@ -1,16 +1,18 @@
 using System;
 using System.Linq;
 using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Text.Json.Serialization.Metadata;
 using System.Threading;
 using System.Threading.Tasks;
-using Newtonsoft.Json;
 using WorkflowCore.Exceptions;
 using WorkflowCore.Interface;
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Services
 {
-    public class ActivityController : IActivityController
+    public partial class ActivityController : IActivityController
     {
         private readonly ISubscriptionRepository _subscriptionRepository;
         private readonly IDistributedLockProvider _lockProvider;
@@ -113,8 +115,13 @@ class Token
 
             public string Encode()
             {
-                var json = JsonConvert.SerializeObject(this);
+#if NET8_0_OR_GREATER
+                var raw = JsonSerializer.SerializeToUtf8Bytes(this, typeof(Token), TokenSerializeContext.Default);
+                return Convert.ToBase64String(raw);
+#else
+                var json = JsonSerializer.Serialize(this);
                 return Convert.ToBase64String(Encoding.UTF8.GetBytes(json));
+#endif
             }
 
             public static Token Create(string subscriptionId, string activityName)
@@ -130,9 +137,20 @@ public static Token Create(string subscriptionId, string activityName)
             public static Token Decode(string encodedToken)
             {
                 var raw = Convert.FromBase64String(encodedToken);
+#if NET8_0_OR_GREATER
+                return JsonSerializer.Deserialize<Token>(raw, TokenSerializeContext.Default.Token);
+#else
                 var json = Encoding.UTF8.GetString(raw);
-                return JsonConvert.DeserializeObject<Token>(json);
+                return JsonSerializer.Deserialize<Token>(raw);
+#endif
             }
         }
+
+#if NET8_0_OR_GREATER
+        [JsonSerializable(typeof(Token))]
+        partial class TokenSerializeContext : JsonSerializerContext
+        {
+        }
+#endif
     }
 }
\ No newline at end of file
diff --git a/src/WorkflowCore/Services/BackgroundTasks/QueueConsumer.cs b/src/WorkflowCore/Services/BackgroundTasks/QueueConsumer.cs
index a5392ecbb..b4fd915b5 100644
--- a/src/WorkflowCore/Services/BackgroundTasks/QueueConsumer.cs
+++ b/src/WorkflowCore/Services/BackgroundTasks/QueueConsumer.cs
@@ -1,10 +1,10 @@
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
-using ConcurrentCollections;
 using Microsoft.Extensions.Logging;
 using OpenTelemetry.Trace;
 using WorkflowCore.Interface;
@@ -14,17 +14,19 @@ namespace WorkflowCore.Services.BackgroundTasks
 {
     internal abstract class QueueConsumer : IBackgroundTask
     {
-        protected abstract QueueType Queue { get; }
-        protected virtual int MaxConcurrentItems => Math.Max(Environment.ProcessorCount, 2);
-        protected virtual bool EnableSecondPasses => false;
+        private readonly Dictionary<string, EventWaitHandle> _activeTasks;
+        // Refer to  https://github.com/dotnet/runtime/issues/39919#issuecomment-954774092
+        private readonly ConcurrentDictionary<string, byte> _secondPasses;
+        private CancellationTokenSource _cancellationTokenSource;
 
         protected readonly IQueueProvider QueueProvider;
         protected readonly ILogger Logger;
         protected readonly WorkflowOptions Options;
-        protected Task DispatchTask;        
-        private CancellationTokenSource _cancellationTokenSource;
-        private Dictionary<string, EventWaitHandle> _activeTasks;
-        private ConcurrentHashSet<string> _secondPasses;
+        protected Task DispatchTask;
+
+        protected abstract QueueType Queue { get; }
+        protected virtual int MaxConcurrentItems => Math.Max(Environment.ProcessorCount, 2);
+        protected virtual bool EnableSecondPasses => false;
 
         protected QueueConsumer(IQueueProvider queueProvider, ILoggerFactory loggerFactory, WorkflowOptions options)
         {
@@ -33,7 +35,7 @@ protected QueueConsumer(IQueueProvider queueProvider, ILoggerFactory loggerFacto
             Logger = loggerFactory.CreateLogger(GetType());
 
             _activeTasks = new Dictionary<string, EventWaitHandle>();
-            _secondPasses = new ConcurrentHashSet<string>();
+            _secondPasses = new ConcurrentDictionary<string, byte>();
         }
 
         protected abstract Task ProcessItem(string itemId, CancellationToken cancellationToken);
@@ -62,7 +64,7 @@ public virtual void Stop()
 
         private async Task Execute()
         {
-            var cancelToken = _cancellationTokenSource.Token;            
+            var cancelToken = _cancellationTokenSource.Token;
 
             while (!cancelToken.IsCancellationRequested)
             {
@@ -100,14 +102,14 @@ private async Task Execute()
                     }
                     if (hasTask)
                     {
-                        _secondPasses.Add(item);
+                        _secondPasses.TryAdd(item, 0);
                         if (!EnableSecondPasses)
                             await QueueProvider.QueueWork(item, Queue);
                         activity?.Dispose();
                         continue;
                     }
 
-                    _secondPasses.TryRemove(item);
+                    _secondPasses.TryRemove(item, out _);
 
                     var waitHandle = new ManualResetEvent(false);
                     lock (_activeTasks)
@@ -145,9 +147,9 @@ private async Task ExecuteItem(string itemId, EventWaitHandle waitHandle, Activi
             try
             {
                 await ProcessItem(itemId, _cancellationTokenSource.Token);
-                while (EnableSecondPasses && _secondPasses.Contains(itemId))
+                while (EnableSecondPasses && _secondPasses.ContainsKey(itemId))
                 {
-                    _secondPasses.TryRemove(itemId);
+                    _secondPasses.TryRemove(itemId, out _);
                     await ProcessItem(itemId, _cancellationTokenSource.Token);
                 }
             }
diff --git a/src/WorkflowCore/Services/DefaultProviders/MemoryPersistenceProvider.cs b/src/WorkflowCore/Services/DefaultProviders/MemoryPersistenceProvider.cs
index cb69c8791..4ca9a206b 100644
--- a/src/WorkflowCore/Services/DefaultProviders/MemoryPersistenceProvider.cs
+++ b/src/WorkflowCore/Services/DefaultProviders/MemoryPersistenceProvider.cs
@@ -99,14 +99,14 @@ public async Task<IEnumerable<WorkflowInstance>> GetWorkflowInstances(WorkflowSt
         {
             lock (_instances)
             {
-                var result = _instances.AsQueryable();
+                IEnumerable<WorkflowInstance> result = _instances;
 
                 if (status.HasValue)
                 {
                     result = result.Where(x => x.Status == status.Value);
                 }
 
-                if (!String.IsNullOrEmpty(type))
+                if (!string.IsNullOrEmpty(type))
                 {
                     result = result.Where(x => x.WorkflowDefinitionId == type);
                 }
diff --git a/src/WorkflowCore/Services/DefaultProviders/TransientMemoryPersistenceProvider.cs b/src/WorkflowCore/Services/DefaultProviders/TransientMemoryPersistenceProvider.cs
index 31ec6dbe2..02f2c8c9c 100644
--- a/src/WorkflowCore/Services/DefaultProviders/TransientMemoryPersistenceProvider.cs
+++ b/src/WorkflowCore/Services/DefaultProviders/TransientMemoryPersistenceProvider.cs
@@ -40,6 +40,7 @@ public TransientMemoryPersistenceProvider(ISingletonMemoryProvider innerService)
 
         public Task<IEnumerable<WorkflowInstance>> GetWorkflowInstances(IEnumerable<string> ids, CancellationToken _ = default) => _innerService.GetWorkflowInstances(ids);
 
+        [Obsolete]
         public Task<IEnumerable<WorkflowInstance>> GetWorkflowInstances(WorkflowStatus? status, string type, DateTime? createdFrom, DateTime? createdTo, int skip, int take) => _innerService.GetWorkflowInstances(status, type, createdFrom, createdTo, skip, take);
 
         public Task MarkEventProcessed(string id, CancellationToken _ = default) => _innerService.MarkEventProcessed(id);
diff --git a/src/WorkflowCore/Services/FluentBuilders/ParallelStepBuilder.cs b/src/WorkflowCore/Services/FluentBuilders/ParallelStepBuilder.cs
index 81cb34690..991e82ac1 100644
--- a/src/WorkflowCore/Services/FluentBuilders/ParallelStepBuilder.cs
+++ b/src/WorkflowCore/Services/FluentBuilders/ParallelStepBuilder.cs
@@ -1,11 +1,18 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Interface;
 using WorkflowCore.Models;
 using WorkflowCore.Primitives;
 
 namespace WorkflowCore.Services
 {
-    public class ParallelStepBuilder<TData, TStepBody> : IParallelStepBuilder<TData, TStepBody>
+    public class ParallelStepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody> : IParallelStepBuilder<TData, TStepBody>
         where TStepBody : IStepBody
     {
         private readonly IStepBuilder<TData, Sequence> _referenceBuilder;
@@ -14,7 +21,7 @@ public class ParallelStepBuilder<TData, TStepBody> : IParallelStepBuilder<TData,
         public IWorkflowBuilder<TData> WorkflowBuilder { get; private set; }
 
         public WorkflowStep<TStepBody> Step { get; set; }
-        
+
         public ParallelStepBuilder(IWorkflowBuilder<TData> workflowBuilder, IStepBuilder<TData, TStepBody> stepBuilder, IStepBuilder<TData, Sequence> referenceBuilder)
         {
             WorkflowBuilder = workflowBuilder;
@@ -22,15 +29,15 @@ public ParallelStepBuilder(IWorkflowBuilder<TData> workflowBuilder, IStepBuilder
             _stepBuilder = stepBuilder;
             _referenceBuilder = referenceBuilder;
         }
-        
+
         public IParallelStepBuilder<TData, TStepBody> Do(Action<IWorkflowBuilder<TData>> builder)
         {
             var lastStep = WorkflowBuilder.LastStep;
             builder.Invoke(WorkflowBuilder);
-            
+
             if (lastStep == WorkflowBuilder.LastStep)
                 throw new NotSupportedException("Empty Do block not supported");
-            
+
             Step.Children.Add(lastStep + 1); //TODO: make more elegant
 
             return this;
diff --git a/src/WorkflowCore/Services/FluentBuilders/ReturnStepBuilder.cs b/src/WorkflowCore/Services/FluentBuilders/ReturnStepBuilder.cs
index 0777533b5..606ad4e61 100644
--- a/src/WorkflowCore/Services/FluentBuilders/ReturnStepBuilder.cs
+++ b/src/WorkflowCore/Services/FluentBuilders/ReturnStepBuilder.cs
@@ -1,10 +1,21 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Interface;
 using WorkflowCore.Models;
 
 namespace WorkflowCore.Services
 {
-    public class ReturnStepBuilder<TData, TStepBody, TParentStep> : IContainerStepBuilder<TData, TStepBody, TParentStep>
+    public class ReturnStepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TParentStep> : IContainerStepBuilder<TData, TStepBody, TParentStep>
         where TStepBody : IStepBody
         where TParentStep : IStepBody
     {
@@ -20,7 +31,7 @@ public ReturnStepBuilder(IWorkflowBuilder<TData> workflowBuilder, WorkflowStep<T
             Step = step;
             _referenceBuilder = referenceBuilder;
         }
-        
+
         public IStepBuilder<TData, TParentStep> Do(Action<IWorkflowBuilder<TData>> builder)
         {
             builder.Invoke(WorkflowBuilder);
diff --git a/src/WorkflowCore/Services/FluentBuilders/StepBuilder.cs b/src/WorkflowCore/Services/FluentBuilders/StepBuilder.cs
index 9e41f15ca..615fa5f4d 100644
--- a/src/WorkflowCore/Services/FluentBuilders/StepBuilder.cs
+++ b/src/WorkflowCore/Services/FluentBuilders/StepBuilder.cs
@@ -1,5 +1,8 @@
 using System;
 using System.Collections;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Linq.Expressions;
 using WorkflowCore.Interface;
 using WorkflowCore.Models;
@@ -7,7 +10,11 @@
 
 namespace WorkflowCore.Services
 {
-    public class StepBuilder<TData, TStepBody> : IStepBuilder<TData, TStepBody>, IContainerStepBuilder<TData, TStepBody, TStepBody>
+    public class StepBuilder<TData,
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TStepBody> : IStepBuilder<TData, TStepBody>, IContainerStepBuilder<TData, TStepBody, TStepBody>
         where TStepBody : IStepBody
     {
         public IWorkflowBuilder<TData> WorkflowBuilder { get; private set; }
@@ -32,7 +39,11 @@ public IStepBuilder<TData, TStepBody> Id(string id)
             return this;
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
             where TStep : IStepBody
         {
             WorkflowStep<TStep> newStep = new WorkflowStep<TStep>();
@@ -50,7 +61,11 @@ public IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>>
             return stepBuilder;
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(IStepBuilder<TData, TStep> newStep)
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(IStepBuilder<TData, TStep> newStep)
             where TStep : IStepBody
         {
             Step.Outcomes.Add(new ValueOutcome { NextStep = newStep.Step.Id });
@@ -101,7 +116,11 @@ public IStepOutcomeBuilder<TData> When(object outcomeValue, string label = null)
             return outcomeBuilder;
         }
 
-        public IStepBuilder<TData, TStepBody> Branch<TStep>(object outcomeValue, IStepBuilder<TData, TStep> branch) where TStep : IStepBody
+        public IStepBuilder<TData, TStepBody> Branch<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(object outcomeValue, IStepBuilder<TData, TStep> branch) where TStep : IStepBody
         {
             if (branch.WorkflowBuilder.Steps.Count == 0)
                 return this;
@@ -118,7 +137,11 @@ public IStepBuilder<TData, TStepBody> Branch<TStep>(object outcomeValue, IStepBu
             return this;
         }
 
-        public IStepBuilder<TData, TStepBody> Branch<TStep>(Expression<Func<TData, object, bool>> outcomeExpression, IStepBuilder<TData, TStep> branch) where TStep : IStepBody
+        public IStepBuilder<TData, TStepBody> Branch<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Expression<Func<TData, object, bool>> outcomeExpression, IStepBuilder<TData, TStep> branch) where TStep : IStepBody
         {
             if (branch.WorkflowBuilder.Steps.Count == 0)
                 return this;
@@ -207,7 +230,11 @@ public IStepBuilder<TData, WaitFor> WaitFor(string eventName, Expression<Func<TD
             return stepBuilder;
         }
 
-        public IStepBuilder<TData, TStep> End<TStep>(string name) where TStep : IStepBody
+        public IStepBuilder<TData, TStep> End<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(string name) where TStep : IStepBody
         {
             var ancestor = IterateParents(Step.Id, name);
 
@@ -495,7 +522,11 @@ public IStepBuilder<TData, TStepBody> Do(Action<IWorkflowBuilder<TData>> builder
             return this;
         }
 
-        public IStepBuilder<TData, TStepBody> CompensateWith<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody
+        public IStepBuilder<TData, TStepBody> CompensateWith<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody
         {
             WorkflowStep<TStep> newStep = new WorkflowStep<TStep>();
             WorkflowBuilder.AddStep(newStep);
diff --git a/src/WorkflowCore/Services/FluentBuilders/StepOutcomeBuilder.cs b/src/WorkflowCore/Services/FluentBuilders/StepOutcomeBuilder.cs
index 1d654152a..17b24cb73 100644
--- a/src/WorkflowCore/Services/FluentBuilders/StepOutcomeBuilder.cs
+++ b/src/WorkflowCore/Services/FluentBuilders/StepOutcomeBuilder.cs
@@ -1,4 +1,7 @@
 using System;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using WorkflowCore.Interface;
 using WorkflowCore.Models;
 using WorkflowCore.Primitives;
@@ -16,7 +19,11 @@ public StepOutcomeBuilder(IWorkflowBuilder<TData> workflowBuilder, ValueOutcome
             Outcome = outcome;
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
             where TStep : IStepBody
         {
             WorkflowStep<TStep> step = new WorkflowStep<TStep>();
@@ -34,7 +41,11 @@ public IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>>
             return stepBuilder;
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(IStepBuilder<TData, TStep> step)
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(IStepBuilder<TData, TStep> step)
             where TStep : IStepBody
         {
             Outcome.NextStep = step.Step.Id;
diff --git a/src/WorkflowCore/Services/FluentBuilders/WorkflowBuilder.cs b/src/WorkflowCore/Services/FluentBuilders/WorkflowBuilder.cs
index adc02f488..a49969eeb 100644
--- a/src/WorkflowCore/Services/FluentBuilders/WorkflowBuilder.cs
+++ b/src/WorkflowCore/Services/FluentBuilders/WorkflowBuilder.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics.CodeAnalysis;
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
@@ -21,7 +22,11 @@ public class WorkflowBuilder : IWorkflowBuilder
 
         public int LastStep => Steps.Max(x => x.Id);
 
-        public IWorkflowBuilder<T> UseData<T>()
+        public IWorkflowBuilder<T> UseData<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            T>()
         {
             IWorkflowBuilder<T> result = new WorkflowBuilder<T>(Steps);
             return result;
@@ -119,12 +124,14 @@ public void AttachBranch(IWorkflowBuilder branch)
 
             Branches.Add(branch);
         }
-
     }
 
-    public class WorkflowBuilder<TData> : WorkflowBuilder, IWorkflowBuilder<TData>
+    public class WorkflowBuilder<
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+        TData> : WorkflowBuilder, IWorkflowBuilder<TData>
     {
-
         public override WorkflowDefinition Build(string id, int version)
         {
             var result = base.Build(id, version);
@@ -137,7 +144,11 @@ public WorkflowBuilder(IEnumerable<WorkflowStep> steps)
             this.Steps.AddRange(steps);
         }
 
-        public IStepBuilder<TData, TStep> StartWith<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
+        public IStepBuilder<TData, TStep> StartWith<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null)
             where TStep : IStepBody
         {
             WorkflowStep<TStep> step = new WorkflowStep<TStep>();
@@ -189,12 +200,20 @@ public IWorkflowBuilder<TData> CreateBranch()
             return result;
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(Action<IStepBuilder<TData, TStep>> stepSetup = null) where TStep : IStepBody
         {
             return Start().Then(stepSetup);
         }
 
-        public IStepBuilder<TData, TStep> Then<TStep>(IStepBuilder<TData, TStep> newStep) where TStep : IStepBody
+        public IStepBuilder<TData, TStep> Then<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
+#endif
+            TStep>(IStepBuilder<TData, TStep> newStep) where TStep : IStepBody
         {
             return Start().Then(newStep);
         }
@@ -209,13 +228,17 @@ public IStepBuilder<TData, ActionStepBody> Then(Action<IStepExecutionContext> bo
             return Start().Then(body);
         }
 
-        public IStepBuilder<TData, WaitFor> WaitFor(string eventName, Expression<Func<TData, string>> eventKey, Expression<Func<TData, DateTime>> effectiveDate = null,
+        public IStepBuilder<TData, WaitFor> WaitFor(
+            string eventName, Expression<Func<TData, string>> eventKey,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
             Expression<Func<TData, bool>> cancelCondition = null)
         {
             return Start().WaitFor(eventName, eventKey, effectiveDate, cancelCondition);
         }
 
-        public IStepBuilder<TData, WaitFor> WaitFor(string eventName, Expression<Func<TData, IStepExecutionContext, string>> eventKey, Expression<Func<TData, DateTime>> effectiveDate = null,
+        public IStepBuilder<TData, WaitFor> WaitFor(
+            string eventName, Expression<Func<TData, IStepExecutionContext, string>> eventKey,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
             Expression<Func<TData, bool>> cancelCondition = null)
         {
             return Start().WaitFor(eventName, eventKey, effectiveDate, cancelCondition);
@@ -236,12 +259,16 @@ public IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TD
             return Start().ForEach(collection);
         }
 
-        public IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IEnumerable>> collection, Expression<Func<TData, bool>> runParallel)
+        public IContainerStepBuilder<TData, Foreach, Foreach> ForEach(
+            Expression<Func<TData, IEnumerable>> collection,
+            Expression<Func<TData, bool>> runParallel)
         {
             return Start().ForEach(collection, runParallel);
         }
 
-        public IContainerStepBuilder<TData, Foreach, Foreach> ForEach(Expression<Func<TData, IStepExecutionContext, IEnumerable>> collection, Expression<Func<TData, bool>> runParallel)
+        public IContainerStepBuilder<TData, Foreach, Foreach> ForEach(
+            Expression<Func<TData, IStepExecutionContext, IEnumerable>> collection,
+            Expression<Func<TData, bool>> runParallel)
         {
             return Start().ForEach(collection, runParallel);
         }
@@ -286,17 +313,25 @@ public IContainerStepBuilder<TData, Schedule, InlineStepBody> Schedule(Expressio
             return Start().Schedule(time);
         }
 
-        public IContainerStepBuilder<TData, Recur, InlineStepBody> Recur(Expression<Func<TData, TimeSpan>> interval, Expression<Func<TData, bool>> until)
+        public IContainerStepBuilder<TData, Recur, InlineStepBody> Recur(
+            Expression<Func<TData, TimeSpan>> interval,
+            Expression<Func<TData, bool>> until)
         {
             return Start().Recur(interval, until);
         }
 
-        public IStepBuilder<TData, Activity> Activity(string activityName, Expression<Func<TData, object>> parameters = null, Expression<Func<TData, DateTime>> effectiveDate = null,
+        public IStepBuilder<TData, Activity> Activity(
+            string activityName, Expression<Func<TData, object>> parameters = null,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
             Expression<Func<TData, bool>> cancelCondition = null)
         {
             return Start().Activity(activityName, parameters, effectiveDate, cancelCondition);
         }
-        public IStepBuilder<TData, Activity> Activity(Expression<Func<TData, IStepExecutionContext, string>> activityName, Expression<Func<TData, object>> parameters = null, Expression<Func<TData, DateTime>> effectiveDate = null, Expression<Func<TData, bool>> cancelCondition = null)
+        public IStepBuilder<TData, Activity> Activity(
+            Expression<Func<TData, IStepExecutionContext, string>> activityName,
+            Expression<Func<TData, object>> parameters = null,
+            Expression<Func<TData, DateTime>> effectiveDate = null,
+            Expression<Func<TData, bool>> cancelCondition = null)
         {
             return Start().Activity(activityName, parameters, effectiveDate, cancelCondition);
         }
diff --git a/src/WorkflowCore/Services/SyncWorkflowRunner.cs b/src/WorkflowCore/Services/SyncWorkflowRunner.cs
index 5317a8966..5e962ce56 100644
--- a/src/WorkflowCore/Services/SyncWorkflowRunner.cs
+++ b/src/WorkflowCore/Services/SyncWorkflowRunner.cs
@@ -64,7 +64,7 @@ public async Task<WorkflowInstance> RunWorkflowSync<TData>(string workflowId, in
                 if (typeof(TData) == def.DataType)
                     wf.Data = new TData();
                 else
-                    wf.Data = def.DataType.GetConstructor(new Type[0]).Invoke(new object[0]);
+                    wf.Data = def.DataType.GetConstructor(Array.Empty<Type>()).Invoke(Array.Empty<object>());
             }
 
             wf.ExecutionPointers.Add(_pointerFactory.BuildGenesisPointer(def));
diff --git a/src/WorkflowCore/Services/WorkflowController.cs b/src/WorkflowCore/Services/WorkflowController.cs
index 79272e084..32998b55d 100755
--- a/src/WorkflowCore/Services/WorkflowController.cs
+++ b/src/WorkflowCore/Services/WorkflowController.cs
@@ -1,5 +1,7 @@
 using System;
-using System.Linq;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -80,7 +82,7 @@ public async Task<string> StartWorkflow<TData>(string workflowId, int? version,
                 if (typeof(TData) == def.DataType)
                     wf.Data = new TData();
                 else
-                    wf.Data = def.DataType.GetConstructor(new Type[0]).Invoke(new object[0]);
+                    wf.Data = def.DataType.GetConstructor(Array.Empty<Type>()).Invoke(Array.Empty<object>());
             }
 
             wf.ExecutionPointers.Add(_pointerFactory.BuildGenesisPointer(def));
@@ -226,14 +228,22 @@ await _eventHub.PublishNotification(new WorkflowTerminated
             }
         }
 
-        public void RegisterWorkflow<TWorkflow>()
+        public void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow>()
             where TWorkflow : IWorkflow
         {
             var wf = ActivatorUtilities.CreateInstance<TWorkflow>(_serviceProvider);
             _registry.RegisterWorkflow(wf);
         }
 
-        public void RegisterWorkflow<TWorkflow, TData>()
+        public void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow, TData>()
             where TWorkflow : IWorkflow<TData>
             where TData : new()
         {
diff --git a/src/WorkflowCore/Services/WorkflowHost.cs b/src/WorkflowCore/Services/WorkflowHost.cs
index 73c8850fa..8553f5b8d 100644
--- a/src/WorkflowCore/Services/WorkflowHost.cs
+++ b/src/WorkflowCore/Services/WorkflowHost.cs
@@ -1,6 +1,8 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.Logging;
@@ -135,13 +137,21 @@ public async Task StopAsync(CancellationToken cancellationToken)
             await _lifeCycleEventHub.Stop();
         }
 
-        public void RegisterWorkflow<TWorkflow>()
+        public void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+            [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow>()
             where TWorkflow : IWorkflow
         {
             _workflowController.RegisterWorkflow<TWorkflow>();
         }
 
-        public void RegisterWorkflow<TWorkflow, TData>()
+        public void RegisterWorkflow<
+#if NET8_0_OR_GREATER
+        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+#endif
+            TWorkflow, TData>()
             where TWorkflow : IWorkflow<TData>
             where TData : new()
         {
diff --git a/src/WorkflowCore/Services/WorkflowRegistry.cs b/src/WorkflowCore/Services/WorkflowRegistry.cs
index beed19c0e..a62a087a2 100644
--- a/src/WorkflowCore/Services/WorkflowRegistry.cs
+++ b/src/WorkflowCore/Services/WorkflowRegistry.cs
@@ -1,6 +1,9 @@
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+#if NET8_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+#endif
 using System.Linq;
 using Microsoft.Extensions.DependencyInjection;
 using WorkflowCore.Interface;
@@ -10,9 +13,9 @@ namespace WorkflowCore.Services
 {
     public class WorkflowRegistry : IWorkflowRegistry
     {
-        private readonly IServiceProvider _serviceProvider;        
+        private readonly IServiceProvider _serviceProvider;
         private readonly ConcurrentDictionary<string, WorkflowDefinition> _registry = new ConcurrentDictionary<string, WorkflowDefinition>();
-        private readonly ConcurrentDictionary<string, WorkflowDefinition> _lastestVersion = new ConcurrentDictionary<string, WorkflowDefinition>();
+        private readonly ConcurrentDictionary<string, WorkflowDefinition> _latestVersion = new ConcurrentDictionary<string, WorkflowDefinition>();
 
         public WorkflowRegistry(IServiceProvider serviceProvider)
         {
@@ -29,9 +32,9 @@ public WorkflowDefinition GetDefinition(string workflowId, int? version = null)
             }
             else
             {
-                if (!_lastestVersion.ContainsKey(workflowId))
+                if (!_latestVersion.ContainsKey(workflowId))
                     return default;
-                return _lastestVersion[workflowId];
+                return _latestVersion[workflowId];
             }
         }
 
@@ -43,13 +46,13 @@ public void DeregisterWorkflow(string workflowId, int version)
             lock (_registry)
             {
                 _registry.TryRemove($"{workflowId}-{version}", out var _);
-                if (_lastestVersion[workflowId].Version == version)
+                if (_latestVersion[workflowId].Version == version)
                 {
-                    _lastestVersion.TryRemove(workflowId, out var _);
+                    _latestVersion.TryRemove(workflowId, out var _);
 
                     var latest = _registry.Values.Where(x => x.Id == workflowId).OrderByDescending(x => x.Version).FirstOrDefault();
                     if (latest != default)
-                        _lastestVersion[workflowId] = latest;
+                        _latestVersion[workflowId] = latest;
                 }
             }
         }
@@ -72,14 +75,14 @@ public void RegisterWorkflow(WorkflowDefinition definition)
             lock (_registry)
             {
                 _registry[$"{definition.Id}-{definition.Version}"] = definition;
-                if (!_lastestVersion.ContainsKey(definition.Id))
+                if (!_latestVersion.ContainsKey(definition.Id))
                 {
-                    _lastestVersion[definition.Id] = definition;
+                    _latestVersion[definition.Id] = definition;
                     return;
                 }
 
-                if (_lastestVersion[definition.Id].Version <= definition.Version)
-                    _lastestVersion[definition.Id] = definition;
+                if (_latestVersion[definition.Id].Version <= definition.Version)
+                    _latestVersion[definition.Id] = definition;
             }
         }
 
diff --git a/src/WorkflowCore/WorkflowCore.csproj b/src/WorkflowCore/WorkflowCore.csproj
index bb567d87c..226279783 100644
--- a/src/WorkflowCore/WorkflowCore.csproj
+++ b/src/WorkflowCore/WorkflowCore.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;netcoreapp3.1;netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore</AssemblyName>
     <PackageId>WorkflowCore</PackageId>
     <PackageTags>workflow;.NET;Core;state machine</PackageTags>
@@ -13,28 +13,29 @@
     <Description>Workflow Core is a light weight workflow engine targeting .NET Standard.</Description>
   </PropertyGroup>
 
+  <!-- if net8.0, enable trimming -->
+  <PropertyGroup Condition=" '$(TargetFramework)' == 'net8.0' ">
+    <IsAotCompatible>true</IsAotCompatible>
+    <EnableTrimAnalyzer>true</EnableTrimAnalyzer>
+  </PropertyGroup>
+
   <ItemGroup>
-    <PackageReference Include="ConcurrentHashSet" Version="1.1.0" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.ObjectPool" Version="2.2.0" />
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="System.Threading.Tasks.Parallel" Version="4.3.0" />
-    <PackageReference Include="System.Threading.ThreadPool" Version="4.3.0" />
-    <PackageReference Include="System.Reflection" Version="4.3.0" />
-    <PackageReference Include="System.Reflection.TypeExtensions" Version="4.7.0" />
-    <PackageReference Include="System.Threading.Thread" Version="4.3.0" />
-    <PackageReference Include="System.Linq.Queryable" Version="4.3.0" />
-    <PackageReference Include="OpenTelemetry.Api" Version="1.1.0" />
-    <PackageReference Include="System.Diagnostics.DiagnosticSource" Version="6.0.0" />
-	<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
-		<_Parameter1>WorkflowCore.IntegrationTests</_Parameter1>
-	</AssemblyAttribute>
+    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
+    <PackageReference Include="Microsoft.Extensions.ObjectPool" />
+    <PackageReference Include="System.Text.Json" />
+    <PackageReference Include="OpenTelemetry.Api" />
+  </ItemGroup>
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
+  </ItemGroup>
+
+  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
   </ItemGroup>
 
   <ItemGroup>
-    <Folder Include="Services\DefinitionStorage\" />
+    <InternalsVisibleTo Include="WorkflowCore.IntegrationTests"/>
   </ItemGroup>
 
 </Project>
diff --git a/src/extensions/WorkflowCore.Users/WorkflowCore.Users.csproj b/src/extensions/WorkflowCore.Users/WorkflowCore.Users.csproj
index 66c96f4ec..0d29447f9 100644
--- a/src/extensions/WorkflowCore.Users/WorkflowCore.Users.csproj
+++ b/src/extensions/WorkflowCore.Users/WorkflowCore.Users.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core extensions for human workflow</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Users</AssemblyName>
     <PackageId>WorkflowCore.Users</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;human;user</PackageTags>
@@ -22,7 +22,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
   </ItemGroup>
 
 </Project>
diff --git a/src/extensions/WorkflowCore.WebAPI/Controllers/WorkflowsController.cs b/src/extensions/WorkflowCore.WebAPI/Controllers/WorkflowsController.cs
index 3c88df3fb..62133720f 100644
--- a/src/extensions/WorkflowCore.WebAPI/Controllers/WorkflowsController.cs
+++ b/src/extensions/WorkflowCore.WebAPI/Controllers/WorkflowsController.cs
@@ -27,8 +27,8 @@ public WorkflowsController(IWorkflowHost workflowHost, IWorkflowRegistry registr
             _logger = loggerFactory.CreateLogger<WorkflowsController>();
         }
 
-
         [HttpGet]
+        [Obsolete]
         public async Task<IActionResult> Get(WorkflowStatus? status, string type, DateTime? createdFrom, DateTime? createdTo, int skip, int take)
         {
             var result = await _workflowStore.GetWorkflowInstances(status, type, createdFrom, createdTo, skip, take);
diff --git a/src/extensions/WorkflowCore.WebAPI/WorkflowCore.WebAPI.csproj b/src/extensions/WorkflowCore.WebAPI/WorkflowCore.WebAPI.csproj
index f6eb6ea92..1b598b377 100644
--- a/src/extensions/WorkflowCore.WebAPI/WorkflowCore.WebAPI.csproj
+++ b/src/extensions/WorkflowCore.WebAPI/WorkflowCore.WebAPI.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core REST API</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.WebAPI</AssemblyName>
     <PackageId>WorkflowCore.WebAPI</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;REST;API</PackageTags>
@@ -22,9 +22,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="1.1.3" />
-    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
   </ItemGroup>
 
 </Project>
diff --git a/src/providers/WorkflowCore.LockProviders.SqlServer/SqlLockProvider.cs b/src/providers/WorkflowCore.LockProviders.SqlServer/SqlLockProvider.cs
index 92795d871..15aac4d79 100644
--- a/src/providers/WorkflowCore.LockProviders.SqlServer/SqlLockProvider.cs
+++ b/src/providers/WorkflowCore.LockProviders.SqlServer/SqlLockProvider.cs
@@ -80,7 +80,7 @@ public async Task<bool> AcquireLock(string Id, CancellationToken cancellationTok
                     catch (Exception ex)
                     {
                         connection.Close();
-                        throw ex;
+                        throw;
                     }
                 }
                 finally
diff --git a/src/providers/WorkflowCore.LockProviders.SqlServer/WorkflowCore.LockProviders.SqlServer.csproj b/src/providers/WorkflowCore.LockProviders.SqlServer/WorkflowCore.LockProviders.SqlServer.csproj
index 5c798129a..022044bab 100644
--- a/src/providers/WorkflowCore.LockProviders.SqlServer/WorkflowCore.LockProviders.SqlServer.csproj
+++ b/src/providers/WorkflowCore.LockProviders.SqlServer/WorkflowCore.LockProviders.SqlServer.csproj
@@ -1,14 +1,14 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <Description>Distributed lock provider for Workflow-core using SQL Server</Description>
     <PackageProjectUrl>https://github.com/danielgerlag/workflow-core</PackageProjectUrl>
     <PackageLicenseUrl>https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md</PackageLicenseUrl>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
+    <PackageReference Include="System.Data.SqlClient" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj b/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj
index b5fb079c9..a2ce00930 100644
--- a/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj
+++ b/src/providers/WorkflowCore.Persistence.EntityFramework/WorkflowCore.Persistence.EntityFramework.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core EntityFramework Core Persistence Provider</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFrameworks>netstandard2.1;net6.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.EntityFramework</AssemblyName>
     <PackageId>WorkflowCore.Persistence.EntityFramework</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;EntityFramework;EntityFrameworkCore</PackageTags>
@@ -21,17 +21,9 @@
     <ProjectReference Include="..\..\WorkflowCore\WorkflowCore.csproj" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.*" />
-  </ItemGroup>
-
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.2" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.2" />
-  </ItemGroup>
-
   <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
+    <PackageReference Include="Newtonsoft.Json" />
   </ItemGroup>
 
 </Project>
diff --git a/src/providers/WorkflowCore.Persistence.MongoDB/WorkflowCore.Persistence.MongoDB.csproj b/src/providers/WorkflowCore.Persistence.MongoDB/WorkflowCore.Persistence.MongoDB.csproj
index e55685a2e..2e68429c6 100644
--- a/src/providers/WorkflowCore.Persistence.MongoDB/WorkflowCore.Persistence.MongoDB.csproj
+++ b/src/providers/WorkflowCore.Persistence.MongoDB/WorkflowCore.Persistence.MongoDB.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core MongoDB Persistence Provider</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.MongoDB</AssemblyName>
     <PackageId>WorkflowCore.Persistence.MongoDB</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;MongoDB;Mongo</PackageTags>
@@ -22,12 +22,12 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="MongoDB.Driver" Version="2.19.0" />
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="MongoDB.Driver" />
+    <PackageReference Include="Newtonsoft.Json" />
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
-    <PackageReference Include="System.Reflection" Version="4.3.0" />
+    <PackageReference Include="System.Reflection" />
   </ItemGroup>
 
 
diff --git a/src/providers/WorkflowCore.Persistence.MySQL/WorkflowCore.Persistence.MySQL.csproj b/src/providers/WorkflowCore.Persistence.MySQL/WorkflowCore.Persistence.MySQL.csproj
index 8b87ba216..094f75f78 100644
--- a/src/providers/WorkflowCore.Persistence.MySQL/WorkflowCore.Persistence.MySQL.csproj
+++ b/src/providers/WorkflowCore.Persistence.MySQL/WorkflowCore.Persistence.MySQL.csproj
@@ -4,7 +4,7 @@
     <AssemblyTitle>Workflow Core MySQL Persistence Provider</AssemblyTitle>
     <VersionPrefix>1.0.0</VersionPrefix>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFrameworks>netstandard2.1;net6.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.MySQL</AssemblyName>
     <PackageId>WorkflowCore.Persistence.MySQL</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;MySQL</PackageTags>
@@ -18,28 +18,12 @@
     <Description>Provides support to persist workflows running on Workflow Core to a MySQL database.</Description>
   </PropertyGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.2">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
-    </PackageReference>
-    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="3.1.1" />
-  </ItemGroup>
-
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.7">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
-    </PackageReference>
-    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.1" />
-  </ItemGroup>
-
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.*">
+  <ItemGroup>
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.*" />
+    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.Persistence.PostgreSQL/WorkflowCore.Persistence.PostgreSQL.csproj b/src/providers/WorkflowCore.Persistence.PostgreSQL/WorkflowCore.Persistence.PostgreSQL.csproj
index 583c706f0..782c1e2b9 100644
--- a/src/providers/WorkflowCore.Persistence.PostgreSQL/WorkflowCore.Persistence.PostgreSQL.csproj
+++ b/src/providers/WorkflowCore.Persistence.PostgreSQL/WorkflowCore.Persistence.PostgreSQL.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core PostgreSQL Persistence Provider</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFrameworks>netstandard2.1;net6.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.PostgreSQL</AssemblyName>
     <PackageId>WorkflowCore.Persistence.PostgreSQL</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;PostgreSQL</PackageTags>
@@ -22,25 +22,12 @@
     <ProjectReference Include="..\WorkflowCore.Persistence.EntityFramework\WorkflowCore.Persistence.EntityFramework.csproj" />
   </ItemGroup>
 
-  <ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
-	<PackageReference Include="Npgsql" Version="7.*" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.*" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.*">
-      <PrivateAssets>All</PrivateAssets>
-    </PackageReference>
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.*">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
-  </ItemGroup>
-
-  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.1'">
-    <PackageReference Include="Npgsql" Version="5.0.14" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.1" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.1">
+  <ItemGroup>
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools">
       <PrivateAssets>All</PrivateAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.1">
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
diff --git a/src/providers/WorkflowCore.Persistence.RavenDB/ServiceCollectionExtensions.cs b/src/providers/WorkflowCore.Persistence.RavenDB/ServiceCollectionExtensions.cs
index fb05b9ba3..513368f20 100644
--- a/src/providers/WorkflowCore.Persistence.RavenDB/ServiceCollectionExtensions.cs
+++ b/src/providers/WorkflowCore.Persistence.RavenDB/ServiceCollectionExtensions.cs
@@ -5,6 +5,7 @@
 using WorkflowCore.Persistence.RavenDB.Services;
 using WorkflowCore.Interface;
 using WorkflowCore.Persistence.RavenDB;
+using Microsoft.Extensions.Logging;
 
 namespace Microsoft.Extensions.DependencyInjection
 {
@@ -21,7 +22,8 @@ public static WorkflowOptions UseRavenDB(this WorkflowOptions options, RavenStor
 
 			options.UsePersistence(sp =>
 			{
-				return new RavendbPersistenceProvider(store);
+				var loggerFactory = sp.GetService<ILoggerFactory>();
+                return new RavendbPersistenceProvider(store, loggerFactory);
 			});
 
 			options.Services.AddTransient<IWorkflowPurger>(sp =>
diff --git a/src/providers/WorkflowCore.Persistence.RavenDB/Services/RavendbPersistenceProvider.cs b/src/providers/WorkflowCore.Persistence.RavenDB/Services/RavendbPersistenceProvider.cs
index 3e1d5e2ea..ec0b10d61 100644
--- a/src/providers/WorkflowCore.Persistence.RavenDB/Services/RavendbPersistenceProvider.cs
+++ b/src/providers/WorkflowCore.Persistence.RavenDB/Services/RavendbPersistenceProvider.cs
@@ -1,4 +1,5 @@
-using Raven.Client.Documents;
+using Microsoft.Extensions.Logging;
+using Raven.Client.Documents;
 using Raven.Client.Documents.Linq;
 using Raven.Client.Documents.Operations;
 using Raven.Client.Documents.Session;
@@ -16,15 +17,18 @@ namespace WorkflowCore.Persistence.RavenDB.Services
 	public class RavendbPersistenceProvider : IPersistenceProvider
 	{
 		internal const string WorkflowCollectionName = "wfc.workflows";
+		private static bool indexesCreated = false;
+
 		private readonly IDocumentStore _database;
-		static bool indexesCreated = false;
+		private readonly ILogger _logger;
 
         public bool SupportsScheduledCommands => false;
 
-        public RavendbPersistenceProvider(IDocumentStore database)
+        public RavendbPersistenceProvider(IDocumentStore database, ILoggerFactory loggerFactory)
 		{
 			_database = database;
-			CreateIndexes(this);
+            _logger = loggerFactory.CreateLogger<RavendbPersistenceProvider>();
+            CreateIndexes(this);
 		}
 
 		static void CreateIndexes(RavendbPersistenceProvider instance)
@@ -216,7 +220,8 @@ public async Task<bool> SetSubscriptionToken(string eventSubscriptionId, string
 			}
 			catch (Exception e)
 			{
-				return false;
+				_logger.LogError(e, "Failed to set subscription token");
+                return false;
 			}
 		}
 
@@ -240,7 +245,8 @@ public async Task ClearSubscriptionToken(string eventSubscriptionId, string toke
 			}
 			catch (Exception e)
 			{
-				throw e;
+                _logger.LogError(e, "Failed to clear subscription token");
+                throw;
 			}
 		}
 
diff --git a/src/providers/WorkflowCore.Persistence.RavenDB/WorkflowCore.Persistence.RavenDB.csproj b/src/providers/WorkflowCore.Persistence.RavenDB/WorkflowCore.Persistence.RavenDB.csproj
index 69c8e94e7..16a560a35 100644
--- a/src/providers/WorkflowCore.Persistence.RavenDB/WorkflowCore.Persistence.RavenDB.csproj
+++ b/src/providers/WorkflowCore.Persistence.RavenDB/WorkflowCore.Persistence.RavenDB.csproj
@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <AssemblyTitle>Workflow Core RavenDB Persistence Provider</AssemblyTitle>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.RavenDB</AssemblyName>
     <PackageId>WorkflowCore.Persistence.RavenDB</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;RavenDB</PackageTags>
@@ -17,7 +17,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="RavenDB.Client" Version="5.1.2" />
+    <PackageReference Include="RavenDB.Client" />
   </ItemGroup>
 
   <ItemGroup>
@@ -25,7 +25,7 @@
   </ItemGroup>
 
   <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
-    <PackageReference Include="System.Reflection" Version="4.3.0" />
+    <PackageReference Include="System.Reflection" />
   </ItemGroup>
 
 
diff --git a/src/providers/WorkflowCore.Persistence.SqlServer/WorkflowCore.Persistence.SqlServer.csproj b/src/providers/WorkflowCore.Persistence.SqlServer/WorkflowCore.Persistence.SqlServer.csproj
index b6db766bd..f4d1458db 100644
--- a/src/providers/WorkflowCore.Persistence.SqlServer/WorkflowCore.Persistence.SqlServer.csproj
+++ b/src/providers/WorkflowCore.Persistence.SqlServer/WorkflowCore.Persistence.SqlServer.csproj
@@ -4,7 +4,7 @@
     <AssemblyTitle>Workflow Core SQL Server Persistence Provider</AssemblyTitle>
     <VersionPrefix>1.8.0</VersionPrefix>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFrameworks>netstandard2.1;net6.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.SqlServer</AssemblyName>
     <PackageId>WorkflowCore.Persistence.SqlServer</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore</PackageTags>
@@ -23,23 +23,12 @@
     <ProjectReference Include="..\WorkflowCore.Persistence.EntityFramework\WorkflowCore.Persistence.EntityFramework.csproj" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.*" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.*">
-      <PrivateAssets>All</PrivateAssets>
-    </PackageReference>
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.*">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
-  </ItemGroup>
-
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.1" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.1">
+  <ItemGroup>
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools">
       <PrivateAssets>All</PrivateAssets>
     </PackageReference>
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.1">
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
diff --git a/src/providers/WorkflowCore.Persistence.Sqlite/WorkflowCore.Persistence.Sqlite.csproj b/src/providers/WorkflowCore.Persistence.Sqlite/WorkflowCore.Persistence.Sqlite.csproj
index 88b9ceec9..33d01686e 100644
--- a/src/providers/WorkflowCore.Persistence.Sqlite/WorkflowCore.Persistence.Sqlite.csproj
+++ b/src/providers/WorkflowCore.Persistence.Sqlite/WorkflowCore.Persistence.Sqlite.csproj
@@ -4,7 +4,7 @@
     <AssemblyTitle>Workflow Core Sqlite Persistence Provider</AssemblyTitle>
     <VersionPrefix>1.5.0</VersionPrefix>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFrameworks>netstandard2.1;net6.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.Persistence.Sqlite</AssemblyName>
     <PackageId>WorkflowCore.Persistence.Sqlite</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;Sqlite</PackageTags>
@@ -23,12 +23,8 @@
     <ProjectReference Include="..\WorkflowCore.Persistence.EntityFramework\WorkflowCore.Persistence.EntityFramework.csproj" />
   </ItemGroup>
 
-  <ItemGroup Condition=" '$(TargetFramework)' == 'net6.0' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.*" />
-  </ItemGroup>
-
-  <ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
-    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.1" />
+  <ItemGroup>
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" />
   </ItemGroup>
 
 </Project>
diff --git a/src/providers/WorkflowCore.Providers.AWS/WorkflowCore.Providers.AWS.csproj b/src/providers/WorkflowCore.Providers.AWS/WorkflowCore.Providers.AWS.csproj
index 4ea4a1ed8..a567c0f69 100644
--- a/src/providers/WorkflowCore.Providers.AWS/WorkflowCore.Providers.AWS.csproj
+++ b/src/providers/WorkflowCore.Providers.AWS/WorkflowCore.Providers.AWS.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <Authors>Daniel Gerlag</Authors>
     <Description>AWS providers for Workflow Core
 
@@ -14,11 +14,11 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="AWSSDK.DynamoDBv2" Version="3.7.3.11" />
-    <PackageReference Include="AWSSDK.Kinesis" Version="3.7.1.32" />
-    <PackageReference Include="AWSSDK.SQS" Version="3.7.2.33" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
+    <PackageReference Include="AWSSDK.DynamoDBv2" />
+    <PackageReference Include="AWSSDK.Kinesis" />
+    <PackageReference Include="AWSSDK.SQS" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
+    <PackageReference Include="Newtonsoft.Json" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.Providers.Azure/WorkflowCore.Providers.Azure.csproj b/src/providers/WorkflowCore.Providers.Azure/WorkflowCore.Providers.Azure.csproj
index cedd72024..d7724fbf7 100644
--- a/src/providers/WorkflowCore.Providers.Azure/WorkflowCore.Providers.Azure.csproj
+++ b/src/providers/WorkflowCore.Providers.Azure/WorkflowCore.Providers.Azure.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <Description>Azure providers for Workflow Core
 
 - Provides distributed lock management  on Workflow Core
@@ -16,10 +16,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.19.0" />
-    <PackageReference Include="Microsoft.Azure.DocumentDB" Version="2.11.6" />
-	  <PackageReference Include="Microsoft.Azure.ServiceBus" Version="5.0.0" />
-    <PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />
+    <PackageReference Include="Microsoft.Azure.Cosmos" />
+    <PackageReference Include="Microsoft.Azure.DocumentDB" />
+	  <PackageReference Include="Microsoft.Azure.ServiceBus" />
+    <PackageReference Include="WindowsAzure.Storage" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.Providers.Elasticsearch/WorkflowCore.Providers.Elasticsearch.csproj b/src/providers/WorkflowCore.Providers.Elasticsearch/WorkflowCore.Providers.Elasticsearch.csproj
index 7bf5600b8..1f1d5edeb 100644
--- a/src/providers/WorkflowCore.Providers.Elasticsearch/WorkflowCore.Providers.Elasticsearch.csproj
+++ b/src/providers/WorkflowCore.Providers.Elasticsearch/WorkflowCore.Providers.Elasticsearch.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <PackageLicenseUrl>https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md</PackageLicenseUrl>
     <PackageProjectUrl>https://github.com/danielgerlag/workflow-core</PackageProjectUrl>
     <RepositoryUrl>https://github.com/danielgerlag/workflow-core.git</RepositoryUrl>
@@ -12,8 +12,8 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
-    <PackageReference Include="NEST" Version="7.14.1" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
+    <PackageReference Include="NEST" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.Providers.Redis/WorkflowCore.Providers.Redis.csproj b/src/providers/WorkflowCore.Providers.Redis/WorkflowCore.Providers.Redis.csproj
index b1cc0aa97..a95288dc5 100644
--- a/src/providers/WorkflowCore.Providers.Redis/WorkflowCore.Providers.Redis.csproj
+++ b/src/providers/WorkflowCore.Providers.Redis/WorkflowCore.Providers.Redis.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <PackageLicenseUrl>https://github.com/danielgerlag/workflow-core/blob/master/LICENSE.md</PackageLicenseUrl>
     <RepositoryUrl>https://github.com/danielgerlag/workflow-core.git</RepositoryUrl>
     <RepositoryType>git</RepositoryType>
@@ -10,10 +10,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="RedLock.net" Version="2.2.0" />
-    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
+    <PackageReference Include="Newtonsoft.Json" />
+    <PackageReference Include="RedLock.net" />
+    <PackageReference Include="StackExchange.Redis" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/providers/WorkflowCore.QueueProviders.RabbitMQ/WorkflowCore.QueueProviders.RabbitMQ.csproj b/src/providers/WorkflowCore.QueueProviders.RabbitMQ/WorkflowCore.QueueProviders.RabbitMQ.csproj
index 3ef1064ae..756717291 100644
--- a/src/providers/WorkflowCore.QueueProviders.RabbitMQ/WorkflowCore.QueueProviders.RabbitMQ.csproj
+++ b/src/providers/WorkflowCore.QueueProviders.RabbitMQ/WorkflowCore.QueueProviders.RabbitMQ.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <AssemblyTitle>Workflow Core RabbitMQ queue provider</AssemblyTitle>
     <Authors>Daniel Gerlag</Authors>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>WorkflowCore.QueueProviders.RabbitMQ</AssemblyName>
     <PackageId>WorkflowCore.QueueProviders.RabbitMQ</PackageId>
     <PackageTags>workflow;.NET;Core;state machine;WorkflowCore;RabbitMQ</PackageTags>
@@ -22,8 +22,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="RabbitMQ.Client" Version="4.1.3" />
+    <PackageReference Include="Newtonsoft.Json" />
+    <PackageReference Include="RabbitMQ.Client" />
   </ItemGroup>
 
 </Project>
diff --git a/src/providers/WorkflowCore.QueueProviders.SqlServer/WorkflowCore.QueueProviders.SqlServer.csproj b/src/providers/WorkflowCore.QueueProviders.SqlServer/WorkflowCore.QueueProviders.SqlServer.csproj
index c24b7d89e..0bded008d 100644
--- a/src/providers/WorkflowCore.QueueProviders.SqlServer/WorkflowCore.QueueProviders.SqlServer.csproj
+++ b/src/providers/WorkflowCore.QueueProviders.SqlServer/WorkflowCore.QueueProviders.SqlServer.csproj
@@ -1,28 +1,21 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFrameworks>netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <Authors>Roberto Paterlini</Authors>
     <Description>Queue provider for Workflow-core using SQL Server Service Broker</Description>
     <Company />
     <Stage>alpha</Stage>
   </PropertyGroup>
 
-  <ItemGroup>
-    <None Remove="Services\DequeueWork.sql" />
-    <None Remove="Services\QueueWork.sql" />
-    <None Remove="Services\SqlServerQueueProviderOption.cs~RF7cacba9.TMP" />
-  </ItemGroup>
-
   <ItemGroup>
     <EmbeddedResource Include="SqlCommands\DequeueWork.sql" />
     <EmbeddedResource Include="SqlCommands\QueueWork.sql" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
-    <PackageReference Include="System.Data.Common" Version="4.3.0" />
-    <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
+    <PackageReference Include="System.Data.Common" />
+    <PackageReference Include="System.Data.SqlClient" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/Directory.Build.props b/src/samples/Directory.Build.props
index 0f8bd594d..3615b1c49 100644
--- a/src/samples/Directory.Build.props
+++ b/src/samples/Directory.Build.props
@@ -1,7 +1,13 @@
 <Project>
-    <PropertyGroup>
-        <TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
-        <LangVersion>latest</LangVersion>
-        <IsPackable>false</IsPackable>
-    </PropertyGroup>
+  <PropertyGroup>
+    <TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
+    <LangVersion>latest</LangVersion>
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+
+  <!-- disable warnings for netcoreapp3.1 -->
+  <PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
+    <SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
+    <NoWarn>$(NoWarn);NETSDK1138</NoWarn>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/src/samples/WorkflowCore.Sample01/WorkflowCore.Sample01.csproj b/src/samples/WorkflowCore.Sample01/WorkflowCore.Sample01.csproj
index d20a6bc51..f0cb00f97 100644
--- a/src/samples/WorkflowCore.Sample01/WorkflowCore.Sample01.csproj
+++ b/src/samples/WorkflowCore.Sample01/WorkflowCore.Sample01.csproj
@@ -15,12 +15,12 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample02/SimpleDecisionWorkflow.cs b/src/samples/WorkflowCore.Sample02/SimpleDecisionWorkflow.cs
index 91a0323f2..078c17a49 100644
--- a/src/samples/WorkflowCore.Sample02/SimpleDecisionWorkflow.cs
+++ b/src/samples/WorkflowCore.Sample02/SimpleDecisionWorkflow.cs
@@ -11,6 +11,7 @@ public class SimpleDecisionWorkflow : IWorkflow
 
         public int Version => 1;
 
+        [Obsolete]
         public void Build(IWorkflowBuilder<object> builder)
         {
             builder
diff --git a/src/samples/WorkflowCore.Sample02/WorkflowCore.Sample02.csproj b/src/samples/WorkflowCore.Sample02/WorkflowCore.Sample02.csproj
index be4e85c2d..74fefbdae 100644
--- a/src/samples/WorkflowCore.Sample02/WorkflowCore.Sample02.csproj
+++ b/src/samples/WorkflowCore.Sample02/WorkflowCore.Sample02.csproj
@@ -10,8 +10,8 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample03/Steps/AddNumbers.cs b/src/samples/WorkflowCore.Sample03/Steps/AddNumbers.cs
index a8209d227..6f6f48108 100644
--- a/src/samples/WorkflowCore.Sample03/Steps/AddNumbers.cs
+++ b/src/samples/WorkflowCore.Sample03/Steps/AddNumbers.cs
@@ -14,11 +14,10 @@ public class AddNumbers : StepBodyAsync
 
         public int Output { get; set; }
 
-
-        public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
+        public override Task<ExecutionResult> RunAsync(IStepExecutionContext context)
         {
-            Output = (Input1 + Input2);
-            return ExecutionResult.Next();
+            Output = Input1 + Input2;
+            return Task.FromResult(ExecutionResult.Next());
         }
     }
 }
diff --git a/src/samples/WorkflowCore.Sample03/WorkflowCore.Sample03.csproj b/src/samples/WorkflowCore.Sample03/WorkflowCore.Sample03.csproj
index 180c03454..3327a5f2a 100644
--- a/src/samples/WorkflowCore.Sample03/WorkflowCore.Sample03.csproj
+++ b/src/samples/WorkflowCore.Sample03/WorkflowCore.Sample03.csproj
@@ -15,8 +15,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample04/WorkflowCore.Sample04.csproj b/src/samples/WorkflowCore.Sample04/WorkflowCore.Sample04.csproj
index 5940a8e00..cd1e90cb9 100644
--- a/src/samples/WorkflowCore.Sample04/WorkflowCore.Sample04.csproj
+++ b/src/samples/WorkflowCore.Sample04/WorkflowCore.Sample04.csproj
@@ -23,9 +23,9 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="AWSSDK.SQS" Version="3.7.2.33" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.2" />
+    <PackageReference Include="AWSSDK.SQS" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample05/WorkflowCore.Sample05.csproj b/src/samples/WorkflowCore.Sample05/WorkflowCore.Sample05.csproj
index bbfd7f7c7..4a8152953 100644
--- a/src/samples/WorkflowCore.Sample05/WorkflowCore.Sample05.csproj
+++ b/src/samples/WorkflowCore.Sample05/WorkflowCore.Sample05.csproj
@@ -15,7 +15,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample06/MultipleOutcomeWorkflow.cs b/src/samples/WorkflowCore.Sample06/MultipleOutcomeWorkflow.cs
index 5f7661455..3cbb3d3ef 100644
--- a/src/samples/WorkflowCore.Sample06/MultipleOutcomeWorkflow.cs
+++ b/src/samples/WorkflowCore.Sample06/MultipleOutcomeWorkflow.cs
@@ -11,6 +11,7 @@ public class MultipleOutcomeWorkflow : IWorkflow
 
         public int Version => 1;
 
+        [Obsolete]
         public void Build(IWorkflowBuilder<object> builder)
         {
             builder
diff --git a/src/samples/WorkflowCore.Sample06/WorkflowCore.Sample06.csproj b/src/samples/WorkflowCore.Sample06/WorkflowCore.Sample06.csproj
index 47e03b0ee..6d7779ffa 100644
--- a/src/samples/WorkflowCore.Sample06/WorkflowCore.Sample06.csproj
+++ b/src/samples/WorkflowCore.Sample06/WorkflowCore.Sample06.csproj
@@ -15,7 +15,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample07/Startup.cs b/src/samples/WorkflowCore.Sample07/Startup.cs
index 80264f6d2..f5fdd9334 100644
--- a/src/samples/WorkflowCore.Sample07/Startup.cs
+++ b/src/samples/WorkflowCore.Sample07/Startup.cs
@@ -3,6 +3,7 @@
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Logging;
 using WorkflowCore.Interface;
 
@@ -10,7 +11,6 @@ namespace WorkflowCore.Sample07
 {
     public class Startup
     {
-        
         public void ConfigureServices(IServiceCollection services)
         {
             services.AddLogging();
@@ -18,15 +18,14 @@ public void ConfigureServices(IServiceCollection services)
             services.AddMvc();
         }
 
-        
-        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
         {
             //loggerFactory.AddConsole();
 
             //start the workflow host
             var host = app.ApplicationServices.GetService<IWorkflowHost>();
             host.RegisterWorkflow<Sample03.PassingDataWorkflow, Sample03.MyDataClass>();
-            host.RegisterWorkflow<Sample04.EventSampleWorkflow, Sample04.MyDataClass>();            
+            host.RegisterWorkflow<Sample04.EventSampleWorkflow, Sample04.MyDataClass>();
             host.Start();
 
             if (env.IsDevelopment())
@@ -34,7 +33,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
                 app.UseDeveloperExceptionPage();
             }
 
-            app.UseMvc(); 
+            app.UseMvc();
         }
     }
 }
diff --git a/src/samples/WorkflowCore.Sample07/WorkflowCore.Sample07.csproj b/src/samples/WorkflowCore.Sample07/WorkflowCore.Sample07.csproj
index 1cc78f66f..753780c2b 100644
--- a/src/samples/WorkflowCore.Sample07/WorkflowCore.Sample07.csproj
+++ b/src/samples/WorkflowCore.Sample07/WorkflowCore.Sample07.csproj
@@ -22,9 +22,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
-    <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
-    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
+    <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" />
+    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample08/WorkflowCore.Sample08.csproj b/src/samples/WorkflowCore.Sample08/WorkflowCore.Sample08.csproj
index f6ae3bcba..8da96aadc 100644
--- a/src/samples/WorkflowCore.Sample08/WorkflowCore.Sample08.csproj
+++ b/src/samples/WorkflowCore.Sample08/WorkflowCore.Sample08.csproj
@@ -20,7 +20,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
 </Project>
diff --git a/src/samples/WorkflowCore.Sample09/WorkflowCore.Sample09.csproj b/src/samples/WorkflowCore.Sample09/WorkflowCore.Sample09.csproj
index e7c7206ec..6619eb1f7 100644
--- a/src/samples/WorkflowCore.Sample09/WorkflowCore.Sample09.csproj
+++ b/src/samples/WorkflowCore.Sample09/WorkflowCore.Sample09.csproj
@@ -5,7 +5,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample09s/WorkflowCore.Sample09s.csproj b/src/samples/WorkflowCore.Sample09s/WorkflowCore.Sample09s.csproj
index 67c94bc64..443145818 100644
--- a/src/samples/WorkflowCore.Sample09s/WorkflowCore.Sample09s.csproj
+++ b/src/samples/WorkflowCore.Sample09s/WorkflowCore.Sample09s.csproj
@@ -5,7 +5,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample10/WorkflowCore.Sample10.csproj b/src/samples/WorkflowCore.Sample10/WorkflowCore.Sample10.csproj
index e7c7206ec..6619eb1f7 100644
--- a/src/samples/WorkflowCore.Sample10/WorkflowCore.Sample10.csproj
+++ b/src/samples/WorkflowCore.Sample10/WorkflowCore.Sample10.csproj
@@ -5,7 +5,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample11/WorkflowCore.Sample11.csproj b/src/samples/WorkflowCore.Sample11/WorkflowCore.Sample11.csproj
index 106048445..a25c5d053 100644
--- a/src/samples/WorkflowCore.Sample11/WorkflowCore.Sample11.csproj
+++ b/src/samples/WorkflowCore.Sample11/WorkflowCore.Sample11.csproj
@@ -5,8 +5,8 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample12/WorkflowCore.Sample12.csproj b/src/samples/WorkflowCore.Sample12/WorkflowCore.Sample12.csproj
index e0fb0e8aa..d4ab95034 100644
--- a/src/samples/WorkflowCore.Sample12/WorkflowCore.Sample12.csproj
+++ b/src/samples/WorkflowCore.Sample12/WorkflowCore.Sample12.csproj
@@ -5,7 +5,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample13/WorkflowCore.Sample13.csproj b/src/samples/WorkflowCore.Sample13/WorkflowCore.Sample13.csproj
index 522eaac98..2bad708f4 100644
--- a/src/samples/WorkflowCore.Sample13/WorkflowCore.Sample13.csproj
+++ b/src/samples/WorkflowCore.Sample13/WorkflowCore.Sample13.csproj
@@ -5,7 +5,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample15/WorkflowCore.Sample15.csproj b/src/samples/WorkflowCore.Sample15/WorkflowCore.Sample15.csproj
index f8d1df555..098122901 100644
--- a/src/samples/WorkflowCore.Sample15/WorkflowCore.Sample15.csproj
+++ b/src/samples/WorkflowCore.Sample15/WorkflowCore.Sample15.csproj
@@ -5,8 +5,8 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample16/WorkflowCore.Sample16.csproj b/src/samples/WorkflowCore.Sample16/WorkflowCore.Sample16.csproj
index f8d1df555..098122901 100644
--- a/src/samples/WorkflowCore.Sample16/WorkflowCore.Sample16.csproj
+++ b/src/samples/WorkflowCore.Sample16/WorkflowCore.Sample16.csproj
@@ -5,8 +5,8 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample18/WorkflowCore.Sample18.csproj b/src/samples/WorkflowCore.Sample18/WorkflowCore.Sample18.csproj
index c1c6e0846..bb898d4a9 100644
--- a/src/samples/WorkflowCore.Sample18/WorkflowCore.Sample18.csproj
+++ b/src/samples/WorkflowCore.Sample18/WorkflowCore.Sample18.csproj
@@ -1,14 +1,14 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.Extensions.Logging" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/src/samples/WorkflowCore.Sample19/WorkflowCore.Sample19.csproj b/src/samples/WorkflowCore.Sample19/WorkflowCore.Sample19.csproj
index 181b45e66..0410f5157 100644
--- a/src/samples/WorkflowCore.Sample19/WorkflowCore.Sample19.csproj
+++ b/src/samples/WorkflowCore.Sample19/WorkflowCore.Sample19.csproj
@@ -5,11 +5,11 @@
     </PropertyGroup>
 
     <ItemGroup>
-        <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-        <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
-        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.0" />
-        <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
-        <PackageReference Include="Polly" Version="7.2.1" />
+        <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+        <PackageReference Include="Microsoft.Extensions.Logging" />
+        <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+        <PackageReference Include="Microsoft.Extensions.Logging.Debug" />
+        <PackageReference Include="Polly" />
     </ItemGroup>
 
     <ItemGroup>
diff --git a/src/samples/WorkflowCore.TestSample01/NUnitTest.cs b/src/samples/WorkflowCore.TestSample01/NUnitTest.cs
index 167c97441..ccf777e73 100644
--- a/src/samples/WorkflowCore.TestSample01/NUnitTest.cs
+++ b/src/samples/WorkflowCore.TestSample01/NUnitTest.cs
@@ -11,7 +11,7 @@ namespace WorkflowCore.TestSample01
     public class NUnitTest : WorkflowTest<MyWorkflow, MyDataClass>
     {
         [SetUp]
-        protected void Setup()
+        protected override void Setup()
         {
             base.Setup();
         }
diff --git a/src/samples/WorkflowCore.TestSample01/WorkflowCore.TestSample01.csproj b/src/samples/WorkflowCore.TestSample01/WorkflowCore.TestSample01.csproj
index 308565745..f593223ec 100644
--- a/src/samples/WorkflowCore.TestSample01/WorkflowCore.TestSample01.csproj
+++ b/src/samples/WorkflowCore.TestSample01/WorkflowCore.TestSample01.csproj
@@ -1,13 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="FluentAssertions" Version="4.19.4" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
-    <PackageReference Include="NUnit" Version="3.9.0" />
-    <PackageReference Include="NUnit3TestAdapter" Version="3.9.0" />
-    <PackageReference Include="xunit" Version="2.3.1" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
+    <PackageReference Include="FluentAssertions" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" />
+    <PackageReference Include="NUnit" />
+    <PackageReference Include="NUnit3TestAdapter" />
+    <PackageReference Include="xunit" />
+    <PackageReference Include="xunit.runner.visualstudio" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/Directory.Build.props b/test/Directory.Build.props
index 3b2ad7341..d3e80a5ab 100644
--- a/test/Directory.Build.props
+++ b/test/Directory.Build.props
@@ -1,24 +1,25 @@
 <Project>
-    <PropertyGroup>
-        <TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
-        <LangVersion>latest</LangVersion>
-        <IsPackable>false</IsPackable>
-    </PropertyGroup>
+  <PropertyGroup>
+    <TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
+    <LangVersion>latest</LangVersion>
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
 
-    <ItemGroup>
-        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0"/>
-        <PackageReference Include="xunit" Version="2.4.1"/>
-        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1"/>
-        <PackageReference Include="FluentAssertions" Version="4.19.4" />
-        <PackageReference Include="Moq" Version="4.7.145" />
-        <PackageReference Include="FakeItEasy" Version="4.9.2" />
-    </ItemGroup>
-    
-    <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
-        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.2" />
-    </ItemGroup>
+  <!-- disable warnings for netcoreapp3.1 -->
+  <PropertyGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' ">
+    <SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
+    <NoWarn>$(NoWarn);NETSDK1138</NoWarn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="FakeItEasy" />
+    <PackageReference Include="FluentAssertions" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" />
+    <PackageReference Include="Moq" />
+    <PackageReference Include="xunit" />
+    <PackageReference Include="xunit.core" />
+    <PackageReference Include="xunit.runner.visualstudio" />
+  </ItemGroup>
 
-    <ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
-        <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="6.0.0" />
-    </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/test/Docker.Testify/Docker.Testify.csproj b/test/Docker.Testify/Docker.Testify.csproj
index a83648df4..414cba031 100644
--- a/test/Docker.Testify/Docker.Testify.csproj
+++ b/test/Docker.Testify/Docker.Testify.csproj
@@ -1,9 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="Docker.DotNet" Version="3.125.2" />
-    <PackageReference Include="System.Diagnostics.Process" Version="4.3.0" />
-    <PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" />
-    <PackageReference Include="System.Threading.Thread" Version="4.3.0" />
+    <PackageReference Include="Docker.DotNet" />
+    <PackageReference Include="System.Net.NetworkInformation" />
   </ItemGroup>
 </Project>
diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/ActivityScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/ActivityScenario.cs
index 1e082f4db..cafa42816 100644
--- a/test/WorkflowCore.IntegrationTests/Scenarios/ActivityScenario.cs
+++ b/test/WorkflowCore.IntegrationTests/Scenarios/ActivityScenario.cs
@@ -5,6 +5,7 @@
 using FluentAssertions;
 using System.Linq;
 using WorkflowCore.Testing;
+using System.Threading.Tasks;
 
 namespace WorkflowCore.IntegrationTests.Scenarios
 {
@@ -47,16 +48,16 @@ public ActivityScenario()
         }
 
         [Fact]
-        public void Scenario()
+        public async Task Scenario()
         {
             var workflowId = StartWorkflow(new MyDataClass { ActivityInput = new ActivityInput { Value1 = "a", Value2 = 1 } });
-            var activity = Host.GetPendingActivity("act-1", "worker1", TimeSpan.FromSeconds(30)).Result;
+            var activity = await Host.GetPendingActivity("act-1", "worker1", TimeSpan.FromSeconds(30));
 
             if (activity != null)
             {
                 var actInput = (ActivityInput)activity.Parameters;
-                Host.SubmitActivitySuccess(activity.Token, new ActivityOutput
-                { 
+                await Host.SubmitActivitySuccess(activity.Token, new ActivityOutput
+                {
                     Value1 = actInput.Value1 + "1",
                     Value2 = actInput.Value2 + 1
                 });
diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs
index 89a9b46e0..97088093d 100644
--- a/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs
+++ b/test/WorkflowCore.IntegrationTests/Scenarios/ForkScenario.cs
@@ -3,9 +3,11 @@
 using WorkflowCore.Models;
 using Xunit;
 using FluentAssertions;
+using System.Threading.Tasks;
 
 namespace WorkflowCore.IntegrationTests.Scenarios
 {
+    [Obsolete]
     public class ForkScenario : BaseScenario<ForkScenario.OutcomeFork, Object>
     {
         static int TaskATicker = 0;
@@ -57,16 +59,16 @@ public void Build(IWorkflowBuilder<Object> builder)
         }
 
         [Fact]
-        public void Scenario()
+        public async Task Scenario()
         {
-            var workflowId = Host.StartWorkflow("OutcomeFork").Result;
-            var instance = PersistenceProvider.GetWorkflowInstance(workflowId).Result;
+            var workflowId = await Host.StartWorkflow("OutcomeFork");
+            var instance = await PersistenceProvider.GetWorkflowInstance(workflowId);
             int counter = 0;
             while ((instance.Status == WorkflowStatus.Runnable) && (counter < 300))
             {
                 System.Threading.Thread.Sleep(100);
                 counter++;
-                instance = PersistenceProvider.GetWorkflowInstance(workflowId).Result;
+                instance = await PersistenceProvider.GetWorkflowInstance(workflowId);
             }
 
             instance.Status.Should().Be(WorkflowStatus.Complete);
diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs
index 66d442018..9984ffe76 100644
--- a/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs
+++ b/test/WorkflowCore.IntegrationTests/Scenarios/UserScenario.cs
@@ -5,6 +5,7 @@
 using FluentAssertions;
 using System.Linq;
 using WorkflowCore.Testing;
+using System.Threading.Tasks;
 
 namespace WorkflowCore.IntegrationTests.Scenarios
 {
@@ -37,7 +38,7 @@ public UserScenario()
         }
 
         [Fact]
-        public void Scenario()
+        public async Task Scenario()
         {
             var workflowId = StartWorkflow(null);
             var counter = 0;
@@ -50,11 +51,11 @@ public void Scenario()
 
             var openItems1 = Host.GetOpenUserActions(workflowId).ToList();
 
-            Host.PublishUserAction(openItems1.First().Key, "user1", "yes").Wait();
+            await Host.PublishUserAction(openItems1.First().Key, "user1", "yes");
 
             WaitForWorkflowToComplete(workflowId, TimeSpan.FromSeconds(30));
 
-            var openItems2 = Host.GetOpenUserActions(workflowId);        
+            var openItems2 = Host.GetOpenUserActions(workflowId);
 
             ApproveStepTicker.Should().Be(1);
             DisapproveStepTicker.Should().Be(0);
diff --git a/test/WorkflowCore.IntegrationTests/WorkflowCore.IntegrationTests.csproj b/test/WorkflowCore.IntegrationTests/WorkflowCore.IntegrationTests.csproj
index bdc973728..c077184d3 100644
--- a/test/WorkflowCore.IntegrationTests/WorkflowCore.IntegrationTests.csproj
+++ b/test/WorkflowCore.IntegrationTests/WorkflowCore.IntegrationTests.csproj
@@ -17,7 +17,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.3.1" />
+    <PackageReference Include="Autofac.Extensions.DependencyInjection" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.TestAssets/WorkflowCore.TestAssets.csproj b/test/WorkflowCore.TestAssets/WorkflowCore.TestAssets.csproj
index cbba0dccb..b217dfe6d 100644
--- a/test/WorkflowCore.TestAssets/WorkflowCore.TestAssets.csproj
+++ b/test/WorkflowCore.TestAssets/WorkflowCore.TestAssets.csproj
@@ -38,8 +38,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
-    <PackageReference Include="NUnit" Version="3.6.1" />
+    <PackageReference Include="Newtonsoft.Json" />
+    <PackageReference Include="NUnit" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.Tests.DynamoDB/WorkflowCore.Tests.DynamoDB.csproj b/test/WorkflowCore.Tests.DynamoDB/WorkflowCore.Tests.DynamoDB.csproj
index 65320489d..713f59d8c 100644
--- a/test/WorkflowCore.Tests.DynamoDB/WorkflowCore.Tests.DynamoDB.csproj
+++ b/test/WorkflowCore.Tests.DynamoDB/WorkflowCore.Tests.DynamoDB.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="AWSSDK.DynamoDBv2" Version="3.7.3.11" />
+    <PackageReference Include="AWSSDK.DynamoDBv2" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.Tests.Elasticsearch/WorkflowCore.Tests.Elasticsearch.csproj b/test/WorkflowCore.Tests.Elasticsearch/WorkflowCore.Tests.Elasticsearch.csproj
index 9aa005f40..2eeb7d813 100644
--- a/test/WorkflowCore.Tests.Elasticsearch/WorkflowCore.Tests.Elasticsearch.csproj
+++ b/test/WorkflowCore.Tests.Elasticsearch/WorkflowCore.Tests.Elasticsearch.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="Squadron.Elasticsearch" Version="0.17.0" />
+    <PackageReference Include="Squadron.Elasticsearch" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs
index f582f0e7b..80ab9db5f 100644
--- a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs
+++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoForkScenario.cs
@@ -6,6 +6,7 @@
 namespace WorkflowCore.Tests.MongoDB.Scenarios
 {
     [Collection("Mongo collection")]
+    [Obsolete]
     public class MongoForkScenario : ForkScenario
     {        
         protected override void Configure(IServiceCollection services)
diff --git a/test/WorkflowCore.Tests.MongoDB/WorkflowCore.Tests.MongoDB.csproj b/test/WorkflowCore.Tests.MongoDB/WorkflowCore.Tests.MongoDB.csproj
index c708f7bf3..12d036d24 100644
--- a/test/WorkflowCore.Tests.MongoDB/WorkflowCore.Tests.MongoDB.csproj
+++ b/test/WorkflowCore.Tests.MongoDB/WorkflowCore.Tests.MongoDB.csproj
@@ -20,8 +20,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Squadron.Mongo" Version="0.17.0" />
-    <PackageReference Include="MongoDB.Driver" Version="2.19.0" />
+    <PackageReference Include="Squadron.Mongo" />
+    <PackageReference Include="MongoDB.Driver" />
   </ItemGroup>
 
 </Project>
diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs
index 8a57e465b..fffefaee3 100644
--- a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs
+++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlForkScenario.cs
@@ -6,6 +6,7 @@
 namespace WorkflowCore.Tests.MySQL.Scenarios
 {
     [Collection("Mysql collection")]
+    [Obsolete]
     public class MysqlForkScenario : ForkScenario
     {        
         protected override void Configure(IServiceCollection services)
diff --git a/test/WorkflowCore.Tests.MySQL/WorkflowCore.Tests.MySQL.csproj b/test/WorkflowCore.Tests.MySQL/WorkflowCore.Tests.MySQL.csproj
index a56acc9b7..d11895dee 100644
--- a/test/WorkflowCore.Tests.MySQL/WorkflowCore.Tests.MySQL.csproj
+++ b/test/WorkflowCore.Tests.MySQL/WorkflowCore.Tests.MySQL.csproj
@@ -1,7 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="Squadron.MySql" Version="0.18.0-preview.7" />
+    <PackageReference Include="MySqlConnector" />
+    <PackageReference Include="Squadron.MySql" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs
index 4ad8fe86a..c1447ae5e 100644
--- a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs
+++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresForkScenario.cs
@@ -6,6 +6,7 @@
 namespace WorkflowCore.Tests.PostgreSQL.Scenarios
 {
     [Collection("Postgres collection")]
+    [Obsolete]
     public class PostgresForkScenario : ForkScenario
     {        
         protected override void Configure(IServiceCollection services)
diff --git a/test/WorkflowCore.Tests.PostgreSQL/WorkflowCore.Tests.PostgreSQL.csproj b/test/WorkflowCore.Tests.PostgreSQL/WorkflowCore.Tests.PostgreSQL.csproj
index 66cc649b4..a98afd491 100644
--- a/test/WorkflowCore.Tests.PostgreSQL/WorkflowCore.Tests.PostgreSQL.csproj
+++ b/test/WorkflowCore.Tests.PostgreSQL/WorkflowCore.Tests.PostgreSQL.csproj
@@ -20,7 +20,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Squadron.PostgreSql" Version="0.17.0" />
+    <PackageReference Include="Squadron.PostgreSql" />
   </ItemGroup>
 
 </Project>
diff --git a/test/WorkflowCore.Tests.QueueProviders.RabbitMQ/WorkflowCore.Tests.QueueProviders.RabbitMQ.csproj b/test/WorkflowCore.Tests.QueueProviders.RabbitMQ/WorkflowCore.Tests.QueueProviders.RabbitMQ.csproj
index 98e658fed..b03a5c6d5 100644
--- a/test/WorkflowCore.Tests.QueueProviders.RabbitMQ/WorkflowCore.Tests.QueueProviders.RabbitMQ.csproj
+++ b/test/WorkflowCore.Tests.QueueProviders.RabbitMQ/WorkflowCore.Tests.QueueProviders.RabbitMQ.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
     <ItemGroup>
-        <PackageReference Include="coverlet.collector" Version="1.2.0" />
+        <PackageReference Include="coverlet.collector" />
     </ItemGroup>
 
     <ItemGroup>
diff --git a/test/WorkflowCore.Tests.Redis/WorkflowCore.Tests.Redis.csproj b/test/WorkflowCore.Tests.Redis/WorkflowCore.Tests.Redis.csproj
index 147dad6da..dea7d8fb0 100644
--- a/test/WorkflowCore.Tests.Redis/WorkflowCore.Tests.Redis.csproj
+++ b/test/WorkflowCore.Tests.Redis/WorkflowCore.Tests.Redis.csproj
@@ -1,8 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
-    <PackageReference Include="Squadron.Redis" Version="0.17.0" />
+    <PackageReference Include="StackExchange.Redis" />
+    <PackageReference Include="Squadron.Redis" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.Tests.SqlServer/WorkflowCore.Tests.SqlServer.csproj b/test/WorkflowCore.Tests.SqlServer/WorkflowCore.Tests.SqlServer.csproj
index 24e83536e..ef4793f7c 100644
--- a/test/WorkflowCore.Tests.SqlServer/WorkflowCore.Tests.SqlServer.csproj
+++ b/test/WorkflowCore.Tests.SqlServer/WorkflowCore.Tests.SqlServer.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
-    <PackageReference Include="Squadron.SqlServer" Version="0.17.0" />
+    <PackageReference Include="Squadron.SqlServer" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs b/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs
index 9114da7b9..b935a4574 100644
--- a/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs
+++ b/test/WorkflowCore.UnitTests/BasePersistenceFixture.cs
@@ -15,7 +15,7 @@ public abstract class BasePersistenceFixture
         protected abstract IPersistenceProvider Subject { get; }
 
         [Fact]
-        public void CreateNewWorkflow_should_generate_id()
+        public async Task CreateNewWorkflow_should_generate_id()
         {
             var workflow = new WorkflowInstance
             {
@@ -33,14 +33,14 @@ public void CreateNewWorkflow_should_generate_id()
                 StepId = 0
             });
 
-            var workflowId = Subject.CreateNewWorkflow(workflow).Result;
+            var workflowId = await Subject.CreateNewWorkflow(workflow);
 
             workflowId.Should().NotBeNull();
             workflow.Id.Should().NotBeNull();
         }
 
         [Fact]
-        public void GetWorkflowInstance_should_retrieve_workflow()
+        public async Task GetWorkflowInstance_should_retrieve_workflow()
         {
             var workflow = new WorkflowInstance
             {
@@ -60,9 +60,9 @@ public void GetWorkflowInstance_should_retrieve_workflow()
                 SleepUntil = new DateTime(2000, 1, 1).ToUniversalTime(),
                 Scope = new List<string> { "4", "3", "2", "1" }
             });
-            var workflowId = Subject.CreateNewWorkflow(workflow).Result;
+            var workflowId = await Subject.CreateNewWorkflow(workflow);
 
-            var retrievedWorkflow = Subject.GetWorkflowInstance(workflowId).Result;
+            var retrievedWorkflow = await Subject.GetWorkflowInstance(workflowId);
 
             retrievedWorkflow.ShouldBeEquivalentTo(workflow);
             retrievedWorkflow.ExecutionPointers.FindById("1")
@@ -70,7 +70,7 @@ public void GetWorkflowInstance_should_retrieve_workflow()
         }
 
         [Fact]
-        public void GetWorkflowInstances_should_retrieve_workflows()
+        public async Task GetWorkflowInstances_should_retrieve_workflows()
         {
             var workflow01 = new WorkflowInstance
             {
@@ -90,7 +90,7 @@ public void GetWorkflowInstances_should_retrieve_workflows()
                 SleepUntil = new DateTime(2000, 1, 1).ToUniversalTime(),
                 Scope = new List<string> { "4", "3", "2", "1" }
             });
-            var workflowId01 = Subject.CreateNewWorkflow(workflow01).Result;
+            var workflowId01 = await Subject.CreateNewWorkflow(workflow01);
 
             var workflow02 = new WorkflowInstance
             {
@@ -110,7 +110,7 @@ public void GetWorkflowInstances_should_retrieve_workflows()
                 SleepUntil = new DateTime(2000, 1, 1).ToUniversalTime(),
                 Scope = new List<string> { "4", "3", "2", "1" }
             });
-            var workflowId02 = Subject.CreateNewWorkflow(workflow02).Result;
+            var workflowId02 = await Subject.CreateNewWorkflow(workflow02);
 
             var workflow03 = new WorkflowInstance
             {
@@ -130,9 +130,9 @@ public void GetWorkflowInstances_should_retrieve_workflows()
                 SleepUntil = new DateTime(2000, 1, 1).ToUniversalTime(),
                 Scope = new List<string> { "4", "3", "2", "1" }
             });
-            var workflowId03 = Subject.CreateNewWorkflow(workflow03).Result;
+            var workflowId03 = await Subject.CreateNewWorkflow(workflow03);
 
-            var retrievedWorkflows = Subject.GetWorkflowInstances(new[] { workflowId01, workflowId02, workflowId03 }).Result;
+            var retrievedWorkflows = await Subject.GetWorkflowInstances(new[] { workflowId01, workflowId02, workflowId03 });
 
             retrievedWorkflows.Count().ShouldBeEquivalentTo(3);
 
@@ -153,7 +153,7 @@ public void GetWorkflowInstances_should_retrieve_workflows()
         }
 
         [Fact]
-        public void PersistWorkflow()
+        public async Task PersistWorkflow()
         {
             var oldWorkflow = new WorkflowInstance
             {
@@ -173,21 +173,21 @@ public void PersistWorkflow()
                 StepId = 0,
                 Scope = new List<string> { "1", "2", "3", "4" }
             });
-            var workflowId = Subject.CreateNewWorkflow(oldWorkflow).Result;
+            var workflowId = await Subject.CreateNewWorkflow(oldWorkflow);
             var newWorkflow = Utils.DeepCopy(oldWorkflow);
             newWorkflow.Data = oldWorkflow.Data;
             newWorkflow.Reference = oldWorkflow.Reference;
             newWorkflow.NextExecution = 7;
             newWorkflow.ExecutionPointers.Add(new ExecutionPointer { Id = Guid.NewGuid().ToString(), Active = true, StepId = 1 });
 
-            Subject.PersistWorkflow(newWorkflow).Wait();
+            await Subject.PersistWorkflow(newWorkflow);
 
-            var current = Subject.GetWorkflowInstance(workflowId).Result;
+            var current = await Subject.GetWorkflowInstance(workflowId);
             current.ShouldBeEquivalentTo(newWorkflow);
         }
 		
 		[Fact]
-        public void PersistWorkflow_with_subscriptions()
+        public async Task PersistWorkflow_with_subscriptions()
         {
             var workflow = new WorkflowInstance
             {
@@ -220,7 +220,7 @@ public void PersistWorkflow_with_subscriptions()
                 EventName = "Event2",
             });
 
-            var workflowId = Subject.CreateNewWorkflow(workflow).Result;
+            var workflowId = await Subject.CreateNewWorkflow(workflow);
             workflow.NextExecution = 0;
 
             List<EventSubscription> subscriptions = new List<EventSubscription>();
@@ -240,14 +240,14 @@ public void PersistWorkflow_with_subscriptions()
                 subscriptions.Add(subscription);
             }
 
-            Subject.PersistWorkflow(workflow, subscriptions).Wait();
+            await Subject.PersistWorkflow(workflow, subscriptions);
 
-            var current = Subject.GetWorkflowInstance(workflowId).Result;
+            var current = await Subject.GetWorkflowInstance(workflowId);
             current.ShouldBeEquivalentTo(workflow);
 
             foreach (var pointer in workflow.ExecutionPointers)
             {
-                subscriptions = Subject.GetSubscriptions(pointer.EventName, workflowId, DateTime.UtcNow).Result.ToList();
+                subscriptions = (await Subject.GetSubscriptions(pointer.EventName, workflowId, DateTime.UtcNow)).ToList();
                 subscriptions.Should().HaveCount(1);
             }
         }