refactor(csharp): rewrite integration tests to remove DependsOn (#2710)

Remove all DependsOn attributes from 11 test files. Each test now
creates its own resources with unique names via Guid.NewGuid(), ensuring
full isolation and eliminating ordering dependencies.

Delete 16 unused fixture, helper, and model files that were only needed
by the old DependsOn-based test structure.

Closes #2654
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
index 7e11092..aaf5161 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/ConsumerGroupTests.cs
@@ -21,195 +21,235 @@
 using Apache.Iggy.IggyClient;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class ConsumerGroupTests
 {
-    private static readonly uint GroupId = 0;
-    private static readonly string GroupName = "test_consumer_group";
-    private Identifier TopicId => Identifier.String(Fixture.TopicId);
+    private const uint PartitionsCount = 10;
+    private const string TopicName = "cg-topic";
+    private const string GroupName = "test_consumer_group";
 
-    [ClassDataSource<ConsumerGroupFixture>(Shared = SharedType.PerClass)]
-    public required ConsumerGroupFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName)> CreateStreamAndTopic(Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"cg-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), TopicName, PartitionsCount);
+        return (client, streamName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateConsumerGroup_HappyPath_Should_CreateConsumerGroup_Successfully(Protocol protocol)
     {
-        var consumerGroup
-            = await Fixture.Clients[protocol]
-                .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    GroupName);
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
+        var consumerGroup = await client.CreateConsumerGroupAsync(
+            Identifier.String(streamName), Identifier.String(TopicName), GroupName);
 
         consumerGroup.ShouldNotBeNull();
-        consumerGroup.Id.ShouldBe(GroupId);
-        consumerGroup.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        consumerGroup.Id.ShouldBeGreaterThanOrEqualTo(0u);
+        consumerGroup.PartitionsCount.ShouldBe(PartitionsCount);
         consumerGroup.MembersCount.ShouldBe(0u);
         consumerGroup.Name.ShouldBe(GroupName);
     }
 
     [Test]
-    [DependsOn(nameof(CreateConsumerGroup_HappyPath_Should_CreateConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateConsumerGroup_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    GroupName));
+            client.CreateConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), GroupName));
     }
 
     [Test]
-    [DependsOn(nameof(CreateConsumerGroup_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroupById_Should_Return_ValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetConsumerGroupByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
+        var response = await client.GetConsumerGroupByIdAsync(
+            Identifier.String(streamName), Identifier.String(TopicName),
+            Identifier.Numeric(cg!.Id));
 
         response.ShouldNotBeNull();
-        response.Id.ShouldBe(GroupId);
+        response.Id.ShouldBe(cg.Id);
         response.Name.ShouldBe(GroupName);
-        response.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        response.PartitionsCount.ShouldBe(PartitionsCount);
         response.MembersCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(GetConsumerGroupById_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroups_Should_Return_ValidResponse(Protocol protocol)
     {
-        IReadOnlyList<ConsumerGroupResponse> response
-            = await Fixture.Clients[protocol]
-                .GetConsumerGroupsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId);
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
+        IReadOnlyList<ConsumerGroupResponse> response = await client.GetConsumerGroupsAsync(
+            Identifier.String(streamName), Identifier.String(TopicName));
 
         response.ShouldNotBeNull();
         response.Count.ShouldBe(1);
 
         var group = response.FirstOrDefault();
         group.ShouldNotBeNull();
-        group.Id.ShouldBe(GroupId);
         group.Name.ShouldBe(GroupName);
-        group.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        group.PartitionsCount.ShouldBe(PartitionsCount);
         group.MembersCount.ShouldBe(0u);
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetConsumerGroups_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Tcp_Should_JoinConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
+
+        // Verify via GetMe that the client is now a member of the consumer group
+        var me = await client.GetMeAsync();
+        me.ShouldNotBeNull();
+        me.ConsumerGroupsCount.ShouldBe(1);
+        me.ConsumerGroups.ShouldContain(x => x.GroupId == (int)cg!.Id);
     }
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(GetConsumerGroups_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(JoinConsumerGroup_Tcp_Should_JoinConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LeaveConsumerGroup_Tcp_Should_LeaveConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+        await client.JoinConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), Identifier.Numeric(cg!.Id));
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .LeaveConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.LeaveConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg.Id)));
+
+        // Verify via GetMe that the client is no longer a member of the consumer group
+        var me = await client.GetMeAsync();
+        me.ShouldNotBeNull();
+        me.ConsumerGroupsCount.ShouldBe(0);
+        me.ConsumerGroups.ShouldNotContain(x => x.GroupId == (int)cg.Id);
     }
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(JoinConsumerGroup_Http_Should_Throw_FeatureUnavailable))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LeaveConsumerGroup_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol]
-                .LeaveConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.LeaveConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(LeaveConsumerGroup_Http_Should_Throw_FeatureUnavailable))]
-    [DependsOn(nameof(LeaveConsumerGroup_Tcp_Should_LeaveConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetConsumerGroupById_WithMembers_Should_Return_ValidResponse(Protocol protocol)
     {
-        var clientIds = new List<uint>();
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         var clients = new List<IIggyClient>();
         for (var i = 0; i < 2; i++)
         {
-            var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-            clients.Add(client);
-            await client.LoginUser("iggy", "iggy");
-            var me = await client.GetMeAsync();
-            clientIds.Add(me!.ClientId);
-            await client.JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+            var memberClient = await Fixture.CreateClient(Protocol.Tcp);
+            clients.Add(memberClient);
+            await memberClient.LoginUser("iggy", "iggy");
+            await memberClient.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id));
         }
 
-        var response = await Fixture.Clients[protocol]
-            .GetConsumerGroupByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                Identifier.Numeric(GroupId));
+        var response = await client.GetConsumerGroupByIdAsync(
+            Identifier.String(streamName), Identifier.String(TopicName),
+            Identifier.Numeric(cg!.Id));
 
         response.ShouldNotBeNull();
-        response.Id.ShouldBe(GroupId);
-        response.PartitionsCount.ShouldBe(Fixture.PartitionsCount);
+        response.Id.ShouldBe(cg.Id);
+        response.PartitionsCount.ShouldBe(PartitionsCount);
         response.MembersCount.ShouldBe(2u);
         response.Members.ShouldNotBeNull();
         response.Members.Count.ShouldBe(2);
-        response.Members.ShouldAllBe(x => x.PartitionsCount >= 1 && x.PartitionsCount < (int)Fixture.PartitionsCount);
-        response.Members.ShouldAllBe(x => x.Partitions.Count >= 1 && x.Partitions.Count < (int)Fixture.PartitionsCount);
-        response.Members.Sum(x => x.PartitionsCount).ShouldBe((int)Fixture.PartitionsCount);
+        response.Members.ShouldAllBe(x => x.PartitionsCount >= 1 && x.PartitionsCount < (int)PartitionsCount);
+        response.Members.ShouldAllBe(x => x.Partitions.Count >= 1 && x.Partitions.Count < (int)PartitionsCount);
+        response.Members.Sum(x => x.PartitionsCount).ShouldBe((int)PartitionsCount);
     }
 
     [Test]
-    [DependsOn(nameof(GetConsumerGroupById_WithMembers_Should_Return_ValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteConsumerGroup_Should_DeleteConsumerGroup_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+        var cg = await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), GroupName);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteConsumerGroupAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId, Identifier.Numeric(GroupId)));
+            client.DeleteConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(cg!.Id)));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteConsumerGroup_Should_DeleteConsumerGroup_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task JoinConsumerGroup_Tcp_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
+        // Try to join a consumer group that doesn't exist
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId,
-                    Identifier.Numeric(GroupId)));
+            client.JoinConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(99999)));
     }
 
-
     [Test]
-    [DependsOn(nameof(JoinConsumerGroup_Tcp_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteConsumerGroup_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamAndTopic(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteConsumerGroupAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicId, Identifier.Numeric(GroupId)));
+            client.DeleteConsumerGroupAsync(Identifier.String(streamName),
+                Identifier.String(TopicName), Identifier.Numeric(99999)));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
index b5d0fae..4a32eff 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/FetchMessagesTests.cs
@@ -15,37 +15,65 @@
 // // specific language governing permissions and limitations
 // // under the License.
 
+using System.Text;
 using Apache.Iggy.Contracts;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Headers;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Kinds;
-using Apache.Iggy.Tests.Integrations.Attributes;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class FetchMessagesTests
 {
-    [ClassDataSource<FetchMessagesFixture>(Shared = SharedType.PerClass)]
-    public required FetchMessagesFixture Fixture { get; init; }
+    private const int MessageCount = 20;
+    private const string TopicName = "topic";
+    private const string HeadersTopicName = "headers-topic";
 
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName)> CreateStreamWithMessages(Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"fetch-msg-{Guid.NewGuid():N}";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), TopicName, 1);
+        await client.CreateTopicAsync(Identifier.String(streamName), HeadersTopicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(TopicName), Partitioning.None(),
+            CreateMessagesWithoutHeader(MessageCount));
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(HeadersTopicName), Partitioning.None(),
+            CreateMessagesWithHeader(MessageCount));
+
+        return (client, streamName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_WithNoHeaders_Should_PollMessages_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].PollMessagesAsync(new MessageFetchRequest
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
+        var response = await client.PollMessagesAsync(new MessageFetchRequest
         {
             Count = 10,
             AutoCommit = true,
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.String(Fixture.TopicRequest.Name)
+            StreamId = Identifier.String(streamName),
+            TopicId = Identifier.String(TopicName)
         });
 
         response.Messages.Count.ShouldBe(10);
@@ -61,10 +89,11 @@
     }
 
     [Test]
-    [DependsOn(nameof(PollMessages_WithNoHeaders_Should_PollMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_InvalidTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
         var invalidFetchRequest = new MessageFetchRequest
         {
             Count = 10,
@@ -72,19 +101,20 @@
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+            StreamId = Identifier.String(streamName),
             TopicId = Identifier.Numeric(2137)
         };
 
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].PollMessagesAsync(invalidFetchRequest));
+            client.PollMessagesAsync(invalidFetchRequest));
     }
 
     [Test]
