diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index d2be1b02..95881e14 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -43,7 +43,7 @@ jobs:
     - name: Setup .NET Core SDK
       uses: actions/setup-dotnet@v3
       with:
-        dotnet-version: '8.0.x'
+        dotnet-version: '9.0.x'
         
     - name: Install Workloads
       run: |
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 4327786f..b4fa2d5f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -20,7 +20,7 @@ jobs:
     - name: Setup .NET Core SDK
       uses: actions/setup-dotnet@v3
       with:
-        dotnet-version: '8.0.x'
+        dotnet-version: '9.0.x'
         include-prerelease: true
         
     - name: Test
diff --git a/lib/ShortDev.Microsoft.ConnectedDevices.NearShare/ShortDev.Microsoft.ConnectedDevices.NearShare.csproj b/lib/ShortDev.Microsoft.ConnectedDevices.NearShare/ShortDev.Microsoft.ConnectedDevices.NearShare.csproj
index 690b7eb7..cf958247 100644
--- a/lib/ShortDev.Microsoft.ConnectedDevices.NearShare/ShortDev.Microsoft.ConnectedDevices.NearShare.csproj
+++ b/lib/ShortDev.Microsoft.ConnectedDevices.NearShare/ShortDev.Microsoft.ConnectedDevices.NearShare.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
 	<PropertyGroup>
-		<TargetFramework>net8.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 	</PropertyGroup>
 
 	<ItemGroup>
diff --git a/lib/ShortDev.Microsoft.ConnectedDevices/Messages/Connection/Authentication/AuthenticationPayload.cs b/lib/ShortDev.Microsoft.ConnectedDevices/Messages/Connection/Authentication/AuthenticationPayload.cs
index 5458ae2b..a239512b 100644
--- a/lib/ShortDev.Microsoft.ConnectedDevices/Messages/Connection/Authentication/AuthenticationPayload.cs
+++ b/lib/ShortDev.Microsoft.ConnectedDevices/Messages/Connection/Authentication/AuthenticationPayload.cs
@@ -15,7 +15,7 @@ private AuthenticationPayload() { }
     public static AuthenticationPayload Parse(ref EndianReader reader)
         => new()
         {
-            Certificate = new(reader.ReadBytesWithLength().ToArray()),
+            Certificate = X509CertificateLoader.LoadCertificate(reader.ReadBytesWithLength()),
             SignedThumbprint = reader.ReadBytesWithLength().ToArray()
         };
 
diff --git a/lib/ShortDev.Microsoft.ConnectedDevices/ShortDev.Microsoft.ConnectedDevices.csproj b/lib/ShortDev.Microsoft.ConnectedDevices/ShortDev.Microsoft.ConnectedDevices.csproj
index 341487c3..b3c131bf 100644
--- a/lib/ShortDev.Microsoft.ConnectedDevices/ShortDev.Microsoft.ConnectedDevices.csproj
+++ b/lib/ShortDev.Microsoft.ConnectedDevices/ShortDev.Microsoft.ConnectedDevices.csproj
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
 	<PropertyGroup>
-		<TargetFramework>net8.0</TargetFramework>
+		<TargetFramework>net9.0</TargetFramework>
 		<WarningsAsErrors>Nullable</WarningsAsErrors>
 		<Version>0.1.0</Version>
 		<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
diff --git a/src/NearShare.Android.csproj b/src/NearShare.Android.csproj
index d0aef1d9..b225a039 100644
--- a/src/NearShare.Android.csproj
+++ b/src/NearShare.Android.csproj
@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
 	<PropertyGroup>
-		<TargetFramework>net8.0-android34.0</TargetFramework>
+		<TargetFramework>net9.0-android35.0</TargetFramework>
 		<OutputType>Exe</OutputType>
 		<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
 		<ApplicationId>de.shortdev.nearby_sharing_windows</ApplicationId>
diff --git a/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/End2EndTest.cs b/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/End2EndTest.cs
index b0666382..14b83c1b 100644
--- a/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/End2EndTest.cs
+++ b/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/End2EndTest.cs
@@ -4,7 +4,6 @@
 using ShortDev.Microsoft.ConnectedDevices.Transports.Bluetooth;
 using ShortDev.Microsoft.ConnectedDevices.Transports.Network;
 using System.Net;
-using Xunit.Abstractions;
 
 namespace ShortDev.Microsoft.ConnectedDevices.Test.E2E;
 
@@ -54,14 +53,14 @@ public async Task TransferUri(bool useTcp1, bool useTcp2)
         if (useTcp1)
             UseTcp(device1, tcpPort: 5041, udpPort: 5051);
 
-        device1.Discover(cancellationToken: default);
+        device1.Discover(TestContext.Current.CancellationToken);
 
         using var device2 = CreateDevice(network, "Device 2", "81-7A-80-8F-D5-80");
         if (useTcp2)
             UseTcp(device2, tcpPort: 5041, udpPort: 5051);
 
