diff --git a/.gitignore b/.gitignore
index 3e759b75..f7e3a3e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -328,3 +328,8 @@ ASALocalRun/
# MFractors (Xamarin productivity tool) working folder
.mfractor/
+
+
+#dont save code coverage results
+coverage.opencover.xml
+coverage.json
diff --git a/src/Caliburn.Micro.Maui.Tests/ActionMessageTests.cs b/src/Caliburn.Micro.Maui.Tests/ActionMessageTests.cs
new file mode 100644
index 00000000..32d77ece
--- /dev/null
+++ b/src/Caliburn.Micro.Maui.Tests/ActionMessageTests.cs
@@ -0,0 +1,49 @@
+namespace Caliburn.Micro.Maui.Tests
+{
+ public class ActionMessageTests
+ {
+ [Fact]
+ public void MethodName_ShouldBeSetAndRetrievedCorrectly()
+ {
+ // Arrange
+ var actionMessage = new ActionMessage();
+ var expectedMethodName = "TestMethod";
+
+ // Act
+ actionMessage.MethodName = expectedMethodName;
+ var actualMethodName = actionMessage.MethodName;
+
+ // Assert
+ Assert.Equal(expectedMethodName, actualMethodName);
+ }
+
+ [Fact]
+ public void Handler_ShouldBeSetAndRetrievedCorrectly()
+ {
+ // Arrange
+ var actionMessage = new ActionMessage();
+ var expectedHandler = new object();
+
+ // Act
+ actionMessage.Handler = expectedHandler;
+ var actualHandler = actionMessage.Handler;
+
+ // Assert
+ Assert.Equal(expectedHandler, actualHandler);
+ }
+
+ [Fact]
+ public void Parameters_ShouldBeInitialized()
+ {
+ // Arrange
+ var actionMessage = new ActionMessage();
+
+ // Act
+ var parameters = actionMessage.Parameters;
+
+ // Assert
+ Assert.NotNull(parameters);
+ }
+
+ }
+}
diff --git a/src/Caliburn.Micro.Maui.Tests/AssemblyCacheTests.cs b/src/Caliburn.Micro.Maui.Tests/AssemblyCacheTests.cs
new file mode 100644
index 00000000..afa1aac5
--- /dev/null
+++ b/src/Caliburn.Micro.Maui.Tests/AssemblyCacheTests.cs
@@ -0,0 +1,34 @@
+namespace Caliburn.Micro.Maui.Tests
+{
+ public class AssemblyCacheTests
+ {
+ [Fact]
+ public void AddingTheSameAssemblyMoreThanOneShouldNotThrow()
+ {
+ AssemblySourceCache.Install();
+
+ var testAssembly = typeof(AssemblyCacheTests).Assembly;
+ AssemblySource.Instance.Add(testAssembly);
+
+ //Re-add the same assembly
+ var exception = Record.Exception(() => AssemblySource.Instance.Add(testAssembly));
+ Assert.Null(exception);
+ }
+
+ [Fact]
+ public void ResettingTheCacheWithMoreThanOneAssemblyShouldNotThrow()
+ {
+ AssemblySourceCache.Install();
+
+ var testAssembly = typeof(AssemblyCacheTests).Assembly;
+
+ AssemblySource.Instance.AddRange(new[] { testAssembly, testAssembly });
+
+ //Refresh clears and re-creates the cache
+ var exception = Record.Exception(() => AssemblySource.Instance.Refresh());
+ Assert.Null(exception);
+ }
+ }
+
+
+}
diff --git a/src/Caliburn.Micro.Maui.Tests/Caliburn.Micro.Maui.Tests.csproj b/src/Caliburn.Micro.Maui.Tests/Caliburn.Micro.Maui.Tests.csproj
new file mode 100644
index 00000000..341ab555
--- /dev/null
+++ b/src/Caliburn.Micro.Maui.Tests/Caliburn.Micro.Maui.Tests.csproj
@@ -0,0 +1,37 @@
+
+
+
+ net8.0
+ enable
+ enable
+ true
+ false
+ true
+
+
+ 10.0
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Caliburn.Micro.Maui.Tests/FormsPlatformProviderTests.cs b/src/Caliburn.Micro.Maui.Tests/FormsPlatformProviderTests.cs
new file mode 100644
index 00000000..8cbf616a
--- /dev/null
+++ b/src/Caliburn.Micro.Maui.Tests/FormsPlatformProviderTests.cs
@@ -0,0 +1,126 @@
+using Moq;
+
+namespace Caliburn.Micro.Maui.Tests
+{
+ public class FormsPlatformProviderTests
+ {
+ private readonly Mock mockPlatformProvider;
+ private readonly FormsPlatformProvider formsPlatformProvider;
+
+ public FormsPlatformProviderTests()
+ {
+ mockPlatformProvider = new Mock();
+ formsPlatformProvider = new FormsPlatformProvider(mockPlatformProvider.Object);
+ }
+
+ [Fact]
+ public void InDesignMode_ShouldReturnPlatformProviderInDesignMode()
+ {
+ // Arrange
+ mockPlatformProvider.Setup(p => p.InDesignMode).Returns(true);
+
+ // Act
+ var result = formsPlatformProvider.InDesignMode;
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void PropertyChangeNotificationsOnUIThread_ShouldReturnPlatformProviderPropertyChangeNotificationsOnUIThread()
+ {
+ // Arrange
+ mockPlatformProvider.Setup(p => p.PropertyChangeNotificationsOnUIThread).Returns(true);
+
+ // Act
+ var result = formsPlatformProvider.PropertyChangeNotificationsOnUIThread;
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void BeginOnUIThread_ShouldCallPlatformProviderBeginOnUIThread()
+ {
+ // Arrange
+ System.Action action = () => { };
+
+ // Act
+ formsPlatformProvider.BeginOnUIThread(action);
+
+ // Assert
+ mockPlatformProvider.Verify(p => p.BeginOnUIThread(action), Times.Once);
+ }
+
+ [Fact]
+ public async Task OnUIThreadAsync_ShouldCallPlatformProviderOnUIThreadAsync()
+ {
+ // Arrange
+ Func action = async () => await Task.CompletedTask;
+
+ // Act
+ await formsPlatformProvider.OnUIThreadAsync(action);
+
+ // Assert
+ mockPlatformProvider.Verify(p => p.OnUIThreadAsync(action), Times.Once);
+ }
+
+ [Fact]
+ public void OnUIThread_ShouldCallPlatformProviderOnUIThread()
+ {
+ // Arrange
+ System.Action action = () => { };
+
+ // Act
+ formsPlatformProvider.OnUIThread(action);
+
+ // Assert
+ mockPlatformProvider.Verify(p => p.OnUIThread(action), Times.Once);
+ }
+
+ [Fact]
+ public void ExecuteOnFirstLoad_ShouldCallPlatformProviderExecuteOnFirstLoad_WhenViewIsNotPage()
+ {
+ // Arrange
+ var view = new object();
+ Action