diff --git a/NClient.sln b/NClient.sln
index bf29e7e9c..cb239b085 100644
--- a/NClient.sln
+++ b/NClient.sln
@@ -93,6 +93,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Api.Rest"
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Api.Rest.Tests", "tests\NClient.Providers\NClient.Providers.Api.Rest.Tests\NClient.Providers.Api.Rest.Tests.csproj", "{27521108-9C67-44AE-885C-3BE343421955}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Serialization.Protobuf.ProtobufNet", "src\NClient.Providers\NClient.Providers.Serialization.Protobuf.ProtobufNet\NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj", "{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests", "tests\NClient.Providers\NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests\NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.csproj", "{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -279,6 +283,18 @@ Global
 		{27521108-9C67-44AE-885C-3BE343421955}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{27521108-9C67-44AE-885C-3BE343421955}.Release|Any CPU.Build.0 = Release|Any CPU
 		{27521108-9C67-44AE-885C-3BE343421955}.TestRelease|Any CPU.ActiveCfg = Release|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.TestRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772}.TestRelease|Any CPU.Build.0 = Debug|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.TestRelease|Any CPU.ActiveCfg = Debug|Any CPU
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3}.TestRelease|Any CPU.Build.0 = Debug|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -318,6 +334,8 @@ Global
 		{FA3D9C32-CC55-4D39-8F49-5FC3040EBD78} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
 		{0BB4D666-9C18-4F71-A0A3-88DCC275139D} = {DCB997FD-29F4-48D9-8348-093761DA42E7}
 		{27521108-9C67-44AE-885C-3BE343421955} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