-    [DependsOn(nameof(PollMessages_InvalidTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PollMessages_WithHeaders_Should_PollMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName) = await CreateStreamWithMessages(protocol);
+
         var headersMessageFetchRequest = new MessageFetchRequest
         {
             Count = 10,
@@ -92,12 +122,11 @@
             Consumer = Consumer.New(1),
             PartitionId = 0,
             PollingStrategy = PollingStrategy.Next(),
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.String(Fixture.TopicHeadersRequest.Name)
+            StreamId = Identifier.String(streamName),
+            TopicId = Identifier.String(HeadersTopicName)
         };
 
-
-        var response = await Fixture.Clients[protocol].PollMessagesAsync(headersMessageFetchRequest);
+        var response = await client.PollMessagesAsync(headersMessageFetchRequest);
         response.Messages.Count.ShouldBe(10);
         response.PartitionId.ShouldBe(0);
         response.CurrentOffset.ShouldBe(19u);
@@ -109,4 +138,47 @@
             responseMessage.UserHeaders[HeaderKey.FromString("header2")].ToInt32().ShouldBeGreaterThan(0);
         }
     }
+
+    private static Message[] CreateMessagesWithoutHeader(int count)
+    {
+        var messages = new List<Message>();
+        for (var i = 0; i < count; i++)
+        {
+            var dummyJson = $$"""
+                              {
+                                "userId": {{i + 1}},
+                                "id": {{i + 1}},
+                                "title": "delete",
+                                "completed": false
+                              }
+                              """;
+            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)));
+        }
+
+        return messages.ToArray();
+    }
+
+    private static Message[] CreateMessagesWithHeader(int count)
+    {
+        var messages = new List<Message>();
+        for (var i = 0; i < count; i++)
+        {
+            var dummyJson = $$"""
+                              {
+                                "userId": {{i + 1}},
+                                "id": {{i + 1}},
+                                "title": "delete",
+                                "completed": false
+                              }
+                              """;
+            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(14 + i) }
+                }));
+        }
+
+        return messages.ToArray();
+    }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs
deleted file mode 100644
index f842556..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/ConsumerGroupFixture.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class ConsumerGroupFixture : IAsyncInitializer
-{
-    internal readonly uint PartitionsCount = 10;
-    internal readonly string StreamId = "ConsumerGroupStream";
-    internal readonly string TopicId = "ConsumerGroupTopic";
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)), TopicId,
-                PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs
deleted file mode 100644
index 5b2dd71..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FetchMessagesFixture.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using System.Text;
-using Apache.Iggy.Enums;
-using Apache.Iggy.Headers;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class FetchMessagesFixture : IAsyncInitializer
-{
-    internal readonly int MessageCount = 20;
-    internal readonly string StreamId = "FetchMessagesStream";
-    internal readonly CreateTestTopic TopicHeadersRequest = TopicFactory.CreateTopic("HeadersTopic");
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            var streamId = Identifier.String(StreamId.GetWithProtocol(client.Key));
-
-            await client.Value.CreateStreamAsync(streamId.GetString());
-            await client.Value.CreateTopicAsync(streamId, TopicRequest.Name,
-                TopicRequest.PartitionsCount);
-            await client.Value.CreateTopicAsync(streamId, TopicHeadersRequest.Name,
-                TopicHeadersRequest.PartitionsCount);
-
-            await client.Value.SendMessagesAsync(streamId, Identifier.String(TopicRequest.Name), Partitioning.None(),
-                CreateMessagesWithoutHeader(MessageCount));
-
-            await client.Value.SendMessagesAsync(streamId, Identifier.String(TopicHeadersRequest.Name),
-                Partitioning.None(), CreateMessagesWithHeader(MessageCount));
-        }
-    }
-
-    private static Message[] CreateMessagesWithoutHeader(int count)
-    {
-        var messages = new List<Message>();
-        for (var i = 0; i < count; i++)
-        {
-            var dummyJson = $$"""
-                              {
-                                "userId": {{i + 1}},
-                                "id": {{i + 1}},
-                                "title": "delete",
-                                "completed": false
-                              }
-                              """;
-            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)));
-        }
-
-        return messages.ToArray();
-    }
-
-    private static Message[] CreateMessagesWithHeader(int count)
-    {
-        var messages = new List<Message>();
-        for (var i = 0; i < count; i++)
-        {
-            var dummyJson = $$"""
-                              {
-                                "userId": {{i + 1}},
-                                "id": {{i + 1}},
-                                "title": "delete",
-                                "completed": false
-                              }
-                              """;
-            messages.Add(new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(14 + i) }
-                }));
-        }
-
-        return messages.ToArray();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs
deleted file mode 100644
index 511a4bc..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/FlushMessageFixture.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class FlushMessageFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "FlushMessageStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-
-            var messages = new Message[]
-            {
-                new(Guid.NewGuid(), "Test message 1"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 2"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 3"u8.ToArray()), new(Guid.NewGuid(), "Test message 4"u8.ToArray())
-            };
-            await client.Value.SendMessagesAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                Identifier.String(TopicRequest.Name), Partitioning.None(), messages);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
index 1c2fc9b..b3f41df 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/IggyServerFixture.cs
@@ -159,6 +159,14 @@
         return dictionary;
     }
 
+    public async Task<IIggyClient> CreateAuthenticatedClient(Protocol protocol, string userName = "iggy",
+        string password = "iggy")
+    {
+        return protocol == Protocol.Tcp
+            ? await CreateTcpClient(userName, password)
+            : await CreateHttpClient(userName, password);
+    }
+
     public async Task<IIggyClient> CreateTcpClient(string userName = "iggy", string password = "iggy",
         bool connect = true)
     {
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs
deleted file mode 100644
index 6e33f8c..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/OffsetFixtures.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-using Partitioning = Apache.Iggy.Kinds.Partitioning;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class OffsetFixtures : IAsyncInitializer
-{
-    internal readonly string StreamId = "OffsetStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-
-            var messages = new Message[]
-            {
-                new(Guid.NewGuid(), "Test message 1"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 2"u8.ToArray()),
-                new(Guid.NewGuid(), "Test message 3"u8.ToArray()), new(Guid.NewGuid(), "Test message 4"u8.ToArray())
-            };
-            await client.Value.SendMessagesAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                Identifier.String(TopicRequest.Name), Partitioning.None(), messages);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs
deleted file mode 100644
index cdd5fb9..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PartitionsFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class PartitionsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "PartitionsStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs
deleted file mode 100644
index b891a64..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/PersonalAccessTokenFixture.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class PersonalAccessTokenFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        var userTcp = "pat_user_tcp";
-        var userHttp = "pat_user_http";
-
-        Clients = await IggyServerFixture.CreateClients();
-
-        await Clients[Protocol.Tcp].CreateUser(userTcp, "iggy", UserStatus.Active);
-        await Clients[Protocol.Http].CreateUser(userHttp, "iggy", UserStatus.Active);
-
-        Clients[Protocol.Tcp] = await IggyServerFixture.CreateTcpClient(userTcp);
-        Clients[Protocol.Http] = await IggyServerFixture.CreateTcpClient(userHttp);
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs
deleted file mode 100644
index e8baf72..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SegmentsFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SegmentsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SegmentsStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("SegmentsTopic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs
deleted file mode 100644
index ec7b984..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SendMessageFixture.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SendMessageFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SendMessageStream";
-    internal readonly CreateTestTopic TopicRequest = TopicFactory.CreateTopic("Topic");
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-            await client.Value.CreateTopicAsync(Identifier.String(StreamId.GetWithProtocol(client.Key)),
-                TopicRequest.Name, TopicRequest.PartitionsCount);
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs
deleted file mode 100644
index 74a436d..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/StreamsFixture.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class StreamsFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs
deleted file mode 100644
index 2dcd09e..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/SystemFixture.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class SystemFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "SystemStream";
-    internal readonly int TotalClientsCount = 10;
-
-    private List<IIggyClient> AdditionalClients { get; } = new();
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        await CreateClientsAsync();
-    }
-
-    private async Task CreateClientsAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-        for (var i = 0; i < TotalClientsCount; i++)
-        {
-            var userName = $"iggy_{Protocol.Http}_{i}";
-            await Clients[Protocol.Http].CreateUser(userName, "iggy", UserStatus.Active);
-
-            var client = await IggyServerFixture.CreateClient(Protocol.Tcp, Protocol.Http);
-            AdditionalClients.Add(client);
-            var login = await client.LoginUser(userName, "iggy");
-
-            if (login!.UserId == 0)
-            {
-                throw new Exception("Failed to login user 'iggy'.");
-            }
-
-            await client.PingAsync();
-        }
-
-        // One client less for tcp due to a default client
-        for (var i = 0; i < TotalClientsCount - 1; i++)
-        {
-            var userName = $"iggy_{Protocol.Tcp}_{i}";
-            await Clients[Protocol.Tcp].CreateUser(userName, "iggy", UserStatus.Active);
-
-            var client = await IggyServerFixture.CreateClient(Protocol.Tcp, Protocol.Tcp);
-            AdditionalClients.Add(client);
-            var login = await client.LoginUser(userName, "iggy");
-            if (login!.UserId == 0)
-            {
-                throw new Exception("Failed to login user 'iggy'.");
-            }
-
-            await client.PingAsync();
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs
deleted file mode 100644
index b4cbca0..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/TopicsFixture.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class TopicsFixture : IAsyncInitializer
-{
-    internal readonly string StreamId = "TestStream";
-
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-
-        foreach (KeyValuePair<Protocol, IIggyClient> client in Clients)
-        {
-            await client.Value.CreateStreamAsync(StreamId.GetWithProtocol(client.Key));
-        }
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs
deleted file mode 100644
index 1f8ed7d..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Fixtures/UsersFixture.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-using Apache.Iggy.IggyClient;
-using TUnit.Core.Interfaces;
-
-namespace Apache.Iggy.Tests.Integrations.Fixtures;
-
-public class UsersFixture : IAsyncInitializer
-{
-    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
-    public required IggyServerFixture IggyServerFixture { get; init; }
-
-    public Dictionary<Protocol, IIggyClient> Clients { get; set; } = new();
-
-    public async Task InitializeAsync()
-    {
-        Clients = await IggyServerFixture.CreateClients();
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
index 284878a..07ad3e5 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/FlushMessagesTests.cs
@@ -17,47 +17,75 @@
 
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
+using Apache.Iggy.IggyClient;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class FlushMessagesTests
 {
-    [ClassDataSource<FlushMessageFixture>(Shared = SharedType.PerClass)]
-    public required FlushMessageFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamWithMessages(
+        Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"flush-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 3"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 4"u8.ToArray())
+            ]);
+
+        return (client, streamName, topicName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task FlushUnsavedBuffer_WithFsync_Should_Flush_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0, true));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 0, true));
     }
 
     [Test]
-    [DependsOn(nameof(FlushUnsavedBuffer_WithFsync_Should_Flush_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task FlushUnsavedBuffer_WithOutFsync_Should_Flush_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0, false));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 0, false));
     }
 
     [Test]