-        device2.Advertise(cancellationToken: default);
-        device2.Listen(cancellationToken: default);
+        device2.Advertise(TestContext.Current.CancellationToken);
+        device2.Listen(TestContext.Current.CancellationToken);
 
         TaskCompletionSource<UriTransferToken> receivePromise = new();
         NearShareReceiver.ReceivedUri += receivePromise.SetResult;
@@ -73,7 +72,8 @@ public async Task TransferUri(bool useTcp1, bool useTcp2)
             await sender.SendUriAsync(
                 device: new("Device 2", DeviceType.Linux, Endpoint:
                     new(Transports.CdpTransportType.Rfcomm, "81-7A-80-8F-D5-80", "ServiceId")
-                ), new Uri("https://nearshare.shortdev.de/")
+                ), new Uri("https://nearshare.shortdev.de/"),
+                TestContext.Current.CancellationToken
             );
 
             var token = await receivePromise.Task;
@@ -99,14 +99,14 @@ public async Task TransferFile(bool useTcp1, bool useTcp2)
         if (useTcp1)
             UseTcp(device1, tcpPort: 5041, udpPort: 5051);
 
-        device1.Discover(cancellationToken: default);
+        device1.Discover(TestContext.Current.CancellationToken);
 
         using var device2 = CreateDevice(network, "Device 2", "81-7A-80-8F-D5-80");
         if (useTcp2)
             UseTcp(device2, tcpPort: 5041, udpPort: 5051);
 
-        device2.Advertise(cancellationToken: default);
-        device2.Listen(cancellationToken: default);
+        device2.Advertise(TestContext.Current.CancellationToken);
+        device2.Listen(TestContext.Current.CancellationToken);
 
         var buffer = new byte[Random.Shared.Next(1_000, 1_000_000)];
         outputHelper.WriteLine($"[Information]: Generated buffer with size {buffer.LongLength}");
@@ -125,7 +125,8 @@ await sender.SendFileAsync(
                     new(Transports.CdpTransportType.Rfcomm, "81-7A-80-8F-D5-80", "ServiceId")
                 ),
                 CdpFileProvider.FromBuffer("TestFile", buffer),
-                new Progress<NearShareProgress>()
+                new Progress<NearShareProgress>(),
+                TestContext.Current.CancellationToken
             );
 
             await receivePromise.Task;
