diff --git a/src/ComplexSerializerTest.sln b/src/ComplexSerializerTest.sln
new file mode 100644
index 0000000..a695ad1
--- /dev/null
+++ b/src/ComplexSerializerTest.sln
@@ -0,0 +1,43 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.10.34607.79
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sender", "Sender\Sender.csproj", "{A585D41C-B732-42AD-81ED-572080D2021E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Receiver", "Receiver\Receiver.csproj", "{377D6303-9705-4245-980D-50450B63FA1C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageContracts", "MessageContracts\MessageContracts.csproj", "{EC1E505C-A782-4A97-AA38-583C0EB245A9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Messages", "Messages\Messages.csproj", "{77899F03-CEFC-4862-AEBF-073C105A9645}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {A585D41C-B732-42AD-81ED-572080D2021E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A585D41C-B732-42AD-81ED-572080D2021E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A585D41C-B732-42AD-81ED-572080D2021E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A585D41C-B732-42AD-81ED-572080D2021E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {377D6303-9705-4245-980D-50450B63FA1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {377D6303-9705-4245-980D-50450B63FA1C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {377D6303-9705-4245-980D-50450B63FA1C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {377D6303-9705-4245-980D-50450B63FA1C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC1E505C-A782-4A97-AA38-583C0EB245A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC1E505C-A782-4A97-AA38-583C0EB245A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC1E505C-A782-4A97-AA38-583C0EB245A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC1E505C-A782-4A97-AA38-583C0EB245A9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {77899F03-CEFC-4862-AEBF-073C105A9645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {77899F03-CEFC-4862-AEBF-073C105A9645}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {77899F03-CEFC-4862-AEBF-073C105A9645}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {77899F03-CEFC-4862-AEBF-073C105A9645}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {DAC70A48-A91C-4832-B7F2-B67621CFC55D}
+ EndGlobalSection
+EndGlobal
diff --git a/src/MessageContracts/Contracts.cs b/src/MessageContracts/Contracts.cs
new file mode 100644
index 0000000..85bac25
--- /dev/null
+++ b/src/MessageContracts/Contracts.cs
@@ -0,0 +1,11 @@
+namespace MessageContracts;
+
+public interface IComplexContract
+{
+ IComplexChild? Child { get; }
+}
+
+public interface IComplexChild
+{
+ bool IsComplex { get; }
+}
diff --git a/src/MessageContracts/MessageContracts.csproj b/src/MessageContracts/MessageContracts.csproj
new file mode 100644
index 0000000..fa71b7a
--- /dev/null
+++ b/src/MessageContracts/MessageContracts.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/src/Messages/Class1.cs b/src/Messages/Class1.cs
new file mode 100644
index 0000000..8f8b644
--- /dev/null
+++ b/src/Messages/Class1.cs
@@ -0,0 +1,14 @@
+using MessageContracts;
+
+namespace Messages;
+
+public class ConcreteContract : IComplexContract
+{
+ public ConcreteChild? Child { get; set; }
+ IComplexChild? IComplexContract.Child => Child;
+}
+
+public class ConcreteChild : IComplexChild
+{
+ public bool IsComplex => true;
+}
\ No newline at end of file
diff --git a/src/Messages/Messages.csproj b/src/Messages/Messages.csproj
new file mode 100644
index 0000000..e026a64
--- /dev/null
+++ b/src/Messages/Messages.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/src/Receiver/ComplexContractHandler.cs b/src/Receiver/ComplexContractHandler.cs
new file mode 100644
index 0000000..b5a6880
--- /dev/null
+++ b/src/Receiver/ComplexContractHandler.cs
@@ -0,0 +1,12 @@
+using MessageContracts;
+
+namespace Receiver;
+
+class ComplexContractHandler : IHandleMessages
+{
+ public Task Handle(IComplexContract message, IMessageHandlerContext context)
+ {
+ Console.WriteLine($"Received message {message?.Child?.IsComplex}");
+ return Task.CompletedTask;
+ }
+}
diff --git a/src/Receiver/Program.cs b/src/Receiver/Program.cs
new file mode 100644
index 0000000..b50f9dd
--- /dev/null
+++ b/src/Receiver/Program.cs
@@ -0,0 +1,21 @@
+using MessageContracts;
+
+Console.Title = "Receiver";
+
+var endpointConfig = new EndpointConfiguration("Receiver");
+
+endpointConfig.UseTransport();
+endpointConfig.UseSerialization();
+
+endpointConfig.Conventions().DefiningMessagesAs(t => t.Assembly == typeof(IComplexContract).Assembly
+ || t.Name == "ConcreteContract");
+
+var endpoint = await Endpoint.Start(endpointConfig);
+
+while(Console.ReadKey(true).Key != ConsoleKey.Escape)
+{
+
+}
+
+await endpoint.Stop();
+
diff --git a/src/Receiver/Receiver.csproj b/src/Receiver/Receiver.csproj
new file mode 100644
index 0000000..a1b1d9c
--- /dev/null
+++ b/src/Receiver/Receiver.csproj
@@ -0,0 +1,18 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Sender/Program.cs b/src/Sender/Program.cs
new file mode 100644
index 0000000..32e3bdc
--- /dev/null
+++ b/src/Sender/Program.cs
@@ -0,0 +1,31 @@
+using MessageContracts;
+using Messages;
+
+Console.Title = "Sender";
+
+var endpointConfig = new EndpointConfiguration("Sender");
+
+endpointConfig.UseTransport();
+endpointConfig.UseSerialization();
+endpointConfig.Conventions().DefiningMessagesAs(t => t.Assembly == typeof(IComplexContract).Assembly
+ || t == typeof(ConcreteContract));
+
+var endpoint = await Endpoint.Start(endpointConfig);
+
+Console.WriteLine("Started");
+
+while (Console.ReadKey(true).Key != ConsoleKey.Escape)
+{
+ await endpoint.Send(
+ "Receiver",
+ new ConcreteContract
+ {
+ Child = new ConcreteChild()
+ }
+ );
+ Console.WriteLine("Message sent");
+}
+
+await endpoint.Stop();
+
+Console.WriteLine("Stopped");
diff --git a/src/Sender/Sender.csproj b/src/Sender/Sender.csproj
new file mode 100644
index 0000000..3c923ba
--- /dev/null
+++ b/src/Sender/Sender.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+