-    [DependsOn(nameof(FlushUnsavedBuffer_WithOutFsync_Should_Flush_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    public async Task FlushUnsavedBuffer_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
+    public async Task FlushUnsavedBuffer_Should_Throw_WhenPartition_DoesNotExist(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].FlushUnsavedBufferAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 55, false));
+            client.FlushUnsavedBufferAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), 55, false));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs
deleted file mode 100644
index 012ef9f..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/NameIdHelpers.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Helpers;
-
-public static class ProtocolHelpers
-{
-    public static string GetWithProtocol(this string name, Protocol protocol)
-    {
-        return $"{name}_{protocol.ToString().ToLowerInvariant()}";
-    }
-
-    public static uint GetWithProtocol(this uint id, Protocol protocol)
-    {
-        return id + (uint)protocol * 10;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs
deleted file mode 100644
index 52576c8..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Helpers/TopicFactory.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using Apache.Iggy.Tests.Integrations.Models;
-
-namespace Apache.Iggy.Tests.Integrations.Helpers;
-
-public static class TopicFactory
-{
-    internal static CreateTestTopic CreateTopic(string topicId, uint partitionsCount = 1,
-        TimeSpan messageExpiry = default)
-    {
-        return new CreateTestTopic
-        {
-            Name = topicId,
-            PartitionsCount = partitionsCount,
-            MessageExpiry = messageExpiry
-        };
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs
deleted file mode 100644
index d58f123..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/CreateTestTopic.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using System.Diagnostics.CodeAnalysis;
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-internal class CreateTestTopic
-{
-    public required string Name { get; set; }
-    public CompressionAlgorithm CompressionAlgorithm { get; set; } = CompressionAlgorithm.None;
-    public TimeSpan MessageExpiry { get; set; } = TimeSpan.Zero;
-    public uint PartitionsCount { get; set; } = 1;
-    public byte? ReplicationFactor { get; set; } = 1;
-    public ulong MaxTopicSize { get; set; }
-
-    public CreateTestTopic()
-    {
-    }
-
-    [SetsRequiredMembers]
-    public CreateTestTopic(string name,
-        CompressionAlgorithm compressionAlgorithm,
-        TimeSpan messageExpiry,
-        uint partitionsCount,
-        byte? replicationFactor,
-        ulong maxTopicSize)
-    {
-        Name = name;
-        CompressionAlgorithm = compressionAlgorithm;
-        MessageExpiry = messageExpiry;
-        PartitionsCount = partitionsCount;
-        ReplicationFactor = replicationFactor;
-        MaxTopicSize = maxTopicSize;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs
deleted file mode 100644
index bc149fd..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/DummyMessage.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// // Licensed to the Apache Software Foundation (ASF) under one
-// // or more contributor license agreements.  See the NOTICE file
-// // distributed with this work for additional information
-// // regarding copyright ownership.  The ASF licenses this file
-// // to you under the Apache License, Version 2.0 (the
-// // "License"); you may not use this file except in compliance
-// // with the License.  You may obtain a copy of the License at
-// //
-// //   http://www.apache.org/licenses/LICENSE-2.0
-// //
-// // Unless required by applicable law or agreed to in writing,
-// // software distributed under the License is distributed on an
-// // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// // KIND, either express or implied.  See the License for the
-// // specific language governing permissions and limitations
-// // under the License.
-
-using System.Buffers.Binary;
-using System.Text;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-public sealed class DummyMessage
-{
-    public int Id { get; set; }
-    public required string Text { get; set; }
-
-    internal static Func<byte[], DummyMessage> DeserializeDummyMessage
-        => bytes =>
-        {
-            var id = BinaryPrimitives.ReadInt32LittleEndian(bytes.AsSpan()[..4]);
-            var textLength = BinaryPrimitives.ReadInt32LittleEndian(bytes.AsSpan()[4..8]);
-            var text = Encoding.UTF8.GetString(bytes.AsSpan()[8..(8 + textLength)]);
-            return new DummyMessage
-            {
-                Id = id,
-                Text = text
-            };
-        };
-
-    internal byte[] SerializeDummyMessage()
-    {
-        var bytes = new byte[4 + 4 + Text.Length];
-        BinaryPrimitives.WriteInt32LittleEndian(bytes.AsSpan()[..4], Id);
-        BinaryPrimitives.WriteInt32LittleEndian(bytes.AsSpan()[4..8], Text.Length);
-        Encoding.UTF8.GetBytes(Text).CopyTo(bytes.AsSpan()[8..]);
-        return bytes;
-    }
-}
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs
deleted file mode 100644
index fbdcb5b..0000000
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/Models/UpdateTestTopic.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using Apache.Iggy.Enums;
-
-namespace Apache.Iggy.Tests.Integrations.Models;
-
-internal record UpdateTestTopic(
-    string Name,
-    CompressionAlgorithm CompressionAlgorithm,
-    ulong MaxTopicSize,
-    TimeSpan MessageExpiry,
-    byte? ReplicationFactor);
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
index 312c11a..d2a46d5 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/OffsetTests.cs
@@ -16,11 +16,13 @@
 // // under the License.
 
 using Apache.Iggy.Enums;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Kinds;
+using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
+using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
 namespace Apache.Iggy.Tests.Integrations;
 
@@ -28,26 +30,54 @@
 {
     private const ulong SetOffset = 2;
 
-    [ClassDataSource<OffsetFixtures>(Shared = SharedType.PerClass)]
-    public required OffsetFixtures Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
+
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamWithMessages(
+        Protocol protocol)
+    {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"offset-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 3"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 4"u8.ToArray())
+            ]);
+
+        return (client, streamName, topicName);
+    }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task StoreOffset_IndividualConsumer_Should_StoreOffset_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol]
-            .StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), SetOffset, 0));
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await Should.NotThrowAsync(() => client
+            .StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+                Identifier.String(topicName), SetOffset, 0));
     }
 
     [Test]
-    [DependsOn(nameof(StoreOffset_IndividualConsumer_Should_StoreOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_IndividualConsumer_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol]
-            .GetOffsetAsync(Consumer.New("test-consumer"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.StoreOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.New("test-consumer"), Identifier.String(streamName),
+            Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -56,31 +86,63 @@
     }
 
     [Test]
-    [DependsOn(nameof(GetOffset_IndividualConsumer_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task StoreOffset_ConsumerGroup_Should_StoreOffset_Successfully(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), "test_consumer_group");
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
 
-        await Fixture.Clients[Protocol.Tcp].JoinConsumerGroupAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name), Identifier.String("test_consumer_group"));
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
 
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol]
-            .StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), SetOffset, 0));
+        // Consumer group membership is per-connection. For TCP the same client must join.
+        // For HTTP, a separate TCP client joins (HTTP is stateless and doesn't track membership).
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await Should.NotThrowAsync(() => client
+            .StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+                Identifier.String(topicName), SetOffset, 0));
     }
 
     [Test]
-    [DependsOn(nameof(StoreOffset_ConsumerGroup_Should_StoreOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_ConsumerGroup_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol]
-            .GetOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -89,13 +151,33 @@
     }
 
     [Test]
-    [DependsOn(nameof(GetOffset_ConsumerGroup_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetOffset_ConsumerGroup_ByName_Should_GetOffset_Successfully(Protocol protocol)
     {
-        var offset = await Fixture.Clients[protocol].GetOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
+
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        if (protocol == Protocol.Tcp)
+        {
+            await client.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+        else
+        {
+            var tcpClient = await Fixture.CreateTcpClient();
+            await tcpClient.JoinConsumerGroupAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName), Identifier.String("test_consumer_group"));
+        }
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldNotBeNull();
         offset.StoredOffset.ShouldBe(SetOffset);
@@ -105,17 +187,26 @@
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetOffset_ConsumerGroup_ByName_Should_GetOffset_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteOffset_ConsumerGroup_Should_DeleteOffset_Successfully(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        var (client, streamName, topicName) = await CreateStreamWithMessages(protocol);
 
-        var offset = await Fixture.Clients[protocol].GetOffsetAsync(Consumer.Group("test_consumer_group"),
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.String(Fixture.TopicRequest.Name),
-            0);
+        await client.CreateConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String(topicName), "test_consumer_group");
+
+        await client.JoinConsumerGroupAsync(
+            Identifier.String(streamName),
+            Identifier.String(topicName), Identifier.String("test_consumer_group"));
+
+        await client.StoreOffsetAsync(Consumer.Group("test_consumer_group"), Identifier.String(streamName),
+            Identifier.String(topicName), SetOffset, 0);
+
+        await client.DeleteOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
+
+        var offset = await client.GetOffsetAsync(Consumer.Group("test_consumer_group"),
+            Identifier.String(streamName), Identifier.String(topicName), 0);
 
         offset.ShouldBeNull();
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
index f2da703..aa2d7c5 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/PartitionsTests.cs
@@ -17,74 +17,83 @@
 
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class PartitionsTests
 {
-    [ClassDataSource<PartitionsFixture>(Shared = SharedType.PerClass)]
-    public required PartitionsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePartition_HappyPath_Should_CreatePartition_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol]
-                .CreatePartitionsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                    Identifier.String(Fixture.TopicRequest.Name), 3));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var response = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var streamName = $"part-create-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        await Should.NotThrowAsync(() =>
+            client.CreatePartitionsAsync(Identifier.String(streamName),
+                Identifier.String(topicName), 3));
+
+        var response = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String(topicName));
         response.ShouldNotBeNull();
         response.PartitionsCount.ShouldBe(4u);
     }
 
     [Test]