+		{EC0A387A-AAEE-44EF-8AB0-6EF2D745E772} = {DCB997FD-29F4-48D9-8348-093761DA42E7}
+		{B10DCE0F-7BF1-4D0C-AAFD-F4D1D0CBD4A3} = {B1BCB5AE-6A5E-49F7-A00A-6B2931DF628C}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {244A4C58-8FA7-496C-ABCF-72F333149A20}
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/ProtobufSerializationExtensions.cs b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/ProtobufSerializationExtensions.cs
new file mode 100644
index 000000000..b98fbb1c7
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/ProtobufSerializationExtensions.cs
@@ -0,0 +1,80 @@
+using NClient.Common.Helpers;
+using NClient.Providers.Serialization;
+using NClient.Providers.Serialization.Protobuf.ProtobufNet;
+
+// ReSharper disable once CheckNamespace
+namespace NClient
+{
+    public static class ProtobufSerializationExtensions
+    {
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="optionalBuilder"></param>
+        /// <typeparam name="TClient"></typeparam>
+        /// <typeparam name="TRequest"></typeparam>
+        /// <typeparam name="TResponse"></typeparam>
+        /// <returns></returns>
+        public static INClientOptionalBuilder<TClient, TRequest, TResponse> WithProtobufNetSerialization<TClient, TRequest, TResponse>(
+            this INClientOptionalBuilder<TClient, TRequest, TResponse> optionalBuilder) 
+            where TClient : class
+        {
+            Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
+            
+            return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider());
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="optionalBuilder"></param>
+        /// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
+        /// <typeparam name="TClient"></typeparam>
+        /// <typeparam name="TRequest"></typeparam>
+        /// <typeparam name="TResponse"></typeparam>
+        /// <returns></returns>
+        public static INClientOptionalBuilder<TClient, TRequest, TResponse> WithProtobufNetSerialization<TClient, TRequest, TResponse>(
+            this INClientOptionalBuilder<TClient, TRequest, TResponse> optionalBuilder,
+            ProtobufSerializerSettings protobufSerializerSettings)
+            where TClient : class
+        {
+            Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+            
+            return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider(protobufSerializerSettings));
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="optionalBuilder"></param>
+        /// <typeparam name="TRequest"></typeparam>
+        /// <typeparam name="TResponse"></typeparam>
+        /// <returns></returns>
+        public static INClientFactoryOptionalBuilder<TRequest, TResponse> WithProtobufNetSerialization<TRequest, TResponse>(
+            this INClientFactoryOptionalBuilder<TRequest, TResponse> optionalBuilder)
+        {
+            Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
+            
+            return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider());
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="optionalBuilder"></param>
+        /// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
+        /// <typeparam name="TRequest"></typeparam>
+        /// <typeparam name="TResponse"></typeparam>
+        /// <returns></returns>
+        public static INClientFactoryOptionalBuilder<TRequest, TResponse> WithProtobufNetSerialization<TRequest, TResponse>(
+            this INClientFactoryOptionalBuilder<TRequest, TResponse> optionalBuilder,
+            ProtobufSerializerSettings protobufSerializerSettings)
+        {
+            Ensure.IsNotNull(optionalBuilder, nameof(optionalBuilder));
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+            
+            return optionalBuilder.WithCustomSerialization(new ProtobufSerializerProvider(protobufSerializerSettings));
+        }
+    }
+}
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/UsingProtobufSerializationExtensions.cs b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/UsingProtobufSerializationExtensions.cs
new file mode 100644
index 000000000..1c691c231
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/Extensions/UsingProtobufSerializationExtensions.cs
@@ -0,0 +1,68 @@
+using NClient.Common.Helpers;
+using NClient.Providers.Serialization;
+using NClient.Providers.Serialization.Protobuf.ProtobufNet;
+
+// ReSharper disable once CheckNamespace
+namespace NClient
+{
+    public static class UsingProtobufSerializationExtensions
+    {
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="serializationBuilder"></param>
+        public static INClientOptionalBuilder<TClient, TRequest, TResponse> UsingProtobufNetSerialization<TClient, TRequest, TResponse>(
+            this INClientSerializationBuilder<TClient, TRequest, TResponse> serializationBuilder)
+            where TClient : class
+        {
+            Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
+
+            return serializationBuilder.UsingCustomSerializer(new ProtobufSerializerProvider());
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="serializationBuilder"></param>
+        /// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
+        public static INClientOptionalBuilder<TClient, TRequest, TResponse> UsingProtobufNetSerialization<TClient, TRequest, TResponse>(
+            this INClientSerializationBuilder<TClient, TRequest, TResponse> serializationBuilder,
+            ProtobufSerializerSettings protobufSerializerSettings)
+            where TClient : class
+        {
+            Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+
+            return serializationBuilder
+                .UsingCustomSerializer(new ProtobufSerializerProvider(protobufSerializerSettings));
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="serializationBuilder"></param>
+        public static INClientFactoryOptionalBuilder<TRequest, TResponse> UsingProtobufNetSerialization<TRequest, TResponse>(
+            this INClientFactorySerializationBuilder<TRequest, TResponse> serializationBuilder)
+        {
+            Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
+
+            return serializationBuilder.UsingCustomSerializer(new ProtobufSerializerProvider());
+        }
+
+        /// <summary>
+        /// Sets ProtobufNet based <see cref="ISerializerProvider"/> used to create instance of <see cref="ISerializer"/>.
+        /// </summary>
+        /// <param name="serializationBuilder"></param>
+        /// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
+        public static INClientFactoryOptionalBuilder<TRequest, TResponse> UsingProtobufNetSerialization<TRequest, TResponse>(
+            this INClientFactorySerializationBuilder<TRequest, TResponse> serializationBuilder,
+            ProtobufSerializerSettings protobufSerializerSettings)
+        {
+            Ensure.IsNotNull(serializationBuilder, nameof(serializationBuilder));
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+
+            return serializationBuilder
+                .UsingCustomSerializer(new ProtobufSerializerProvider(protobufSerializerSettings));
+        }
+    }
+}
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj
new file mode 100644
index 000000000..42cc0b27e
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj
@@ -0,0 +1,52 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+
+    <PropertyGroup>
+        <PackageId>$(AssemblyName)</PackageId>
+        <VersionPrefix>$(VersionPrefix)</VersionPrefix>
+        <VersionSuffix>$(VersionSuffix)</VersionSuffix>
+        <PackageIcon>logo.png</PackageIcon>
+        <PackageProjectUrl>https://nclient.github.io</PackageProjectUrl>
+        <RepositoryUrl>https://github.com/nclient/nclient</RepositoryUrl>
+        <RepositoryType>git</RepositoryType>
+        <PackageTags>NClient;NClient.Providers;NClient.Providers.Serialization;Protobuf;Google;protobuf-net</PackageTags>
+        <Description>The provider that allows you to use the Protobuf serializer.</Description>
+        <Authors>kingmidas74</Authors>
+        <PackageLicenseFile>LICENSE</PackageLicenseFile>
+        <IsPackable>true</IsPackable>
+    </PropertyGroup>
+
+    <PropertyGroup>
+        <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
+        <LangVersion>9.0</LangVersion>
+        <Nullable>enable</Nullable>
+        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+        <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
+        <Configurations>Debug;Release</Configurations>
+        <Platforms>AnyCPU</Platforms>
+        <OutputPath>$(SolutionDir)/bin/src/$(Configuration)/$(AssemblyName)</OutputPath>
+    </PropertyGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\NClient\NClient.Abstractions\NClient.Abstractions.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <None Include="..\..\..\logo.png" Pack="true" PackagePath="" />
+        <None Include="..\..\..\LICENSE" Pack="true" PackagePath="" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\..\NClient\NClient.Common\Helpers\Ensure.cs">
+            <Link>Common\Ensure.cs</Link>
+        </Compile>
+        <Compile Include="..\..\NClient\NClient.Common\Helpers\Converters.cs">
+            <Link>Common\Converters.cs</Link>
+        </Compile>
+    </ItemGroup>
+
+    <ItemGroup>
+      <PackageReference Include="protobuf-net" Version="3.0.101" />
+    </ItemGroup>
+
+</Project>
\ No newline at end of file
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializer.cs b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializer.cs
new file mode 100644
index 000000000..7162fe062
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializer.cs
@@ -0,0 +1,44 @@
+using System;
+using System.IO;
+using NClient.Common.Helpers;
+using ProtoBuf;
+
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
+{
+    public class ProtobufSerializer : ISerializer
+    {
+        private readonly ProtobufSerializerSettings _protobufSerializerSettings;
+
+        public string ContentType { get; } = String.Empty;
+
+        public ProtobufSerializer(ProtobufSerializerSettings protobufSerializerSettings)
+        {
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+            Ensure.IsNotNullOrEmpty(protobufSerializerSettings.ContentTypeHeader, nameof(protobufSerializerSettings.ContentTypeHeader));
+
+            _protobufSerializerSettings = protobufSerializerSettings;
+            ContentType = _protobufSerializerSettings.ContentTypeHeader;
+        }
+
+        public object? Deserialize(string source, Type returnType)
+        {
+            Ensure.IsNotNull(source, nameof(source));
+            Ensure.IsNotNull(returnType, nameof(returnType));
+
+            var bytes = Converters.GetBytes(source);
+            
+            using var memoryStream = new MemoryStream(bytes);
+            return Serializer.Deserialize(returnType, memoryStream);
+        }
+
+        public string Serialize<T>(T? value)
+        {
+            Ensure.IsNotNull(value, nameof(value));
+            
+            using var memoryStream = new MemoryStream();
+            Serializer.Serialize(memoryStream, value);
+            
+            return Converters.GetString(memoryStream.ToArray());
+        }
+    }
+}
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerProvider.cs b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerProvider.cs
new file mode 100644
index 000000000..ffafe993a
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerProvider.cs
@@ -0,0 +1,34 @@
+using Microsoft.Extensions.Logging;
+using NClient.Common.Helpers;
+
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
+{
+    public class ProtobufSerializerProvider : ISerializerProvider
+    {
+        private readonly ProtobufSerializerSettings _protobufSerializerSettings;
+
+        /// <summary>
+        /// Creates the Protobuf serializer provider.
+        /// </summary>
+        public ProtobufSerializerProvider()
+        {
+            _protobufSerializerSettings = new ProtobufSerializerSettings("application/proto");
+        }
+
+        /// <summary>
+        /// Creates the Newtonsoft.Json based serializer provider.
+        /// </summary>
+        /// <param name="protobufSerializerSettings">The settings to be used with <see cref="ProtobufSerializer"/>.</param>
+        public ProtobufSerializerProvider(ProtobufSerializerSettings protobufSerializerSettings)
+        {
+            Ensure.IsNotNull(protobufSerializerSettings, nameof(protobufSerializerSettings));
+
+            _protobufSerializerSettings = protobufSerializerSettings;
+        }
+
+        public ISerializer Create(ILogger? logger)
+        {
+            return new ProtobufSerializer(_protobufSerializerSettings);
+        }
+    }
+}
diff --git a/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerSettings.cs b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerSettings.cs
new file mode 100644
index 000000000..a196fb708
--- /dev/null
+++ b/src/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet/ProtobufSerializerSettings.cs
@@ -0,0 +1,16 @@
+using NClient.Common.Helpers;
+
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet
+{
+    public record ProtobufSerializerSettings
+    {
+        public string ContentTypeHeader { get; } = string.Empty;
+
+        public ProtobufSerializerSettings(string contentTypeHeader)
+        {
+            Ensure.IsNotNullOrEmpty(contentTypeHeader, nameof(contentTypeHeader));
+
+            ContentTypeHeader = contentTypeHeader;
+        }
+    }
+}
diff --git a/src/NClient/NClient.Common/Helpers/Converters.cs b/src/NClient/NClient.Common/Helpers/Converters.cs
new file mode 100644
index 000000000..36b7c36dd
--- /dev/null
+++ b/src/NClient/NClient.Common/Helpers/Converters.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace NClient.Common.Helpers
+{
+    internal static class Converters
+    {
+        public static string GetString(byte[] source)
+        {
+            var chars = new char[source.Length];
+            Buffer.BlockCopy(source, 0, chars, 0, source.Length);
+            return new string(chars);
+        }
+
+        public static byte[] GetBytes(string source)
+        {
+            byte[] result = new byte[source.Length];
+            Buffer.BlockCopy(source.ToCharArray(), 0, result, 0, result.Length);
+            return result;
+        }
+    }
+}
diff --git a/tests/NClient.Packages/NClient.Packages.Tests/NClient.Packages.Tests.csproj b/tests/NClient.Packages/NClient.Packages.Tests/NClient.Packages.Tests.csproj
index 22cce9601..ace9b2784 100644
--- a/tests/NClient.Packages/NClient.Packages.Tests/NClient.Packages.Tests.csproj
+++ b/tests/NClient.Packages/NClient.Packages.Tests/NClient.Packages.Tests.csproj
@@ -28,6 +28,7 @@
         <PackageReference Include="NClient.Providers.Serialization.Json.System" Version="*-*"/>
         <PackageReference Include="NClient.Providers.Serialization.Json.Newtonsoft" Version="*-*"/>
         <PackageReference Include="NClient.Providers.Serialization.Xml.System" Version="*-*"/>
+        <PackageReference Include="NClient.Providers.Serialization.Protobuf.ProtobufNet" Version="*-*"/>
         <PackageReference Include="NClient.Extensions.DependencyInjection" Version="*-*"/>
     </ItemGroup>
 
diff --git a/tests/NClient.Packages/NClient.Packages.Tests/VersionTest.cs b/tests/NClient.Packages/NClient.Packages.Tests/VersionTest.cs
index 9755d3dde..80692fcf8 100644
--- a/tests/NClient.Packages/NClient.Packages.Tests/VersionTest.cs
+++ b/tests/NClient.Packages/NClient.Packages.Tests/VersionTest.cs
@@ -56,6 +56,10 @@ public void NClient_Providers_Serialization_Json_System() =>
         public void NClient_Providers_Serialization_Json_Newtonsoft() =>
             PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Json.Newtonsoft").Should().Be(PackagesVersionProvider.GetNew());
         
+        [Test]
+        public void NClient_Providers_Serialization_Protobuf_ProtobufNet() =>
+            PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Protobuf.ProtobufNet").Should().Be(PackagesVersionProvider.GetNew());
+        
         [Test]
         public void NClient_Providers_Serialization_Xml_System() =>
             PackagesVersionProvider.GetCurrent("NClient.Providers.Serialization.Xml.System").Should().Be(PackagesVersionProvider.GetNew());
diff --git a/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/NotProto.cs b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/NotProto.cs
new file mode 100644
index 000000000..7fe21ef6a
--- /dev/null
+++ b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/NotProto.cs
@@ -0,0 +1,14 @@
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.Models
+{
+    public readonly struct NotProto
+    {
+        public readonly int X;
+        public readonly int Y;
+
+        public NotProto(int x, int y)
+        {
+            X = x;
+            Y = y;
+        }
+    }
+}
diff --git a/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/Point.cs b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/Point.cs
new file mode 100644
index 000000000..c0b350bd2
--- /dev/null
+++ b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/Models/Point.cs
@@ -0,0 +1,13 @@
+using ProtoBuf;
+
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.Models
+{
+    [ProtoContract]
+    public struct Point
+    {
+        [ProtoMember(1)]
+        public int X { get; set; }
+        [ProtoMember(2)]
+        public int Y { get; set; }
+    }
+}
diff --git a/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.csproj b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.csproj
new file mode 100644
index 000000000..8a5e36059
--- /dev/null
+++ b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.csproj
@@ -0,0 +1,33 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+    <PropertyGroup>
+        <TargetFrameworks>net462;net472;net48;net5.0;net6.0;netcoreapp3.1</TargetFrameworks>
+        <LangVersion>9.0</LangVersion>
+        <Nullable>enable</Nullable>
+        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+        <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
+        <IsPackable>false</IsPackable>
+        <Configurations>Debug;Release</Configurations>
+        <Platforms>AnyCPU</Platforms>
+        <OutputPath>$(SolutionDir)/bin/test/$(Configuration)/$(AssemblyName)</OutputPath>
+    </PropertyGroup>
+
+    <ItemGroup>
+        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\..\src\NClient.Providers\NClient.Providers.Serialization.Protobuf.ProtobufNet\NClient.Providers.Serialization.Protobuf.ProtobufNet.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <ProjectReference Include="..\..\NClient.Testing\NClient.Testing.Common\NClient.Testing.Common.csproj" />
+    </ItemGroup>
+
+    <ItemGroup>
+        <Compile Include="..\..\..\src\NClient\NClient.Common\Helpers\Converters.cs">
+            <Link>Common\Converters.cs</Link>
+        </Compile>
+    </ItemGroup>
+
+</Project>
diff --git a/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/ProtobufSerializerTest.cs b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/ProtobufSerializerTest.cs
new file mode 100644
index 000000000..91a318eb4
--- /dev/null
+++ b/tests/NClient.Providers/NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests/ProtobufSerializerTest.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections;
+using System.IO;
+using FluentAssertions;
+using NClient.Common.Helpers;
+using NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests.Models;
+using NUnit.Framework;
+using ProtoBuf;
+
+namespace NClient.Providers.Serialization.Protobuf.ProtobufNet.Tests
+{
+    [Parallelizable]
+    public class ProtobufSerializerTest
+    {
+        public static readonly IEnumerable SerializationValidTestCases = new[]
+        {
+            new TestCaseData(new Point{ X = 1, Y = 2 }, new Point{ X = 1, Y = 2 }, typeof(Point)),
+            new TestCaseData(new Point{ X = 2, Y = 2 }, new Point{ X = 2, Y = 2 }, typeof(Point))
+        };
+
+        public static readonly IEnumerable DeserializationValidTestCases = new[]
+        {
+            new TestCaseData(new Point{ X = 1, Y = 2 }, new Point{ X = 1, Y = 2 }, typeof(Point))
+        };
+
+        public static readonly IEnumerable NotValidTestCases = new[]
+        {
+            new TestCaseData(new NotProto(1, 2), new NotProto(1, 2), typeof(NotProto))
+        };
+
+        [TestCaseSource(nameof(SerializationValidTestCases))]
+        public void Serialize_ValidValues_NotThrow(object obj, object expectedResult, Type type)
+        {
+            var serializer = new ProtobufSerializerProvider().Create(logger: null);
+
+            var serializerString = serializer.Serialize(obj);
+            byte[] bytes = Converters.GetBytes(serializerString);
+
+            var actualResult = Serializer.Deserialize(type, new MemoryStream(bytes));
+
+            actualResult.Should().BeEquivalentTo(expectedResult);
+        }
+        
+        [Test]
+        public void Serialize_Null_ThrowArgumentNullException()
+        {
+            var serializer = new ProtobufSerializerProvider().Create(logger: null);
+
+            serializer
+                .Invoking(x => x.Serialize((int?) null))
+                .Should()
+                .ThrowExactly<ArgumentNullException>();
+        }
+
+        [TestCaseSource(nameof(DeserializationValidTestCases))]
+        public void Deserialize_ValidValues_NotThrow(object sourceObject, object expectedResult, Type type)
+        {
+            var serializer = new ProtobufSerializerProvider().Create(logger: null);
+
+            using var memoryStream = new MemoryStream();
+            Serializer.Serialize(memoryStream, sourceObject);
+            
+            var serializedBytes = memoryStream.ToArray();
+            
+            var serializedString = Converters.GetString(serializedBytes);
+            
+            var actualResult = serializer.Deserialize(serializedString, type);
+
+            actualResult.Should().BeEquivalentTo(expectedResult);
+        }
+
+        [Test]
+        public void Deserialize_Null_ThrowArgumentNullException()
+        {
+            var serializer = new ProtobufSerializerProvider().Create(logger: null);
+
+            serializer
+                .Invoking(x => x.Deserialize(null!, typeof(string)))
+                .Should()
+                .ThrowExactly<ArgumentNullException>();
+        }
+    }
+}
