# Customizing the data bus Endpoints support sending and receiving large chunks of data via the [data bus](index.md). It is possible to create a custom data bus implementation. This is done by using the [Features](/nservicebus/pipeline/features.md) extension. ## Implement the `IDataBus` interface This new class will provide the custom implementations for the `Get` and `Put` methods for the data bus. ```cs class CustomDataBus : IDataBus { public Task Get(string key, CancellationToken cancellationToken) { Stream stream = File.OpenRead("blob.dat"); return Task.FromResult(stream); } public async Task Put(Stream stream, TimeSpan timeToBeReceived, CancellationToken cancellationToken) { using (var destination = File.OpenWrite("blob.dat")) { await stream.CopyToAsync(destination, 81920, cancellationToken); } return "the-key-of-the-stored-file-such-as-the-full-path"; } public Task Start(CancellationToken cancellationToken) { return Task.CompletedTask; } } ``` This new implementation needs to be registered as a new feature. ## Define a feature Define a [new feature](/nservicebus/pipeline/features.md) that registers the custom data bus implementation class. ```cs class CustomDatabusFeature : Feature { public CustomDatabusFeature() => DependsOn(); protected override void Setup(FeatureConfigurationContext context) => context.Services.AddSingleton(); } ``` ## Define a DataBusDefinition Define a new class that inherits from the `DataBusDefinition` class. ```cs class CustomDatabusDefinition : DataBusDefinition { protected override Type ProvidedByFeature() => typeof(CustomDatabusFeature); } ``` ## Configure the endpoint Configure the endpoint to use the custom data bus implementation instead of the default data bus: ```cs endpointConfiguration.UseDataBus(svc => new CustomDataBus(), new SystemJsonDataBusSerializer()); ```