-    [DependsOn(nameof(CreatePartition_HappyPath_Should_CreatePartition_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_DeletePartition_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var response = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var streamName = $"part-delete-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 4);
+
+        await Should.NotThrowAsync(() =>
+            client.DeletePartitionsAsync(Identifier.String(streamName),
+                Identifier.String(topicName), 1));
+
+        var response = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String(topicName));
         response.ShouldNotBeNull();
         response.PartitionsCount.ShouldBe(3u);
     }
 
     [Test]
-    [DependsOn(nameof(DeletePartition_Should_DeletePartition_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_Throw_WhenTopic_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"part-notopic-{Guid.NewGuid():N}";
+
+        await client.CreateStreamAsync(streamName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+            client.DeletePartitionsAsync(Identifier.String(streamName),
+                Identifier.String("nonexistent-topic"), 1));
     }
 
     [Test]
-    [DependsOn(nameof(DeletePartition_Should_Throw_WhenTopic_DoesNotExist))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePartition_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .DeleteStreamAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeletePartitionsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), 1));
+            client.DeletePartitionsAsync(Identifier.String($"nonexistent-{Guid.NewGuid():N}"),
+                Identifier.String("nonexistent-topic"), 1));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
index b2a284c..1029841 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/PersonalAccessTokenTests.cs
@@ -25,68 +25,84 @@
 
 public class PersonalAccessTokenTests
 {
-    private const string Name = "test-pat";
     private static readonly TimeSpan Expiry = TimeSpan.FromHours(1);
 
-    [ClassDataSource<PersonalAccessTokenFixture>(Shared = SharedType.PerClass)]
-    public required PersonalAccessTokenFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePersonalAccessToken_HappyPath_Should_CreatePersonalAccessToken_Successfully(
         Protocol protocol)
     {
-        var result = await Fixture.Clients[protocol].CreatePersonalAccessTokenAsync(Name, Expiry);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"pat-{Guid.NewGuid():N}"[..20];
+        var result = await client.CreatePersonalAccessTokenAsync(name, Expiry);
 
         result.ShouldNotBeNull();
         result.Token.ShouldNotBeNullOrEmpty();
     }
 
     [Test]
-    [DependsOn(nameof(CreatePersonalAccessToken_HappyPath_Should_CreatePersonalAccessToken_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreatePersonalAccessToken_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"dup-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].CreatePersonalAccessTokenAsync(Name, Expiry));
+            client.CreatePersonalAccessTokenAsync(name, Expiry));
     }
 
     [Test]
-    [DependsOn(nameof(CreatePersonalAccessToken_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetPersonalAccessTokens_Should_ReturnValidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
         IReadOnlyList<PersonalAccessTokenResponse> response
-            = await Fixture.Clients[protocol].GetPersonalAccessTokensAsync();
+            = await client.GetPersonalAccessTokensAsync();
 
         response.ShouldNotBeNull();
-        response.Count.ShouldBe(1);
-        response[0].Name.ShouldBe(Name);
+        response.Count.ShouldBeGreaterThanOrEqualTo(1);
+        response.ShouldContain(x => x.Name == name);
+
+        var token = response.First(x => x.Name == name);
         var tokenExpiryDateTimeOffset = DateTimeOffset.UtcNow.Add(Expiry);
-        response[0].ExpiryAt!.Value.ToUniversalTime().ShouldBe(tokenExpiryDateTimeOffset, TimeSpan.FromMinutes(1));
+        token.ExpiryAt!.Value.ToUniversalTime().ShouldBe(tokenExpiryDateTimeOffset, TimeSpan.FromMinutes(1));
     }
 
     [Test]
-    [DependsOn(nameof(GetPersonalAccessTokens_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LoginWithPersonalAccessToken_Should_Be_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].CreatePersonalAccessTokenAsync("test-pat-login", Expiry);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var client = await Fixture.IggyServerFixture.CreateClient(protocol);
+        var name = $"lgn-{Guid.NewGuid():N}"[..20];
+        var response = await client.CreatePersonalAccessTokenAsync(name, Expiry);
 
-        var authResponse = await client.LoginWithPersonalAccessToken(response!.Token);
+        var loginClient = await Fixture.CreateClient(protocol);
+        var authResponse = await loginClient.LoginWithPersonalAccessToken(response!.Token);
 
         authResponse.ShouldNotBeNull();
-        authResponse.UserId.ShouldBeGreaterThan(0);
+        authResponse.UserId.ShouldBeGreaterThanOrEqualTo(0);
     }
 
     [Test]
-    [DependsOn(nameof(LoginWithPersonalAccessToken_Should_Be_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeletePersonalAccessToken_Should_DeletePersonalAccessToken_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(() => Fixture.Clients[protocol].DeletePersonalAccessTokenAsync(Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"del-{Guid.NewGuid():N}"[..20];
+        await client.CreatePersonalAccessTokenAsync(name, Expiry);
+
+        await Should.NotThrowAsync(() => client.DeletePersonalAccessTokenAsync(name));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
index b703813..eed1d01 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SegmentsTests.cs
@@ -19,26 +19,32 @@
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class SegmentsTests
 {
-    [ClassDataSource<SegmentsFixture>(Shared = SharedType.PerClass)]
-    public required SegmentsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [SkipHttp]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_WithZeroCount_Should_Succeed(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-zero-{Guid.NewGuid():N}";
+        var topicName = $"seg-zero-topic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
         // Deleting 0 segments should succeed without error (no-op)
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName),
                 0, // partition_id (0-indexed)
                 0)); // segments_count = 0
     }
@@ -48,23 +54,34 @@
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Http_Should_Throw_FeatureUnavailable(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-http-{Guid.NewGuid():N}";
+        var topicName = $"seg-http-topic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
         await Should.ThrowAsync<FeatureUnavailableException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
+                Identifier.String(topicName),
                 0,
                 0));
     }
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteSegments_WithZeroCount_Should_Succeed))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Should_Throw_WhenTopic_DoesNotExist(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"seg-notopic-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+            client.DeleteSegmentsAsync(
+                Identifier.String(streamName),
                 Identifier.String("non-existent-topic"),
                 0, // partition_id (0-indexed)
                 1)); // segments_count
@@ -72,20 +89,15 @@
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(DeleteSegments_Should_Throw_WhenTopic_DoesNotExist))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteSegments_Should_Throw_WhenStream_DoesNotExist(Protocol protocol)
     {
-        await Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(Fixture.TopicRequest.Name));
-        await Fixture.Clients[protocol]
-            .DeleteStreamAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].DeleteSegmentsAsync(
-                Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name),
+            client.DeleteSegmentsAsync(
+                Identifier.String($"nonexistent-stream-{Guid.NewGuid():N}"),
+                Identifier.String("any-topic"),
                 0, // partition_id (0-indexed)
                 1)); // segments_count
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
index 3973415..5b84781 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SendMessagesTests.cs
@@ -16,15 +16,12 @@
 // // under the License.
 
 using System.Text;
-using Apache.Iggy.Contracts;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Headers;
-using Apache.Iggy.Kinds;
+using Apache.Iggy.IggyClient;
 using Apache.Iggy.Messages;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -32,83 +29,117 @@
 
 public class SendMessagesTests
 {
-    private static Message[] _messagesWithoutHeaders = [];
-    private static Message[] _messagesWithHeaders = [];
+    private static readonly string DummyJson = """
+                                               {
+                                                 "userId": 1,
+                                                 "id": 1,
+                                                 "title": "delete",
+                                                 "completed": false
+                                               }
+                                               """;
 
-    [ClassDataSource<SendMessageFixture>(Shared = SharedType.PerClass)]
-    public required SendMessageFixture Fixture { get; set; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
-    [Before(Class)]
-    public static Task Before()
+    private async Task<(IIggyClient client, string streamName, string topicName)> CreateStreamAndTopic(
+        Protocol protocol)
     {
-        var dummyJson = """
-                        {
-                          "userId": 1,
-                          "id": 1,
-                          "title": "delete",
-                          "completed": false
-                        }
-                        """;
-        _messagesWithoutHeaders =
-        [
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson)),
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson))
-        ];
-        _messagesWithHeaders =
-        [
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
-                }),
-            new Message(Guid.NewGuid(), Encoding.UTF8.GetBytes(dummyJson),
-                new Dictionary<HeaderKey, HeaderValue>
-                {
-                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
-                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
-                })
-        ];
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        return Task.CompletedTask;
+        var streamName = $"send-msg-{Guid.NewGuid():N}";
+        var topicName = "test-topic";
+
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), topicName, 1);
+
+        return (client, streamName, topicName);
     }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_NoHeaders_Should_SendMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson)),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson))
+        };
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), Partitioning.None(), _messagesWithoutHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String(topicName), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_NoHeaders_Should_SendMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_NoHeaders_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName, _) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson)),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson))
+        };
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.Numeric(69), Partitioning.None(), _messagesWithoutHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.Numeric(69), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_NoHeaders_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_WithHeaders_Should_SendMessages_Successfully(Protocol protocol)
     {
+        var (client, streamName, topicName) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                }),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                })
+        };
+
         await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(Fixture.TopicRequest.Name), Partitioning.None(), _messagesWithHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String(topicName), Partitioning.None(), messages));
     }
 
     [Test]
