diff --git a/ExampleApp/ExampleApp.csproj b/ExampleApp/ExampleApp.csproj
new file mode 100644
index 000000000..df4d8156d
--- /dev/null
+++ b/ExampleApp/ExampleApp.csproj
@@ -0,0 +1,15 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/ExampleApp/Program.cs b/ExampleApp/Program.cs
new file mode 100644
index 000000000..da3e45d50
--- /dev/null
+++ b/ExampleApp/Program.cs
@@ -0,0 +1,100 @@
+// ReSharper disable AccessToDisposedClosure
+
+using System.Text;
+using NATS.Client;
+using NATS.Client.JetStream;
+
+await using var client = new NatsClient();
+
+CancellationTokenSource cts = new();
+
+// Subscribe for int, string, bytes, json
+List tasks =
+[
+ Task.Run(async () =>
+ {
+ await foreach (var msg in client.SubscribeAsync("x.int", cancellationToken: cts.Token))
+ {
+ Console.WriteLine($"Received int: {msg.Data}");
+ }
+ }),
+
+ Task.Run(async () =>
+ {
+ await foreach (var msg in client.SubscribeAsync("x.string", cancellationToken: cts.Token))
+ {
+ Console.WriteLine($"Received string: {msg.Data}");
+ }
+ }),
+
+ Task.Run(async () =>
+ {
+ await foreach (var msg in client.SubscribeAsync("x.bytes", cancellationToken: cts.Token))
+ {
+ if (msg.Data != null)
+ {
+ Console.WriteLine($"Received bytes: {Encoding.UTF8.GetString(msg.Data)}");
+ }
+ }
+ }),
+
+ Task.Run(async () =>
+ {
+ await foreach (var msg in client.SubscribeAsync("x.json", cancellationToken: cts.Token))
+ {
+ Console.WriteLine($"Received data: {msg.Data}");
+ }
+ }),
+
+ Task.Run(async () =>
+ {
+ await foreach (var msg in client.SubscribeAsync("x.service", cancellationToken: cts.Token))
+ {
+ if (msg.Data != null)
+ {
+ Console.WriteLine($"Replying to data: {msg.Data}");
+ await msg.ReplyAsync($"Thank you {msg.Data.Name} your Id is {msg.Data.Id}!");
+ }
+ }
+ }),
+
+ Task.Run(async () =>
+ {
+ var id = 0;
+ await foreach (var msg in client.SubscribeAsync