@@ -140,7 +141,7 @@ await sender.SendFileAsync(
         void OnFileTransfer(FileTransferToken token)
         {
             Assert.Equal("Device 1", token.DeviceName);
-            Assert.Equal(1, token.Files.Count);
+            Assert.Single(token.Files);
             Assert.Equal("TestFile", token.Files[0].Name);
             Assert.Equal((ulong)buffer.LongLength, token.Files[0].Size);
 
diff --git a/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/TestLoggerProvider.cs b/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/TestLoggerProvider.cs
index 1733432a..55219aad 100644
--- a/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/TestLoggerProvider.cs
+++ b/tests/ShortDev.Microsoft.ConnectedDevices.Test/E2E/TestLoggerProvider.cs
@@ -1,5 +1,4 @@
 using Microsoft.Extensions.Logging;
-using Xunit.Abstractions;
 
 namespace ShortDev.Microsoft.ConnectedDevices.Test.E2E;
 
diff --git a/tests/ShortDev.Microsoft.ConnectedDevices.Test/SerializationTest.cs b/tests/ShortDev.Microsoft.ConnectedDevices.Test/SerializationTest.cs
index 20794147..e7f91ba5 100644
--- a/tests/ShortDev.Microsoft.ConnectedDevices.Test/SerializationTest.cs
+++ b/tests/ShortDev.Microsoft.ConnectedDevices.Test/SerializationTest.cs
@@ -2,8 +2,6 @@
 using ShortDev.Microsoft.ConnectedDevices.Messages;
 using ShortDev.Microsoft.ConnectedDevices.NearShare.Messages;
 using ShortDev.Microsoft.ConnectedDevices.Serialization;
-using System.Diagnostics;
-using Xunit.Abstractions;
 
 namespace ShortDev.Microsoft.ConnectedDevices.Test;
 
@@ -16,7 +14,7 @@ static SerializationTest()
 
     private readonly ITestOutputHelper _output = output;
 
-    public static IEnumerable<object[]> GenerateMsgTypes()
+    public static IEnumerable<TheoryDataRow<Type>> GenerateMsgTypes()
     {
         var assembly = typeof(CommonHeader).Assembly;
         foreach (var type in assembly.DefinedTypes)
@@ -26,7 +24,7 @@ public static IEnumerable<object[]> GenerateMsgTypes()
                 IsOk(typeof(ICdpPayload<>), type) &&
                 type.Name != "PresenceResponse"
             )
-                yield return new object[] { type };
+                yield return type;
         }
 
         static bool IsOk(Type TInterface, Type TClass)
@@ -56,7 +54,7 @@ static void TestRun<T>(Endianness endianness) where T : ICdpSerializable<T>
             Type type = typeof(T);
 
             // allocate
-            var instance = (T)TestValueGenerator.RandomValue(typeof(T));
+            var instance = TestValueGenerator.RandomValue<T>();
 
             // write - 1st pass
             EndianWriter writer = new(endianness);
diff --git a/tests/ShortDev.Microsoft.ConnectedDevices.Test/ShortDev.Microsoft.ConnectedDevices.Test.csproj b/tests/ShortDev.Microsoft.ConnectedDevices.Test/ShortDev.Microsoft.ConnectedDevices.Test.csproj
index 3e46f736..748a1018 100644
--- a/tests/ShortDev.Microsoft.ConnectedDevices.Test/ShortDev.Microsoft.ConnectedDevices.Test.csproj
+++ b/tests/ShortDev.Microsoft.ConnectedDevices.Test/ShortDev.Microsoft.ConnectedDevices.Test.csproj
@@ -1,28 +1,27 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
-  <PropertyGroup>
-    <TargetFramework>net8.0</TargetFramework>
-    <IsPackable>false</IsPackable>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-  </PropertyGroup>
+	<PropertyGroup>
+		<OutputType>Exe</OutputType>
+		<TargetFramework>net9.0</TargetFramework>
+		<IsPackable>false</IsPackable>
+		<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+	</PropertyGroup>
 
-  <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
-    <PackageReference Include="xunit" Version="2.4.2" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-      <PrivateAssets>all</PrivateAssets>
-    </PackageReference>
-    <PackageReference Include="coverlet.collector" Version="3.1.2">
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-      <PrivateAssets>all</PrivateAssets>
-    </PackageReference>
-  </ItemGroup>
+	<ItemGroup>
+		<PackageReference Include="Microsoft.TestPlatform.TestHost" Version="17.12.0" />
+		<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
+		<PackageReference Include="xunit.runner.visualstudio" Version="3.0.0">
+			<PrivateAssets>all</PrivateAssets>
+		</PackageReference>
+		<PackageReference Include="coverlet.collector" Version="6.0.3">
+			<PrivateAssets>all</PrivateAssets>
+		</PackageReference>
+		<PackageReference Include="xunit.v3" Version="1.0.0" />
+	</ItemGroup>
 
-  <ItemGroup>
-    <ProjectReference Include="..\..\lib\ShortDev.Microsoft.ConnectedDevices.NearShare\ShortDev.Microsoft.ConnectedDevices.NearShare.csproj" />
-    <ProjectReference Include="..\..\lib\ShortDev.Microsoft.ConnectedDevices\ShortDev.Microsoft.ConnectedDevices.csproj" />
-  </ItemGroup>
+	<ItemGroup>
+		<ProjectReference Include="..\..\lib\ShortDev.Microsoft.ConnectedDevices.NearShare\ShortDev.Microsoft.ConnectedDevices.NearShare.csproj" />
+		<ProjectReference Include="..\..\lib\ShortDev.Microsoft.ConnectedDevices\ShortDev.Microsoft.ConnectedDevices.csproj" />
+	</ItemGroup>
 
 </Project>
diff --git a/tests/ShortDev.Microsoft.ConnectedDevices.Test/UtilsTest.cs b/tests/ShortDev.Microsoft.ConnectedDevices.Test/UtilsTest.cs
index d135e3ff..d86d405d 100644
--- a/tests/ShortDev.Microsoft.ConnectedDevices.Test/UtilsTest.cs
+++ b/tests/ShortDev.Microsoft.ConnectedDevices.Test/UtilsTest.cs
@@ -1,6 +1,4 @@
-using Xunit.Abstractions;
-
-namespace ShortDev.Microsoft.ConnectedDevices.Test;
+namespace ShortDev.Microsoft.ConnectedDevices.Test;
 public sealed class UtilsTest(ITestOutputHelper output)
 {
     [Theory]
@@ -19,7 +17,7 @@ await LongRunningOperationWithThrow(delayMs)
         });
 
         // Wait for long-running task to complete
-        await Task.Delay(delayMs * 2);
+        await Task.Delay(delayMs * 2, TestContext.Current.CancellationToken);
     }
 
     [Theory]
@@ -38,7 +36,7 @@ await LongRunningOperationWithThrow(delayMs)
         });
 
         // Wait for long-running task to complete
-        await Task.Delay(delayMs * 2);
+        await Task.Delay(delayMs * 2, TestContext.Current.CancellationToken);
     }
 
     static async Task<object> LongRunningOperationWithThrow(int delayMs)