-    [DependsOn(nameof(SendMessages_WithHeaders_Should_SendMessages_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task SendMessages_WithHeaders_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var (client, streamName, _) = await CreateStreamAndTopic(protocol);
+
+        var messages = new Message[]
+        {
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                }),
+            new(Guid.NewGuid(), Encoding.UTF8.GetBytes(DummyJson),
+                new Dictionary<HeaderKey, HeaderValue>
+                {
+                    { HeaderKey.FromString("header1"), HeaderValue.FromString("value1") },
+                    { HeaderKey.FromString("header2"), HeaderValue.FromInt32(444) }
+                })
+        };
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.Numeric(69), Partitioning.None(), _messagesWithHeaders));
+            client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.Numeric(69), Partitioning.None(), messages));
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
index 6caa0b5..3b1603f 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/StreamsTests.cs
@@ -20,7 +20,6 @@
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -28,22 +27,21 @@
 
 public class StreamsTests
 {
-    private const string Name = "StreamTests";
-
-    [ClassDataSource<StreamsFixture>(Shared = SharedType.PerClass)]
-    public required StreamsFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateStream_HappyPath_Should_CreateStream_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .CreateStreamAsync(Name.GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"create-stream-{Guid.NewGuid():N}";
+        var response = await client.CreateStreamAsync(name);
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Name.ShouldBe(Name.GetWithProtocol(protocol));
+        response.Name.ShouldBe(name);
         response.Size.ShouldBe(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(0u);
@@ -52,42 +50,50 @@
     }
 
     [Test]
-    [DependsOn(nameof(CreateStream_HappyPath_Should_CreateStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateStream_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .CreateStreamAsync(Name.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"dup-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(client.CreateStreamAsync(name));
     }
 
     [Test]
-    [DependsOn(nameof(CreateStream_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreams_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].CreateStreamAsync("test-stream-2".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        IReadOnlyList<StreamResponse> response = await Fixture.Clients[protocol].GetStreamsAsync();
+        var name1 = $"get-streams-1-{Guid.NewGuid():N}";
+        var name2 = $"get-streams-2-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name1);
+        await client.CreateStreamAsync(name2);
+
+        IReadOnlyList<StreamResponse> response = await client.GetStreamsAsync();
 
         response.ShouldNotBeNull();
         response.Count.ShouldBeGreaterThanOrEqualTo(2);
-        response.ShouldContain(x => x.Name == Name.GetWithProtocol(protocol));
-        response.ShouldContain(x => x.Name == "test-stream-2".GetWithProtocol(protocol));
+        response.ShouldContain(x => x.Name == name1);
+        response.ShouldContain(x => x.Name == name2);
     }
 
     [Test]
-    [DependsOn(nameof(GetStreams_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_Should_ReturnValidResponse(Protocol protocol)
     {
-        var newStream = await Fixture.Clients[protocol].CreateStreamAsync("test-stream-3".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-by-id-{Guid.NewGuid():N}";
+        var newStream = await client.CreateStreamAsync(name);
         newStream.ShouldNotBeNull();
 
-        var response = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.Numeric(newStream.Id));
+        var response = await client.GetStreamByIdAsync(Identifier.Numeric(newStream.Id));
         response.ShouldNotBeNull();
         response.Id.ShouldBe(newStream.Id);
-        response.Name.ShouldBe(newStream.Name);
+        response.Name.ShouldBe(name);
         response.Size.ShouldBe(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(0u);
@@ -95,14 +101,16 @@
         response.Topics.ShouldBeEmpty();
     }
 
-
     [Test]
-    [DependsOn(nameof(GetStreamById_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreams_ByStreamName_Should_ReturnValidResponse(Protocol protocol)
     {
-        var name = "test-stream-3".GetWithProtocol(protocol);
-        var response = await Fixture.Clients[protocol].GetStreamByIdAsync(Identifier.String(name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"get-by-name-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(name);
+
+        var response = await client.GetStreamByIdAsync(Identifier.String(name));
 
         response.ShouldNotBeNull();
         response.Id.ShouldNotBe(0u);
@@ -115,131 +123,141 @@
     }
 
     [Test]
-    [DependsOn(nameof(GetStreams_ByStreamName_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_WithTopics_Should_ReturnValidResponse(Protocol protocol)
     {
-        var topicRequest1 = TopicFactory.CreateTopic("Topic1", messageExpiry: TimeSpan.FromHours(1));
-        var topicRequest2 = TopicFactory.CreateTopic("Topic2", messageExpiry: TimeSpan.FromHours(1));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            topicRequest1.Name, topicRequest1.PartitionsCount, messageExpiry: topicRequest1.MessageExpiry);
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            topicRequest2.Name, topicRequest2.PartitionsCount, messageExpiry: topicRequest2.MessageExpiry);
+        var streamName = $"topics-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
 
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            Identifier.String(topicRequest1.Name), Partitioning.None(),
+        var topicName1 = "Topic1";
+        var topicName2 = "Topic2";
+        await client.CreateTopicAsync(Identifier.String(streamName),
+            topicName1, 1, messageExpiry: TimeSpan.FromHours(1));
+        await client.CreateTopicAsync(Identifier.String(streamName),
+            topicName2, 1, messageExpiry: TimeSpan.FromHours(1));
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName1), Partitioning.None(),
             [
                 new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 2"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 3"u8.ToArray())
             ]);
 
-
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Name.GetWithProtocol(protocol)),
-            Identifier.String(topicRequest2.Name), Partitioning.None(), [
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String(topicName2), Partitioning.None(), [
                 new Message(Guid.NewGuid(), "Test message 4"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 5"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 6"u8.ToArray()),
                 new Message(Guid.NewGuid(), "Test message 7"u8.ToArray())
             ]);
 
-        var response = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        var response = await client.GetStreamByIdAsync(Identifier.String(streamName));
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Name.ShouldBe(Name.GetWithProtocol(protocol));
-        response.Size.ShouldBe(546u);
+        response.Name.ShouldBe(streamName);
+        response.Size.ShouldBeGreaterThan(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
         response.MessagesCount.ShouldBe(7u);
         response.TopicsCount.ShouldBe(2);
         response.Topics.Count().ShouldBe(2);
 
-        var topic = response.Topics.First(x => x.Name == topicRequest1.Name);
+        var topic = response.Topics.First(x => x.Name == topicName1);
         topic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        topic.Name.ShouldBe(topicRequest1.Name);
-        topic.CompressionAlgorithm.ShouldBe(topicRequest1.CompressionAlgorithm);
+        topic.Name.ShouldBe(topicName1);
         topic.Partitions.ShouldBeNull();
-        topic.MessageExpiry.ShouldBe(topicRequest1.MessageExpiry);
-        topic.Size.ShouldBe(234u);
-        topic.PartitionsCount.ShouldBe(topicRequest1.PartitionsCount);
-        topic.ReplicationFactor.ShouldBe(topicRequest1.ReplicationFactor);
+        topic.MessageExpiry.ShouldBe(TimeSpan.FromHours(1));
+        topic.Size.ShouldBeGreaterThan(0u);
+        topic.PartitionsCount.ShouldBe(1u);
         topic.MaxTopicSize.ShouldBeGreaterThan(0u);
         topic.MessagesCount.ShouldBe(3u);
     }
 
     [Test]
-    [DependsOn(nameof(GetStreamById_WithTopics_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdateStream_Should_UpdateStream_Successfully(Protocol protocol)
     {
-        var streamToUpdate = await Fixture.Clients[protocol]
-            .CreateStreamAsync("stream-to-update".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"update-stream-{Guid.NewGuid():N}";
+        var updatedName = $"updated-stream-{Guid.NewGuid():N}";
+        var streamToUpdate = await client.CreateStreamAsync(name);
         streamToUpdate.ShouldNotBeNull();
 
-        await Fixture.Clients[protocol].UpdateStreamAsync(Identifier.String(streamToUpdate.Name),
-            "updated-test-stream".GetWithProtocol(protocol));
+        await client.UpdateStreamAsync(Identifier.String(streamToUpdate.Name), updatedName);
 
-        var result = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.Numeric(streamToUpdate.Id));
+        var result = await client.GetStreamByIdAsync(Identifier.Numeric(streamToUpdate.Id));
         result.ShouldNotBeNull();
-        result.Name.ShouldBe("updated-test-stream".GetWithProtocol(protocol));
+        result.Name.ShouldBe(updatedName);
     }
 
     [Test]
-    [DependsOn(nameof(UpdateStream_Should_UpdateStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task PurgeStream_Should_PurgeStream_Successfully(Protocol protocol)
     {
-        // Ensure the stream has messages (created in previous steps) before purging
-        var stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
+        var streamName = $"purge-stream-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "purge-topic", 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("purge-topic"), Partitioning.None(),
+            [
+                new Message(Guid.NewGuid(), "Test message 1"u8.ToArray()),
+                new Message(Guid.NewGuid(), "Test message 2"u8.ToArray())
+            ]);
+
+        var stream = await client.GetStreamByIdAsync(Identifier.String(streamName));
         stream.ShouldNotBeNull();
-        stream.MessagesCount.ShouldBe(7u);
-        stream.TopicsCount.ShouldBe(2);
+        stream.MessagesCount.ShouldBe(2u);
 
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].PurgeStreamAsync(Identifier.String(Name.GetWithProtocol(protocol))));
+        await Should.NotThrowAsync(() => client.PurgeStreamAsync(Identifier.String(streamName)));
 
-        stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String(Name.GetWithProtocol(protocol)));
+        stream = await client.GetStreamByIdAsync(Identifier.String(streamName));
         stream.ShouldNotBeNull();
         stream.MessagesCount.ShouldBe(0u);
-        stream.TopicsCount.ShouldBe(2);
+        stream.TopicsCount.ShouldBe(1);
     }
 
     [Test]
-    [DependsOn(nameof(PurgeStream_Should_PurgeStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteStream_Should_DeleteStream_Successfully(Protocol protocol)
     {
-        var streamToDelete = await Fixture.Clients[protocol]
-            .CreateStreamAsync("stream-to-delete".GetWithProtocol(protocol));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var name = $"del-stream-{Guid.NewGuid():N}";
+        var streamToDelete = await client.CreateStreamAsync(name);
         streamToDelete.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(() =>
-            Fixture.Clients[protocol].DeleteStreamAsync(Identifier.Numeric(streamToDelete.Id)));
+        await Should.NotThrowAsync(() => client.DeleteStreamAsync(Identifier.Numeric(streamToDelete.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteStream_Should_DeleteStream_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteStream_NotExists_Should_Throw_InvalidResponse(Protocol protocol)
     {
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
         await Should.ThrowAsync<IggyInvalidStatusCodeException>(() =>
-            Fixture.Clients[protocol]
-                .DeleteStreamAsync(Identifier.String("stream-to-delete".GetWithProtocol(protocol))));
+            client.DeleteStreamAsync(Identifier.String($"nonexistent-{Guid.NewGuid():N}")));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteStream_NotExists_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStreamById_AfterDelete_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var stream = await Fixture.Clients[protocol]
-            .GetStreamByIdAsync(Identifier.String("stream-to-delete".GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        stream.ShouldBeNull();
+        var name = $"del-get-stream-{Guid.NewGuid():N}";
+        var stream = await client.CreateStreamAsync(name);
+        stream.ShouldNotBeNull();
+
+        await client.DeleteStreamAsync(Identifier.Numeric(stream.Id));
+
+        var result = await client.GetStreamByIdAsync(Identifier.String(name));
+        result.ShouldBeNull();
     }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
index 3cc9a44..e956302 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/SystemTests.cs
@@ -22,7 +22,6 @@
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -30,38 +29,39 @@
 
 public class SystemTests
 {
-    [ClassDataSource<SystemFixture>(Shared = SharedType.PerClass)]
-    public required SystemFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    public async Task GetClients_Should_Return_CorrectClientsCount(Protocol protocol)
+    public async Task GetClients_Should_Return_NonEmptyClientsList(Protocol protocol)
     {
-        IReadOnlyList<ClientResponse> clients = await Fixture.Clients[protocol].GetClientsAsync();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        clients.Count.ShouldBeGreaterThanOrEqualTo(Fixture.TotalClientsCount);
-        foreach (var client in clients)
+        IReadOnlyList<ClientResponse> clients = await client.GetClientsAsync();
+
+        clients.ShouldNotBeNull();
+        clients.Count.ShouldBeGreaterThanOrEqualTo(1);
+        foreach (var c in clients)
         {
-            client.ClientId.ShouldNotBe(0u);
-            client.Address.ShouldNotBeNullOrEmpty();
-            client.Transport.ShouldBe(Protocol.Tcp);
+            c.ClientId.ShouldNotBe(0u);
+            c.Address.ShouldNotBeNullOrEmpty();
+            c.Transport.ShouldBe(Protocol.Tcp);
         }
     }
 
     [Test]
-    [DependsOn(nameof(GetClients_Should_Return_CorrectClientsCount))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetClient_Should_Return_CorrectClient(Protocol protocol)
     {
-        IReadOnlyList<ClientResponse> clients = await Fixture.Clients[protocol].GetClientsAsync();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-        await client.LoginUser("iggy", "iggy");
-        var clientInfo = await client.GetMeAsync();
+        var tcpClient = await Fixture.CreateClient(Protocol.Tcp);
+        await tcpClient.LoginUser("iggy", "iggy");
+        var clientInfo = await tcpClient.GetMeAsync();
         clientInfo.ShouldNotBeNull();
 
-        clients.Count.ShouldBeGreaterThanOrEqualTo(Fixture.TotalClientsCount);
-        var response = await Fixture.Clients[protocol].GetClientByIdAsync(clientInfo.ClientId);
+        var response = await client.GetClientByIdAsync(clientInfo.ClientId);
         response.ShouldNotBeNull();
         response.ClientId.ShouldBe(clientInfo.ClientId);
         response.UserId.ShouldNotBeNull();
@@ -74,11 +74,12 @@
 
     [Test]
     [SkipHttp]
-    [DependsOn(nameof(GetClient_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetMe_Tcp_Should_Return_MyClient(Protocol protocol)
     {
-        var me = await Fixture.Clients[protocol].GetMeAsync();
+        var client = await Fixture.CreateTcpClient();
+
+        var me = await client.GetMeAsync();
         me.ShouldNotBeNull();
         me.ClientId.ShouldNotBe(0u);
         me.UserId.ShouldBe(0u);
@@ -88,64 +89,60 @@
 
     [Test]
     [SkipTcp]
-    [DependsOn(nameof(GetClient_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetMe_HTTP_Should_Throw_FeatureUnavailableException(Protocol protocol)
     {
-        await Should.ThrowAsync<FeatureUnavailableException>(() => Fixture.Clients[protocol].GetMeAsync());
+        var client = await Fixture.CreateHttpClient();
+
+        await Should.ThrowAsync<FeatureUnavailableException>(() => client.GetMeAsync());
     }
 
     [Test]
-    [DependsOn(nameof(GetMe_HTTP_Should_Throw_FeatureUnavailableException))]
-    [DependsOn(nameof(GetMe_Tcp_Should_Return_MyClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetClient_WithConsumerGroup_Should_Return_CorrectClient(Protocol protocol)
     {
-        var client = await Fixture.IggyServerFixture.CreateClient(Protocol.Tcp, protocol);
-        await client.LoginUser("iggy", "iggy");
-        var stream = await client.CreateStreamAsync(Fixture.StreamId.GetWithProtocol(protocol));
-        await client.CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "test_topic", 2);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var consumerGroup
-            = await client.CreateConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String("test_topic"), "test_consumer_group");
-        await client.JoinConsumerGroupAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("test_topic"), Identifier.String("test_consumer_group"));
-        var me = await client.GetMeAsync();
+        var streamName = $"sys-cg-{Guid.NewGuid():N}";
+        var tcpClient = await Fixture.CreateClient(Protocol.Tcp);
+        await tcpClient.LoginUser("iggy", "iggy");
 
-        var response = await Fixture.Clients[protocol].GetClientByIdAsync(me!.ClientId);
+        var stream = await tcpClient.CreateStreamAsync(streamName);
+        await tcpClient.CreateTopicAsync(Identifier.String(streamName), "first_topic", 2);
+        var secondTopic = await tcpClient.CreateTopicAsync(Identifier.String(streamName), "second_topic", 2);
+
+        var consumerGroup = await tcpClient.CreateConsumerGroupAsync(
+            Identifier.String(streamName), Identifier.String("second_topic"), "test_consumer_group");
+        await tcpClient.JoinConsumerGroupAsync(Identifier.String(streamName),
+            Identifier.String("second_topic"), Identifier.String("test_consumer_group"));
+        var me = await tcpClient.GetMeAsync();
+
+        var response = await client.GetClientByIdAsync(me!.ClientId);
         response.ShouldNotBeNull();
-        response.UserId.ShouldBe(0u);
         response.Address.ShouldNotBeNullOrEmpty();
         response.Transport.ShouldBe(Protocol.Tcp);
         response.ConsumerGroupsCount.ShouldBe(1);
         response.ConsumerGroups.ShouldNotBeEmpty();
         response.ConsumerGroups.ShouldContain(x => x.GroupId == consumerGroup!.Id);
-        response.ConsumerGroups.ShouldContain(x => x.TopicId == 0);
         response.ConsumerGroups.ShouldContain(x => x.StreamId == stream!.Id);
+        response.ConsumerGroups.ShouldContain(x => x.TopicId == (int)secondTopic!.Id);
     }
 
-
     [Test]
-    [DependsOn(nameof(GetClient_WithConsumerGroup_Should_Return_CorrectClient))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetStats_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(0), Partitioning.None(), [new Message(Guid.NewGuid(), "Test message"u8.ToArray())]);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        await Fixture.Clients[protocol].PollMessagesAsync(new MessageFetchRequest
-        {
-            StreamId = Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicId = Identifier.Numeric(0),
-            AutoCommit = true,
-            Consumer = Consumer.New(1),
-            Count = 1,
-            PartitionId = 1,
-            PollingStrategy = PollingStrategy.First()
-        });
+        // Create a stream/topic and send a message so stats are non-zero
+        var streamName = $"sys-stats-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "stats-topic", 1);
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("stats-topic"), Partitioning.None(),
+            [new Message(Guid.NewGuid(), "Test message"u8.ToArray())]);
 
-        var response = await Fixture.Clients[protocol].GetStatsAsync();
+        var response = await client.GetStatsAsync();
         response.ShouldNotBeNull();
         response.ProcessId.ShouldBeGreaterThanOrEqualTo(0);
         response.CpuUsage.ShouldBeGreaterThanOrEqualTo(0);
@@ -158,13 +155,12 @@
         response.ReadBytes.ShouldBeGreaterThanOrEqualTo(0u);
         response.WrittenBytes.ShouldBeGreaterThanOrEqualTo(0u);
         response.MessagesSizeBytes.ShouldBeGreaterThanOrEqualTo(0u);
-        response.StreamsCount.ShouldNotBe(0);
-        response.TopicsCount.ShouldNotBe(0);
-        response.PartitionsCount.ShouldNotBe(0);
-        response.SegmentsCount.ShouldNotBe(0);
-        response.MessagesCount.ShouldNotBe(0u);
-        response.ClientsCount.ShouldNotBe(0);
-        response.ConsumerGroupsCount.ShouldNotBe(0);
+        response.StreamsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.TopicsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.PartitionsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.SegmentsCount.ShouldBeGreaterThanOrEqualTo(1);
+        response.MessagesCount.ShouldBeGreaterThanOrEqualTo(1u);
+        response.ClientsCount.ShouldBeGreaterThanOrEqualTo(1);
         response.Hostname.ShouldNotBeNullOrEmpty();
         response.OsName.ShouldNotBeNullOrEmpty();
         response.OsVersion.ShouldNotBeNullOrEmpty();
@@ -174,19 +170,21 @@
     }
 
     [Test]
-    [DependsOn(nameof(GetStats_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Ping_Should_Pong(Protocol protocol)
     {
-        await Should.NotThrowAsync(Fixture.Clients[protocol].PingAsync());
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        await Should.NotThrowAsync(client.PingAsync());
     }
 
     [Test]
-    [DependsOn(nameof(Ping_Should_Pong))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetSnapshot_Should_Return_ValidZipData(Protocol protocol)
     {
-        var snapshot = await Fixture.Clients[protocol].GetSnapshotAsync(
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var snapshot = await client.GetSnapshotAsync(
             SnapshotCompression.Deflated,
             [SystemSnapshotType.Test]);
 
@@ -197,29 +195,4 @@
         snapshot[0].ShouldBe((byte)'P');
         snapshot[1].ShouldBe((byte)'K');
     }
-
-    // [Test]
-    // [DependsOn(nameof(Ping_Should_Pong))]
-    // [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
-    // public async Task GetClusterMetadata_Should_Return_ClusterMetadata(Protocol protocol)
-    // {
-    //     var clusterMetadata = await Fixture.Clients[protocol].GetClusterMetadataAsync();
-    //
-    //     clusterMetadata.ShouldNotBeNull();
-    //     clusterMetadata.Id.ShouldBe(1u);
-    //     clusterMetadata.Name.ShouldBe("iggy-cluster");
-    //     clusterMetadata.Transport.ShouldBe(Protocol.Tcp);
-    //     clusterMetadata.Nodes.ShouldNotBeEmpty();
-    //     clusterMetadata.Nodes.Length.ShouldBe(2);
-    //     clusterMetadata.Nodes[0].Id.ShouldBe(1u);
-    //     clusterMetadata.Nodes[0].Name.ShouldBe("iggy-node-1");
-    //     clusterMetadata.Nodes[0].Address.ShouldBe("127.0.0.1:8090");
-    //     clusterMetadata.Nodes[0].Role.ShouldBe(ClusterNodeRole.Leader);
-    //     clusterMetadata.Nodes[0].Status.ShouldBe(ClusterNodeStatus.Healthy);
-    //     clusterMetadata.Nodes[1].Id.ShouldBe(2u);
-    //     clusterMetadata.Nodes[1].Name.ShouldBe("iggy-node-2");
-    //     clusterMetadata.Nodes[1].Address.ShouldBe("127.0.0.1:8092");
-    //     clusterMetadata.Nodes[1].Role.ShouldBe(ClusterNodeRole.Follower);
-    //     clusterMetadata.Nodes[1].Status.ShouldBe(ClusterNodeStatus.Healthy);
-    // }
 }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
index d516e79..c15f6cd 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/TopicsTests.cs
@@ -21,8 +21,6 @@
 using Apache.Iggy.Exceptions;
 using Apache.Iggy.Messages;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
-using Apache.Iggy.Tests.Integrations.Models;
 using Shouldly;
 using Partitioning = Apache.Iggy.Kinds.Partitioning;
 
@@ -30,175 +28,154 @@
 
 public class TopicsTests
 {
-    private static readonly CreateTestTopic TopicRequest = new("Test Topic", CompressionAlgorithm.Gzip,
-        TimeSpan.FromMinutes(10), 1, 2, 2_000_000_000);
-
-    private static readonly CreateTestTopic TopicRequestSecond
-        = new("Test Topic 2", CompressionAlgorithm.Gzip, TimeSpan.FromMinutes(10), 1, 2, 2_000_000_000);
-
-    private static readonly UpdateTestTopic UpdateTopicRequest
-        = new("Updated Topic", CompressionAlgorithm.Gzip, 3_000_000_000, TimeSpan.FromMinutes(10), 3);
-
-    [ClassDataSource<TopicsFixture>(Shared = SharedType.PerClass)]
-    public required TopicsFixture Fixture { get; init; }
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Create_NewTopic_Should_Return_Successfully(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].CreateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicRequest.Name,
-            TopicRequest.PartitionsCount, TopicRequest.CompressionAlgorithm, TopicRequest.ReplicationFactor,
-            TopicRequest.MessageExpiry, TopicRequest.MaxTopicSize);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-create-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        var response = await client.CreateTopicAsync(
+            Identifier.String(streamName), "Test Topic", 2, CompressionAlgorithm.Gzip,
+            1, TimeSpan.FromMinutes(10), 2_000_000_000);
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Test Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Create_NewTopic_Should_Return_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Create_DuplicateTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol].CreateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), TopicRequest.Name,
-            TopicRequest.PartitionsCount, TopicRequest.CompressionAlgorithm, TopicRequest.ReplicationFactor,
-            TopicRequest.MessageExpiry, TopicRequest.MaxTopicSize));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-dup-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Dup Topic", 1);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.CreateTopicAsync(Identifier.String(streamName), "Dup Topic", 1));
     }
 
     [Test]
-    [DependsOn(nameof(Create_DuplicateTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopic_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), Identifier.Numeric(0));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-get-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Get Topic", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName), Identifier.Numeric(0));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
         response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Get Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopic_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopic_ByName_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-getname-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Name Topic", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Name Topic"));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        response.Partitions!.Count().ShouldBe((int)TopicRequest.PartitionsCount);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
+        response.Name.ShouldBe("Name Topic");
+        response.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        response.Partitions!.Count().ShouldBe(2);
+        response.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
         response.Size.ShouldBe(0u);
-        response.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
+        response.PartitionsCount.ShouldBe(2u);
+        response.ReplicationFactor.ShouldBe((byte?)1);
+        response.MaxTopicSize.ShouldBe(2_000_000_000u);
         response.MessagesCount.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopic_ByName_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_ExistingTopics_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol].CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            TopicRequestSecond.Name, TopicRequestSecond.PartitionsCount, TopicRequestSecond.CompressionAlgorithm,
-            TopicRequestSecond.ReplicationFactor, TopicRequestSecond.MessageExpiry,
-            TopicRequestSecond.MaxTopicSize);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        IReadOnlyList<TopicResponse> response = await Fixture.Clients[protocol]
-            .GetTopicsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)));
+        var streamName = $"topic-list-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "List Topic 1", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+        await client.CreateTopicAsync(Identifier.String(streamName), "List Topic 2", 2,
+            CompressionAlgorithm.Gzip, 1, TimeSpan.FromMinutes(10), 2_000_000_000);
+
+        IReadOnlyList<TopicResponse> response = await client.GetTopicsAsync(Identifier.String(streamName));
 
         response.ShouldNotBeNull();
         response.Count().ShouldBe(2);
-        response.Select(x => x.Name).ShouldContain(TopicRequest.Name);
-        response.Select(x => x.Name).ShouldContain(TopicRequestSecond.Name);
-
-        var firstTopic = response.First(x => x.Name == TopicRequest.Name);
-        firstTopic.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        firstTopic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        firstTopic.Name.ShouldBe(TopicRequest.Name);
-        firstTopic.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
-        firstTopic.Partitions.ShouldBeNull();
-        firstTopic.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
-        firstTopic.Size.ShouldBe(0u);
-        firstTopic.PartitionsCount.ShouldBe(TopicRequest.PartitionsCount);
-        firstTopic.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        firstTopic.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
-        firstTopic.MessagesCount.ShouldBe(0u);
-
-        var secondTopic = response.First(x => x.Name == TopicRequestSecond.Name);
-        secondTopic.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        secondTopic.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        secondTopic.Name.ShouldBe(TopicRequestSecond.Name);
-        secondTopic.CompressionAlgorithm.ShouldBe(TopicRequestSecond.CompressionAlgorithm);
-        secondTopic.Partitions.ShouldBeNull();
-        secondTopic.MessageExpiry.ShouldBe(TopicRequestSecond.MessageExpiry);
-        secondTopic.Size.ShouldBe(0u);
-        secondTopic.PartitionsCount.ShouldBe(TopicRequestSecond.PartitionsCount);
-        secondTopic.ReplicationFactor.ShouldBe(TopicRequestSecond.ReplicationFactor);
-        secondTopic.MaxTopicSize.ShouldBe(TopicRequestSecond.MaxTopicSize);
-        secondTopic.MessagesCount.ShouldBe(0u);
+        response.Select(x => x.Name).ShouldContain("List Topic 1");
+        response.Select(x => x.Name).ShouldContain("List Topic 2");
     }
 
     [Test]
-    [DependsOn(nameof(Get_ExistingTopics_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_Topic_WithPartitions_Should_ReturnValidResponse(Protocol protocol)
     {
-        await Fixture.Clients[protocol]
-            .CreatePartitionsAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name),
-                2);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-parts-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Parts Topic", 1);
+
+        await client.CreatePartitionsAsync(Identifier.String(streamName),
+            Identifier.String("Parts Topic"), 2);
 
         for (var i = 0; i < 3; i++)
         {
-            await Fixture.Clients[protocol]
-                .SendMessagesAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                    Identifier.String(TopicRequest.Name),
-                    Partitioning.None(), GetMessages(i + 2));
+            await client.SendMessagesAsync(Identifier.String(streamName),
+                Identifier.String("Parts Topic"),
+                Partitioning.None(), GetMessages(i + 2));
         }
 
-        var response = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var response = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Parts Topic"));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.CreatedAt.UtcDateTime.ShouldBe(DateTimeOffset.UtcNow.UtcDateTime, TimeSpan.FromMinutes(1));
-        response.Name.ShouldBe(TopicRequest.Name);
-        response.CompressionAlgorithm.ShouldBe(TopicRequest.CompressionAlgorithm);
+        response.Name.ShouldBe("Parts Topic");
         response.Partitions!.Count().ShouldBe(3);
-        response.MessageExpiry.ShouldBe(TopicRequest.MessageExpiry);
-        response.Size.ShouldBe(702u);
+        response.Size.ShouldBeGreaterThan(0u);
         response.PartitionsCount.ShouldBe(3u);
-        response.ReplicationFactor.ShouldBe(TopicRequest.ReplicationFactor);
-        response.MaxTopicSize.ShouldBe(TopicRequest.MaxTopicSize);
         response.MessagesCount.ShouldBe(9u);
         response.Partitions.ShouldNotBeNull();
         response.Partitions.ShouldAllBe(x => x.MessagesCount > 0);
@@ -210,88 +187,100 @@
     }
 
     [Test]
-    [DependsOn(nameof(Get_Topic_WithPartitions_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Update_ExistingTopic_Should_UpdateTopic_Successfully(Protocol protocol)
     {
-        var topicToUpdate = await Fixture.Clients[protocol]
-            .CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "topic-to-update", 1);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-update-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        var topicToUpdate = await client.CreateTopicAsync(Identifier.String(streamName), "topic-to-update", 1);
         topicToUpdate.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].UpdateTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(topicToUpdate.Id), UpdateTopicRequest.Name,
-            UpdateTopicRequest.CompressionAlgorithm, UpdateTopicRequest.MaxTopicSize, UpdateTopicRequest.MessageExpiry,
-            UpdateTopicRequest.ReplicationFactor));
+        await Should.NotThrowAsync(client.UpdateTopicAsync(
+            Identifier.String(streamName),
+            Identifier.Numeric(topicToUpdate.Id), "Updated Topic",
+            CompressionAlgorithm.Gzip, 3_000_000_000, TimeSpan.FromMinutes(10), 3));
 
-        var result = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
+        var result = await client.GetTopicByIdAsync(
+            Identifier.String(streamName),
             Identifier.Numeric(topicToUpdate.Id));
         result.ShouldNotBeNull();
-        result!.Name.ShouldBe(UpdateTopicRequest.Name);
-        result.MessageExpiry.ShouldBe(UpdateTopicRequest.MessageExpiry);
-        result.CompressionAlgorithm.ShouldBe(UpdateTopicRequest.CompressionAlgorithm);
-        result.MaxTopicSize.ShouldBe(UpdateTopicRequest.MaxTopicSize);
-        result.ReplicationFactor.ShouldBe(UpdateTopicRequest.ReplicationFactor);
+        result!.Name.ShouldBe("Updated Topic");
+        result.MessageExpiry.ShouldBe(TimeSpan.FromMinutes(10));
+        result.CompressionAlgorithm.ShouldBe(CompressionAlgorithm.Gzip);
+        result.MaxTopicSize.ShouldBe(3_000_000_000u);
+        result.ReplicationFactor.ShouldBe((byte?)3);
     }
 
     [Test]
-    [DependsOn(nameof(Update_ExistingTopic_Should_UpdateTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Purge_ExistingTopic_Should_PurgeTopic_Successfully(Protocol protocol)
     {
-        var beforePurge = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
+        var streamName = $"topic-purge-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        await client.CreateTopicAsync(Identifier.String(streamName), "Purge Topic", 1);
+
+        await client.SendMessagesAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"), Partitioning.None(), GetMessages(5));
+
+        var beforePurge = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"));
         beforePurge.ShouldNotBeNull();
-        beforePurge.MessagesCount.ShouldBe(9u);
+        beforePurge.MessagesCount.ShouldBe(5u);
         beforePurge.Size.ShouldBeGreaterThan(0u);
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].PurgeTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String(TopicRequest.Name)));
+        await Should.NotThrowAsync(client.PurgeTopicAsync(
+            Identifier.String(streamName), Identifier.String("Purge Topic")));
 
-        var afterPurge = await Fixture.Clients[protocol]
-            .GetTopicByIdAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-                Identifier.String(TopicRequest.Name));
+        var afterPurge = await client.GetTopicByIdAsync(Identifier.String(streamName),
+            Identifier.String("Purge Topic"));
         afterPurge.ShouldNotBeNull();
         afterPurge!.MessagesCount.ShouldBe(0u);
         afterPurge.Size.ShouldBe(0u);
     }
 
     [Test]
-    [DependsOn(nameof(Purge_ExistingTopic_Should_PurgeTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Delete_ExistingTopic_Should_DeleteTopic_Successfully(Protocol protocol)
     {
-        var topicToDelete = await Fixture.Clients[protocol]
-            .CreateTopicAsync(Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)), "topic-to-delete", 1);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-del-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+        var topicToDelete = await client.CreateTopicAsync(Identifier.String(streamName), "topic-to-delete", 1);
         topicToDelete.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.Numeric(topicToDelete.Id)));
+        await Should.NotThrowAsync(client.DeleteTopicAsync(
+            Identifier.String(streamName), Identifier.Numeric(topicToDelete.Id)));
     }
 
     [Test]
-    [DependsOn(nameof(Delete_ExistingTopic_Should_DeleteTopic_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Delete_NonExistingTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol].DeleteTopicAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("topic-to-delete")));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-delnone-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(client.DeleteTopicAsync(
+            Identifier.String(streamName), Identifier.String("nonexistent-topic")));
     }
 
     [Test]
-    [DependsOn(nameof(Delete_NonExistingTopic_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task Get_NonExistingTopic_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var topic = await Fixture.Clients[protocol].GetTopicByIdAsync(
-            Identifier.String(Fixture.StreamId.GetWithProtocol(protocol)),
-            Identifier.String("topic-to-delete"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var streamName = $"topic-getnone-{Guid.NewGuid():N}";
+        await client.CreateStreamAsync(streamName);
+
+        var topic = await client.GetTopicByIdAsync(
+            Identifier.String(streamName), Identifier.String("nonexistent-topic"));
 
         topic.ShouldBeNull();
     }
diff --git a/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs b/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
index 0e95a3e..3f0a08e 100644
--- a/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
+++ b/foreign/csharp/Iggy_SDK.Tests.Integration/UsersTests.cs
@@ -20,88 +20,94 @@
 using Apache.Iggy.Contracts.Http.Auth;
 using Apache.Iggy.Enums;
 using Apache.Iggy.Exceptions;
-using Apache.Iggy.Tests.Integrations.Attributes;
 using Apache.Iggy.Tests.Integrations.Fixtures;
-using Apache.Iggy.Tests.Integrations.Helpers;
 using Shouldly;
 
 namespace Apache.Iggy.Tests.Integrations;
 
 public class UsersTests
 {
-    private const string Username = "fixture_users_user_1";
-    private const string NewUsername = "fixture_users_user_1_new";
-
-    [ClassDataSource<UsersFixture>(Shared = SharedType.PerClass)]
-    public required UsersFixture Fixture { get; init; }
-
+    [ClassDataSource<IggyServerFixture>(Shared = SharedType.PerAssembly)]
+    public required IggyServerFixture Fixture { get; init; }
 
     [Test]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateUser_Should_CreateUser_Successfully(Protocol protocol)
     {
-        var request = new CreateUserRequest(Username.GetWithProtocol(protocol), "test_password_1", UserStatus.Active,
-            null);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var result = await Fixture.Clients[protocol].CreateUser(request.Username, request.Password, request.Status);
+        var username = $"user-{Guid.NewGuid():N}"[..20];
+        var result = await client.CreateUser(username, "test_password_1", UserStatus.Active);
         result.ShouldNotBeNull();
-        result.Username.ShouldBe(request.Username);
-        result.Status.ShouldBe(request.Status);
+        result.Username.ShouldBe(username);
+        result.Status.ShouldBe(UserStatus.Active);
         result.Id.ShouldBeGreaterThan(0u);
         result.CreatedAt.ShouldBeGreaterThan(0u);
     }
 
     [Test]
-    [DependsOn(nameof(CreateUser_Should_CreateUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task CreateUser_Duplicate_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        var request = new CreateUserRequest(Username.GetWithProtocol(protocol), "test1", UserStatus.Active, null);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .CreateUser(request.Username, request.Password, request.Status));
+        var username = $"dup-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.CreateUser(username, "test1", UserStatus.Active));
     }
 
     [Test]
-    [DependsOn(nameof(CreateUser_Duplicate_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetUser_WithoutPermissions_Should_ReturnValidResponse(Protocol protocol)
     {
-        var response = await Fixture.Clients[protocol].GetUser(Identifier.String(Username.GetWithProtocol(protocol)));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"get-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        var response = await client.GetUser(Identifier.String(username));
 
         response.ShouldNotBeNull();
         response.Id.ShouldBeGreaterThanOrEqualTo(0u);
-        response.Username.ShouldBe(Username.GetWithProtocol(protocol));
+        response.Username.ShouldBe(username);
         response.Status.ShouldBe(UserStatus.Active);
         response.CreatedAt.ShouldBeGreaterThan(0u);
         response.Permissions.ShouldBeNull();
     }
 
     [Test]
-    [DependsOn(nameof(GetUser_WithoutPermissions_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task GetUsers_Should_ReturnValidResponse(Protocol protocol)
     {
-        IReadOnlyList<UserResponse> response = await Fixture.Clients[protocol].GetUsers();
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"lst-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        IReadOnlyList<UserResponse> response = await client.GetUsers();
 
         response.ShouldNotBeNull();
         response.ShouldNotBeEmpty();
-        response.ShouldContain(user =>
-            user.Username == Username.GetWithProtocol(protocol) && user.Status == UserStatus.Active);
+        response.ShouldContain(user => user.Username == username && user.Status == UserStatus.Active);
         response.ShouldAllBe(user => user.CreatedAt > 0u);
         response.ShouldAllBe(user => user.Permissions == null);
     }
 
     [Test]
-    [DependsOn(nameof(GetUsers_Should_ReturnValidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdateUser_Should_UpdateUser_Successfully(Protocol protocol)
     {
-        var newUsername = NewUsername.GetWithProtocol(protocol);
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdateUser(Identifier.String(Username.GetWithProtocol(protocol)), newUsername, UserStatus.Active));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var user = await Fixture.Clients[protocol].GetUser(Identifier.String(newUsername));
+        var username = $"upd-{Guid.NewGuid():N}"[..20];
+        var newUsername = $"new-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        await Should.NotThrowAsync(client.UpdateUser(Identifier.String(username), newUsername, UserStatus.Active));
+
+        var user = await client.GetUser(Identifier.String(newUsername));
 
         user.ShouldNotBeNull();
         user.Id.ShouldBeGreaterThanOrEqualTo(0u);
@@ -109,24 +115,23 @@
         user.Status.ShouldBe(UserStatus.Active);
         user.CreatedAt.ShouldBeGreaterThan(0u);
         user.Permissions.ShouldBeNull();
-
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdateUser(Identifier.String(newUsername), Username.GetWithProtocol(protocol), UserStatus.Active));
     }
 
     [Test]
-    [DependsOn(nameof(UpdateUser_Should_UpdateUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task UpdatePermissions_Should_UpdatePermissions_Successfully(Protocol protocol)
     {
-        var permissions = CreatePermissions();
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .UpdatePermissions(Identifier.String(Username.GetWithProtocol(protocol)), permissions));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var user = await Fixture.Clients[protocol].GetUser(Identifier.String(Username.GetWithProtocol(protocol)));
+        var username = $"perm-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "test1", UserStatus.Active);
+
+        var permissions = CreatePermissions();
+        await Should.NotThrowAsync(client.UpdatePermissions(Identifier.String(username), permissions));
+
+        var user = await client.GetUser(Identifier.String(username));
 
         user.ShouldNotBeNull();
-        user.Id.ShouldBeGreaterThanOrEqualTo(0u);
         user.Permissions.ShouldNotBeNull();
         user.Permissions!.Global.ShouldNotBeNull();
         user.Permissions.Global.ManageServers.ShouldBeTrue();
@@ -156,31 +161,47 @@
     }
 
     [Test]
-    [DependsOn(nameof(UpdatePermissions_Should_UpdatePermissions_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task ChangePassword_Should_ChangePassword_Successfully(Protocol protocol)
     {
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .ChangePassword(Identifier.String(Username.GetWithProtocol(protocol)), "test_password_1", "user2"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"chpw-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "old_password", UserStatus.Active);
+
+        await Should.NotThrowAsync(client.ChangePassword(Identifier.String(username), "old_password", "new_password"));
+
+        // Verify password was actually changed by logging in with the new credentials
+        var loginClient = await Fixture.CreateClient(protocol);
+        var loginResponse = await loginClient.LoginUser(username, "new_password");
+        loginResponse.ShouldNotBeNull();
+        loginResponse.UserId.ShouldBeGreaterThan(0);
     }
 
     [Test]
-    [DependsOn(nameof(ChangePassword_Should_ChangePassword_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task ChangePassword_WrongCurrentPassword_Should_Throw_InvalidResponse(Protocol protocol)
     {
-        await Should.ThrowAsync<IggyInvalidStatusCodeException>(Fixture.Clients[protocol]
-            .ChangePassword(Identifier.String(Username.GetWithProtocol(protocol)), "test_password_1", "user2"));
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"chpwf-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "correct_password", UserStatus.Active);
+
+        await Should.ThrowAsync<IggyInvalidStatusCodeException>(
+            client.ChangePassword(Identifier.String(username), "wrong_password", "new_password"));
     }
 
     [Test]
-    [DependsOn(nameof(ChangePassword_WrongCurrentPassword_Should_Throw_InvalidResponse))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LoginUser_Should_LoginUser_Successfully(Protocol protocol)
     {
-        var client = await Fixture.IggyServerFixture.CreateClient(protocol);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
 
-        var response = await client.LoginUser(Username.GetWithProtocol(protocol), "user2");
+        var username = $"login-{Guid.NewGuid():N}"[..20];
+        await client.CreateUser(username, "login_password", UserStatus.Active);
+
+        var loginClient = await Fixture.CreateClient(protocol);
+        var response = await loginClient.LoginUser(username, "login_password");
 
         response.ShouldNotBeNull();
         response.UserId.ShouldBeGreaterThan(0);
@@ -196,26 +217,25 @@
     }
 
     [Test]
-    [DependsOn(nameof(LoginUser_Should_LoginUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task DeleteUser_Should_DeleteUser_Successfully(Protocol protocol)
     {
-        var userToRemove = await Fixture.Clients[protocol]
-            .CreateUser("user-to-remove".GetWithProtocol(protocol), "test123", UserStatus.Active);
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        var username = $"del-{Guid.NewGuid():N}"[..20];
+        var userToRemove = await client.CreateUser(username, "test123", UserStatus.Active);
         userToRemove.ShouldNotBeNull();
 
-        await Should.NotThrowAsync(Fixture.Clients[protocol]
-            .DeleteUser(Identifier.String(userToRemove.Username)));
-
+        await Should.NotThrowAsync(client.DeleteUser(Identifier.String(userToRemove.Username)));
     }
 
     [Test]
-    [DependsOn(nameof(DeleteUser_Should_DeleteUser_Successfully))]
     [MethodDataSource<IggyServerFixture>(nameof(IggyServerFixture.ProtocolData))]
     public async Task LogoutUser_Should_LogoutUser_Successfully(Protocol protocol)
     {
-        // act & assert
-        await Should.NotThrowAsync(Fixture.Clients[protocol].LogoutUser());
+        var client = await Fixture.CreateAuthenticatedClient(protocol);
+
+        await Should.NotThrowAsync(client.LogoutUser());
     }
 
     private static Permissions CreatePermissions()