diff --git a/src/Nox.Types.EntityFramework/CurrencyCode3Converter.cs b/src/Nox.Types.EntityFramework/CurrencyCode3Converter.cs
new file mode 100644
index 0000000..e544a5a
--- /dev/null
+++ b/src/Nox.Types.EntityFramework/CurrencyCode3Converter.cs
@@ -0,0 +1,15 @@
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Nox.Types.EntityFramework;
+
+///
+/// Class for three-letters currency code (ISO 4217).
+///
+public class CurrencyCode3Converter : ValueConverter
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public CurrencyCode3Converter() : base(currencyCode3 => currencyCode3.Value, currencyCode3Value => CurrencyCode3.From(currencyCode3Value)) { }
+}
+
diff --git a/src/Nox.Types/Types/CurrencyCode3/CurrencyCode3.cs b/src/Nox.Types/Types/CurrencyCode3/CurrencyCode3.cs
new file mode 100644
index 0000000..58bad97
--- /dev/null
+++ b/src/Nox.Types/Types/CurrencyCode3/CurrencyCode3.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Linq;
+
+namespace Nox.Types;
+
+///
+/// Class for three-letters currency code (ISO 4217).
+///
+public sealed class CurrencyCode3 : ValueObject
+{
+ private readonly string[] CurrencyCodes = Enum.GetNames(typeof(CurrencyCode));
+
+ ///
+ /// Validates the object.
+ ///
+ /// A validation result indicating whether the object is valid or not.
+ internal override ValidationResult Validate()
+ {
+ var result = base.Validate();
+
+ if (!CurrencyCodes.Contains(Value))
+ {
+ result.Errors.Add(new ValidationFailure(nameof(Value), $"Could not create a Nox CurrencyCode3 type with unsupported value '{Value}'."));
+ }
+
+ return result;
+ }
+}
diff --git a/tests/Nox.Types.Tests/CurrencyCode3Tests.cs b/tests/Nox.Types.Tests/CurrencyCode3Tests.cs
new file mode 100644
index 0000000..f42d38c
--- /dev/null
+++ b/tests/Nox.Types.Tests/CurrencyCode3Tests.cs
@@ -0,0 +1,53 @@
+using Nox.Types.Tests.Types;
+
+namespace Nox.Types.Tests;
+public class CurrencyCode3Tests
+{
+ [Theory]
+ [ClassData(typeof(CurrencyCodeData))]
+ public void CurrencyCode3_Constructor_ReturnsSameValue_AllCurrencies(string currencyCode3String)
+ {
+ var currencyCode3 = CurrencyCode3.From(currencyCode3String);
+
+ Assert.Equal(currencyCode3String, currencyCode3.Value);
+ }
+
+ [Fact]
+ public void CurrencyCode3_Constructor_WithUnsupportedCurrencyCode3_ThrowsValidationException()
+ {
+ var exception = Assert.Throws(() => _ =
+ CurrencyCode3.From("ABC")
+ );
+
+ Assert.Equal("Could not create a Nox CurrencyCode3 type with unsupported value 'ABC'.", exception.Errors.First().ErrorMessage);
+ }
+
+ [Fact]
+ public void CurrencyCode3_Equality_Tests()
+ {
+ var currencyCode3_1 = CurrencyCode3.From("USD");
+
+ var currencyCode3_2 = CurrencyCode3.From("USD");
+
+ Assert.Equal(currencyCode3_1, currencyCode3_2);
+ }
+
+ [Fact]
+ public void CurrencyCode3_NotEqual_Tests()
+ {
+ var currencyCode3_1 = CurrencyCode3.From("RWF");
+
+ var currencyCode3_2 = CurrencyCode3.From("SHP");
+
+ Assert.NotEqual(currencyCode3_1, currencyCode3_2);
+ }
+
+ [Fact]
+ public void CurrencyCode3_ToString_ReturnsString()
+ {
+ var currencyCode3 = CurrencyCode3.From("USD");
+
+ Assert.Equal("USD", currencyCode3.ToString());
+ }
+}
+
diff --git a/tests/Nox.Types.Tests/CurrencyCodeData.cs b/tests/Nox.Types.Tests/CurrencyCodeData.cs
new file mode 100644
index 0000000..35f5640
--- /dev/null
+++ b/tests/Nox.Types.Tests/CurrencyCodeData.cs
@@ -0,0 +1,142 @@
+using System.Collections;
+
+namespace Nox.Types.Tests.Types;
+public class CurrencyCodeData : IEnumerable